728x90

전체 글 287

spring-boot-maven-plugin 디버깅 하기

spring boot 가 많이 활성화 된 상황에서 프로젝트를 로컬에서 실행하는 방법은 매우 간단하다. 그냥 부트스트랩 클래스를 run 하면 된다. 그런데 간혹 갑자기 맡게된 프로젝트에서 이게 안되고 spring-boot-maven-plugin 을 통해서만 구동이 가능하게 구성된 프로젝트들이 있다. 즉, 로컬에서는 아래와 같이 mvn 플러그인 실행만으로 프로젝트를 구동할 수 있는 것이다. mvn spring-boot:run 그런데 문제는 이렇게 프로젝트를 띄우면 debug 모드가 지원되지 않아 breakpoint 에서 실행이 중단되지 않는다. 디버깅이 불가능하다는 말이다. 이때는 프로젝트를 띄울 때 원격 디버그 포트를 지원하도록 하고 해당 포트로 붙어서 서비스를 호출하면 우리가 원하는 데로 breakpoi..

Backend/Spring+Boot 2022.05.31

[Kotlin] SpringMVC WebClient 에 Resilience4j 적용하기

WebClient 는 SpringMVC 에서 동기식으로 사용할 것이고 WebClient가 아닌 다른 rest client 를 선택하더라도 적용방법은 크게 달라지지 않는다. WebFlux 에서 사용하는 비동기식 WebClient 에 적용하는 방법은 추후 다시 정리하도록 한다. Resilience4j 에서는 여러가지 모듈을 제공하는데 여기에서는 일반적으로 많이 사용하는 retry, circuitbreaker 모듈 적용만 정리한다. retry, circuitbreaker 설정에는 여러가지 설정값들이 존재하겠지만 application.yml 에 아래와 같이 설정되어 있다고 가정해보자. resilience4j: retry: configs: default: maxRetryAttempts: 3 waitDuration..

Backend/Kotlin 2022.05.10

kotlin, gradle 환경 jvm 버전 지정하기

build.gradle.kts 파일에 아래내용을 명시하면 된다. 명시하지 않을 경우 kotlin 1.6.20 기준 기본적으로 jvm 1.8 버전을 참조한다. tasks.withType { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = JavaVersion.VERSION_17.toString() } } 아래는 있어도 되고 없어도 되는데 명시하려면 위와 버전을 맞춰야 한다. java.sourceCompatibility = JavaVersion.VERSION_17 만약 맞추지 않을 경우 컴파일 단계에서 아래와 같은 경고 메시지가 출력된다. 'compileJava' task (current target is 17) and 'co..

ETC 2022.04.29

maven default properties

pom/project 빌드 : ${project.build.directory} = ${pom.build.directory} = ‘target’; 빌드 : ${project.build.outputDirectory} = ‘target/classes’; 프로젝트 이름 : ${project.name} = ${pom.name} = / 엘리먼트 설정 값; 프로젝트 버전 : ${project.version} = ${pom.version} = ${version} = / 엘리먼트 설정 값; 최종 파일 이름 : ${project.build.finalName}= // 엘리먼트 설정 값 settings 로컬 저장소 경로 : ${settings.localRepository} environment variable 시스템 PATH..

Base/CI, CD 2022.04.27

mysql delete 데이터 공간 반납

mysql은 데이터를 delete 하더라도 사용 했던 공간은 바로 반납하지 않는다. 이에 대량 delete 의 경우 truncate 또는 사전에 파티셔닝을 해놔서 파티션을 삭제하는 방법을 선택한다. 그럼 delete 삭제된 데이터 공간은 영원히 반납하지 않느냐? 그건 또 아니다. 이후 DDL 이 수행될때 지워진 공간이 반납된다. truncate 나 파티션 삭제는 모두 DDL 이기 때문에 곧바로 공간이 반납될 뿐이다. 이를 이용하면 delete 를 수행하고 임의로 DDL를 수행하는 것도 하나의 방법이 될 수 있다.

Backend/Database 2022.04.27

서로 다른 사설 네트워크 서버끼리 통신하기

