728x90

Backend/Kotlin 22

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

@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

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

[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

[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] thread-safe Collection

Coroutine를 병렬로 활용하다보면 thread-safe 한 Collection 이 필요해진다. 그런데 Kotlin 자체에서는 thread-safe 한 Collection 을 제공하지 않는다. 아래 함수는 모두 thread-safe 하지 않다. mutableMapOf() mutableListOf() mutableSetOf() 만약 thread-safe 한 Collection 을 사용하고 싶다면 Java의 Collections 에서 제공하는 wrapper 메소드를 활용하면 된다. Collections.synchronizedMap(mutableMapOf()) Collections.synchronizedList(mutableListOf()) Collections.synchronizedSet(mutableS..

Backend/Kotlin 2022.04.14

[Kotlin] 코틀린에서 Mapstruct 사용하기

Mapstruct 를 사용할 경우 객체간 매핑을 자동으로 해주기 때문에 JPA 를 사용하는 환경처럼 DTO, Entity 간 변환이 잦은 경우 유용하게 사용될 수 있다. 하지만 코틀린 환경에서는 몇가지 제약사항이 있다. 자바 환경에서는 아래와 같이 사용할 수 있었다. @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface PushReqInfoMapper { @Mapping(target = "eventId", source = "makeIdReqInfo.eventType") @Mapping(target = "pushOtherInfo", expression = "java(toPushOthe..

Backend/Kotlin 2022.04.05

[Kotlin] RequestBody 유효성 검증로직 추가하기

RequestBody에 할당되는 값에 대한 유효성 검증 방법에는 여러가지가 있을 것이다. Spring 환경이라면 대표적으로 @Valid 또는 @Validated 을 사용할텐데 여기에서는 직접 유효성 검증 로직을 추가하는 방법을 알아본다. 사실 이 방법은 Kotlin 에서만 국한된 것은 아니기 때문에 개념만 이해한다면 어디서든 사용할 수 있다. 우선 여기에서 @Valid와 @Validated 의 차이는 구체적으로 다룰 필요는 없겠지만 간단하게 말하면 그냥 @Validated 이 상위호환 이라고 보면 되고 아래부터 @Validated 로만 표현하겠다. @Validated 는 왜 사용하지 않았나? 단일 값의 유효성만 검증하는게 아니라 2개 이상 값의 조합도 검증하고 싶었다. 예를 들어 주민등록번호를 검증을 한..

Backend/Kotlin 2022.03.07

Coroutine timeout 설정

Coroutine 을 사용하는 이유는 병렬처리 또는 자원의 균일한 사용이다. 이런 면에서 timeout 은 필수로 필요한 설정이 된다. Coroutine 패키지에서 제공되는 withTimeout 함수를 사용하면 손쉽게 timeout 을 설정할 수 있는데 이걸 어떤 형태로 사용하느냐에 따라 동작이 전혀 달라지기 때문에 이를 기록해 놓는다. 결론부터 말하면 아래와 같은 형태로 사용하면 된다. runBlocking(Dispatchers.IO) { repeat(5){ launch { try{ withTimeout(3000) { if (it == 1) delayRoutine(it) else normalRoutine(it) } }catch (e: Exception){ println("$it ${e.message}"..

Backend/Kotlin 2022.02.04
728x90