Java
118개의 글
가상 스레드가 synchronized에서 고정될 때
Tomcat 10.1부터 요청 처리를 가상 스레드로 돌릴 수 있게 되면서, 스레드 풀 튜닝에 쏟던 고민이 한결 줄었다. 그런데 막상 운영에 올려보면 "가상 스레드를 켰는데 동시 처리량이 기대만큼 안…
자바 스레드 덤프 분석하는 법
장애 대응을 하다 보면 "서버는 살아 있는데 요청이 안 돌아온다"는 연락을 받을 때가 있다. 로그에는 에러가 한 줄도 없고, 재시작하면 멀쩡해져서 원인은 확인도 못 한 채 넘어간다. 재시작 버튼을 …
자바 OOM 자동 힙덤프로 누수 객체 찾기
운영 중인 자바 애플리케이션이 한밤중에 OutOfMemoryError: Java heap space 를 던지고 죽는 일은 드물지 않다. 문제는 다음날 아침 로그를 열어봐도 "힙이 모자랐다"는 사실만…
RDS 페일오버 후 자바가 옛 IP로 붙을 때
DB 페일오버 자체는 몇십 초면 끝난다. 그런데 애플리케이션만 한참을 옛 IP에 매달려 있다가 결국 재기동으로 푸는 경우를 현장에서 자주 본다. 스탠바이로 승격은 됐고 DNS도 새 IP를 가리키는데…
Java 8에서 Java 25로 올릴 때 확인할 것
Java 8 지원 종료 이야기가 나올 때마다 "다음 분기에 하자"며 미뤄 둔 업그레이드 프로젝트가 어느 조직에나 하나쯤 있다. Tomcat 위에서 몇 년째 조용히 돌아가는 서비스라면 더 그렇다. 이…
RestClient로 동기 HTTP 클라이언트 갈아타기
서버 사이드에서 외부 API를 호출하는 코드는 대부분 RestTemplate 으로 짜여 있다. 그런데 요즘 새 프로젝트를 열어보면 자동완성에서 RestClient 가 먼저 뜬다. WebFlux를 쓰…
ExecutorService로 병렬 호출하면 왜 스레드가 새는가 - JDK 25 구조적 동시성 StructuredTaskScope로 실패 시 자동 취소
서비스 하나가 화면을 그리려고 회원 정보, 주문 내역, 추천 목록을 각기 다른 API에서 끌어오는 구조는 어디에나 있다. 순차로 부르면 느리니 병렬로 묶는데, 이때 ExecutorService 와 …
Spring Boot에서 Logback JSON 구조화 로깅
운영 중인 서비스에서 장애 원인을 좇다 보면 로그가 텍스트 한 줄로 흩어져 있어 특정 요청만 뽑아보기 어려운 경우가 많다. 톰캣 접근 로그와 애플리케이션 로그를 grep으로 맞춰 보다가 시간만 쓴 …
Java 17과 Java 25의 차이 - 두 LTS 사이에 바뀐 것과 업그레이드 확인 목록
운영 중인 서비스의 JDK 버전을 물어보면 아직 17이라는 답을 제일 많이 듣습니다. 8에서 17로 넘어오면서 한 번 크게 고생한 기억이 남아 있으면 당분간 런타임에 손대기 싫어지는 것도 당연하죠.…
Spring Boot JPA N+1 쿼리 진단과 해결: generate_statistics, fetch join, @EntityGraph, @BatchSize
코드 리뷰나 성능 점검을 하다 보면 JPA N+1 얘기를 반복해서 하게 된다. 목록 화면 하나 열었을 때 쿼리가 몇 개 나가는지 물어보면 답이 바로 안 나오는 경우가 많고, 원인을 찾은 뒤에도 fe…
Spring @Cacheable 상속 시 파라미터명 불일치로 인한 캐시 키 충돌 문제 해결
발단: "왜 다른 데이터가 나오죠?" API 개발 중 황당한 버그를 만났습니다. GET /api/items?category=A → A 카테고리 데이터 ✓ GET /api/items?category=…
HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=15m45s854ms). 메시지는?
2026-01-25 08:17:33 - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=15m45s854ms).…
JDK17은 어떻게 C10k를 해결했을까?
🔹 JDK 17 이전에도 이미 Reactive Streams가 존재했음 • JDK 9(2017년)에 java.util.concurrent.Flow 패키지가 추가되면서 Reactive Streams…
Tomcat에 JPetStore (MyBatis) 올리기 + HSQLDB가 아닌 MySQL 연결하기
1. JPetStore 설정 JPetStore 소스는 https://github.com/mybatis/jpetstore-6 에 있는 것을 사용하였다. git clone https://github.c…
와탭 자바 에이전트로 Spring Cloud Gateway 모니터링하기
1. 배경 기본 와탭 자바 에이전트로는 Spring Cloud Gateway 모니터링 불가 별도로 제공되는 위빙(Weaving) 기능을 사용해야 함 2. 지원 버전 제공되는 위빙 플러그인 버전 : …
IBM JVM 주요 Parameter 설명
IBM JVM의 주요 Parameter를 설명하는 문서이다. 옵션 기본값 설명 Xclasshc TRUE . 클래스로더가 변했을 때만 Class GC를 수행할지 여부 Xalwaysclassgc . G…
Spring IOC - ApplicationEventPublisher
개요 옵저버 패턴의 구현체로서, 이벤트 기반의 프로그래밍을 할 때 유용한 인터페이스. 실습을 위한 주요 구성 요소 퍼블리셔, 이벤트, 이벤트핸들러 이벤트 ApplicationEvent 상속 publ…
JMC(JDK Mission Control) 8.1 릴리스 - JMC Agent를 통한 JVM 성능 모니터링
1. 개요 최근 JMC(JDK Mission Control) 8.1가 릴리스 되었다. 이 버전부터 JMC Agent 플러그인이 즉시 제공되므로 성능 모니터링 요구 사항에 대해 쉽게 활용 가능하다. …
Feign Client
1. 소개 Netflix에서 만든 것으로 웹 서비스 클라이언트를 보다 쉽게 개발할 수 있도록 도와주는 도구이다. 2. 사용법 의존성 추가 (spring-cloud-starter-feign) @Ena…
HttpUrlConnection을 이용하여 REST API 호출하고 JSON 받기
1. 코드 import org.json.JSONException; import org.json.JSONObject; import java.io.*; import java.net.HttpURLConn…
JavaDockerizing Spring Boot Application
Spring Boot 애플리케이션을 Docker 환경에 배포하기 위해서는 크게 4가지의 과정이 필요하다. Spring Boot 애플리케이션 만들기 Dockerfile 만들기 Dockerfile을 빌…
ZGC(Z Garbage Collectors)
Java 11 버전의 GC는 많은 개선과 변화를 가지고 왔다. ZGC(Z Garbage Collectors)란? ZGC는 아래의 목표를 충족하기 위해 설계된 확장 가능하고 낮은 지연율(low lat…
[Spring Boot] Spring Data JPA & MongoDB 암호화 처리
JPA를 사용해 MongoDB를 연동하는 과정에서 MongoDB 내에 값을 암호화해야 하는 경우가 있다. 이에 spring-data-mongodb-encrypt 라는 암호화 모듈 제공파일을 사용하여…
ThreadLocal이란?
1. 개요 ThreadLocal에 대해 알아본다. 2. 역사 자바 1.2 버전부터 제공되고 있다. 3. 목적 스레드 단위로 로컬 변수를 할당하는 기능이다. 일반적인 변수는 메소드, for 블록 등 …