728x90

Backend/Spring+Boot 64

ConfigurationProperties 주의사항

Spring 에서 제공하는 @ConfigurationProperties 를 사용하면 application.yml 에 구성된 정보를 특정 클래스로 바인딩 할 수 있다. 이 때 몇가지 주의사항이 있다. 1. 바인딩할 클래스에 @ConfigurationProperties 주석을 추가하는 것은 당연한데 그 외 @Configuration 클래스나 @SpringBootApplication 클래스에 @EnableConfigurationProperties 도 추가해야 하고 파라미터로 @ConfigurationProperties 주석을 추가한 클래스를 포함해야 한다. 2. @ConfigurationProperties 에 prefix 를 지정할 때 카맬케이스는 사용할 수 없다. 만약 application.yml 에 gif..

Backend/Spring+Boot 2023.08.30

swagger 사용시 패키지가 다른 동일 클래스를 구별하지 못하는 이슈

여러명의 개발자가 페어로 개발을 하다보면 클래스명은 동일하지만 패키지를 다르게 해서 생성하게 되는 경우가 있다. 중복 클래스가 아니라 엄연히 다른 클래스인데 명칭이 중복되는 경우도 있고 inner class 명이 서로 다른 클래스 하위에 중복으로 선언될 수도 있다. swagger 에서는 Controller 에서 사용되는 클래스들을 Schema 로 분류해서 관리하는데 기본적으로 패키지를 포함해서 관리하지 않기 때문에 클래스명이 동일할 경우 이를 구분하지 못한다. 예를 들어 아래와 같이 2개의 VO 클래스와 Controller 메소드가 정의되어 있다고 가정해보자. data class Vo1( val transferablePeriod: TransferablePeriod ) { data class Transfe..

Backend/Spring+Boot 2023.08.30

spring cloud vault 으로 vault 연동

사내에 vault 서버가 있고 이곳에 주요정보들을 보관하고 있다. Spring 환경어어서 기존 프로젝트 들에서는 아래 의존성을 사용했었다. org.springframework.vault:spring-vault-core 사용법은 매우 간단하다. application.yml 파일에 아래와 같이 접속정보를 정의하고 vault: uri: https://vault.... token: ... Configuration 클래스는 아래와 같이 정의하면 된다. @Configuration @Import(EnvironmentVaultConfiguration.class) @VaultPropertySource(value = {"secret/application/sandbox/db-info"}, propertyNamePrefix ..

Backend/Spring+Boot 2023.06.14

@RequestPart 사용할 때 주의사항. 그리고 @ModelAttribute

application/json + multipart/form-data 를 파라미터로 받아야 할 경우 @RequestPart 를 사용하곤 한다. json 문자열은 자동으로 VO로 컨버팅되고 MultipartFile도 잘 받아진다. @RequestParam 를 사용해도 되지만 이 경우 json 문자열의 VO 컨버팅이 자동으로 수행되지 않는다. 그런데 json 문자열 VO 컨버팅 라는 말에는 함정이 있다. 그냥 하면 절대로 되지 않고 json 문자열에 대한 body 값에 대해 Content-Type을 반드시 application/json 로 지정해줘야 한다. 즉, 클라이언트 측에서 body 에 json 과 MultipartFile 을 함께 넣는다면 Content-Type 을 각각 application/json..

Backend/Spring+Boot 2022.11.07

@JsonCreator 주의사항

Spring 환경에서는 일반적으로 api body 포맷으로 json 을 사용하고 전달받은 json 문자열의 역직렬화도 자동으로 지원한다. 그런데 역직렬화 함수를 직접 구현해서 유효성 검증에 활용하고 싶은 경우 해당 클래스의 static 팩토리 함수에 @JsonCreator 를 명시해주면 된다. 코틀린 환경을 기준으로 아래와 같이 구현할 수 있다. data class AuthMsgReqInfo private constructor( val recieverNumber: String, val senderNumber: String, var content:String, val pocId: String?, val origin: Origin? ) { companion object { @JsonCreator @JvmSt..

Backend/Spring+Boot 2022.11.02

[SpringBoot] SpringMVC 에서 WebClient 사용시 주의사항

WebClient 는 Spring 에서 제공하는 RestClient 의 한 종류이다. 과거에 사용되던 RestTemplate 과 비슷한 역할이라고 생각하면 되는데 RestTemplate 는 장기적으로 Deprecated 예정이기 때문에 이제는 WebClient 를 사용해야 한다. WebClient 의 가장 큰 특징은 RestTemplate 과 다르게 논블로킹을 지원한다는 것이다. 말만 들으면 성능에 굉장한 이득이 있을 것 같지만 논블로킹 방식으로 사용하지 않으면 RestTemplate 을 사용하는 것과 차이가 없다. WebClient 의 응답값은 Mono 또는 Flux 타입이다. Mono, Flux 는 리액티브 스트림을 구성하는 파이프라인의 일부로 웹플럭스에서는 기본적으로 논블로킹 처리되지만 Spring..

Backend/Spring+Boot 2022.07.28

WebClient max connection 그리고 mutate()

max connection 의 default는 원래 기본적으로 제한이 없었으나 최근 버전에서는 호스트당 500개로 제한되어 있는 상태이다. 물론 이 값은 커스텀 할 수 있다. 그런데 이 사실을 알고나니 mutate() 대해 궁금해졌다. 난 WebClient를 호스트별로 mutate() 해서 사용했는데 만약 이때마다 새로운 인스턴스가 생성되는거라면 불필요하게 많은 WebClient 를 생성하게 되는거다. 그런데 서칭해보니 WebClient 는 한번 빌드한 뒤에는 이뮤터블하고 mutate() 하더라도 동일한 인스턴스가 사용되고 다른 설정값을 가지는 요청을 처리할 수 있게 해줄 뿐이라고 한다.

Backend/Spring+Boot 2022.07.22

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

WebClient SSL 설정

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

Backend/Spring+Boot 2022.04.19

[SpringBatch] SpringBatch 이력테이블 초기화 스크립트

1개월 이전 이력 삭제. 자세한 설명은 생략한다. DELIMITER $$ DELETE FROM BATCH_STEP_EXECUTION_CONTEXT WHERE STEP_EXECUTION_ID IN ( SELECT STEP_EXECUTION_ID FROM BATCH_STEP_EXECUTION where JOB_EXECUTION_ID in( select JOB_EXECUTION_ID from BATCH_JOB_EXECUTION where CREATE_TIME < DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH) ) ); DELETE FROM BATCH_STEP_EXECUTION where JOB_EXECUTION_ID in( select JOB_EXECUTION_ID from BAT..

Backend/Spring+Boot 2022.03.29
728x90