Java 42

Java 멀티스레딩, 병행성 및 성능 최적화

이 글은 글또 x 유데미 콜라보를 통해 강의를 지원받아 작성한 글 입니다. 글을 꾸준히 작성하기 위해 글또 커뮤니티에 참여하고있는데, 감사하게도 유데미에서 글또 커뮤니티에 강의를 제공해주셨습니다. 저는 Java 멀티스레딩, 병행성 및 성능 최적화 - 전문가 되기라는 강의를 선택했는데요. 이 강의는 운영체제, 프로세스와 스레드부터 시작해서 멀티 스레딩의 주요 개념들을 지나 가상 스레드까지 모두 담고 있습니다. 멀티스레딩에 대한 큰 그림을 그릴 수 있는 인상적인 강의여서, 이 글에서는 강의의 핵심 내용들을 추려서 알려드리려고 합니다. (이 글은 강의에서 설명한 내용이 많이 생략되었고, 나름의 표현으로 변경했기 때문에 강의도 꼭 듣는것을 추천드립니다.) 1. 멀티스레딩 개요 멀티스레딩이 필요한 근본적인 이유는..

Java 2024.03.31

Kotlin Coroutine 과 Java Virtual thread

최근 Java 21 에서 Virtual thread 가 정식 출시되어 많은 관심을 받고 있는데요. 문득 Virtual thread 가 Kotlin Coroutine 을 대체하는 양상이 나오지 않을까 하는 생각이 들었습니다. 그래서 이 둘을 비교하며, 각각 어떤 문제를 해결하기 위해 나온 기술들이고 어떤 특징들이 있는지 살펴보고자 합니다. 1. 서론 Kotlin coroutine(코루틴)과 Java Virtual threads(가상 스레드)는 '컴퓨팅 자원을 더 효율적으로 사용하기 위한 경량 스레드 기술' 입니다. 컴퓨터의 발전 과정에서 우리는 자원을 효율적으로 사용하기 위해, 가용 자원의 유휴시간을 줄이기 위해 노력해왔는데요. CPU Scheduling 이 그 대표적인 사례이죠. 코루틴과 ..

Java 2024.03.17

[Effective Java] 아이템 84. 프로그램의 동작을 스레드 스케줄러에 기대지 말라

0. 들어가며 이 아이템은 스레드 스케줄러에게 의존적인 코드를 작성하지 말라는 내용입니다. 아래에서 조금 더 자세히 알아보겠습니다. 1. 스레드 스케줄링 스레드 스케줄링은 간단히 말해서, 스레드를 어떤 기준에 따라 순서대로 실행시키는행위 입니다. 기본적으로는 운영체제가 이런 작업을 모두 처리하는데요. Java의 경우 JVM이 이를 대신 처리합니다. 1.1 JVM의 스레드 스케줄링 JVM의 스레드는 User-level-thread(ULT) 이고 실제 실행시에는 Kernal-level-thread(KLT)와 매핑됩니다. User-level-thread : 사용자(프로그램)이 구현한 Thread Kernel-level-thread : 운영체제(Kernel)에 구현된 Thread 하지만 KLT는 한정적이기 때문..

Java 2023.04.04

[Effective Java] 아이템 76 : 가능한 한 실패 원자적으로 만들라

0. 들어가며 이 아이템이 말하는 바는 짧고 명확해서, 아이템 이름만 봐도 명확하게 보입니다. 저는 “가능한 한 실패 원자적으로 만들라” 라고 핵심 키워드를 꼽았습니다. 가능한 : 반드시 해야한다는건 아니지만, 실패 원자적 : 실패 상황에도 정상적인 흐름으로 흘러가게 하라. 그런데 실패 원자적이라는 말이 확 와닿지는 않는데요. 이를 책에서는 다음과 같이 말합니다. 호출된 메서드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 어떻게 원자적으로 만들 수 있는지, 해야하는 상황과 아닌 상황은 어떻게 구분하는지 아래에서 알아보겠습니다. 1. 실패 원자적으로 만드는 방법 1.1 불변 사실, 불변객체인 경우에는 실패원자적으로 만들기가 쉽습니다. 왜냐하면, 불변 객체인 경우에는 상태를 변경할때 새..

Java 2023.03.27

[Effective Java] 아이템 71 : 필요 없는 검사 예외 사용은 피하라

0. 들어가며 저를 포함한 많은 자바 개발자들은 Checked Exception이 try-catch 구문이나 throw 를 강제하기 때문에 좋아하지 않는데요. 그래서 요즘은 거의 Checked Exception은 사용하지 않고, 불가피하게 사용하게 되는경우는 RuntimeException으로 변환해서 다루는 경우도 많은 것 같습니다. 게다가 Checked Exception을 던지는 메서드는 Stream에서 직접 사용할 수 없어서 더욱 기피하게되는데요. 하지만 이런 Checked Exception도 제대로 활용한다면 API와 프로그램의 질을 올릴 수 있다고 합니다. 1. 제대로 활용할 수 있는 경우 Checked Exception을 제대로 활용할 수 있는 경우는 다음과 같습니다. 외부에서 API를 정상적으..

Java 2023.03.26

