1. API 호출 방식을 정의합니다.
2. 어떤 비즈니스 로직을 실행할 것인지 결정합니다.
3. API 호출 결과를 어떤 포맷으로 응답할지 정의합니다.
컨트롤러의 가장 큰 역할은 엔드포인트를 정의하고 API 사용자의 요청을 받아 그 결과를 응답 포맷에 맞춰 반환하는 것입니다. 따라서, Presentation Layer에는 비즈니스 로직, 데이터베이스 관련 로직이 있어도 안됩니다.
이러한 Presentation의 특성에 맞춰 Presentation이 의존할 수 있는 Layer는 Service Layer, Core Layer, Util Layer로 국한하여 의존할 수 있도록 설정하였습니다.
API를 입력 받는 특성상 VO를 정의하고 DTO로의 변환 작업을 통해 DTO로 Service Layer로 전송할 수 있도록 합니다. 이렇게 함으로써 하위 모듈인 Service Layer에서 상위 모듈인 Presentation Layer의 VO 클래스에 의존하지 않고 비즈니스 로직을 작성할 수 있습니다.
소프트웨어 설계자 입장에서의 값 객체의 값은 불변성, 동등성, 자가 검증이라는 특성이 있습니다. 따라서 어떤 객체가 이 세 가지 특징을 만족할 때 VO라고 부릅니다.
| 값의 특징 | 설명 | 예시 |
|---|---|---|
| 불변성 | 값은 변하지 않습니다. 예를 들어, 숫자 1은 영원히 숫자 1입니다. | final |
| 동등성 | 값의 가치는 항상 같습니다. 예를 들어, 모든 숫자 1은 적혀 있는 위치나 시간과 관계없이 항상 같은 숫자 1입니다. | @Override equals, hasCode |
| 자가 검증 | 값은 그 자체로 올바릅니다. 예를 들어, 숫자 1은 그 자체로 올바른 숫자입니다. 이는 '1은 사실 1.01이지 않을까?와 같은 고민을 할 필요가 없다는 의미입니다. |