Java

    Java 가상 스레드(Virtual Thread) : SpringBoot에서 사용하기 -3

    SpringBoot With Virtual Thread springboot 3.2 + 자바 21 버전부터 virtual thread를 사용할 수 있습니다. property 설정으로 AutoCofngiruation을 통해 활성화 할 수 있습니다. # virtual thread enabled/disabled spring.threads.virtual.enabled=true 위 조건을 활성화하게되면, SpringBoot Webserver AutoConfiguration에서 기본 스레드풀 대신 가상 스레드 풀을 이용한 톰캣, 제티 등이 활성화가 됩니다. @AutoConfiguration @ConditionalOnNotWarDeployment @ConditionalOnWebApplication @EnableConf..

    Java 가상 스레드(Virtual Thread)의 이해: 주의할점, Scope Value, 구조화된 동시성 -2

    가상 스레드 풀 사용시 주의할점. 가상 스레드가 가볍다고 해서 무조건 좋은것은 아닙니다. 다음과 같은 내용을 주의해야 합니다. 가상 스레드의 스레드풀을 사용할때에는 고정 풀 을 사용하면 안된다. 동시성을 제어하기 위해서 synchronized 키워드 대신 Lock을 사용하자 스레드 로컬에 용량이 큰 객체를 저장하지 말자. 1. 가상 스레드의 스레드풀을 사용할때에는 고정 풀을 사용하면 안된다. 가상 스레드는 고정된 풀 (newFixedThreadPool)을 사용하면 안됩니다. 지정된 한도 이내에 더 많은 가상 스레드를 만들지 못하기 때문입니다. 또한 1회용이기 때문에 풀에 담아 사용하지 말고, 그냥 생성해서 사용하는게 좋습니다. https://docs.oracle.com/en/java/javase/21/c..

    Java 가상 스레드(Virtual Thread)의 이해: 종류, 설정, 사용법 - 1

    JDK 21부터 (자바 21) 기존 플랫폼 스레드의 단점을 보완하고 동시 처리량을 높이기 위한 새로운 방식의 스레드가 도입됐습니다. 가상 스레드가 무엇인지, 기존 스레드와는 무엇이 다르고 어떻게 사용해야 하며 어떤점을 주의해서 사용하는지 정리해보았습니다. 1. Java 가상 스레드(Virtual Thread)와 기존 자바 스레드 스레드의 종류 스레드 유형: KLT vs. ULT 스레드는 크게 커널 수준 스레드(Kernel-Level Threads, KLT)와 사용자 수준 스레드(User-Level Threads, ULT)로 분류될 수 있습니다. 커널 수준 스레드(KLT): 스레드의 생성, 스케줄링 및 관리를 직접 OS 커널이 담당하며, 이러한 스레드는 OS에 의존적입니다. KLT는 자원 관리 및 멀티프로..

    Java 메소드 실행 시간 측정하기

    각 로직들에 대해 성능 테스트를 하기 전, 시간을 측정하고 로그로 남긴다면 분석시에 도움이 됩니다. Java에서 시간을 측정하는 다양한 방법들이 있지만 다음에 대해서 우선적으로 정리합니다. System.currentTimeMillis()를 사용하는 방법 System.nanoTime()를 사용하는 방법 Spring StopWatch를 사용하는 방법 Guava의 Stopwatch를 사용하는 방법 Apache Commons Lang의 StopWatch를 사용하는 방법 모든 클래스가 thread-safe하진 않으므로 주의해서 사용해야 한다는 단점이 있습니다. 개인적으로 Spring StopWatch가 가장 사용하기 좋고 편리하였습니다. 이를 AOP나 Interceptor 등과 같이 유용하게 이용할 수 있습니다...

    Java Sealed class 와 Switch

    Sealed class Sealed 클래스/인터페이스 는 상속하거나(extends), 구현(implements)할 클래스를 지정하여 해당 클래스들만 상속/구현이 가능하도록 제한하는 기능입니다. JDK 15부터 추가된 키워드로, 자바 17에 정식으로 확정되었습니다. Sealed Class의 목표 개발자가 어떤 class 또는 interface가 해당 클래스를 상속받는지를 쉽게 알 수 있고 제한할 수 있다. class 또는 interface 작성자가 구현을 담당하는 코드를 제어할 수 있게 한다. superclass 사용을 제한하기 위해 access modifier 보다 더 선언적인 방법을 제공한다. pattern의 철저한 분석을 위한 기반을 제공하여 pattern matching을 지원한다. 사용방법 sup..

    Java CompletableFuture

    CompletableFuture 자바에서 비동기(Asynchronous) 프로그래밍을 지원하는 클래스입니다. Future의 단점을 극복하기 위해 자바8부터 지원되었습니다. Future의 진화된 형태로써 외부에서 작업을 완료시킬 수 있을 뿐만 아니라 콜백 등록 및 Future 조합 등이 가능 CompletableFuture : 완료가능한 Future Future 인터페이스의 단점 외부에서 완료시킬 수 없고, get의 타임아웃 설정으로만 완료 가능 블로킹 코드(get)를 통해서만 이후의 결과를 처리할 수 있음 여러 Future를 조합할 수 없음 ex) 회원 정보를 가져오고, 알림을 발송하는 등 여러 작업을 조합하거나 예외 처리할 수 없음 Future는 외부에서 작업을 완료시킬 수 없고, 작업 완료는 오직 g..

    Java Future, Callable, Executor Concurrent 프로그래밍

    자바에서 지원하는 Concurrent 프로그래밍 관련 클래스들입니다. 멀티 프로세싱 --> ProcessBuilder 사용 멀티 스레드 --> Thread, Runnable, Executors, Callable 등 사용 Thread와 Runnable은 멀티 스레드를 구현하는것을 지원하지만 Thread와 Runnable을 직접 사용하는 방식은 다음과 같은 한계점이 있습니다. 지나치게 저수준의 API(쓰레드의 생성)에 의존함 값의 반환이 불가능 (void type) 매번 쓰레드 생성과 종료하는 오버헤드가 발생 쓰레드들의 관리가 어려움 특히 결과를 반환하도록 추가된것이 Callble과 Future 입니다. Callable과 Runnable의 차이점은 작업의 결과를 받을 수 있다는 사실이다. Future는 비동..

    Java 현재 시간 + 랜덤 문자로 고유값 만들기 - with apache commons library (Java Random String)

    Java 현재 시간 + 랜덤 문자로 고유값 만들기 - with apache commons library (Java Random String) Apache Commons의 RandomStringUtils 클래스를 이용하여 랜덤 문자열을 만들 수 있다. RandomStringUtils 을 사용하기 위해서는 commons-lang3이 필요하다. build.gradle 에 아래 항목을 추가한다. implementation 'org.apache.commons:commons-lang3:3.0' import org.apache.commons.lang3.RandomStringUtils; RandomStringUtils.randomAlphabetic(4); 메서드 인자로 생성할 random String의 length를 ..

    Java Papago 번역 API 사용

    파파고 번역 개요 API 문서 (API 레퍼런스) 구현 예제 - 공식문서(Java) Java를 이용한 Papago API 호출 예제이다. Papago 번역 API는 일 허용량이 10,000 글자이다. 일일 호출양이 끝난 상태. 애플리케이션 등록 https://developers.naver.com/docs/papago/papago-nmt-overview.md#%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EB%93%B1%EB%A1%9D 애플리케이션 등록 네이버 개발자 센터 상단 Application -> 애플리케이션 등록 -> 애플리케이션 등록 (API 이용신청) 페이지 애플리케이션 이름, 사용 API, 비로그인 오픈 API 서비스 환경 입력 2. 애플..

    Graceful Shutdown - JVM, Java, SpringBoot

    Graceful Shutdown의 사전적 의미 : 정상적인 종료 Graceful shutdown은 프로그램이 종료될 때 최대한 side effect를 내지 않기 위해 로직들을 잘 처리하고 정상적으로 종료하는 것을 의미한다. 운영체제(OS), 애플리케이션, 브라우저 등 모든 소프트웨어에 통틀어서 말할 수 있는 개념이다. Graceful Shutdown의 상반되는 의미로 Hard Shutdown이 있다. Gracueful Shutdown(정상적인 종료) : 사용자가 소프트웨어 기능을 이용하여 정상적으로 프로세스를 종료시키고 종료하는것 Hard Shutdown(강제 종료, 비정상 종료) : 천재지변, 전원 차단(코드뽑기), 하드웨어 오류(메모리부족 등)에 의해 의도치 않게 비정상 종료되는 것 왜 Gracefu..