글쓴이 이름: Hoony

백엔드 개발자. JPA/Spring으로 밥 벌어먹고, AI 코딩 에이전트를 실무에 붙이는 실험을 계속하고 있습니다. 개발 얘기와 아들 키우는 얘기를 같이 씁니다.

WebFlux 이벤트 루프에 블로킹 호출이 섞였을 때 요청이 밀리는 구조 비교 다이어그램
Spring

WebFlux BlockHound 적용과 Kafka 에러

WebFlux로 고성능 애플리케이션을 만들어야 해서 블로킹 코드 검출 도구인 WebFlux BlockHound 를 적용했습니다. kafkaTemplate.send()가 첫 호출에서만 BlockingOperationError를 발생시켜서, 원인을 찾아본 기록입니다.

JPA 상속 매핑 전략 SINGLE_TABLE JOINED TABLE_PER_CLASS 비교 다이어그램
JPA

JPA 상속 관계 매핑 전략 3가지 비교 (8편)

JPA 상속 관계 매핑 전략인 SINGLE_TABLE, JOINED, TABLE_PER_CLASS 를 각각 H2 에 올려 테이블이 몇 개 생기고 어떤 쿼리가 나가는지 직접 찍어봤다. JOINED 의 case 문과 TABLE_PER_CLASS 의 UNION ALL 까지.

Auto Increment, UUID v4, 시퀀셜 UUID, TSID 기본키 전략 비교 표
JPA

PK 전략 비교: Auto Increment vs UUID vs TSID

Auto Increment 로 충분한 줄 알았는데 MSA 에서 PK 가 겹쳤다. PK 전략 비교를 처음부터 다시 했다. UUID 가 인덱스를 망가뜨리는 두 가지 이유와 TSID, 그리고 이미 만든 테이블은 어떻게 할지.

JPA Cascade 전파 범위와 @Transactional self-invocation 문제 다이어그램
JPA

Cascade·@Transactional 함정 (JPA 7편)

cascade 에 습관적으로 ALL 을 박으면 부모 삭제가 자식까지 전이된다. delete 한 번에 DELETE 3번 나가는 로그와, 같은 클래스 내부 호출에서 @Transactional 이 안 먹는 이유.

JPA ManyToMany 숨겨진 조인 테이블과 중간 엔티티 비교 다이어그램
JPA

@ManyToMany 대신 중간 엔티티 쓰기 (JPA 6편)

@ManyToMany 대신 중간 엔티티를 쓰는 이유. 컬럼 추가가 안 되고 쿼리도 예측이 안 된다. 조인 컬럼명이 courses_id 로 나오는 실제 로그와 함께, 중간 엔티티로 푸는 정석을 정리했다.

JPA OSIV open-in-view 옵션 켜짐 꺼짐 커넥션 보유 시간 비교 다이어그램
JPA

JPA OSIV, 기본값 true의 성능 함정 (5편)

스프링 부트 기본값이라 그냥 쓰고 있었던 JPA OSIV, 사실 트래픽 몰리면 커넥션 풀 고갈로 장애까지 이어질 수 있는 옵션이었어요. 꺼야 할지 말지 실무 기준까지 정리해봤습니다.

JPA N+1 문제 지연로딩 batch_fetch_size fetch join 비교 다이어그램
JPA

JPA N+1 문제 해결법 3가지 (4편)

findAll() 한 번에 SELECT 가 우르르 나가는 이유와 JPA N+1 문제 해결 방법 세 가지. 팀 3개에 쿼리 4번 나가는 로그부터 batch_fetch_size 로 2번이 되는 로그까지 직접 찍어서 실었다.

위로 스크롤