var store = [{ "title": "첫번째 커밋", "excerpt":"우연히 깃허브 강의를 수강했다가 깃허브 블로그까지 생성하게 되었다.천릿길도 한걸음부터라는 마음가짐으로 첫번째 커밋을 해본다. 딱히 올릴건 없고.. 어제 작성했던 테스트케이스라도 던져놓고 가야지.(ㅋㅋ) @ExtendWith(SpringExtension.class)@ContextConfiguration(classes = { ErrorAlarmTransformer.class })class ErrorAlarmTransformerTest {@Test@SneakyThrows@DisplayName(\"기존 처리되던 에러코드 반입이고 경고 대상인 경우 테스트\")void test_alarm_status() { given(manager.getAlarmInfo(alarmKey)) .willReturn(AlarmInfoDto.builder() .alarmId(\"alarmId\") .stopYn(StopYnEnum.NON_STOP.getCode()) .intvl(Integer.MAX_VALUE) .occurCnt(3) .occurRuleCd(OccurRuleEnum.MORE_THAN.getCode()) .build()); val realtimeSts = new AlarmRealtimeSts(3,...","categories": ["Java"], "tags": ["테스트케이스"], "url": "https://hyooi.github.io/java/2021/01/10/my-first-log.html" },{ "title": "스스로 만료되는 리스트", "excerpt":"간단하게 구현해본 Passive expiring list 설정한 주기마다 스스로 객체를 만료시키는 list가 필요해 구현했다. (이후 Deque를 활용한 로직으로 변경함) Passive expiring map의 경우 apache commons4에서 제공해주고 있는데, list는 구현이 워낙 간단해서 그런지 따로 제공되는 api가 없길래 직접 만들었다. 로직은 간단하다.상속보단 조합을 사용하라던 조슈아 아저씨의 말에 따라 list객체는 외부에서 주입받고, 오브젝트 생성과...","categories": ["Java"], "tags": ["테스트케이스"], "url": "https://hyooi.github.io/java/2021/01/11/passive-expiring-list.html" },{ "title": "지킬로 제작한 Github page push시 404발생 현상", "excerpt":"1. 개요 github 블로그는 보통 루비로 개발된 jekyll을 많이들 사용한다. 처음 루비를 그다지 사용하고 싶지 않았던 나는 기존 지킬 테마를 fork만 해서 올렸었는데, sitemap 및 커스터마이징하기에 불편함이 많아 결국 루비 및 지킬을 설치해서 사용하고 있다. 루비 안쓰겠다고 난 커스터마이징 안할꺼야! 했던 과거의 나를 반성… 나같은 사람이 또 있지 않기를…ㅎㅎ(그럴거면 티스토리...","categories": ["Java"], "tags": ["github blog","jekyll"], "url": "https://hyooi.github.io/java/2021/01/16/jekyll-404.html" },{ "title": "6주차 일일커밋, TIL후기", "excerpt":"1. 오늘따라 공부하기 싫어서 쓰는 일일커밋&TIL후기 하도 여기저기 얘기하고 다녀서 내 주변 아는 분들은 모두 아실 얘기인데, 최근 일일커밋을 진행하고 있다. 나름 6주차에 접어드니 이제는 하루라도 안하면 죄책감이 들어서, (누구에게 잘못한건지는 모르겠지만) 커밋을 위해서라도 매일 컴퓨터 앞에 앉고있다. 심지어 약속이 있어 커밋하기 어려울 것 같은 날이면 새벽에도 미리 커밋을 하고있다....","categories": [], "tags": ["diary"], "url": "https://hyooi.github.io/2021/02/17/til.html" },{ "title": "Zipkin 및 camel zipkin적용 후기", "excerpt":"1. Zipkin? MSA를 공부하면서 zipkin을 접했었는데, 이번에 zipkin을 적용할 기회가 생겼다. 공식 사이트에 따르면, zipkin은 분산 추적 시스템(distributed tracing system)이라고 설명하고 있다.분산 추적이라는 말에 걸맞게 서로 다른 애플리케이션 간에 통신하는 환경에서 주로 사용하는데, 최근 MSA가 인기를 끌면서 함께 인기를 얻은 오픈소스로 보인다. 실제로 나온지 10년 가량 된 오픈소스인데, 2015~2016년 경에...","categories": [], "tags": ["zipkin","camel"], "url": "https://hyooi.github.io/2021/03/09/zipkin.html" },{ "title": "PostConstruct와 PreDestory", "excerpt":"1. PostConstruct spring빈에서 PostConstruct어노테이션이 붙은 메소드는, spring bean이 생성된 직후 한번 호출된다. 따라서 하단의 예제는 EmployeeManagerImpl bean을 생성한 이후 onInit메소드를 한번 호출한다. 아래와 같이 초기화할 대상이 없는 경우에도 실행 가능하며,public/private/default/protected 모두 가능하지만 static메소드에는 사용 불가하다. @Serviceclass EmployeeManagerImpl implements EmployeeManager { @PostConstruct public void onInit() { System.out.println(\"EmployeeManagerImpl bean is created.\"); }}...","categories": ["spring"], "tags": [], "url": "https://hyooi.github.io/spring/2021/03/13/postconstruct.html" },{ "title": "JVM", "excerpt":"1. JVM JVM은 자바 바이트코드를 실행할 수 있는 프로그램이다. 플랫폼에 독립적이므로 운영체제에 무관하게 프로그램을 실행할 수 있다는 점이 특징이다. 2. 메모리 구조 위와 같이, JVM메모리는 크게 Heap과 Thread stack으로 이루어진다.JVM메모리 사용를 표현한 자료를 첨부한다. 2.1. Heap메모리 JVM은 new와 같은 키워드를 통해 오브젝트를 생성하면 이를 heap에 할당한다.때문에 가장 큰 메모리 영역이며...","categories": ["Java"], "tags": ["JVM"], "url": "https://hyooi.github.io/java/2021/05/23/JVM.html" },{ "title": "Intelij에서 git bash사용하기", "excerpt":"window에서 bash를 편리하게 사용하고 싶은 경우, Intelij의 기본 terminal를 git bash로 설정하면 편리하다. 먼저 git bash를 설치한 후, 다음과 같이 File > Settings > Tools > Terminal에설치한 git bash 경로를 지정해주면 된다. 반드시 “D:Program Files\\Git\\bin\\sh.exe” -login -i 와 같이 입력함에 유의한다. ","categories": ["git"], "tags": ["git"], "url": "https://hyooi.github.io/git/2021/06/09/intelij-git-bash.html" },{ "title": "Webpack dev server 기동 시 config-yargs오류 발생", "excerpt":"1. 개요 웹팩 데브 서버를 기동하는데 하단 에러가 계속 발생했다. $ webpack-dev-server> example@1.0.0 start> webpack-dev-serverinternal/modules/cjs/loader.js:905 throw err; ^Error: Cannot find module 'webpack-cli/bin/config-yargs'Require stack:- D:\\HK\\git\\TIL\\til.frontend\\lecture-frontend-dev-env\\example\\node_modules\\webpack-dev-server\\bin\\webpack-dev-server.js at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15) at Function.Module._load (internal/modules/cjs/loader.js:746:27) at Module.require (internal/modules/cjs/loader.js:974:19) at require (internal/modules/cjs/helpers.js:92:18) at Object.<anonymous> (D:\\HK\\git\\TIL\\til.frontend\\lecture-frontend-dev-env\\example\\node_modules\\webpack-dev-server\\bin\\webpack-dev-server.js:65:1) at Module._compile (internal/modules/cjs/loader.js:1085:14) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) at Module.load (internal/modules/cjs/loader.js:950:32) at Function.Module._load...","categories": ["트러블슈팅"], "tags": ["webpack"], "url": "https://hyooi.github.io/%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85/2021/07/15/WEBPACK-DEV-SERVER.html" },{ "title": "Liquibase offline 적용하기", "excerpt":"1. 개요 대부분의 개발자는 개발한 코드를 git, svn 등의 소프트웨어로 형상관리한다. 회사마다 별도의 상업용 소프트웨어를 구매해 사용하기도 하고, 해당 이력은 항상 중요하게 관리된다. 그에 비해, DB형상관리는 그다지 보편적이지는 않다. 그런데 만약 다양한 종류의 데이터베이스에 맞는 SQL을 관리해야 한다면 어떨까?1번 서버에는 Oracle, 2번 서버에는 Mysql, 3번 서버에는 H2를 사용한다고 가정하자.Oracle에서 정상적으로...","categories": ["Database"], "tags": ["Liquibase","형상관리"], "url": "https://hyooi.github.io/database/2021/08/21/liquibase.html" },{ "title": "Query DSL 5.0.0 적용하기", "excerpt":"1. 개요 DB연동 시 native query를 사용하지 않는다면 JPA를 많이 사용할텐데,사실 JPA만으로는 복잡한 SQL을 작성하기가 어려울 때가 많다. 결국 jpql과 natvie query를 사용해 쿼리를 작성하다보면, 이럴거면 차라리 mybatis를 쓰지(…)하는 생각이 들 때가 있다.이럴 때 타입세이프한 SQL을 사용할 수 있는 프레임워크가 몇가지 있는데,가장 인기있는 게 Query dsl과 jooq인 듯 하다. 1.1....","categories": ["Java","Database"], "tags": ["QueryDSL","Spring Data jpa"], "url": "https://hyooi.github.io/java/database/2021/08/22/querydsl-5.0.0.html" },{ "title": "Gradle distribution plugin으로 배포판 만들기", "excerpt":"1. 개요 개발한 프로그램은 단독 빌드 파일만으로는 배포하기 어려울 때가 많다. 기동 스크립트가 필요하기도 하고, 프로덕션 버전의 설정 파일이 필요할 때도 있다.때로는 프로그램 기동에 필요한 sql이 필요하기도 하다. maven은 assembly plugin이 있어, assembly할 내용을 xml로 작성해 이와 같은 작업이 가능하다. 그렇다면 gradle은 어떻게 해야할까? 그래들은 이와 같은 작업을 위해 distribution...","categories": ["gradle"], "tags": ["빌드/배포"], "url": "https://hyooi.github.io/gradle/2021/09/03/gradle-distribution-plugin.html" },{ "title": "그래들 멀티 프로젝트 정의하기", "excerpt":"1. 개요 자바로 된 프로젝트를 구성할 때, 한가지 모듈만으로 프로젝트를 구성하는 경우는 많지 않다.일반적으로 root하위에 n개의 모듈이 있는 경우가 대부분이다. 이번 포스트는 멀티 프로젝트에서 어떻게 공통 디펜던시를 정의하는지에 대한 내용을 다룬다. 사용된 그래들 버전: 7.1 2. root구성 a와 b모듈로 구성된 프로젝트를 구성한다. 여기서 중요한 점은, 최상위 프로젝트(root)에는 별도의 코드를 작성하지...","categories": ["gradle"], "tags": ["빌드/배포"], "url": "https://hyooi.github.io/gradle/2021/09/04/gradle-multi-project.html" },{ "title": "gitlab ce 도커로 설치하기", "excerpt":"1. 개요 git은 버전관리 시스템 중 현재 가장 인기있는 소프트웨어이다.리눅스를 만들었고, 능력은 있지만 성질있기로 유명한 그 리누스 토발스가 만들었다. 오늘은 git을 호스팅할 수 있는 소프트웨어인 gitlab을 도커로 설치하는 방법을 정리해보려고 한다. 2. gitlab 도커 설치 해당 내용은 공식 문서에 상세히 설명되어 있다. 첫 줄부터 모든 필요한 서비스를 단일 컨테이너에서 기동하는...","categories": ["git"], "tags": ["빌드/배포"], "url": "https://hyooi.github.io/git/2021/09/09/gitlab-docker.html" },{ "title": "gitlab runner 도커로 설치 후 gitlab ci설정하기", "excerpt":"1. 개요 지난 포스트에 이어 이번엔 gitlab runner를 도커로 설치하는 과정을 정리하려고 한다. runner는 gitlab의 ci/cd작업을 실행해주는 도구이다.gitlab과 다른 서버에 설치해도 되고,온프레미스 형태로도 설치 가능하나 도커로 설치하게 되면 필요한 환경마다 다른 이미지를 사용할 수 있어 편리하다. 굳이 러너가 설치된 서버에 jdk를 설치하지 않아도, 파이썬을 설치하지 않았어도 그에 맞는 이미지를 사용할...","categories": ["git"], "tags": ["빌드/배포"], "url": "https://hyooi.github.io/git/2021/09/10/gitlab-runner-docker.html" },{ "title": "서버 인증서 적용기1. Aws route53 서브도메인 발급", "excerpt":"1. 개요 gitlab을 http로 사용 중이었는데, 보안을 위해 ssl을 적용하기로 결정했다. 인증서만 별도로 구입해 적용할 수도 있겠지만, 편의를 위해 도메인을 구입하고,해당 도메인에 LetsEncrypt에서 인증서를 발급받아 적용하기로 했다. 이를 위해 먼저 Aws route53에서 도메인을 발급받은 과정을 정리한다. 2. 도메인 발급 2.1. 도메인 등록 Aws route53 화면에 접속하게 되면, 위와 같은 대시보드가...","categories": ["서버"], "tags": ["Aws route53","서브도메인"], "url": "https://hyooi.github.io/%EC%84%9C%EB%B2%84/2021/09/17/gitlab-ssl-1.html" },{ "title": "서버 인증서 적용기2. LetsEncrypt 인증서 발급하기", "excerpt":"1. 개요 이전 챕터에 이어 nginx에 서브도메인 설정을 해야 하는데,그에 앞서 필요한 SSL인증서를 발급받고자 한다. 유료 인증서를 구입할 수도 있겠지만, 해당 챕터에서는 Let’s Encrypt에서 무료로 인증서를 발급받는 방법을 정리한다. 2. 인증서 발급 2.1. Let’s Encrypt? Let’s Encrypt는 무료이며 자동화된 개방형 인증 기관이다. https서버를 서비스하고자 할 때, 만약 self-signed한 인증서를 적용하게...","categories": ["서버"], "tags": ["LetsEncrypt","SSL"], "url": "https://hyooi.github.io/%EC%84%9C%EB%B2%84/2021/09/17/gitlab-ssl-2.html" },{ "title": "서버 인증서 적용기3. Nginx reverse proxy설정하기", "excerpt":"1. 개요 드디어 발급한 서브도메인에 각각 인증서를 적용하고, nginx로 리버스 프록시 서버를 설정해 실제 artifactory 및 gitlab으로 접속할 수 있도록 만들 예정이다. 어떻게 해야하는지 아예 모르는 상태에서 시작했더니 이 때 가장 많이 헤맸었다…T.Tnginx 대신 apache를 사용할 수도 있겠지만, 좀 더 최근에 개발되었고, 대규모 비동기 처리에 적합한 nginx를 사용해 처리하고자 했다....","categories": ["서버"], "tags": ["nginx","reverse proxy"], "url": "https://hyooi.github.io/%EC%84%9C%EB%B2%84/2021/09/17/gitlab-ssl-3.html" },{ "title": "서버 인증서 적용기4. docker gitlab 도메인 적용하기", "excerpt":"1. 개요 서버 인증서 적용기3으로도 리버스 프록시 서버 구축은 끝났지만,사실 gitlab은 몇 가지 문제가 있다. 정상적인 gitlab이라면 아래처럼 나와야 하는데, 이전 설정을 여전히 가지고 있어 해당 빨간 네모칸이 도메인이 아닌, IP로 나오는 것이었다.또한 인증서가 적용되지 않았다고 인식해 여전히 HTTP로 나오고 있었다. 관련 문서를 찾아보면 사실, gitlab은 bundled nginx를 내장하고 있으므로...","categories": ["서버"], "tags": ["git"], "url": "https://hyooi.github.io/%EC%84%9C%EB%B2%84/2021/09/17/gitlab-ssl-4.html" },{ "title": "서버 인증서 적용기5. gitlab 대용량 repository clone불가 현상", "excerpt":"1. 개요 서버 인증서 적용기 마지막 챕터이다.이전 챕터까지 완료하고 모두 정상적으로 동작하는 것처럼 보였다. 그러나 또다시 이슈가 발생했다..(ㅜㅜ)대용량 레파지토리에서만 발생하는 이슈였는데, 이번 포스트는 그에 관련된 내용이다. 2. gitlab 대용량 repository clone 이슈 2.1. Git clone에러 먼저, 대용량 레파지토리에서 발생한 이슈는 다음과 같다.정체모를 RPC failed에러가 계속해서 발생했다. Cloning into 'large-repository'...remote: Counting...","categories": ["트러블슈팅"], "tags": ["nginx","git"], "url": "https://hyooi.github.io/%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85/2021/09/17/gitlab-ssl-5.html" },{ "title": "스프링부트에 springfox3.0(swagger) 적용하기", "excerpt":"1. 개요 오늘은 백엔드api 문서를 자동으로 생성해주는 swagger에 대해 포스팅하려고 한다. 간만에 사용할 일이 생겨 찾아봤더니, swagger2 스펙을 구현한 springfox가 메이저버전이 3점대로 올라가있었다.찾아보니 spring5 및 webflux를 지원하고, OAS3을 지원한다고 한다. 그리고 적용 방법이 좀 더 간단해진 것 같았다… 오늘은 그에 따라 springfox3.0 적용과정을 포스팅하려고 한다. 2. swagger적용 2.1. build.gradle dependencies...","categories": ["Java"], "tags": ["swagger","springfox"], "url": "https://hyooi.github.io/java/2021/09/22/spring-boot-swagger-3.0.html" },{ "title": "IntelliJ에서 Jetty로 웹프로젝트 기동하기", "excerpt":"1. 개요 WAS에 올려 기동하던 일반 스프링 웹 프로젝트를 IntelliJ로 기동할 일이 생겼다. IntelliJ뿐만 아니라 Android studio 및 Pycharm, WebStorm 등에서도 사용 가능한 플러그인인 IDEA Jetty Runner의사용방법을 정리해본다. 2. Jetty runner적용 2.1. IDEA Jetty Runner설치 File > Settings > Plugins에서 IDEA Jetty Runner를 설치한다. 2.2. Jetty runner설정 설치 후 Run...","categories": ["Java"], "tags": ["Intellij"], "url": "https://hyooi.github.io/java/2021/09/24/intelij-jetty-runner.html" },{ "title": "Spring bean 동적 등록/삭제", "excerpt":"1. 개요 스프링은 ApplicationContext의 beanFactory에서 오브젝트를 빈으로 관리한다. 해당 빈들은 어플리케이션이 기동될 때 @Component, @Controller, @Service 등이 붙은 클래스를 찾아 등록되는데,오늘은 그 빈들을 동적으로 관리하는 방법에 대해 정리해보려고 한다. 2. 스프링 빈 동적 등록/삭제하기 2.1. 빈 등록 12345678910111213141516171819202122232425262728@SpringBootTest@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)@Slf4jpublic class DynamicBeanRegisterTest { @Autowired private ApplicationContext applicationContext; @Test void test()...","categories": ["Java"], "tags": ["Intellij"], "url": "https://hyooi.github.io/java/2021/09/27/spring-dynamic-bean-register.html" },{ "title": "HTTPS? 디지털 인증서?", "excerpt":"1. 개요 인터넷 서핑을 하다보면 브라우저에 보이는 자물쇠가 있다.아래와 같은 버튼인데, 클릭해보면 보안연결이 사용되었다는 문구가 나타난다. 사용자에게는 해당 자물쇠의 유무가 인터넷 서핑에 그닥 영향을 미치지 않지만,실제 네트워크 상에는 정보를 안전하게 주고받을 수 있는 장치가 추가되어 있는 것이다. 오늘은 해당 인증이 어떻게 진행되는지 정리할 예정이다. 2. HTTPS 먼저 위에서 말하는 보안연결(HTTPS)란,...","categories": ["보안"], "tags": ["인증서"], "url": "https://hyooi.github.io/%EB%B3%B4%EC%95%88/2021/10/04/electric-signature.html" },{ "title": "도커 이미지가 사라졌어요", "excerpt":"1. 개요 그간 너무 무탈하다 싶었다. 출근시간도 전에 슬랙에 알림이 울렸다. A: gitlab작업 중인가요? 작업담당자인 나는 새됐다를 외치며 PC를 켜서 gitlab에 접속했다. 그리고 보이는 404 not found(…) 서둘러 도커 상태를 확인하니, gitlab은 커녕 도커로 기동한 모든 컨테이너가 삭제되었을 뿐 아니라 이미지도 사라져있었다.난생 처음 겪는 장애라 혼이 반쯤 빠져나간채로 급한 gitlab부터...","categories": ["트러블슈팅"], "tags": ["docker"], "url": "https://hyooi.github.io/%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85/2021/10/07/docker-service.html" },{ "title": "어제까지만 해도 잘 돌던 스프링앱이 404가 떠요", "excerpt":"1. 개요 고통은 왜 몰아서 오는것일까. 웹어드민 애플리케이션에 CD파이프라인을 적용했더니, 일부api에서 404 not found가 발생했다.로컬에서 빌드한 war를 기동하면 전체 api가 정상인데, CI/CD를 통해서 빌드된 war에서만 해당 현상이 발생하는 재밌는 상황이었다. 원인을 찾기 위해 하루를 꼬박 삽질한 것 같다. 메이븐 옵션에, 서버 jetty버전도 맞춰보고 ci/cd가 작동하는 도커 이미지도 변경해봤지만 모두 동일했다.일부...","categories": ["트러블슈팅"], "tags": ["spring"], "url": "https://hyooi.github.io/%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85/2021/10/13/spring-404.html" },{ "title": "잘 돌던 Gitlab에서 발생한 500 Error", "excerpt":"1. 개요 gitlab에서 간헐적으로 500에러가 발생했다. gitlab웹화면을 왔다갔다하다보면 500에러 화면이 나타났다 사라졌다 한다.심지어 ci/cd파이프라인이 작동하고 나면 관련된 gitlab 파이프라인 페이지가 업데이트가 안됐다. (ex. 종료된 파이프라인인데 계속 실행 중인 것으로 조회되는 등..) 오늘은 관련해서 처리한 내용을 포스팅한다. 2. 원인을 찾자 로그 테이블을 마운트시켜둔 위치에서 익셉션 로그 파일을 확인한다. $ vi logs/gitlab-rails/exceptions_json.log...","categories": ["트러블슈팅"], "tags": ["git"], "url": "https://hyooi.github.io/%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85/2021/10/18/gitlab-500.html" },{ "title": "java.lang.ArrayIndexOutOfBoundsException: 50", "excerpt":"1. 개요 잘 기동되던 인터페이스에서, 갑자기 ArrayIndexOutOfBoundsException이 발생했다. java.lang.ArrayIndexOutOfBoundsException: 50Caused by: java.lang.ArrayIndexOutOfBoundsException: 50 at oracle.jdbc.driver.OracleParameterMetaDataParser.getParameterMetaDataSql(OracleParameterMetaDataParser.java:472) at oracle.jdbc.driver.OracleParameterMetaData.getParameterMetaData(OracleParameterMetaData.java:69) at oracle.jdbc.driver.OraclePreparedStatement.getParameterMetaData(OraclePreparedStatement.java:10545) at oracle.jdbc.driver.OraclePreparedStatementWrapper.getParameterMetaData(OraclePreparedStatementWrapper.java:1203) at org.apache.commons.dbcp2.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:162) at org.apache.commons.dbcp2.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:162) at org.apache.camel.component.sql.SqlProducer$2.doInPreparedStatement(SqlProducer.java:120) at org.apache.camel.component.sql.SqlProducer$2.doInPreparedStatement(SqlProducer.java:116) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) at org.apache.camel.component.sql.SqlProducer.process(SqlProducer.java:116) at 이것저것 테스트해본 결과, prepareStatement사용 시,insert sql의 컬럼이 50개가 넘어가는 경우에 마지막 값을 const로 지정하는 경우 해당...","categories": ["트러블슈팅"], "tags": ["jdbc"], "url": "https://hyooi.github.io/%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85/2021/10/23/ojdbc8.html" },{ "title": "docker gitlab에 smtp적용하기", "excerpt":"1. 개요 서버 인증서 적용기4에 이어 gitlab에 smtp서버를 설정한다. 별도로 사용하는 smtp서버가 없어 기존 docker compose파일에 smtp 도커 이미지를 추가 적용해 사용하도록 했다.아래의 설정은 gitlab공식문서를 참조했는데,굳이 나처럼 도커로 smtp를 띄우지 않더라도 gmail, mailgun, aws ses등의 서비스를 이용할 수도 있다. 2. gitlab smtp적용 2.1. docker-compose.yml 12345678910111213141516171819202122232425262728293031323334353637383940gitlab: image: 'gitlab/gitlab-ce:14.4.1-ce.0' container_name: gitlab restart:...","categories": ["서버"], "tags": ["git"], "url": "https://hyooi.github.io/%EC%84%9C%EB%B2%84/2021/11/02/docker-gitlab-smtp.html" },{ "title": "Mysql ddl, dml 무한대기 현상", "excerpt":"1. 개요 별 생각없이 DB테이블을 업데이트했는데, 간단한 컬럼 추가임에도 무한 대기 현상에 빠졌다. 다른 테이블은 문제가 없었는데, 특정 테이블은 DML, DDL 모두 작업이 종료되지 않았다. 2. 원인을 찾자 2.1. 메타데이터 락 mysql은 데이터베이스의 테이블, 스키마, 프로시저 등의 오브젝트에 대한 일관성을 보장하기 위해metadata lock을 사용한다. 이에 따라 한 세션의 트랜잭션에서 사용...","categories": ["트러블슈팅","Database"], "tags": ["mysql"], "url": "https://hyooi.github.io/%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85/database/2021/11/09/mysql-metadata-lock.html" },{ "title": "ubuntu 20.04에 mysql5.7 비대화형 설치하기", "excerpt":"1. 개요 ubuntu20.04의 기본 APT레파지토리는 mysql8을 내장하고 있다. 따라서 mysql5.7을 사용하고자 할 때는 별도로 패키지를 추가해주어야 한다. 이 때 사용하는 mysql-apt-config명령은 기본적으로 대화형으로 동작하는데,비대화형으로 동작해야만 하는 케이스(ex. dockerfile)를 위해 mysql5.7 설치방법과 함께 해당 내용을 정리한다. 2. mysql5.7 설치 2.1. debian frontend 먼저 데비안의 부팅 파라미터 중 하나인DEBIAN FRONTEND를 이용해 커널에게...","categories": ["Database","서버"], "tags": [], "url": "https://hyooi.github.io/database/%EC%84%9C%EB%B2%84/2021/11/29/ubuntu20-mysql5-7.html" },{ "title": "Nginx http to https 강제 리다이렉트", "excerpt":"1. http? https? http는 IT와 관련없는 사람일지라도 본 적이 있을 정도의 필수적인 프로토콜이다. 웹에 있어 없어서는 안될 프로토콜이지만 그 자체로는 보안이 되지 않으므로,흔히 말하는 인증서를 붙여 안전한 통신이 가능하도록 하는데 이 때 쓰는 프로토콜을 https라고 한다. 이번에는 nginx를 통해 서버 접근 시 http를 사용했다면,https로 강제 리다이렉트하도록 설정하는 내용을 포스팅하려고 한다....","categories": ["서버"], "tags": ["nginx"], "url": "https://hyooi.github.io/%EC%84%9C%EB%B2%84/2021/12/01/nginx-http-to-https.html" },{ "title": "Nginx ip접속 시 도메인 강제 리다이렉트", "excerpt":"1. 개요 이전 포스트인 Nginx http to https 강제 리다이렉트와 합치려다가,별도의 포스트로 분리하면서 분량이 많이 적어졌다. 이번에는 발급받은 도메인이 아닌 ip를 이용해 접속했을 때, nginx에서 강제로 도메인으로 포워딩하도록 설정한다. 2. nginx설정 역시 /etc/nginx/nginx.conf를 편집한다. 이전 포스트와 거의 유사한데, http나 https로 ip(15.0.0.2)를 접속했을 시,강제로 https://gitlab.kello.com로 리다이렉트했다. http { server { listen...","categories": ["서버"], "tags": ["nginx"], "url": "https://hyooi.github.io/%EC%84%9C%EB%B2%84/2021/12/02/nginx-ip-to-domain.html" },{ "title": "oracle max(id)+1에서 발생한 duplication error", "excerpt":"1. 개요 sql developer로 실행 시에는 정상이었던 insert query가, 어플리케이션을 통해 실행되면 에러가 발생했다. Duplicate entry '0001' for key 'target_pk';너무나 익숙한 에러메시지였다. 2. 원인 insert sql에 문제가 있는 것이 확실해보였다.아래는 간소화한 해당 sql이다. INSERT INTO TARGET(ID, NAME)VALUES( (SELECT MAX(ID) + 1 FROM TARGET) , ?)SELECT MAX(ID) + 1 FROM TARGET을...","categories": ["Database","트러블슈팅"], "tags": ["jdbc","oracle"], "url": "https://hyooi.github.io/database/%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85/2021/12/03/batch-update-with-max.html" }]