분류 전체보기 357

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

HTML 삽입 미리보기할 수 없는 소스 모든 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에 대해 알아보자..

Language/Kotlin 2024.04.20

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

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

Language/Kotlin 2024.04.14

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

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

Language/Kotlin 2024.04.02

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

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

Server/Spring JPA 2024.03.30

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

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

Language/Java 2024.03.24

FixtureMonkey 적용 검토해보기!

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

Server/JUnit, Spock 2024.03.23

Spring Webflux - ServerSentEvent 이해하기!

HTML 삽입 미리보기할 수 없는 소스 Server Sent Event Server Sent Event는 서버에서 클라이언트에게 일방적으로 이벤트를 전달하는 방식이다. 클라이언트에서 서버의 이벤트를 구독하기 위해서는 Polling 방식을 주로 사용했다. Polling Polling 방식은 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

SQL - LEFT OUTER JOIN 쿼리 Split 하기!

지난번 커버링 인덱스를 적용한 쿼리를 추가 개선한 이야기이다. 커버링 인덱스 적용 - https://jaehoney.tistory.com/333 지난번 조회 Latency가 너무 커서 커버링인덱스를 조회해서 2~3배, 최대 10배 효율적으로 개선을 할 수 있었다. 문제는 Latency는 큰 문제가 없음에도 TPS가 너무 안나왔다. HTTP 트랜잭션이 0.3s~0.4s 정도인 반면 TPS가 10.8 밖에 안나왔다. 결과를 먼저 소개하자면 LeftOuterJoin 구을 Split해서 TPS를 10.8에서 107.7로 개선했다. 아래는 문제 재현을 위해 임의로 구성한 환경에서 테스트를 진행한 부분이다. 기존 코드 먼저 기존 코드를 보자. @Repository public class ArticleReposito..

Database/SQL 2024.02.27

Spring Webflux란 무엇인가?! - 3. Spring Webflux 이해하기!

해당 포스팅은 Netty, Reactor를 넘어서 Spring Webflux에 대한 자세히 다룬다. Spring Reactive Stack 1편에서 봤던 Spring Reactive Stack을 다시 살펴보고 넘어가자. WebFluxAutoConfiguration WebFluxAutoConfiguration은 SpringWebflux 사용을 위한 필수적인 AutoConfiguration이다. 아래 코드를 보자. @AutoConfiguration(after = { ReactiveWebServerFactoryAutoConfiguration.class, CodecsAutoConfiguration.class, ReactiveMultipartAutoConfiguration.class, ValidationAutoC..