-
웹 어댑터 구현Architecture/Clean Architecture 2024. 12. 3. 22:05
의존성 역전
인커밍 어댑터는 어플리케이션 서비스에 의해 구현된 인터페이스인 전용 포트를 통해 어플리케이션 계층과 통신한다.
웹 어댑터는 인커밍 어댑터다. 외부의 요청을 받아서 어플리케이션에게 해야 하는 일을 알려준다.
여기서 제어흐름은 웹 어댑터에 있는 컨트롤러에서 어플리케이션 계층에 있는 서비스이다.
위와 같은 구조에서 간접 계층이 생기게 되는데 이러한 계층을 통해서 자연스럽게 의존성이 역전된다.
여기서 간접 계층을 없앨 수 도 있지만 그렇게 되면 어플리케이션의 명세가 사라져서 외부와의 통신이 어떻게 되는 지 식별하기 어려워진다.
웹 어댑터의 책임
- 웹 어댑터의 책임
- HTTP 요청을 자바 객체로 매핑
- 권한 검사
- 입력 유효성 검증
- 입력을 유스케이스의 입력 모델로 매핑
- 유스케이스 호출
- 유스케이스의 출력을 HTTP로 매핑
- HTTP 응답을 반환
여기서 입력 유효성을 유스케이스와 똑같이 검증해야 하는 것은 아니다. 웹 어댑터의 입력 모델을 유스케이스의 입력 모델로 변환할 수 있다는 것을 검증해야한다.
즉 변환된 입력 모델로 특정한 유스케이스를 호출하는 것으로 연결된다.
여기서 중요한 점은 웹 어댑터의 책임인 HTTP와 관련된 것이 어플리케이션의 침투되어지면 안된다.
침투되면 HTTP에 의존하게 되고 HTTP를 사용하지 않는 인커밍 어댑터와 호환이 되지 않을 수 있다.
컨트롤러 나누기
컨트롤러는 가능한 한 좁고 다른 컨트롤러와 가능한 한 적제 공유하는 웹 어댑터 조각을 구현해야한다.
즉 너무 많은 유스케이스의 의존하지 않아야한다.
그리고 모든 연산을 단일 컨트롤러에 넣는 것이 데이터 구조의 재활용을 촉진하는데 있다.
예를 들어 많은 연산들이 AccountResource 모델을 공유한다.
AccountResource가 모든 연산에서 필요한 모든 데이터를 담고 있는 큰 통이다.
AccountResouce는 id 필드가 존재할 것이고 이 id값은 create 연산에 필요 없기 때문에 도움이 되기 보다는 헷갈릴 것이다.
그래서 각 연산에 대해 가급적이면 별도의 패키지 안에 별도의 컨트롤러를 만드는 방식을 사용해야한다.
전용 모델 클래스들은 컨트롤러의 패키지에 대해 private 으로 선언할 수 있기 때문에 실수로 다른 곳에서 재사용될 일이 없다.
'Architecture > Clean Architecture' 카테고리의 다른 글
영속성 어댑터 구현하기 (1) 2024.12.10 유스케이스 구현하기 (0) 2024.12.02 코드 구성하기 (0) 2024.11.28 의존성 역전하기 (1) 2024.11.27 Layered architecture 문제 (1) 2024.11.25