728x90

분류 전체보기 287

Gradle 에서 SNAPSHOT 버전 의존성 관리

조직 내부에서 사용되는 라이브러리는 SNAPSHOT 버전으로 만들어서 내부 Nexus 에 저장해서 사용하곤 한다. 빌드툴에서는 기본적으로 버전이 변경될 경우에만 원격저장소와 로컬저장소의 의존성을 비교해서 더 최근버전일 경우 로컬저장소로 다운로드해서 빌드에 활용한다. 하지만 내부에서 사용해서 수정이 잦은 라이브러리의 경우 매번 버저닝을 하기도 번거롭고 이를 사용하는 곳도 버저닝을 적용해야 하는 번거로움 때문에 버저닝 없이도 원격저장소와 로컬저장소를 비교하게 하고 싶을 수 있다. 이를 위한 pom.xml 설정이 아래와 같다. ... ... ... true always true always updatePolicy 가 언제 원격저장소와 로컬저장소를 비교할지에 대한 설정인데 SNAPSHOT 버전은 이렇게 지정하지..

Base/CI, CD 2023.02.02

jenkins kubernetes 연동

Jenkins 에서는 Kubernetes 환경을 위한 플러그인을 제공한다. Jenkins 에서는 마스터노드에서 전체 잡을 관리하지만 실제 잡 수행은 슬레이브 노드에서 하도록 하는 것이 일반적인데 이 경우 슬레이브 노드가 실제로 아무일도 하지 않는 유휴시간 동안에도 자원을 차지한다는 단점이 있다. 이에 Kubernetes 일 경우 슬레이브 노드 대신 컨테이너에서 잡을 수행하도록 하고 작업이 끝나면 해당 컨테이너도 종료하는 방식이다. 그림으로 표현하자만 대략 아래와 같다. 이를 위해서는 일단 마스터노드에서 Kubernetes 클러스터를 연동해야 하는데 자꾸 헷갈려서 그 방식을 기록해둔다. 사용한 Jenkins 버전은 Jenkins 2.361.4 이다. 아래 메뉴에서 연동할 클러스터 정보를 입력할 수 있다. ..

Base/CI, CD 2022.12.01

둘째 50일. 남매 사진촬영.

양재동 사진관 2호점 르아인 스튜디오 둘째가 50일이 되어 첫째와 백일과 삼백일 사진 촬영을 했던 르아인 스튜디오에서 남매 사진촬영을 했다. 첫째도 이제 막 두돌이 지난터라 잘 할 수 있을까 걱정했지만 와이프가 남매사진을 남기는 것을 원했고 조동 중에서도 비슷한 나이에 남매사진을 찍은 사람이 있다고 하여 도전했다. 촬영은 첫째의 돌, 이백일, 삼백일 사진 촬영을 하며 와이프가 만족스러워했던 르아인 스튜디오에서 진행했고 둘째의 잠투정이 있긴 했지만 작가님의 노력과 첫째가 잘 도와준 덕이 좋은 사진을 건질 수 있었다. 앞으로 투샷 좀 더 찍다가 가족사진으로 넘어가려고 한다.

내돈내산 리뷰 2022.11.21

@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

Gradle Core Plugins (plugin is not in 'org.gradle' namespace)

gradle 에서 특정 플러그인의 버전을 올리면 아래와 같은 에러가 뜨면서 의존성 갱신이 안되는 경우가 있다. Plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.7.20'] was not found in any of the following sources: * Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Exception is: org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'org.jetbrains.kotlin.jvm', version: '1.7.20'] w..

Base/CI, CD 2022.10.28

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
728x90