Language 65

[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

무지성 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

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

자바 NIO 간략하게 알아보기!

Java NIO 자바에서 InputStream, OutputStream과 같이 *Stream으로 통신하는 모델을 Java IO 모델이라고 한다. 패키지는 java.io.*에 속한다. 자바 NIO란 New Input/Output의 약자이다. 아래는 Java IO와 Java NIO의 차이이다. 구분 IO NIO 입출력 방식 Stream Channel 데이터 단위 Byte, Character Buffer 데이터 흐름 단방향 양방향 논블로킹 지원 X O 가장 큰 차이는 Java IO는 Stream 기반, NIO는 Channel 기반으로 동작한다. NIO는 java.nio.* 패키지에 속한다. NIO는 아래와 같이 Buffer를 통해 데이터를 읽거나 써서 파일과 통신한다. Java NIO의 모든 IO는 Chann..

Language/Java 2024.01.22

자바에서 동시성을 다룰 때 주의할 점!

아래는 이펙티브 자바의 내용 중 동시성에 대한 부분을 정리한 것이다. Effective Java는 동시성을 사용할 때의 몇가지 주의사항과 가이드라인을 제시한다. 동기화된 메서드 설계 시 주의할 점 동기화된 메서드를 작성할 때 중요한 것은 재정의할 수 있는 메서드를 호출해선 안되고 클라이언트가 넘겨준 함수 객체도 사용하면 안된다는 것이다. public class ObservableSet extends ForwardingSet { public void addObserver(SetObserver observer) { synchronized (observers) { observers.add(observer); } } public boolean removeObserver(SetObserver observer) {..

Language/Java 2023.10.17

Java 검사(Checked) 예외와 비검사(Unchecked) 예외

아래는 이펙티브 자바의 내용 중 예외에 대한 부분의 일부이다. 이펙티브 자바도 그렇고, 예외도 그렇고 포스팅할 내용이 너무 너무 많아서 다 정리할 수 없어서 아쉽다..! 일반적으로 검사 예외와 비검사 예외를 CheckedException, UncheckedException이라고 명명하지만, 해당 포스팅에서는 Effective Java의 명칭대로 검사 예외와 비검사 예외라고 명칭한다. 검사 예외와 비검사 예외 Throwable 클래스를 상속하는 것은 Error와 Exception이 있다. Exception을 상속하면서 RuntimeException을 상속하지 않으면 검사 예외이고, RuntimeException을 상속하면 비검사 예외라고 부른다. 참고로 Error는 Throwable을 상속하고 OutOfM..

Language/Java 2023.10.12

Java - switch 대신 Enum을 검토해보자!

아래 내용은 Effective Java 내용에 기반한다. 상수 대신 Enum 아래 코드를 보자. public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; 이 코드의 영향은 어떤 것이 있을까..? 상수의 값이 바뀌면 반드시 다시 컴파일해야 한다. 추적이 어렵다. (0, 1, 2로 저장되니까) 추적이 어렵다는 이..

Language/Java 2023.10.05

Java 21의 주요 패치 내용 살펴보기!

이번 포스팅에서는 Java 21이 2023년 9월(작성일 기준 이번달)에 출시한다. 개인적으로 Java 21의 패치 내용이 되게 인상깊은데 Java 21 버전의 변경사항에 대해 알아보자. SequencedCollection 기존에 List에서 첫 번째 요소와 마지막 요소를 구할 때는 아래와 같이 코드를 작성했다. String first = list.get(0); // 첫 번째 요소 String last = list.get(list.size() - 1) // 마지막 요소 이런 부분들 구현을 외부에 노출하므로 가독성이 많이 떨어진다. Java 21부터는 SequencedCollection이라는 인터페이스를 제공한다. public interface SequencedCollection extends Collec..

Language/Java 2023.09.10