Controller에서 응답 객체나 요청 객체를 받을 때 Entity를 그대로 사용하는 것보다 DTO를 사용하는 것이 권장된다.
엔티티란,
도메인의 핵심 로직과 속성을 갖고 있고, 실제 DB의 테이블과 매칭되는 클래스이다.
DTO를 사용해야 하는 이유
- 엔티티 내부 구현을 캡슐화할 수 있다.
- 위의 엔티티의 정의에 따라, 엔티티가 getter, setter를 갖게 된다면 controller와 같이 비즈니스 로직과 크게 상관없는 곳에서 자원의 속성이 실수로 변경될 수 있다.
- 또한 엔티티를 UI 계층에 노출하는 것은 테이블 설계를 화면에 공개하는 것과 다름없기에 보안적으로도 바람직하지 못하다.
- 화면에 필요한 데이터를 선별할 수 있다.
- 순환참조를 예방할 수 있다.
- JPA로 개발할 때, 양방향 참조를 사용하면 순환참조를 조심해야 한다....
- 이때 양방향 참조된 엔티티를 컨트롤러에서 응답으로 리턴하게 되면, 엔티티가 참조하고 있는 객체는 지연 로딩되고, 로딩된 객체는 또 다시 본인이 참조하고 있는 객체를 호출하게 된다. 이렇게 서로 참조하는 객체를 계속 호출하면서 결국 무한 루프에 빠지게 된다.
- 물론 이 순환참조의 근본적인 원인은 양방향 매핑 자체에 있다고도 할 수 있지만, 양방향 참조가 부득이한 상황이라면 순환참조가 일어나지 않도록 응답의 return으로 DTO를 두는 것이 안전하다.
- Validation 코드와 모델링 코드를 분리할 수 있다.
- Entity -> @Column, @JoinColumn, @ManyToOne..
- Validation -> @NotNull, @NotEmpty.. 같은 코드 분리 가능
https://tecoble.techcourse.co.kr/post/2020-08-31-dto-vs-entity/
'개발 > Spring' 카테고리의 다른 글
싱글톤 LazyHolder 적용해보기 (0) | 2023.08.03 |
---|---|
spring-data-jpa Repository에서 Entity로 반환받는 이유 (0) | 2023.08.02 |
@Transactional 동작원리와 public method calls private method에서의 트랜잭션 적용 여부 (0) | 2023.08.02 |
연관관계 매핑된 Entity 생성하기 (0) | 2023.08.01 |
JPA OSIV(Open Session In View)와 성능 최적화 (0) | 2023.07.12 |
댓글