Dev/Backend

[Spring] Lazy Loading

kimyoungrok 2024. 3. 24. 01:42
728x90

Lazy Loading

데이터 로딩 전략 중 하나로 연관 데이터를 실제로 필요한 시점에만 로드하는 방식

조회한 객체와 연관된 객체를 한 번에 불러오면 불필요한 데이터까지 불러올 수 있기 때문에 이를 방지하기 위해 사용된다.

 

JPA에 의해 관계 매핑 어노테이션이 적용된 필드에만 Lazy Loading이 기본값으로 적용되며 null값이 들어간다.

 

연관 객체의 호출

Lazy Loading 전략에 의해 연관 객체 필드는 null을 가진다.

그렇다면 어떻게 연관 객체를 가져올까?

 

연관 객체에 대한 접근시 JPA구현체의 영속성 컨텍스트가 이를 감지하고 연관 객체를 가져오기 위한 추가 쿼리를 자동으로 생성한다.

 

테스트와 실제 서비스의 차이

테스트 코드에서는 DB에서 조회 객체를 가져온 후 DB와의 세션이 종료된다.

따라서 연관 객체를 조회하면 오류가 발생한다.

이는 각 동작이 별개의 트랜잭션으로 구분되기 때문이다.

 

@Transactional 어노테이션을 사용해 메서드 내부의 명령을 하나의 트랜잭션으로 묶어준다면, 테스트 코드에서도 DB세션이 종료되지 않은 상태로 연관 객체에 대한 추가 쿼리를 생성한다.

 

 

실제 서비스에서는 DB와의 세션이 끊기지 않기 때문에 @Transactional 어노테이션을 사용하지 않아도 된다.

 

728x90