2024. 2. 1. 15:28ㆍ개발&TIL/architecture
Hexagonal Architecture란?
Hexagonal Architecture는 소프트웨어를 구성하는 요소들을 독립적으로 분리하고, 이들을 연결하는 헥사곤 모양의 구조를 가진 아키텍처 스타일이다. 이 아키텍처는 도메인 로직을 비즈니스 규칙으로부터 분리하고, 외부 요소들과의 결합을 최소화하여 독립적인 테스트와 배포를 가능하게 한다. 또한, 도메인 로직을 외부 요소들로부터 보호하여 도메인 로직의 변경이 외부 요소들에게 영향을 주지 않도록 한다.
헥사고날 아키텍처의 주된 아이디어 중 하나는 비즈니스 코드를 기술 코드로부터 분리하는 것
도메인 헥사곤
애플리케이션의 개발을 시작하는 곳
도메인 헥사곤은 비즈니스에 해당하는 도메인로직을 이해하고 모델링하는 영역
애플리케이션의 핵심 로직과 데이터를 포함
도메인 모델은 실제 비즈니스에 관련된 객체, 규칙, 로직을 정의
도메인과 관련된 로직을 다루며, 비즈니스 규칙을 구현
Entity (엔티티)
헥사고날 아키텍처에서의 엔티티(Entity)는 도메인 영역에 속하는 부분으로 애플리케이션의 핵심 데이터 구조를 표현
이러한 엔티티는 도메인 모델의 일부로서 실제 업무 도메인에서 중요한 객체나 개념을 표현
엔티티는 데이터와 그 데이터를 다루는 메서드(로직)를 포함하며, 주로 도메인 로직의 핵심을 담당
중요한 것은 영속성 모델에 의존하지 않은 모델로 도메인 모델을 구성해야 한다는 것
블로그는 어떻게 구분할 수 있을까? 모든 것을 나열해 보면 좋겠지만 일단은 바로 가능한 것만 나열해 보자
- 게시물 엔티티 (Post Entity)
- 블로그에서 게시되는 개별적인 글
- 데이터: 제목, 내용, 작성일, 작성자 등의 정보를 포함
- 동작: 게시물의 수정, 삭제, 댓글 추가 등의 동작을 처리하는 로직
- 카테고리 엔티티 (Category Entity)
- 블로그 게시물을 분류하는 데 사용되는 카테고리
- 데이터: 카테고리 이름, 설명, 게시물과의 관계 등의 정보를 포함
- 동작: 카테고리에 새로운 게시물 추가, 카테고리 이름 변경 등의 동작을 처리하는 로직
- 사용자 엔티티 (User Entity)
- 블로그에 글을 작성하는 사용자
- 데이터: 사용자명, 이메일, 프로필 사진 등의 정보를 포함
- 동작: 사용자 정보 변경, 작성한 게시물 조회 등의 동작을 처리하는 로직
- 댓글 엔티티 (Comment Entity)
- 게시물에 추가되는 댓글
- 데이터: 댓글 내용, 작성일, 작성자 등의 정보를 포함
- 동작: 댓글 수정, 삭제, 대댓글 추가 등의 동작을 처리하는 로직
Value Object (값 객체)
값 객체(Value Object)는 헥사고날 아키텍처에서 엔티티(Entity)와 함께 사용되는 중요한 개념 중 하나
값 객체는 변경 불가능하며 식별자가 없고, 주로 개념적으로 하나의 값을 나타내는 객체
블로그는 어떻게 구분할 수 있을까? 모든 것을 나열해보면 좋겠지만 일단은 바로 가능한 것만 나열해 보자
- 블로그의 가시성을 나타내는 값 객체 (Visibility Value Object)
- 블로그의 가시성을 나타내는 값 객체
- 데이터: 블로그의 가시성을 나타내는 값 (PUBLIC, PRIVATE, PROTECTED)
- 동작: 블로그의 가시성을 변경하는 동작을 처리하는 로직
- 글 타입 (Entry Type Value Object)
- 글의 타입을 나타내는 값 객체
- 데이터: 글의 타입을 나타내는 값 (POST, PAGE)
- 동작: 글의 타입을 변경하는 동작을 처리하는 로직
- 글의 상태 (Entry Status Value Object)
- 글의 상태를 나타내는 값 객체
- 데이터: 글의 상태를 나타내는 값 (OPEN, PRIVATE, PROTECTED)
- 동작: 글의 상태를 변경하는 동작을 처리하는 로직
애플리케이션 헥사곤
유스케이스를 생성하는 곳
도메인 비즈니스 규칙에 기반한 소프트웨어 사용자의 의도와 기능을 표한하는 영역
유스케이스(Use Case), 입력포트(Input Port), 출력포트(Output Port)를 기반으로 구성
유스케이스
도메인 제약사항을 지원하기 위해 시스템의 동작을 소프트웨어 영역 내에 존재하는 애플리케이션 특화 오퍼레이션을 통해 정의 구현
유스케이스는 엔티티 및 다른 유스케이스와 직접 상호작용하고 그것들을 유연한 컴포넌트로 생성 가능
자바에서 유스케이스는 인터페이스로 정의
public interface CreateBlogUseCase {
void createBlog(CreateBlogInputData inputData);
}
입력 포트
간단하게 유스케이스를 구현하는 구현체
유스케이스에 서술된 소프트웨어의 의도를 만족시키는 입력 포트를 구현
public class CreateBlogInputPort implements CreateBlogUseCase {
private CreateBlogOutputPort createBlogOutputPort;
public CreateBlogInputPort(CreateBlogOutputPort createBlogOutputPort) {
this.createBlogOutputPort = createBlogOutputPort;
}
@Override
public void createBlog(CreateBlogInputData inputData) {
// TODO: 유스케이스 구현
}
}
출력 포트
간단하게 유스케이스의 결과를 노출하기 위한 외부 리소스에서 데이터를 가져오는 or 보내는 것
출력 포트는 유스케이스나 입력 포트가 오퍼레이션을 수행하기 위해 어떠 ㄴ종료의 데이터를 외부에서 가져와야 하는지를 기술에 구애받지 않고 설명하는 인터페이스로 표현
public interface CreateBlogOutputPort {
Blog create(CreateBlogInputData inputData);
}
참조
- 만들면서 배우는 클린 아키텍처
- 만들면서 배우는 핵사고날 아키텍처 설계와 구조