왜 엔티티를 직접 사용하지 말고 DTO를 사용해야 하는 걸까?
- DTO와 Entity 구분
- DTO(Data Transfer Object): 클라이언트와 서버 간 데이터 전송을 위해 설계된 객체
- Entity: 데이터베이스에 저장되는 데이터 객체로, 데이터베이스와 직접적으로 연결
- Entity를 직접 반환할 경우 생기는 문제점
- 필요한 데이터만 전송하기 어렵다. 엔티티를 직접 반환하면 엔티티에 존재하는 모든 데이터가 반환된다. 모든 데이터를 반환하게 되면 트래픽이 증가할 수 있으며 성능 및 비용면에서도 현저한 차이를 가져올 수 있다. 즉, 사용자가 필요로 하는 데이터만 전송하기 어려움이 있다. 이로 인해 불필요한 데이터를 사용자에게 전달될 수 있다.
- 보안 문제가 생긴다. 엔티티를 반환하면 테이블을 공개하는 것이나 다름없으므로 민감한 정보가 노출될 가능성이 있다.
- DTO와 Entity를 분리하여 얻는 장점
- 필요한 데이터만 선별하여 서버 사용량을 최소화 할 수 있다. DTO는 서버에서 클라이언트에 데이터를 전송하는 데 사용된다. 따라서 Entity 범위에서 필요한 필드를 재정의하여 필요한 데이터만 전송될 수 있도록 할 수 있다. 이로 인해 전송하는 데이터양과 네트워크 대역폭 사용량이 최적화되어 더 빠른 응답시간과 전송시간을 얻을 수 있다.
- 엔티티 구조가 변경되어도 안전하다. 엔티티 구조가 변경되더라도 DTO를 사용하여 데이터 전송을 처리하면 이 변경 사항이 클라이언트에 직접적 영향을 미치지 않는다. 서버 간의 결합도를 낮추고 유지보수가 용이해진다.
- 보안이 강화된다. DTO와 Entity를 분리함으로써, 테이블 구조는 서버측에서만 알 수 있으므로 해커들이 데이터를 조작하는 것을 어렵게 할 수 있다. 따라서 DTO와 Entity를 분리하여 API 보안성을 강화시킬 수 있다.
- DTO와 Entity의 변환 위치
- 컨트롤러에서는 DTO의 형태로 데이터를 받아 서비스에 전달한다.
- 서비스에서는 비즈니스 로직을 수행하며 데이터 처리를 담당한다. 컨트롤러에서 받은 DTO를 Entity로 변환하고, 필요한 작업을 수행한 뒤에 Repository에 Entity를 전달한다.
- 레파지토리에서는 Entity를 전달 받아 영속화를 처리한다.
- Entity와 DTO 변환 메서드 구현
- toEntity(), toDto() 같은 메서드를 DTO 클래스에 직접 변환 메서드를 구현하여 상호 변환을 수행할 수 있다.
출처
'TIL > JPA' 카테고리의 다른 글
@Entity, @Table 차이점 (0) | 2024.01.18 |
---|---|
@Transaction(readOnly=true) (1) | 2023.11.22 |