기본적으로 동일 네트워크 내에 구성된 서버는 아무것도 하지 않더라도 서로 통신이 가능하다. 선으로 직접 연결되어 있기 때문이다. 동일 네트워크란 한 회사의 건물이라고 생각하면 된다. 그런데 네트워크 보안에서 우리가 사용하는 인터넷은 어떠한 자료가 오고갈지 모르는 위험한 공간으로 인식되기 때문에 동일 네트워크 내에 있는 서버라고 할지라도 일부 서버만 인터넷에 연결을 해 놓는다. 예를들어 건물에서 서버가 있는 층이 1~3층 이라고 한다면 3층에 있는 서버들만 인터넷에 연결을 해놓는 것을 말하며 이 경우 1, 2층은 내부망 3층은 외부망이라고 부르며 이러한 환경을 망분리 환경이라고 한다. 외부망에는 공인IP가 할당된 OpenApi 서버 혹은 프록시 서버들이 위치하게 될 것이고 내부망에는 사설IP가 할당된 비즈..

Base/개념정리 2022.04.27

[Kubernetes] Graceful Shutdown

쿠너네티스 환경에서는 Scale in/out 이 빈번하게 발생하기 때문에 Scale in 과정에서 종료되는 pod 들에 대한 관리가 필요하다. 예를 들어 pod에서 어떠한 로직을 처리중에 있는데 강제로 종료를 해버리면 당연히 문제가 될 것이고 종료되고 있는 과정에 트래픽이 인입되면 해당 요청을 정상처리할 수 없어 에러를 리턴할 수 밖에 없을 것이다. 이에 pod 이 정상적으로 종료될 수 있도록 대기시간을 주고 그 시간동안 트래픽은 막는 방안이 필요하다. 쿠버네티스에서는 pod 을 종료할 때 SIGTERM 시그널을 우선 보내고 terminationGracePeriodSeconds에 설정된 시간 이후에는 SIGKILL 시그널을 보내서 프로세스를 강제종료한다. terminationGracePeriodSecon..

WebClient SSL 설정

SSL 관련 설정은 가장 많이 다뤄지는 것이 핸드쉐이크 타임아웃인데 이는 default 값이 있기도 하고 설정역시 간단하기 때문에 여기에서 다루지 않는다. 여기에서 다룰 것은 자체서명 인증서를 사용하는 서버와 https 통신을 해야할 때 필요한 설정을 정리한다. 기본적으로 https 통신에 사용되는 인증서는 ROOT CA에 등록된 인증서여야 한다. ROOT CA는 전문적인 인증서 발급회사 의미하며 https 통신을 제공하려는 서버는 이러한 전문업체에 등록되어 정식 서명된 인증서를 사용해야 한다. 당연하게도 이러한 인증서는 관리목적으로 일정비용이 발생하게 되는데 단순히 테스트 목적이라면 굳이 ROOT CA 서명없이 자체서명된 인증서를 사용해도 무방하다. 다만 이러한 자체서명된 인증서를 사용할 경우 아래와 ..

Backend/Spring+Boot 2022.04.19

ResponseTimeout, ReadTimeout, WriteTimeout

네트워크 통신을 담당할 클라이언트를 구성하다보면 위와 같은 타임아웃 설정을 필수로 하게 된다. 대충 알겠으나 항상 헷갈려서그 의미를 명확하게 정리해 놓는다. 일반적으로 통신은 그 요청이 Read 인지 Write 인지에 따라 아래와 같이 수행된다. ReadRequest 1. 클리이언트에서 서버로 읽기 요청을 전송 2. 서버에서 요청을 받아 클라이언트로 응답값 전송의 시작을 알림 3. 서버에서 응답 데이터 전송 시작 4. 서버에서 응답 데이터 전송 종료 WriteReeust 1. 클리이언트에서 서버로 쓰기 요청을 전송 2. 서버에서 요청을 받아 클라이언트로 데이터를 보내라고 알림 3. 클라이언트에서 쓰기 데이터 전송 시작 4. 클라이언트에서 쓰기 데이터 전송 종료 ResponseTimeout은 위에서 공통으..

Base/개념정리 2022.04.19
728x90