-
Port Adapter 패턴이란? (클린아키텍처)Spring Boot 2024. 4. 20. 23:39
배경
사내에 MSA를 도입 해보자는 이야기가 있어서,
이왕이면 제대로 해보고 싶어 요즘 열심히 스터디 중이다.
내가 필요하고 판단한 선수지식은 다음과 같다.
- 멀티모듈(https://yeoon.tistory.com/145)
- DDD (https://yeoon.tistory.com/147)
- port-adapter pattern
- Spring Cloud
- event-consistency, 카프카
- AWS EKS
port-adapter pattern에 관해 작성해본다.
Clean Architecture
- port adapter pattern은 아키텍처적인 문제를 해결하기 위해 등장한 아키텍처 패턴 중 하나다.
- 아키텍처는 기본적으로 변경이 어렵다 즉 개선이 어렵다.
- 좋은 아키텍처는 쉬운 확장, 테스트 하기 쉬운 코드, 높은 품질, 빠른 설계 속도를 목표로 한다.
- 좋은 아키텍처란 결정을 뒤로 미루는 것이라고 한다. (책 클린 아키텍처 도입부)
- 소프트웨어가 완성 된 후에 더 좋은 아키텍처 결정이 생각남에도 변경이 어려워 적용하지 못한다.
- 따라서 아키텍처 결정을 뒤로 미룰 수 있는 구조가 좋은 구조라 설명한다.
- port adapter pattern은 아키텍처적 결정을 뒤로 미루도록 하는 아키텍처 디자인 패턴이다.
Layered Pattern
- port adapter pattern를 살펴보기 전에 모두에게 가장 익숙한 layered pattern을 살펴보자
아래로 바꿔서 보면 좀더 익숙할 것 같다.
- 장점
- 개념적으로 모두가 익숙한 아키텍처로 빠른 속도로 개발 가능하다.
- 단점
- 규모가 커질수록 layer간 의존성이 복잡해지고 유지보수가 어려워진다.
- 플랫폼에 종속적이다.
- 중요한 것은 useCase인데, 개발시 REST API, DB에 집착하게 된다. (DB, API에 의존한 개발)
Port Adapter Pattern
- interface를 활용해서 비즈니스 로직을 격리하고 Runtime에 adapter를 통해 외부 입력/출력을 통신하는 아키텍처 패턴이다.
- 용어 정리
- interface = Port
- 인터페이스 구현체 = Adapter
- interface를 만들어 두고 runtime에 인터페이스 구현을 통해 의존성이 주입되는 패턴이다.
- 직접 구현해보면 아래와 같다.
- MSA를 생각해보면 요청(input)의 주체가 다양하다.
- 사용자
- 메시징큐
- 서버A
- 서버B . . .
- MSA는 응답(output) 또한 다양하다.
- 클라이언트
- 서버A
- 데이터배이스
- 메시징큐 . . .
- 즉, 입력/출력이 모놀리틱 아키텍처에 비해 다양하고, 변경의 여지가 높다.
- 장점
- 입/출력이 interface의 구현을 통해서만 통신 가능하도록 만들면 아키텍처 결정을 뒤로 미룰 수 있다. (유연한 확장을 가능하게 한다.)
- use case, 비즈니스에 집중할 수 있다.
- 변경이 쉬운 구조가 된다.
- 테스트가 쉬워진다. (레이어드 아키텍처에서는 사실상 Data Access Layer는 Mock 하지 않으면 테스트가 불가능한데, port adapter 패턴을 사용하면 Mock을 사용하지 않고 테스트 가능하다.)
- 단점
- 구현 코드양이 늘어남 (생산성 저하)
- 예를들어 adapter 격리를 위해 DTO 클래스가 추가로 필요하다.
- useCase(service)에 domain 객체를 사용하여 클래스 생성을 줄여보려 했했다 (머리속에서 딱 정한 rule이 아직 없다보니 개발하면서 잡생각이 너무 많아졌다.)
- Controller에서 사용하는 RequestDTO
- Service에서 사용하는 Domain
- Repository에서 사용하는 Entity
- 응답용도로 사용하는 ResponseDTO
핵사고날 아키텍처
port-adapter 패턴으로 인터페이스(Port)로 domain을 격리하고 요청/응답을 인터페이스 구현(adapter)로 주입하도록 만드는 아키텍처를 핵사고날 아키텍처라고 한다.
참조 자료
반응형'Spring Boot' 카테고리의 다른 글
springboot 애플리케이션 데이터베이스 초기화 (1) 2024.11.08 스프링 개발자가 가장 많이하는 실수 (0) 2024.06.19 DDD 기본개념 톺아보기 (1) 2024.04.20 멀티모듈 잘 설계해보기 (1) 2024.04.18 디자인 패턴- Builder (0) 2022.01.19