시작이 반

[JPA] xToMany - ManyToX 본문

Programming/JPA

[JPA] xToMany - ManyToX

G_Gi 2021. 5. 29. 02:28
SMALL

생각나는 것 정리...

XToOne 일 경우에는 LAZY 설정을 해야 한다.!!!! 꼭
@XToOne (fetch = FetchType.LAZY)

양방향 연관 관계일 때 API로 호출이 된다면 무한루프가 일어날것이다.

public class Order {

    @Id
    @GeneratedValue
    @Column(name = " order_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;
}
public class Member {

    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}


Order 조회 -> Member 조회 -> List<Order> 조회 -> Member 조회 ...............

이 경우를 방지하기 위해서

@JsonIgnore의 옵션을 한곳에 주어야 한다.

public class Member {

    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    @JsonIgnore
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}



다시 api를 통해 order를 조회 해보면 에러가 뜬다.
왜냐 Lazy설정은 바로 DB를 조회하는 것이 아니기 때문에 Proxy로 생선된 가짜 객체개 들어가게된다.

이를 해결하기 위해서는 hibernate5Module를 사용하여 무시를 해버린다.

	implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'

	@Bean
	Hibernate5Module hibernate5Module() {
		return new Hibernate5Module();
	}

그러면 조회를 하면 order의 member는 null로 조회가 된다 (Lazy설정이기 때문에 무시)

API라는 것은 엔티티를 바꿔도 규격이 변하면 안된다.
정말 간단한 애플리케이션이 아니면 엔티티를 API 응답으로 외부로 노출하는 것은 좋지 않다. 따라서 Hibernate5Module 를 사용하기 보다는 DTO로 변환해서 반환하는 것이 더 좋은 방법이다.

DTO를 사용하자!!

LIST

'Programming > JPA' 카테고리의 다른 글

[JPA] One To Many에서 join fetch ( 페이징 )  (1) 2021.06.07
[JPA] 1 + n 조회, x To One에서 join fetch  (0) 2021.05.29
[JPA] 변경감지와 병합(merge)  (1) 2021.05.27
[JPA] DTO, Domain(Entity)  (0) 2021.02.19
[JPA] 연관관계  (0) 2021.02.18