transactional, proxy, (N + 1) issue
🍁 transactional
- With transactions configured, we can now annotate a bean with @Transactional either at the class or method level.
- Spring creates proxies for all the classes annotated with @Transactional.
- 클래스, 메서드 위 선언적 트랜잭션(@Transactional)을 통해 프록시 오브젝트가 생성되어 요청이 들어왔을 때 이를 가로채 트랜잭션 처리한다.
- 가령, 사용자가 회원 정보 수정시,
스프링의 Controller.Service 호출 - 프록시가 요청 가로채 트랜잭션 시작 - updateMember 로직 처리(updateMember 메서드는 트랜잭션 선언되어있음) - 트랜잭션 종료(commit or rollback)
- JPA가 제공하는 Repository의 모든 메소드는 @Transactional이 적용되어 있음.
🍁 proxy
- proxy server는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템 / 응용 프로그램을 가리킨다.
- 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다.
🍁 (N + 1) issue
- 하위 Entity들을 첫 쿼리 실행시 한 번에 가져오지 않고, Lazy Loading으로 필요한 곳에서 사용되어 쿼리가 실행됨.
- 조회시 바로 가져오고 싶은 Entity field를 지정하는 것이 한 가지 방법.(join fetch a.자식들)
- @EntityGraph의 attributePaths에 쿼리 수행시 바로 가져올 필드명을 지정하면 Lazy가 아닌 Eager조회로 가져오는 것이 두 번째 방법.