읽기 경로
조회가 느려질 때는 SQL 수와 로딩 범위를 먼저 좁힙니다.
ORM이 편해 보여도 실제 병목은 반복 SELECT, 메모리 페이징, 오래 열린 세션에서 드러납니다.
1
쿼리 로그
관측
같은 SELECT가 화면 하나에서 반복되는가?
개발 중에는 SQL 로그와 바인딩 값을 항상 켜 두고, 예상보다 많은 쿼리가 보이면 N+1부터 의심합니다.
2
Fetch Join + 페이징
조회
컬렉션 1:N을 JOIN한 채로 페이지를 자르고 있는가?
페이지네이션은 DB가 하게 두고, 연관 컬렉션은 @BatchSize나 DTO 조회로 분리해 메모리 페이징을 피합니다.
3
OSIV
경계
세션이 응답 끝까지 열려 커넥션을 오래 잡고 있지 않은가?
API 서버라면 보통 OSIV=false 쪽이 안전합니다. Lazy 로딩이 필요하면 서비스 계층 안에서 조회를 끝냅니다.