[Effective Java] 아이템 55 : 옵셔널 반환은 신중히 하라

0. 들어가며 Java 8 이전에는 값을 반환할 수 있을 수도 없을 수도 있는 경우에 정말 애매했습니다. 개발자가 선택할 수 있는건 null 반환, 예외 발생 두 가지 중 하나였는데요. null을 반환하는 경우에는 호출하는 쪽에서 null 방어코드를 추가해줘야합니다. 만약 빠트리게되면 어디선가 NullPointerException이 발생하죠. 그리고 예외를 발생시키더라도 StackTrace 전체를 추적하기 때문에 비용도 만만치 않다고 합니다. 하지만 이 문제는 Java 8에서 Optional이라는 클래스가 등장하며 해소되었죠. 1. Optional Java 8 부터 Optional이 등장하며 값을 반환할 수 있을 수도 없을 수도 있는 경우를 대응할 수 있게 되었습니다. 값이 있는 경우에는 해당 객체를 담..

Java 2023.03.25

[Effective Java] 아이템 51 : 메서드 시그니처를 신중히 설계하라(feat. 팀 컨벤션)

0. 들어가며 이번 아이템을 살짝 훑어보면, 좋은 메서드를 만들기 위한 규칙을 설명합니다. 먼저 규칙들을 설명하기에 앞서, 규칙들을 왜 제안하는지 생각해봤습니다. 일관성 없는 메서드명 메서드가 너무 많아서 뭘 써야할 지 모르는 상황 매개변수가 너무 많아서 헷갈리는 상황 대표적으로 이런 경우들로 생각해볼 수 있고, 아마 다들 한번쯤은 겪어보셨을 것이라 생각합니다. 이제 필자가 어떤 규칙들을 제안하고, 그 규칙들을 지키면 위와 같은 상황을 해결할 수 있는지 살펴보겠습니다. 1. 메서드 시그니처 규칙 필자가 제안한 메서드 시그니처 규칙은 다음과 같습니다. 메서드 이름을 신중히 짓자 표준 명명 규칙(아이템68)을 따르자 같은 패키지 속의 다른 이름들과 일관되게 짓자 개발자 커뮤니티에서 널리 받아들여지는 이름을 ..

Java 2023.02.21

[Effective Java] 아이템 46 : 스트림에서는 부작용 없는 함수를 사용하라

0. 들어가며 스트림에서 '부작용 없는 함수'를 사용하라는 말은 무슨 뜻 일까요? '부작용' 이라고 번역된 단어는 원서는 'Side effect' 입니다. 즉, 이 함수의 인해 '다른곳에 영향을 끼치지 않는 함수'를 스트림에서 사용해야 한다는 뜻이 됩니다. 1. 순수함수 다른곳에 영향을 끼치지 않는 함수를 함수형 프로그래밍에서는 '순수 함수'라고 하는데요. 이는 조금 바꿔서 말하면 '같은 입력이 주어지면, 항상 같은 결과를 내는 함수'라고 생각할 수 있습니다. 이를 코드로 한번 살펴볼텐데요. 먼저 순수함수가 아닌 예를 먼저 살펴봅시다. class Something { private static int num = 1; p..

Java 2023.02.10

[Effective Java] 아이템 40 : @Override 애너테이션을 일관되게 사용하라

예제 코드는 여기서 보실 수 있습니다. 0. 들어가며 보통 IDE 에서 재정의 기능을 사용하면 자동으로 @Override 어노테이션을 붙여줍니다. 그래서 저는 @Override 에 대해 깊게 고민해본적이 없는데요. 이번 아이템은 개발도구가 도와주지 않다고 가정하고 자세히 알아보겠습니다. 1. @Override 를 붙이지 않는다면 @Override 어노테이션의 가장 중요한 역할은 해당 메서드가 정확하게 오버라이드하고 있는지 확인해주는 것 입니다. class Something { private final int num; public Something(int num) { ... } // equals, hashCode 는 문제없다고 가정 public boolean equals(Something obj) { ....

Java 2023.02.07

[Effective Java] 아이템 33 : 타입 안전 이종 컨테이너를 고려하라(feat. ApplicationContext of Spring)

0. 들어가며 33번은 타입 안전 이종 컨테이너에 대한 이야기를 하는 아이템입니다. 이 단어를 하나 하나 분해하여 의미를 파악해보겠습니다. 타입 안전 : 제네릭을 이용하여 타입 안정성을 꾀함 이종(異種) : 다른 종류 컨테이너 : 무언가를 담는 개체(그릇, 용기, 화물 컨테이너 등) 이를 합쳐서 생각해보면 다음과 같습니다. 타입 안전 이종 컨테이너 : 제네릭을 이용하여 타입 안정을 꾀하지만, 여러 타입을 담을 수 있는 개체 의미를 알았으니 더 자세한 내용은 아래에서 알아보겠습니다. 1. 타입 안전 이종 컨테이너(비한정적 타입 토큰) 먼저 책에서 타입 이종 컨테이너를 설명하기위해 제시한 코드를 살펴봤습니다. public class Favorites { private Map 를 받는데요. 이를 책에서는 타입..

Java 2023.01.28