간소화된 헥사고날 아키텍처
패키지 구조
헥사고날 아키텍처로 검색하면 많이 보이는 그림이 있습니다. 그리고 만들면서 배우는 클린 아키텍처라는 책에서는 패키지 구조를 어떻게 설계해야하는지에 대한 구체적인 방안을 제공하고 있습니다. 하지만 아직 제 경험으로는 이러한 그림과 패키지 구조 전체를 전체로 다 활용할 수 있을만큼의 경험이 부족한 것 같습니다. 거의 50%는 왜 있는지 모르겠고 불필요해보였습니다. 그래서 제가 필요성을 느끼는 부분만 남겨서 보았습니다.
- io.lucky.user
- web
- controller
- dto
- request
- response
- application
- usecase
- query
- service
- port
- domain
- persistence
- adapter
- mapper
- repository
- Main.java
- web
프로젝트의 Root 패키지를 io.lucky라고 정의하고 user 도메인을 다루는 모듈의 예시입니다. io.lucky.user 패키지 아래에는 web, application, domain, persistence 4개 계층이 존재합니다. application 패키지와 domain 패키지는 프로젝트에서 core로 부르는 영역이고, web과 persistence 패키지는 각각 웹 계층과 영속성 계층을 담당합니다.
application 패키지에는 웹 계층에서 사용되는 usecase 인터페이스와 영속성 계층에서 구현되는 port를 가지고 있습니다. service 패키지는 usecase 인터페이스를 구현하고 port 인터페이스를 사용합니다.
package io.lucky.user.application.service;
import io.lucky.user.application.port.CreateUserPort;
import io.lucky.user.application.usecase.CreateUserCommand;
import io.lucky.user.application.usecase.CreateUserUseCase;
import io.lucky.user.domain.User;
import io.lucky.user.domain.UserId;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService implements CreateUserUseCase {
private final CreateUserPort createUserPort;
@Override
public UserId create(CreateUserCommand command) {
User user = new User(null,
command.getEmail(),
command.getNickname(),
command.getPassword());
return createUserPort.create(user);
}
}
표현력 있는 패키지 구조
‘중심으로 향하는 의존성 방향’에 대해서 이야기한 아키텍처가 최대한 코드에 직접적으로 매핑될 수 있어야 합니다.
위의 그림이 머릿속에 들어있고 UseCase와 Port 인터페이스의 역할을 제대로 이해했다면 새로운 클래스를 추가할 때 어느 곳에 넣어야할지 적극적으로 사고하게 됩니다. 이렇게 그 자체로 의미를 가지고 생각할 수 있도록 돕는 패키지 구조는 아키텍처가 더 오랫동안 견고하게 유지될 수 있도록 도와줍니다.
'DEV > Architecture' 카테고리의 다른 글
헥사고날 아키텍처 시리즈 6. 영속성 계층 (0) | 2024.03.16 |
---|---|
헥사고날 아키텍처 시리즈 5. 애플리케이션 계층 (0) | 2024.03.16 |
헥사고날 아키텍처 시리즈 3. 헥사고날 아키텍처 시작하기 (0) | 2024.03.14 |
헥사고날 아키텍처 시리즈 2. 계층형 아키텍처 극복하기 (1) | 2024.03.14 |
헥사고날 아키텍처 시리즈 1. 계층형 아키텍처의 문제점 (0) | 2024.03.14 |