"엔티티를 직접 클라이언트에게 노출되면 위험해~ 안 좋아~"
라는 말은 많이 듣곤 했다.
처음에는 그런가보다... 강사를 따라서 DTO를 만들어 반환하곤 했다.
왜??? 라는 걸 하기에 따라가기도 벅찼던 그 시절...⭐
그런데 이제는 프로젝트를 하게 되면서
"그래서 DTO가 뭐의 약자인 거지?"라는 의문이 들면서
왜 DTO로 반환을 해야하는 것인지 제대로 짚고 넘어가야겠다고 생각했다.
Date Transfer Object
데이터를 계층간(Controller - Service - Repository)이나
서버와 클라이언트 간에
데이터를 전송할 때 사용하는 객체이다.
즉, 이름 그대로 '데이터 전송 담당 객체'인 것이다.
엔티티는 데이터베이스와 직결되는 객체이다.
때문에 보안문제가 생길 수도 있고 불필요한 정보 노출이 발생할 수 있다.
DTO를 사용하지 않고 엔티티를 그대로 반환하면
노출되면 안 되는 민감한 데이터(ex. 비밀번호, 토큰)까지 클라이언트가 볼 수 있게 된다.
JPA에서 조인 관계가 있는 경우,
엔티티를 반환하면 연관된 엔티티까지 반환된다.
따라서 불필요한 데이터까지 반환될 수 있다.
하지만 DTO를 사용하면 필요한 필드만 골라 클라이언트에게 전달 가능하다.
사실 2번과 이어지는 이야기이다.
엔티티를 반환하면 불필요한 데이터까지 조회하면서 쿼리 성능이 저하된다.
이와 달리 DTO를 활용하면 필요한 데이터만 선택적으로 조회할 수 있기 때문에 성능 최적화가 가능해진다.
컨트롤러, 서비스, 리포지토리를 모두 엔티티로 작업을 했을시,
만약 엔티티 구조가 변경되면 모든 레이어의 코드들을 수정해야 한다.
레이어 간 '결합도'가 높아지게 되면서 유지보수가 어려워진다.
엔티티 -> DTO 변환
클라이언트에게 데이터를 반환할 때 사용
필요한 데이터만 전달하게 되어 보안을 높이고 성능 최적화에 도움을 준다.
DTO -> 엔티티 변환
클라이언트에게서 받은 데이터를 DB에 저장할 때