SpringBoot JPA 지연 로딩

song yuheon·2023년 9월 6일
1

Spring

목록 보기
54/93
post-thumbnail

Spring과 JPA를 사용할 때, 지연 로딩은 주로 엔터티 간의 관계에서 사용된다.

우리에게 UserPost 두 개의 엔터티가 있다고 하자. 한 User는 여러 Post를 가질 수 있다.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Post> posts = new ArrayList<>();
    
    // getters, setters, etc.
}

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    
    // getters, setters, etc.
}

User 엔터티와 Post 엔터티 사이의 관계는 OneToManyManyToOne으로 설정되어 있다. fetch = FetchType.LAZY는 지연 로딩을 나타낸다.

  1. User 엔터티를 데이터베이스에서 로드할 때, 해당 UserPost 목록은 바로 로드되지 않는다.
  2. 해당 UserPost 목록에 접근하려고 할 때 (user.getPosts() 호출 시) 그제서야 데이터베이스에서 해당 Post 목록을 로드한다.

이런 방식의 장점은 User만 필요하고 Post는 필요 없는 상황
( User 엔터티의 기본 속성들에만 관심이 있고 해당 User가 작성한 Post들에는 관심이 없는 상황. 즉 User의 모든 속성에 접근할 수 있지만 User와 연관된 Post 목록에는 접근하지 않는 상황)에서 불필요한 데이터베이스 접근을 피할 수 있다는 것이다. 하지만, Post 목록에 처음 접근할 때 추가적인 데이터베이스 쿼리가 발생하므로 이 점을 주의하면서 설계해야 한다.

또한 지연 로딩을 사용할 때 주의할 점은 트랜잭션 밖에서 지연 로딩된 컬렉션에 접근하면 LazyInitializationException이 발생할 수 있다. 따라서 필요한 데이터를 트랜잭션 범위 내에서 미리 로드하거나, 서비스 레이어에서 적절한 로직을 추가하여 이 문제를 회피해야 한다.

지연 로딩의 장단점

  • 지연 로딩의 장점
    초기 로딩 시간을 줄일 수 있다.
    불필요한 데이터를 로딩하지 않아 시스템의 효율성을 높일 수 있다.

  • 지연 로딩의 단점
    실제 데이터에 접근해야 할 때 추가적인 쿼리가 발생할 수 있다.
    예상치 못한 시점의 데이터베이스 쿼리 발생으로 인한 성능 이슈가 있을 수 있다.

profile
backend_Devloper

0개의 댓글