Spring + Boot

서비스계층과 DTO

devRachel 2021. 4. 21. 22:20

DTO는 Data Transfer Object의 약자입니다.

엔티티 객체와 달리 각 계층끼리 주고받는 우편물이나 상자의 개념입니다. 순수하게 데이터를 담고 있다는 점에서 엔티티 객체와 유사하지만 목적 자체가 데이터의 전ㄷ라이므로 읽고, 쓰는 것이 모두 허용되는 점, 일회성으로 사용되는 성격이 강합니다.

JPA를 이용하게 되면 엔티티 객체는 단순히 데이터를 담는 객체가 아니라 실제 데이터베이스와 관련이 있고 내부적으로 엔티티 매니저가 관리하는 객체입니다. DTO가 일회성으로 데이터를 주고받는 용도로 사용되는 것과 달리 Life cycle도 전혀 다르기 때문에 분리해서 처리하는 것을 권장합니다.

웹 애플리케이션을 제작할 때 HttpServlerRequest 또는 HttpServlerResponse를 서비스 계층으로 전달하지 않는 것을 원칙으로 합니다. 유사하게 엔티티 객체가 JPA에서 사용하는 객체이므로 JPA외에 사용하지 않는 것을 권장합니다.

 

DTO를 사용하면 엔티티 객체의 범위를 한정 지을 수 있어서 좀 더 안전한 코드를 작성할 수 있고, 화면과 데이터를 분리하려는 취지에도 부합합니다. DTO를 사용하는 경우 가장 큰 단점은 Entity와 유사한 코드를 중복으로 개발한다는 점, 엔티티 객체를 DTO로 변환하거나 반대로 DTO 객체를 엔티티로 변환하는 과정이 필요하다는 점입니다. 

 

Java 8버전부터 엔터페이스의 실제 내용을 가지는 코드를 default라는 키워드로 생성할 수 있습니다.

이를 이용하면 기존에 추상 클래스를 통해서 전달해야 하는 실제 코드를 인터페이스에 선언할 수 있습니다.

인터페이스 -> 추상 클래스 -> 구현클래스 의 형태로 구현되던 방식에서 추상클래스를 생략할 수 있습니다.

 

서비스 계층에서 파라미터를 DTO 타입으로 받기 때문에 JPA로 처리하려면 엔티티 타입 객체로 변환하는 작업이 필수적입니다. 이 기능을 DTO 클래스에 적용하거나 ModelMapper 라이브러리 http://modelmapper.org 또는 MapStruct https://mapstruct.org/ 를 이용하기도 합니다.