반응형
다음과 같이 DB에 있는 모든 주문 내역을 조회하기 위해 API를 만들었을때
Entity를 그대로 반환하게 된다면 다음과 같은 문제가 발생한다.
order -> members , order -> delivery 는 지연로딩
members, delivery에 프록시로 있는게 아닌 실제 값이 있다면 상관없지만
다음과 같은 경우 에러가 발생하게 된다
이것부터 귀찮아짐
members, delivery에는 실제 Entity 대신에 프록시로 존재하는데
Jackson라이브러리는 기본적으로 이 객체를 json으로 어떻게 생성하는지 모르기 때문에 다음과 같은 예외가 발생한다
해결방법
Hibernate5Module을 스프링 빈으로 등록해서 해결하면 사용가능하다.
Hibernate5Module 등록 후
Hibernate5 를 등록하게 된다면
order -> member, member-> orders 양방향 연관관계를 계속 로딩하게 된다
따라서 @JsonIgnore 옵션을 한곳에 줘야한다.
아니면 무한루프 발생한다
그렇다면 지연로딩 을 피하기 위해 즉시 로딩을 한다면 (LAZY -> EARGR)
이것또한 괜찮아 보이지만
필요 없는 경우에 데이터를 항상 조회하기에 성능 문제가 발생한다 .
LAZY : 필요할때 데이터 불러오기
EARGR : 해당 객체 부를때 모든 연관관계에 대한 정보도 같이 가져오기
라고 생각하면 되는데
당연하게도 EARGR로 하면 모든 정보를 불러오기에 성능개선할것도 없고 필요한것만 반환하는 API 스펙과도 맞지않는다.
결론 우리는 이러한 이유로 인해 DTO로 변환하여 반환하자
이러한 문제들을 접하면서 사실 DTO로 변환해서 반환 하는것이
사실은 귀찮고 쓸데없는 일이 아닌 오히려 더 편한 일로 보여진다.
반응형
'Spring' 카테고리의 다른 글
[Spring] 컬렉션 Entity -> DTO 성능최적화 (1) | 2024.01.05 |
---|---|
[Spring] Entity를 DTO로 반환 후 성능 최적화 (fetch join) (1) | 2024.01.04 |
[Spring] @RequestBody HTTP 메시지 바디 처리하는 어노테이션 (0) | 2023.08.18 |
[Spring] @RequestParam 요청 파라미터 데이터 읽어오기 (0) | 2023.08.17 |
[Spring] @ModelAttribute 객체 생성후 바인딩까지 자동으로 (0) | 2023.08.16 |