-
자바 웹 애플리케이션에서 헥사고날 아키텍처 구현카테고리 없음 2025. 2. 10. 11:30반응형
자바 웹 애플리케이션에서 헥사고날 아키텍처를 구현
핵심 구성요소
- 도메인 계층
- 순수한 비즈니스 로직을 포함하는 POJO(Plain Old Java Object) 클래스로 구성합니다.
- 외부 의존성이 없어야 합니다.
- 포트
- 인바운드 포트: 애플리케이션 코어가 외부에 제공하는 인터페이스
- 아웃바운드 포트: 애플리케이션 코어가 외부 시스템을 사용하기 위한 인터페이스
- 어댑터
- 인바운드 어댑터: 웹 컨트롤러, REST API 등
- 아웃바운드 어댑터: 데이터베이스 리포지토리, 외부 API 클라이언트 등
구현 방법
- 패키지 구조 설계
domain
: 도메인 모델과 비즈니스 로직application
: 유스케이스와 포트 인터페이스adapter
: 인바운드 및 아웃바운드 어댑터 구현
- 의존성 방향 설정
- 모든 의존성은 도메인 계층을 향하도록 합니다.
- 외부 계층은 내부 계층에 의존하되, 내부 계층은 외부 계층을 모르도록 설계합니다.
- 포트 정의
- 애플리케이션 서비스에서 사용할 인터페이스를 정의합니다.
- 예:
UserRepository
,EmailService
등
- 어댑터 구현
- 포트 인터페이스를 구현하는 클래스를 작성합니다.
- 예:
JpaUserRepository
,SmtpEmailService
등
- 의존성 주입 활용
- Spring의 DI를 사용하여 포트와 어댑터를 연결합니다.
코드 예시
// 도메인 모델 public class User { private String id; private String name; // ... } // 인바운드 포트 public interface UserService { void createUser(String name); } // 아웃바운드 포트 public interface UserRepository { void save(User user); } // 애플리케이션 서비스 @Service public class UserServiceImpl implements UserService { private final UserRepository userRepository; public UserServiceImpl(UserRepository userRepository) { this.userRepository = userRepository; } @Override public void createUser(String name) { User user = new User(name); userRepository.save(user); } } // 인바운드 어댑터 (웹 컨트롤러) @RestController public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @PostMapping("/users") public void createUser(@RequestBody CreateUserRequest request) { userService.createUser(request.getName()); } } // 아웃바운드 어댑터 (JPA 리포지토리) @Repository public class JpaUserRepository implements UserRepository { private final JpaUserEntityRepository jpaRepository; public JpaUserRepository(JpaUserEntityRepository jpaRepository) { this.jpaRepository = jpaRepository; } @Override public void save(User user) { UserEntity entity = new UserEntity(user); jpaRepository.save(entity); } }
이러한 구조를 통해 비즈니스 로직을 외부 의존성으로부터 분리하고, 테스트 용이성과 유지보수성을 향상시킬 수 있습니다[1][3][6].
레퍼런스
[1] https://velog.io/@onyx01/%ED%97%A5%EC%82%AC%EA%B3%A0%EB%82%A0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EB%A1%9C-%EC%BD%94%EB%93%9C-%EA%B5%AC%ED%98%84-%ED%95%B4-%EB%B3%B4%EA%B8%B0
[2] https://sejoung.github.io/2021/06/2021-06-24-hexagonal/
[3] https://curiousjinan.tistory.com/entry/spring-hexagonal-architecture
[4] https://cantcoding.tistory.com/107
[5] https://binux.tistory.com/183
[6] https://velog.io/@dlswns2480/%ED%97%A5%EC%82%AC%EA%B3%A0%EB%82%A0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%A0%81%EC%9A%A9%EA%B8%B0feat.-%EB%A9%80%ED%8B%B0%EB%AA%A8%EB%93%88
[7] https://velog.io/@qkrdbqls1001/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90-Hexagonal-architecture-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0
[8] https://tjdtls690.github.io/studycontents/java/2023-05-22-hexagonal_architecture/
[9] https://kangfru.tistory.com/30
[10] https://jaehoney.tistory.com/316
[11] https://velog.io/@p0tat0_chip/3.-%ED%8C%A8%ED%82%A4%EC%A7%80-%EA%B5%AC%EC%A1%B0
[12] https://sejoung.github.io/2021/07/2021-07-20-hexagonal_package/
[13] https://binux.tistory.com/182
[14] https://twbf.tistory.com/28
[15] https://wikibook.co.kr/dhaj/
[16] https://www.earlgrey02.com/post/13
[17] https://covenant.tistory.com/258
[18] https://kangfru.tistory.com/30
[19] https://happy-coding-day.tistory.com/229
[20] https://velog.io/@qkrdbqls1001/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90-Hexagonal-architecture-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0
[21] https://curiousjinan.tistory.com/entry/spring-hexagonal-architecture
[22] https://velog.io/@onyx01/%ED%97%A5%EC%82%AC%EA%B3%A0%EB%82%A0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EB%A1%9C-%EC%BD%94%EB%93%9C-%EA%B5%AC%ED%98%84-%ED%95%B4-%EB%B3%B4%EA%B8%B0
[23] https://tech.osci.kr/hexagonal-architecture/반응형 - 도메인 계층