레이어드 아키텍처는 애플리케이션을 구성하는 요소들을 계층별로 나눠서 설계하는 패턴이다.
자바 애플리케이션에서 사용하는 클래스는 기능 수행을 위한 클래스와 데이터를 담는 클래스로 나눌 수 있다.
모델은 비즈니스 데이터를 담는 역할과 디비 테이블과 스키마를 표현한다. 규모가 큰 자바 애플리케이션의 경우, 모델과 엔티티를 따로 구분하여 사용한다.
서비스가 요청을 처리하고 클라이언트로 반환할 때, 모델 그 자체를 사용하는 경우는 극히 드물다. 모델 대신 Dto라는 데이터를 전달할 때 사용하는 오브젝트로 변환해 사용한다.
그런데, 왜 모델을 사용하지 않고 Dto 클래스를 만들어 전달할까? 첫 번째 이유는 비즈니스 로직을 Encapsulation하기 위해서이다. 모델이 갖고 있는 필드들은 디비 테이블의 속성과 같다고 볼 수 있는데, 이 것을 외부에 노출시키고 싶지 않기 위함이다. 따라서 Dto로 변경해서 사용하면 외부 사용자에게 서비스 내부의 로직, 디비 스키마 등을 숨길 수 있다.
두 번째 이유는 클라이언트는 모델의 모든 필드들을 필요로 하지 않고 다른 데이터들을 필요로 할 수 있기 때문이다. 예를 들어서, 모델의 id값은 데이터베이스에서 식별할 때 사용하는 데이터이므로 사용자에게 노출시킬 이유도 없으며 보안상으로도 숨기는 것이 맞기 때문에, Dto에 id 필드는 포함시키지 않는다.
참고 서적 : 김다정, React.js, 스프링 부트, AWS로 배우는 웹 개발 101