기술과 산업/아키텍처

자바 웹 애플리케이션에서 헥사고날 아키텍처 구현

B컷개발자 2025. 2. 10. 11:30
728x90

자바 웹 애플리케이션에서 헥사고날 아키텍처를 구현

핵심 구성요소

  1. 도메인 계층
    • 순수한 비즈니스 로직을 포함하는 POJO(Plain Old Java Object) 클래스로 구성합니다.
    • 외부 의존성이 없어야 합니다.
  2. 포트
    • 인바운드 포트: 애플리케이션 코어가 외부에 제공하는 인터페이스
    • 아웃바운드 포트: 애플리케이션 코어가 외부 시스템을 사용하기 위한 인터페이스
  3. 어댑터
    • 인바운드 어댑터: 웹 컨트롤러, REST API 등
    • 아웃바운드 어댑터: 데이터베이스 리포지토리, 외부 API 클라이언트 등

구현 방법

  1. 패키지 구조 설계
    • domain: 도메인 모델과 비즈니스 로직
    • application: 유스케이스와 포트 인터페이스
    • adapter: 인바운드 및 아웃바운드 어댑터 구현
  2. 의존성 방향 설정
    • 모든 의존성은 도메인 계층을 향하도록 합니다.
    • 외부 계층은 내부 계층에 의존하되, 내부 계층은 외부 계층을 모르도록 설계합니다.
  3. 포트 정의
    • 애플리케이션 서비스에서 사용할 인터페이스를 정의합니다.
    • 예: UserRepository, EmailService
  4. 어댑터 구현
    • 포트 인터페이스를 구현하는 클래스를 작성합니다.
    • 예: JpaUserRepository, SmtpEmailService
  5. 의존성 주입 활용
    • 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/

728x90