즉시로딩, 지연로딩

징징이·2024년 7월 7일

JPA

목록 보기
4/7

즉시 로딩, 지연 로딩

  • 즉시 로딩은 데이터 조회 시 연관된 데이터까지 한 번에 불러오고, 지연로딩은 필요한 시점에 연관된 데이터를 불러온다.

Fetch Type

  • JPA가 하나의 Entity를 조회할 때 연관관계에 있는 객체들을 어떻게 가져올 것인지를 나타내는 설정값이다.

    (default) @xxToOneEAGER, @xxToManyLAZY

즉시 로딩(Eager Loading)

  • 엔티티가 조회될 때 연관된 엔티티들도 함께 조회된다.

  • 성능에 부담을 줄 수 있으나 즉시 필요한 데이터를 빠르게 조회할 수 있다.

    @Entity
    public class Member {
    
        @Id @GeneratedValue
        private Long id;
        private String username;
    
        @ManyToOne(fetch = FetchType.EAGER) //Team을 조회할 때 즉시로딩을 사용하겠다!
        @JoinColumn(name = "team_id")
        Team team;
    }
    
    @Entity
    public class Team {
    
        @Id @GeneratedValue
        private Long id;
        private String teamname;
    }
  • JPQL로 Member 1건 조회

Member findMember = em.createQuery("select m from Member m", Member.class).getSingleResult();
  • Member 조회 시점에 바로 Team까지 불러오는 쿼리를 날려 한꺼번에 데이터를 불러온다.

지연 로딩(Lazy Loading)

  • 실제로 연관된 엔티티가 필요할 때 조회된다.

  • 성능을 최적화할 수 있으나, 사용 시점에 데이터베이스 조회가 발생한다.

    @Entity
    public class Member {
    
        @Id @GeneratedValue
        private Long id;
        private String username;
    
        @ManyToOne(fetch = FetchType.LAZY) //Team을 조회할 때 지연로딩을 사용하겠다!
        @JoinColumn(name = "team_id")
        Team team;
    }
    
    @Entity
    public class Team {
    
        @Id @GeneratedValue
        private Long id;
        private String teamname;
    }
    Member findMember = em.createQuery("select m from Member m", Member.class).getSingleResult();
    • Member를 조회하는 시점이 아닌 Team을 사용하는 시점에 쿼리가 나간다.

만약 member와 연관된 Team이 1000개라면?

  • 즉시로딩에서는 member 조회를 할 때 Team조회 SQL쿼리가 1000개가 나갈 수 있다. 따라서 가급적이면 기본적으로 지연로딩 사용하는 것이 좋다.
profile
초보 개발자의 개발 공부

0개의 댓글