DTO와 getter, setter

DTO와 ModelMapper

DTO : Data Trasfer Object

: 데이터를 전송하는 역할을 가진 객체

만약 도메인 객체인 Product가 표현 계층인 컨트롤러에서도 사용되고 , 응용 계층인 애플리케이션 서비스와 인프라 스트럭처 계층인 레포지토리 모두에서 사용된다면 각 계층에서 필요한 필드가 달라지거나 사용 안하는 필드가 생길 수 있다. 이러 상황에 적합한 것이 DTO이다.

public Product add(ProductDto productDto) {

        Product product = productDto.

        Product savedProduct = listProductRepository.add(product);

        ProductDto savedProductDto = 
        
        return savedProductDto;
   }

DTO는 표현 계층부터 응용 계층까지 역할을 하고, 그 안쪽까지 전달되지 않는다. 아직 작성되지 않은 부분인 Product와 ProductDto를 서로 변환하는 코드는 작성하기에 그렇게 어려운 일이 아니다. 생성자를 사용해도 되고, 정적 팩토리 메서드라는 이름의 디자인 패턴을 사용해도 되지만 , 그 과정에서 Product에서 제거했던 getter를 다시 추가해 줘야 한다는 문제도 있다. 물론 도메인 객체에 대한 무분별한 getter 사용은 지양하면 추가해도 된다. 하지만 여기서는 getter 없이 두 클래스를 변환하는 ModelMapper 매핑 라이브러리에 대해 알아보자.

DTO와 Entity

ProductDTO를 DTO라고 한다면 Product는 구체적으로 엔티티라고 부를 수 있다. 도메인 객체이면서 id를 가지는 존재를 엔티티(Entity) 도메인 객체이면서 id를 가지지 않는 존재를 값 객체(Value Object) 라고 부른다.

ModelMapper의 기본 설정은 '매개변수가 없는 생성자로 인스턴스를 생성한 후 setter로 값을 초기화하여 변환'하는 것이다. setter 없이도 Product와 ProductDto를 변환 가능하도록 하려면 다음과 같은 설정으로 ModelMapper 빈을 생성하여야함. 이 설정은 ModelMapper가 private 인 필드에 리플렉션 API로 접근하여 변환할 수 있도록 만들어 준다.

DTO 대신 record?

public record ProductDto(Long id, String name, Integer price, Integer amount) {}

생성자, getter, hashCode, equals를 자동으로 만들어준다. 단 setter는 만들어주지 않음.

Last updated