본문 바로가기

Coding/Java Spring23

카카오 JDK 21의 신기능 Virtual Thread 알아보기 정리 개요본 포스팅은 카카오 테크밋에서 안정수님이 발표하신 "JDK 21의 신기능 Virtual Thread 알아보기" 영상을 본 후 글로 정리한 것입니다.Virtual Thread란 무엇인가Virtual Thread는 JDK 21에 새롭게 추가된 기능이다. 기존 플랫폼 스레드와는 달리 경량 스레드로써 OS스레드를 그대로 사용하지 않고 JVM 내부 스케줄링을 통해 수십만~수백만개의 스레드를 동시에 사용할 수 있게 해준다.전통적인 Java의 ThreadJava의 Thread는 OS Thread를 Wrapping한 것이다. (Platform Thread)Java 어플리케이션에서 Thread를 사용하면 실제로는 OS Thread를 사용한 것이다.OS Thread는 생성 갯수가 제한적이고 생성, 유지하는 비용이 비싸.. 2024. 5. 16.
Java Garbage Collection Unreachable 객체 GC는 JVM의 힙 영역에 있는 Unreachable 메모리를 청소한다. 위 사진을 보면 reachable한 객체들은 타 객체에 의해 참조되고 있고 unreachable한 객체들은 타 객체에 의해 참조되지 않고 있다. 하지만 단순히 타 객체에 참조되지 않은 객체를 unreachable라고 부르진 않는다. unreachable 영역을 보면 각 객체들은 서로 순환참조를 이루고 있다. 하지만 GC root로부터 참조를 이루고 있진 않은데, 이처럼 GC root가 도달할 수 없는 객체를 unreachable 객체로 판단한다. GC root가 도달할 수 있는 객체라면 GC가 동작해도 객체를 청소하지 않는다. 이러한 reachable한 객체와는 반대로 GC root로부터의 참조가 끊어진 .. 2024. 1. 30.
스프링 Webflux - 스레드와 이벤트 루프 개요 이벤트 루프는 단순한 스레드인데 어떻게 CPU를 블락킹하는 일반적인 자바 스레드와 다르게 동작할 수 있을까? 리액티브 프로그래밍은 이해하기 어렵진 않지만 완벽하게 이해하기는 쉬운 일이 아니다. 카페에 가서 선호하는 음료를 주문한다고 상상해보자. 주문을 한 후 바리스타가 커피를 다 만들때까지 카페에서 기다리거나 또는 카페 근처를 산책할수도 있다. 또는 주문 직후 핸드폰으로 이메일을 보내거나 다음 미팅 스케줄을 잡을수도 있다. 리액트 프로그래밍의 원리를 이해하고 사용하는것은 매우 중요한데, 프레임워크에 가려져있기에 쉽게 파악하기가 까다롭다. 본 포스팅에서는 일반적인 리액티브 프로그래밍에 대해 초점을 맞추지 않을 것이다. 대신, 스프링 내부에서 어떻게 통합되고 동작하는지에 대해 설명하겠다. Reactiv.. 2023. 11. 13.
스프링 MVC 1 정리 서블릿 @ServletComponentScan @SpringBootApplication @ServletComponentScan public class ServletApplication { public static void main(String[] args) { SpringApplication.run(ServletApplication.class, args); } } 스프링 부트는 서블릿을 직접 등록해서 사용할 수 있는 어노테이션을 제공한다. 예를 들어 위처럼 @ServletComponentScan 어노테이션을 사용하면 스프링이 자동으로 현재 패키지 기준 하위 패키지를 스캔하여 모든 서블릿을 찾고 등록시켜준다. @WebServlet @WebServlet(name = "helloServlet", urlPatt.. 2023. 9. 12.
스프링 통합 테스트를 위한 AbstractTestExecutionListener 개요 테스트는 메소드별로 타 테스트에 영향이 없어야한다. 스프링에서는 @Transactional 어노테이션을 사용하면 테스트 실행 시 발생한 DB작업에 대해 테스트가 종료 시 자동으로 롤백해주는 기능을 제공한다. 지금까지 해당 기능을 통해 통합 테스트를 수행했고 별다른 문제가 발생하지 않았는데, 이번에 비즈니스 로직을 추가하면서 전파 속성이 REQUIRES_NEW인 트랜잭션 단위에 대해 문제가 발생했고 이에 따라 데이터베이스를 초기화시켜주는 작업을 @Transactional 사용에서 AbstractTestExecutionListener를 사용하는 것으로 변경하게 되었다. 본 포스팅에서는 MySQL 대상으로 각 테스트 시 데이터베이스 초기화를 통해 테스트를 격리시키는 방법에 대해 기술한다. Abstract.. 2023. 8. 30.
Reactive Streams 개념 정리 구성 요소 Publisher: 데이터를 생성하고 통지(발행, 게시, 방출)하는 역할을 한다. Subscriber: 구독한 Publisher로부터 통지된 데이터를 전달받아서 처리하는 역할을 한다. Subscription: Publisher에 요청할 데이터의 개수를 지정하고 데이터의 구독을 취소하는 역할을 한다. Processor: Publisher와 Subscriber의 기능을 모두 가지고 있다. 즉, Subscriber로서 다른 Publisher를 구독할 수 있고 Publisher로서 다른 Subscriber가 구독할 수 있다. 동작 과정 Subscriber는 Publisher를 구독한다. (subscribe) Publisher는 Subscriber에게 데이터를 통지할 준비가 되었음을 알린다. (onSu.. 2023. 8. 23.