Spring 3

쿼리 지옥 JPA의 N+1 문제를 둘러싼 오해

동료 분들이랑 대화를 하다가 JPA의 N+1 문제에 대한 이야기가 나왔습니다.사실 그동안은 N+1 문제에 대해 제대로 탐구해보지는 않았고, 면접 단골 문제라기에 그저 암기해 둔 수준에 불과했습니다.근데 대화를 하다 보니까 각자 정확한 문제 정의부터, 원인, 해결 방법까지 이해하고 있는 게 서로 조금씩 다르더라고요.혹시 제가 이해하고 있는 바가 틀릴 수도 있겠다는 생각과 명확하게 정리를 해놓고자 가볍게 자료들을 찾고 있었는데, 아래와 같이 저를 헷갈리게 하는 말들이 너무 많았습니다. "`LAZY` 때문에 N+1 문제가 발생한다.""`EAGER` 때문에 N+1 문제가 발생한다.""`EAGER`가 N+1 문제를 해결하는 방법이다.""`EAGER`로 로딩하면 `JPQL` 사용 시 N+1 문제가 발생하는 경우가 ..

Spring 2025.08.26

@Transactional 메서드에서는 Synchronized 동기화가 통하지 않는다?!?!?

소소하게 진행 중인 프로젝트에서 예상과 다르게 동작하는 부분이 있었는데요, 원인을 파악하고 문제를 해결해 가는 과정에서 새롭게 알게 된 내용들이 있어서 또 짧은 글 남기게 되었습니다. 🔍 목차# 00. 배경# 01. 실험 과정 및 문제 직면# 02. @Transactional은 프록시 기반 AOP# 03. 동기화를 하면서 원자성도 보장하기# 04. 지표 비교 # 00. 배경 단일 프로세스 멀티 스레드 환경에서 동시에 요청을 보내 레이스 컨디션을 유발시키고 자바 수준에서 처리할 수 있는 여러 가지 동기화 방법들(Synchronized, ReentrantLock, StampedLock 등)을 적용해 보는 시간을 가지고 있었습니다. 사실 이렇게 자바 수준에서 적용하는 Lock들은 결국 단일 프로세스 내에서의..

Spring 2025.08.19

컨트롤러 요청/응답 가로채기, 스프링 인터셉터(Interceptor)

취미로 계속 만지고 있는 사이트에서 일별 사용자 수를 모니터링할 수 있으면 좋겠다고 생각했습니다.여러 가지 방법이 있겠지만 저는 프론트에서 GA를 붙이는 방법과 백엔드에서 직접 DB에 로깅을 하는 방법 두 가지를 시도했습니다.DB에 직접 로깅하는 방식에 대해 고민하고 알아보면서 공부하게 된 스프링 인터셉터에 대해 정리하고자 글을 남겨놓게 되었습니다. 🔍 목차00. Interceptor?01. Interceptor 구조 / 동작 흐름02. HandlerInterceptor 메서드03. Interceptor 등록 방법04. Interceptor vs Filter # 00. Interceptor? 인증·인가, 로깅 등 스프링에 매핑된 모든 핸들러 요청에 대해 일관적인 처리를 해야 할 때가 있습니다. 이..

Spring 2025.05.13