ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹 어댑터 구현
    Architecture/Clean Architecture 2024. 12. 3. 22:05

    의존성 역전

    인커밍 어댑터는 어플리케이션 서비스에 의해 구현된 인터페이스인 전용 포트를 통해 어플리케이션 계층과 통신한다.

    웹 어댑터는 인커밍 어댑터다. 외부의 요청을 받아서 어플리케이션에게 해야 하는 일을 알려준다.

    여기서 제어흐름은 웹 어댑터에 있는 컨트롤러에서 어플리케이션 계층에 있는 서비스이다.

    위와 같은 구조에서 간접 계층이 생기게 되는데 이러한 계층을 통해서 자연스럽게 의존성이 역전된다.

    여기서 간접 계층을 없앨 수 도 있지만 그렇게 되면 어플리케이션의 명세가 사라져서 외부와의 통신이 어떻게 되는 지 식별하기 어려워진다.

    웹 어댑터의 책임

    1. 웹 어댑터의 책임
    2. HTTP 요청을 자바 객체로 매핑
    3. 권한 검사
    4. 입력 유효성 검증
    5. 입력을 유스케이스의 입력 모델로 매핑
    6. 유스케이스 호출
    7. 유스케이스의 출력을 HTTP로 매핑
    8. 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
Designed by Tistory.