헥사고날 아키텍처(Hexagonal Architecture), 또는 포트와 어댑터 아키텍처(Ports and Adapters Architecture)
이 아키텍처의 주요 목표는 비즈니스 로직을 외부 세계로부터 격리, 테스트하기 쉬운 구조를 만드는 것
이를 위해 핵심 비즈니스 로직은 중앙의 도메인 영역에 위치하며, 입력과 출력을 처리하는 포트와 어댑터를 통해 외부와 소통
가장 대중적으로 사용하는 3계층 아키텍처(3 Tier Layered Architecture)
비즈니스 로직, 데이터 액세스, 프레젠테이션 계층
이와 달리 헥사고날 아키텍처는 비즈니스 로직에 중점을 두고 외부와 격리
1. 3계층 아키텍처 예
// UserService.java
public class UserService {
private UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void createUser(String name, String email) {
User user = new User(name, email);
userRepository.save(user);
}
}
// UserRepository.java
public interface UserRepository {
void save(User user);
}
// UserRepositoryImpl.java
public class UserRepositoryImpl implements UserRepository {
public void save(User user) {
// 데이터베이스에 사용자 저장
}
}
비즈니스 로직이 UserService 클래스에 있으며, UserRepository 인터페이스를 통해 데이터 액세스 계층과 소통
2. 헥사고날 아키텍처 예
// CreateUserUseCase.java // 비즈니스 로직을 정의
public interface CreateUserUseCase {
void createUser(String name, String email);
}
// CreateUserUseCaseImpl.java // 비즈니스 로직 구현
public class CreateUserUseCaseImpl implements CreateUserUseCase {
private UserRepository userRepository;
public CreateUserUseCaseImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void createUser(String name, String email) {
User user = new User(name, email);
userRepository.save(user);
}
}
// UserRepository.java // 외부와의 소통을 담당
public interface UserRepository {
void save(User user);
}
// UserRepositoryAdapter.java // 외부와의 소통을 담당
public class UserRepositoryAdapter implements UserRepository {
public void save(User user) {
// 데이터베이스에 사용자 저장
}
}
헥사고날 아키텍처에서는 CreateUserUseCase 인터페이스를 통해 비즈니스 로직을 정의하고, CreateUserUseCaseImpl 클래스에서 구현합니다. UserRepositoryAdapter는 UserRepository 인터페이스를 구현하며, 외부와의 소통을 담당
https://tech.osci.kr/hexagonal-architecture/