Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- java알고리즘문제풀이
- 격파르타장점
- java 자료구조 활용
- java알고리즘
- java최솟값구하기
- java set 출력
- 항해99후기
- java set 저장
- 항해15기
- 컴파일
- java map
- 격파르타합격후기
- java list 저장
- sqld자격증합격
- javaJRE
- 코딩부트캠프후기
- java list 출력
- 프로그래머스
- java map 저장
- java참조자료형
- javaJVM
- 격파르타후기
- 인터프린터언어
- 프로그래머스제일작은수
- 작은수제거하기
- 격파르타비전공자
- java기본자료형
- 비전공자sqld
- java map 출력
- 노베이스부트캠프
Archives
- Today
- Total
코딩과 결혼합니다
230816 - Controller에서 JPA Entity를 반환하면 안되는 이유 본문
728x90
Controller에서 api 응답을 Entity로 하는 경우에 생기는 문제점들에 대한 이해를 하고자 한다.
1. 순환 참조
두 테이블이 양방향 관계로 맺어졌을 때
- 컨트롤러에서 @ResponseBody를 통해 응답할 경우 스프링 부트는 HttpMessageConverter로 Jackson 라이브러리를 이용한다.
- A Entity를 응답으로 내보내려 하면 Jackson의 ObjectMapper는 객체를 Json으로 변환하는데, 이때 영속성 컨텍스트가 살아있기 때문에 양방향 맵핑이 된 다른 B라는 Entity가 영속성 컨텍스트에 있다면 객체 그래프를 탐색할 것이고, 영속성 컨텍스트가 없다면 지연 로딩으로 설정된 프록시를 초기화 하여 직렬화 한다.
- 또한 영속 상태인 B Entity에서도 맵핑 관계인 A를 직렬화 하기 위해 다시 객체 그래프를 탐색하는 과정이 발생하여 결국 무한으로 순회하게 된다.
2. 오버패칭(overfetching)
클라이언트가 필요로 하지 않는 데이터까지 프론트쪽으로 모두 보냄으로 자원을 낭비하게 된다.
DTO의 사용으로 불필요한 데이터를 사용하지 않을 수 있기에 비효율적인 면을 줄일 수 있다.
3. 의존성
repository layer를 제외한 다른 계층에서 특정 기술에 의존성이 생길 수 있다. 스프링에서 추구하는 설계는 내부 기술을 최대한 숨기고 의존성을 줄이는 데 있다. Entity를 계층 간 주고 받는 의존 관계가 강한 설계는 수정을 해야 할때 연관된 다른 많은 곳에서의 수정이 불가피해진다.
+ 순환참조가 일어났을 때~
- @JsonIgnore
- 해당 어노테이션이 붙은 필드는 직렬화되지 않고 null이 할당됩니다.
- 양방향 순환 참조를 해결하기 위한 용도는 아니고, 해당 필드를 Json으로 직렬화하고 싶지 않은 경우 사용하는 용도입니다.
- @JsonManagedReference, @JsonBackReference
- 해당 어노테이션은 순환 참조를 방어하기 위한 어노테이션입니다.
- @JsonManagedReference는 정상적으로 직렬화를 진행합니다.
- @JsonBackReference는 직렬화에서 제외합니다.
- DTO를 사용한다.
'2세 > Spring' 카테고리의 다른 글
[Kotlin] 프로젝트 생성과 환경설정 (1) | 2024.01.20 |
---|---|
[Kotlin] 개념과 기초 문법 (0) | 2024.01.20 |
230727 - @Transactional 을 사용하는 이유 (0) | 2023.07.27 |
230726 - Spring Transaction (0) | 2023.07.26 |
230725 - .gitignore가 적용되지 않을 때 Git 캐시 삭제 (민감 정보 감추기 ) (0) | 2023.07.25 |