728x90

Backend 150

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

테스트 코드로 이해해보는 코루틴 예외처리

@Test fun `코루틴은 논블로킹으로 실행된다`(){ /* 코루틴 내부의 코루틴은 각각 논블로킹으로 처리된다. 단, 스레풀에서 돌렸을 때 이야기.. 메인스레드 하나에서 돌리면 작업자가 한명이니 당연히 순차처리된다. */ runBlocking(Dispatchers.IO) { launch { repeat(1000){ println("1111111") } } launch { repeat(1000){ println("2222222") } } } } @Test fun `코루틴은 기본적으로 예외가 부모로 전파된다`(){ /* 예외가 부모로 전파되면 부모가 취소되고 결국 다른 형제 코루틴도 취소된다. launch, async 동일 */ runBlocking(Dispatchers.IO) { launch{ repea..

Backend/Kotlin 2023.02.11

@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

Kotest 삽질기록

1. Coroutine 버전 충돌 Kotest 내부에서 사용되는 Coroutine 과 SpringBoot 에서 기본으로 제공하는 Coroutine 버전이 일치해야 한다. 그렇지 않으면 테스트코드가 동작하지 않는다. 대략 코루틴 관련 의존성을 찾을 수 없다는 에러메시지를 뱉어낼 것이다. 나의 경우 SpringBoot 2.6.6 을 사용하고 있었고 여기에서는 Coroutine 1.5.2 를 기본으로 제공하고 사용하려는 Kotest 5.5.1 에서는 내부적으로 Coroutine 1.6.4 가 사용됐었고 gradle.properties 파일에 아래를 추가해서 이를 해결할 수 있었다. kotlin-coroutines.version=1.6.0 이렇게 되면 SpringBoot에서 제공하는 Coroutine 과 Kot..

Backend/Kotlin 2022.10.29

flatMap

java8 이후 stream 을 많이 사용해왔지만 그동안 flatMap 은 사용해본 적이 없다. 설명을 봐도 잘 모르겠고 딱히 필요성을 느끼지 못했다. 현재 내게 필요한 건 flatMap 어떻게 사용하나? 가 아니라 flatMap 이 왜 필요한가? 이다. 그런데 오픈소스들을 보면 flatMap를 사용한 예제가 꽤 되어서 flatMap 에 대해 다시 알아봤다. 서칭해보니 map 과 비교하는 글들이 많은데 용어만 비슷할 뿐 역할이 완전히 다른데 왜 비교하는지 모르겠다.. 일단 flatMap 의 역할은 스트림 평탄화 라고 한다. flatMap 은 스트림을 리턴해야 하고 그렇게 리턴된 스트림은 1차원 평탄화 된다. 즉, 다차원 배열 또는 다차원 리스트? 를 단일배열 또는 단일 리스트로 변환해야 할 때 필요하다...

Backend/Java 2022.09.07

Kafka, Kafka Streams

Kafka 를 유용하게 사용하고 있었고 웹플럭스를 활용할 신규 서비스에도 Kafka 를 적용하려고 하고 있었는데 Kafka Streams 라는 용어를 접하게 됐다. 처리속도가 빠르고 실시간 처리에 유리하다는데 Kafka 와는 다른건가? 더 좋은건가? 명확하게 구분이 되지 않아 서칭을 좀 해봤다. 일단 Kafka Streams 는 Consumer 에 포함되는 구성요소이다. 이는 Kafka Streams 를 사용하더라도 최초 Producer 는 기존에 Producer 작성하듯이 하면 된다는 말이다. 일반적으로 Consumer 에서 작업이 끝나지 않고 추가 토픽으로 전달이 필요한 경우 Kafka Streams 를 활용하는 것 같다. 그렇다면 Kafka Streams 를 사용하면 무슨 이득이 있는건가? 구조가 ..

Backend/Kafka 2022.09.07

[Kotlin] 생성자 매개변수 선언시 val, var

Kotlin에서 var, val 키워드는 각각 변수, 상수를 의미한다는 것은 매우 기본적인 사실이다. 그런데 이러한 키워드를 함수나 메소드의 매개변수에 사용하진 않는다. Java 에서도 private, public 같이 변수 앞에 선언할 수 있는 키워드가 있지만 매개변수 선언시에는 이를 사용하지 않고 오히려 컴파일 오류를 일으킨다. Kotlin 에서도 마찬가지이고 var, val 도 마찬가지다. 그런데 Kotlin 에서는 var, val 는 물론이고 private, public 같은 키워드도 포함할 수 있는 매개변수가 존재한다. 바로 생성자의 매개변수인데 private, public 은 우리가 익히 알고 있듯이 해당 변수를 외부에 해당 변수를 공개하느냐 마느냐 하는 것이라는 것을 쉽게 알 수 있지만 va..

Backend/Kotlin 2022.09.02
728x90