TIL - FetchType.EAGER / FetchType.LAZY

su·2023년 8월 8일
0

TIL

목록 보기
60/93
post-thumbnail

FetchType

FetchType은 엔티티 간의 관계를 로딩 할 때, 어떻게 가져올 지를 지정하는 것
EAGERLAZY가 있다

FetchType.EAGER

연관 엔티티를 즉시 로딩하는 방식
해당 엔티티가 로딩 되는 시점에 관련된 엔티티들도 함께 로딩 (즉시 필요한 모든 데이터가 로딩되는 것)
다만 불필요한 데이터를 로딩할 수 있음에 주의해야 함

FetchType.LAZY

연관 엔티티를 실제로 사용할 때 로딩하는 방식
엔티티 자체는 초기에 필요한 데이터만 로딩하고, 연관된 엔티티의 경우 실제 접근될 때 로딩
연관 엔티티를 사용하지 않는 경우 불필요한 데이터 로딩이 없음

Post와 Comment의 1:N 관계 매핑

게시글과 댓글을 1:N 관계로 매핑했다.

@Entity
@Table(name = "post")
public class Post {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    /* 내용 생략 */

	@OneToMany(mappedBy = "post")
    @Column(name = "comments")
    List<Comment> comments = new ArrayList<>();
}
@Entity
@Table(name = "comment")
public class Comment {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    /* 내용 생략 */

	@ManyToOne
    @JoinColumn(name = "post_id")
    private Post post;
}

연관 관계를 이렇게 매핑해두고, post를 조회하는 순간 오류가 발생했다.

org.hibernate.LazyInitializationException: could not initialize proxy [~~] 
- no Session
	at org.hibernate.proxy.AbstractLazyInitializer.initialize
    (AbstractLazyInitializer.java:164)
    ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation
    (AbstractLazyInitializer.java:310)
    ~[hibernate-core-6.2.6.Final.jar:6.2.6.Final]
	at ...

다시 오류 내용을 읽어보니, 로딩 방식에서 문제가 있었던 것 같다.

LAZY 설정이라 오류가 난 듯 한데,,, @OneToMany 에너테이션은 기본 설정값이 LAZY로 되어 있어서, 필요에 따라 타입을 변경해주어야 할 것 같다.

나의 경우, Post에서 항상 Comment를 조회해야 하므로 EAGER 타입으로 설정해두어도 상관이 없어서, fetchType을 EAGER로 바꿔봤다.

@Entity
@Table(name = "post")
public class Post {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    /* 내용 생략 */

	@OneToMany(mappedBy = "post", fetch = FetchType.EAGER)
    @Column(name = "comments")
    List<Comment> comments = new ArrayList<>();
}

이렇게 코드를 변경한 뒤 실행하니까 원하는 대로 잘 동작했다 !

아직도 의문인 점은, 이전에 했을 때는 fetch를 따로 지정해주지 않아도 원하는 대로 동작을 했었는데, 왜 이번에 할 때는 문제가 생긴건지 .. 모르겠다 ...

profile
(❁´◡`❁)

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

유익한 자료 감사합니다.

답글 달기