Featured note · Java
CompletableFuture에 대한 이해
Future 는 비동기 작업의 결과를 나중에 받을 수 있게 해 준다. 하지만 Future 만으로는 아쉬운 점이 많다. 결과가 필요하면 결국 get() 으로 기다려야 하고, 작업이 끝난 뒤 이어서 실행할 콜백을 자연스럽게 붙이기도 어렵다. 여러 작업을...
읽어보기Recent posts
View by topic-
Callable, Future, ExecutorService에 대한 이해
Thread 와 Runnable 만으로도 새 실행 흐름을 만들 수는 있다. 하지만 실제 애플리케이션에서는 작업이 하나로 끝나지 않는다. 여러 작업을 동시에 실행해야 하고, 실행 결과를 받아야 하며, 실패나 취소도 다뤄야 한다. 매번 new Thread...
Java -
Thread와 Runnable에 대한 이해
스레드는 하나의 프로그램 안에서 독립적으로 실행되는 흐름이다. JVM은 하나의 애플리케이션 안에서 여러 실행 흐름이 동시에 동작하도록 지원한다. 일반적인 자바 애플리케이션은 main() 메서드를 실행하는 메인 스레드에서 시작하지만, 한 스레드만으로는...
Java -
Java 애플리케이션에서 첫 요청이 느린 이유: JIT 컴파일러와 JVM Warm-up
Java 기반 애플리케이션에서 첫 요청만 유독 느린 경우가 있다. 서버는 정상적으로 떠 있고, 헬스 체크도 통과했는데 실제 사용자의 첫 API 요청에서 응답 시간이 튀는 식이다. 이 현상은 보통 하나의 원인으로만 설명되지 않는다. 그중 JVM 관점에에...
Engineering -
자바 코드는 JVM에서 어떻게 실행될까?
자바를 처음 배울 때 가장 자주 듣는 말은 "Write Once, Run Anywhere"이다. 그런데 이 말은 자바 코드가 곧바로 모든 운영체제에서 실행된다는 뜻은 아니다. 자바 소스 코드는 먼저 JVM이 이해할 수 있는 바이트코드 로 컴파일되고,...
Engineering -
JVM 튜닝에서 -Xms와 -Xmx를 같은 값으로 두는 이유
프로덕션 서버의 JVM 옵션을 보다가 다음과 같은 설정을 자주 만나게 됐다. 처음 보면 조금 이상하다. Xmx 가 최대 힙 크기라면, 최대값만 넉넉하게 잡아두면 되는 것 아닐까? 왜 굳이 Xms 까지 같은 값으로 맞춰서 JVM이 시작하자마자 큰 힙을...
Java -
시스템 규모를 가정하고 추정하기
규모 추정은 시스템 디자인의 일부분이라고 볼 수 있다. 이 시스템 디자인은 소프트웨어 시스템의 구조를 계획하고 설계하는 과정이다. 이 과정은 시스템의 요구사항을 분석하고 최적의 솔루션을 설계하여 시스템이 효울적이고 확장 가능하며 유지관리가 용이하게 만...
Engineering -
서킷 브레이커을 사용헌 Redis 장애 전파 막기
운영 도중 레디스에 장애가 발생해 레디스에 의존하는 서비스의 특정 API가 마비되는 현상이 발견되었다. 현재 레디스는 여러 가지 용도로 사용이 되고 있는데 캐싱 용도로 사용되고 있는 레디스에서 네트워크 장애가 발생했고 그로 인해 레디스를 통해 캐시를...
Engineering -
JVM은 컴파일러일까, 인터프리터일까?
컴파일러 방식 컴파일러 방식은 고급언어로 작성된 프로그램을 목적 프로그램으로 번환후 링킹작업을 통해 실행파일을 생성한다. 기계어 번역과정에서 많은 메모리를 사용한다. 초기 스캔시간은 오래 걸리지만 한번 실행 파일이 만들어지고 나면 실행속도가 빠르다....
Engineering -
모집 마감일에 몰리는 지원서 제출 동시성 문제 해결하기
JECT 서비스는 모집 기간마다 지원자들의 지원서 데이터를 실시간으로 수신받아 관리합니다. 특히 지원서 제출은 모집 마감 직전 짧은 시간에 많은 요청이 몰리는 성향을 가지고 있다. 문제 상황 모집 마감 직전 등 짧은 시간에 동일 사용자가 제출 버튼을...
Engineering