분류 전체보기 359

[Kotlin] - 적절한 Scope Function 선택하기!

Kotlin 표준 라이브러리에서 객체의 컨텍스트 안에서 특정 블록의 코드를 실행하는 것이 목적인 함수가 포함되어 있다. Kotlin에서는 Scope Functions을 제공하고 목적에 맞게 선택하는 것을 권장한다.나는 대부분 만능에 가까운 let을 사용했고, Scope Function을 선택하는 기준을 모르고 있었다. 해당 포스팅은 공식문서 기반으로 Scope Function을 선택하는 기준에 대한 내용이다.Spec다음은 각 Scope Function에 대해 정리한 것이다.Function참조 객체반환값확장함수 여부letitLambda resultYrunthisLambda resultYrun-Lambda resultN: 객체 Context 밖에서 실행된다.withthisLambda resultN: 객체 C..

Language/Kotlin 2024.05.06

Reactive Streams를 테스트하는 방법 (reactor-test 라이브러리)

Reactive Programming을 사용할 때 Project Reactor를 주로 사용한다.Reactor는 비동기로 동작하기 때문에 일반적인 테스트 방식으로 검증하기 어렵다. 그래서 Reactor-test 라이브러리를 제공한다.Dependency우선 예시 동작을 위해서 아래와 같은 Dependency를 추가해야한다.testImplementation 'io.projectreactor:reactor-test:3.6.5'Reactive Streams 테스트가 어려운 이유1. 강제 동기화아래 테스트 코드를 보자.@Testvoid test() { // given var expected = IntStream.range(0, 10).boxed() .collect(Collectors.toLi..

Server/JUnit, Spock 2024.05.04

[Kotlin] 코루틴 - CoroutineScope 이해하기!

모든 Coroutine은 AbstractCoroutine을 상속한다.public abstract class AbstractCoroutine( parentContext: CoroutineContext, initParentJob: Boolean, active: Boolean) : JobSupport(active), Job, Continuation, CoroutineScope { ... }아래는 Coroutine의 특징이다.Coroutine은 Job, Continuation, CoroutinScope를 구현한다.CoroutineScope: Coroutine builder로 자식 Coroutine을 생성하고 관리다음으로 CoroutineScope에 대해 알아보자.CoroutineScopeCoro..

Language/Kotlin 2024.04.20

[Kotlin] 코루틴 - CoroutineContext 이해하기!

코루틴코루틴(Coroutine)은 Co(함께, 서로) + routine(규칙적 작업의 집합) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 작업의 집합을 의미한다.왜 Koroutine이 아니라 Coroutine인지 의아할 수 있는데 코루틴은 코틀린만의 것이 아니다. Python, C#, Go, Javascript 등 다양한 언어에서 지원하는 개념이다.JS의 async, await도 동일한 개념이고 코루틴은 프로그래밍 초창기부터 존재하던 개념이다.Kotlin Coroutines코틀린에서는 코루틴을 위한 공식 라이브러리(kotlinx.coroutines)를 지원한다.아래는 Kotlin Coroutines의 특징이다.동시성을 위한 기능을 제공Async Non-blocking으로 동작하는 코드를 동기 방식으로..

Language/Kotlin 2024.04.14

[Kotlin] 코루틴 - suspend 키워드 이해해보기!

코루틴코루틴(Coroutine)은 Co(함께, 서로) + routine(규칙적 작업의 집합) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 작업의 집합을 의미한다.왜 Koroutine이 아니라 Coroutine인지 의아할 수 있는데 코루틴은 코틀린만의 것이 아니다. Python, C#, Go, Javascript 등 다양한 언어에서 지원하는 개념이다.JS의 async, await도 코루틴의 일부이며, 코루틴은 프로그래밍 초창기부터 존재하던 개념이다.vs Thread코루틴은 경량 쓰레드라고 부른다.아래는 여러 개의 쓰레드로 여러 개의 작업을 실행하는 방식이다.코루틴은 작업 하나하나에 Thread를 할당하는 것이 아니라 Object를 할당한다.쓰레드가 Object를 스위칭함으로써 Context Swichi..

Language/Kotlin 2024.04.02

Connection Pool Deadlock 해결하기! (feat. REQUIRES_NEW)

해당 포스팅은 서비스를 오픈하면서 겪었던 이슈와 해결에 대해 공유한다.아래 코드 및 내용은 예시를 위해 만든 프로젝트이다!송금 서비스송금 서비스에서 은행 API를 호출해서 송금을 한다고 가정해보자.아래는 예시를 위한 코드이다.@Service@RequiredArgsConstructorpublic class TransferService { private final TransferRepository transferRepository; private final BankingRequestRepository bankingRequestRepository; private final BankingApiAdaptor bankingApiAdaptor; @Transactional public voi..

Server/Spring JPA 2024.03.30

무지성 byte[] 사용하지 않기! (feat. Apache Commons Email)

포스팅 제목을 무지성byte[] 사용하지 않기라고 했는데 불필요하게 전체 byte[] 할당하지 않기라고 봐주면 좋을 것 같다.해당 포스팅에서는 서비스 운영 중 byte[]로 인해 심각한 문제가 생겼고, 오픈소스 기여까지 하게된 내용을 작성한다.TPS가 심각하게 낮음메일 파일(약 20MB)을 읽어서 파일의 내용 중 일부를 화면에 노출하는 기능을 개발했다.그런데 POD 1대의 TPS가 1.7 정도밖에 나오지 않았다.전체 HTTP 트랜잭션은 5.42초였다.그래서 아래와 같이 각 로직의 수행 시간을 측정해봤다.그 결과 parse 로직이 3787ms가 걸린다는 것을 알 수 있었다.parseparse()의 경우 외부 라이브러리(apache-commons-email)의 로직만을 담고 있었다. 상세한 확인으로 아래 부..

Language/Java 2024.03.24

FixtureMonkey 적용 검토해보기!

새로운 팀에서 테스트를 위한 객체를 생성하는 패턴이나 라이브러리가 필요하게 되었다. 팀원 분이 FixtureMonkey를 추천해주셔서 POC를 진행하게 되었다.FixtureMonkeyFixtureMonkey는 Naver에서 만든 테스트 객체를 쉽게 생성하고 조작할 수 있도록 도와주는 Java 및 Kotlin 라이브러리이다.FixtureMonkey는 한국어 docs를 지원한다. 오픈소스 중에 볼륨도 작은 편이라 한번 읽어보는 것도 추천드린다. 포스팅 내용은 요약 및 검토 정도로 봐주면 좋을 것 같다.https://naver.github.io/fixture-monkey/v1-0-0-kor/docs/introduction이전에 사용하지 않았던 이유FixtureMonkey는 2년 전에 한번 봤었고 적용한다는 블..

Server/JUnit, Spock 2024.03.23

Spring Webflux - ServerSentEvent 이해하기!

Server Sent EventServer Sent Event는 서버에서 클라이언트에게 일방적으로 이벤트를 전달하는 방식이다.클라이언트에서 서버의 이벤트를 구독하기 위해서는 Polling 방식을 주로 사용했다.PollingPolling 방식은 Client에서 Server에게 특정 주기로 요청을 보내서 데이터를 조회하는 방식이다.구현이 간단하지만, 실시간성이 떨어지고 불필요한 네트워크 요청을 지속적으로 하기 때문에 자원을 낭비하게 된다.Long Polling앞선 Polling의 문제를 해결하기 위해 Long Polling 기법이 나왔다.Long Polling 방식은 서버가 요청을 받은 후 데이터가 생길 때까지 기다렸다가 응답을 보내는 방식이다.이 방식은 불필요한 요청 수를 줄이고 실시간성을 보장할 수 있게..

Ktlint에서 라인 생성 Rule을 Disabled하기!

새로 합류한 팀에서 ktlint를 적용하다가 생긴 문제와 해결 방법에 대해 공유한다. 현재 팀에서 IntelliJ의 Ktlint 플러그인을 사용하고 있고 Actions on Save 기능을 사용해서 코드를 저장할 때마다 코드 스타일을 반영한다. 그런데 나한테만 기존 코드의 변경사항이 너무 많았다. 자꾸 라인이 아래와 같이 추가되고 있었다. 라인 추가되는 이슈 아래는 기존의 코드이다. fun getUserTypeCode(user: User): Any = when (user.type) { Type.MEMBER -> if (true) { 1 } else { 2 } Type.ADMIN -> if (true) { 2 } else { 1 } } 다른 팀원들 모두 이슈가 없는데, 내가 저장하면 아래와 같이 코드가 변..

Language/Kotlin 2024.03.02