ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • hexagonal 구조 스프링 부트, 장점과 단점은?
    Tech 2025. 6. 21. 15:50
    반응형

     

     

    hexagonal 구조는 소프트웨어 아키텍처에서 큰 관심을 받고 있습니다. 카카오페이의 사례를 통해 이 구조의 실제 적용과 문제점을 살펴봅니다.

     

    hexagonal 구조의 정의와 중요성

    "기능적 요구사항을 충족하면서도 기술적 부채를 최소화하는 구축 방법이 필요하다." - 카카오페이 서버 개발자 도리

     

    hexagonal 구조란 무엇인가?

    Hexagonal 구조(또는 헥사고날 아키텍처)는 소프트웨어 설계의 한 유형으로, 시스템의 내부와 외부 인터페이스를 분리해주는 구조를 특징으로 합니다. 이 아키텍처의 핵심 개념은 의존성의 역전으로, 핵심 비즈니스 로직(도메인)과 외부 세계(데이터베이스, UI 등)가 서로 느슨하게 연결될 수 있도록 설계됩니다.

    따라서, 비즈니스 로직에 대한 변화가 필요할 때, 시스템 다른 부분에 미치는 영향을 최소화할 수 있는 구조가 됩니다. 이는 개발자가 보다 쉽게 기능을 추가하고 변경할 수 있는 포괄적인 이점을 제공합니다.

     

     

     

    주요 특징과 장점

    hexagonal 구조의 주요 특징과 장점은 다음과 같습니다.

    특징 내용
    의존성 역전 비즈니스 로직은 외부 세계와 독립적으로 동작하며, 외부 인터페이스의 변화에 덜 영향을 받는다.
    모듈화 비즈니스 로직, 사용자 인터페이스, 데이터 접근 로직이 별도의 모듈로 분리된다.
    유지보수 용이성 시스템 변화에 빠르게 대응할 수 있어, 유지보수가 용이하다.
    재사용성 이미 구축된 모듈을 재사용할 수 있어 코드 중복을 줄일 수 있다.

    이러한 구조는 개발자들이 여러 환경 변화에 효율적으로 대응할 수 있도록 도와줍니다. 그러나, 모든 프로젝트에 적합한 것은 아니며, 상황에 따라 약한 점을 드러낼 수 있습니다.

     

    스프링 부트와의 통합

    스프링 부트와 hexagonal 아키텍처는 매우 잘 통합될 수 있습니다. 스프링 부트는 간편한 설정과 외부 라이브러리 관리 기능을 제공하여, hexagonal 구조의 구현을 매우 쉽게 만들어줍니다. 특히 API 표현과 데이터베이스 접근 모듈에 대한 의존성을 최소화하는 데 효과적입니다.

    1. 모듈 구조 구성: 스프링 부트를 활용하면, hexagonal 구조의 각 부분을 독립적으로 구현하고 각 레이어에 대해 명확한 책임을 정의할 수 있습니다.
    2. 효율적인 의존성 관리: 스프링 부트의 의존성 주입 기능을 통해, 외부 API와의 연동을 쉽게 설정할 수 있습니다. 이를 통해 비즈니스 로직을 단순화할 수 있습니다.
    3. 테스팅 용이성: 스프링 부트는 테스트 환경을 쉽게 설정할 수 있는 기능을 제공하여, hexagonal 구조 내의 개별 모듈을 독립적으로 검증할 수 있습니다.

    이러한 통합 방식은 기존 hexagonal 구조의 장점을 살리면서도 스프링 부트의 생산성을 극대화하는데 기여합니다. 따라서, 프레임워크의 기능을 활용하여 안정적인 서비스를 개발할 수 있습니다.

    결국, hexagonal 구조는 카카오페이와 같은 복잡한 시스템에서도 유연성과 견고성을 제공하므로, 앞으로의 소프트웨어 설계에 있어 중요한 선택지가 될 것입니다.

     

     

     

     

     

    쿠팡이 추천하는 장마 테마관 관련 혜택과 특가

    쿠팡이 추천하는 장마 테마관 관련 특가를 만나보세요. 로켓와우 회원은 다양한 할인과 무료 배송 및 반품 혜택도 누릴 수 있어요.

    pages.coupang.com

     

     

    Hexagonal 구조의 장단점 분석

    Hexagonal 아키텍처는 의존성 역전 원칙에 기반하여, 비즈니스 로직을 외부 환경으로부터 분리하는 구조입니다. 하지만 이 구조는 장단점을 모두 지니고 있어서, 프로젝트에 적용하기 전 충분한 분석이 필요합니다.

     

    장점: 의존성 역전

    Hexagonal 아키텍처의 가장 큰 장점 중 하나는 의존성 역전입니다. 이는 비즈니스 로직이 외부의 변화에 의존하지 않게 만들며, 다양한 입력/출력 포트를 쉽게 교체할 수 있게 해줍니다. 덕분에 새로운 기능 추가나 수정이 용이해지고, 테스트의 용이성도 높아집니다.

    "Hexagonal architecture는 구조적으로 port와 adapter를 활용해 코드를 구성하며, 핵심 비즈니스 로직이 외부의 의존성에 신경 쓰지 않을 수 있도록 돕는다."

     

    단점: 도메인 모델 정의의 어려움

    반면, Hexagonal 아키텍처의 단점으로는 도메인 모델 정의의 어려움이 있습니다. 의사 결정 시 도메인 모델을 명확히 정의하지 않으면, port와 adapter 간의 경계가 모호해지면서 혼란이 발생할 수 있습니다. 이로 인해 비즈니스 로직을 유지하기 어려워질 수 있습니다.

     

    연동 변화에 대한 유연성

    Hexagonal 아키텍처는 연동 변화에 대한 유연성을 제공하지만, 실제 운영 과정에서 엇갈린 효과를 보일 수 있습니다. 외부 연동의 변경이 비즈니스 로직에 불가피하게 영향을 줄 경우, 아키텍처의 장점을 누리지 못하는 상황이 발생하기 쉽습니다. 따라서 이는 구조적 장점보다 운영의 비효율성이 더 크게 느껴질 수 있는 단점으로 작용할 수 있습니다.

    장점 단점
    의존성 역전 도메인 모델 정의의 어려움
    새로운 기능의 용이한 추가 연동 변화에 따른 비효율성

    이러한 장단점들을 기반으로 Hexagonal 아키텍처의 도입 여부를 신중히 고려해야 할 것입니다. 상황에 따라 적절한 구성과 활용 방안이 중요합니다

     

     

    .

     

    카카오페이의 hexagonal 구조 적용 사례

     

    프로젝트 배경

    카카오페이는 사용자가 카카오톡과 카카오페이 앱을 통해 다양한 서비스를 손쉽게 이용할 수 있도록 돕기 위해 홈 서버를 최전방에서 운영하고 있습니다. 2023년 개편 전, 두 앱에서 접근하는 UI와 정보 제공 방식이 달라 사용자 경험에 혼선이 있었습니다. 개편 후, 통합된 UI 제공과 효율적 유지보수를 목표로 새로운 마이크로서비스를 구성하게 되었습니다. 이는 기존 서버 구조가 비효율적이라는 인식을 바탕으로, hexagonal architecture (육각형 구조)가 도입되었습니다.

     

    애플리케이션 아키텍처

    이 과정에서 hexagonal architecture는 카카오페이 홈 서버의 아키텍처를 큰 틀에서 바꾸는 계기가 되었으나, 처음부터 여러 문제점을 드러내었습니다. 이 아키텍처는 핵심 비즈니스 로직을 외부 의존성과 분리할 수 있는 장점이 있었고, 이는 장기적인 유지보수와 유연성 향상에 기여할 것이라 예상되었습니다.

    모듈 구조 역할
    api 도메인 객체 변환 및 API 응답 처리
    domain 비즈니스 로직 및 도메인 객체 생성
    infrastructure 외부 API 연동 담당

    초기에는 API 연동부터 응답 처리까지 다양한 문제를 해결하는 데 도움이 되었으나, 운영 과정에서 나타난 문제점이 점차 누적되었습니다.

     

    실제 적용 후의 변화

    hexagonal 구조의 도입은 시작에는 여러 이점을 제공했지만, 운영 및 신규 기능 개발 과정에서 비효율성을 초래했습니다. 각 레이어가 지나치게 분리되어 있던 탓에, 신규 기능을 추가할 때마다 도메인 레이어부터 여러 요소를 수정해야 했고, 이는 개발 속도를 저하했습니다. 또한, 팀원들 간의 이해도가 다양해져 코드 관리의 복잡성을 더욱 증가시켰습니다.

    “은탄환이 없다는 말이 여기에 적합할 것입니다. 카카오페이 홈 서버에 hexagonal architecture는 특정 상황에 잘 맞지 않았습니다.”

    결국, 카카오페이는 hexagonal architecture를 제거하고, 관심사별 패키징 및 단일 모듈로 회귀하기로 결정했습니다. 이러한 변화는 코드 줄 수를 8,000줄 이상 줄였으며, 이는 전체적인 로직을 더욱 쉽게 이해할 수 있게 했습니다. 신규 기능을 추가하는 데 걸리는 시간도 단축되었습니다.

    카카오페이의 사례는 hexagonal architecture가 반드시 모든 프로젝트에 적합하진 않다는 중요한 교훈을 제시합니다. 프로젝트의 도메인 모델과 아키텍처의 일관성을 고려한 신중한 선택이 필요합니다.

     

     

     

    Hexagonal 구조에서의 문제점 발견

    Hexagonal 아키텍처는 그 자체로 매력적인 구조적 장점을 제공하지만, 특정 환경에서는 여러 가지 문제점이 발생할 수 있습니다. 이번 섹션에서는 이러한 문제점들을 다양한 측면에서 살펴보겠습니다.

     

    격차와 모호함

    의존성과 경계의 모호함은 hexagonal 아키텍처에서 자주 발생하는 문제 중 하나입니다. 초기에 아키텍처의 도입 시 강한 도메인 모델 없이 진행되면, port와 adapter 간의 경계가 불분명해질 위험이 큽니다. 이로 인해 개발자는 어떤 정보를 어떻게 수신해야 할지 명확히 알기 어려워 집니다.

    "단순히 port와 adapter 구조를 활용하다 보면, 핵심 비즈니스 로직이 외부의 의존성에 신경 쓰지 않게 하는 것이 오히려 더 복잡해질 수 있다."

    예를 들어, 기존의 webclient에서 반환된 응답을 기준으로 port를 작성하는 경우, 이후의 외부 연동 변화에 민감하게 반응해야 할 수 있습니다. 이러한 융통성 부족은 모호한 레이어 간 경계를 더욱 강조하게 됩니다.

     

    신규 기능 개발의 비효율성

    hexagonal 아키텍처를 적용하면서, 신규 기능 개발을 하기 위해서는 반복적으로 domain, port, adapter 각 레이어에서 알맞은 수정이 필요합니다. 다양한 port와 dto, 매핑 로직까지 수정을 요구하기 때문에 여러 파일에 걸쳐 변경 작업이 발생하게 됩니다.

    신규 기능 개발 시 소요되는 작업 항목 설명
    도메인 레이어 변경 새로운 비즈니스 로직 추가 및 수정 필요
    port 인터페이스 추가/변경 추가적인 외부 API 호출을 위해 변경 필수
    adapter 개발 port의 변경에 맞춰 adapter 로직을 수정해야 함

    이러한 복잡한 구조는 결국 개발 시간의 증가비용의 증가로 이어지며, 빠른 기능 추가가 주요 목표인 현대의 소프트웨어 개발 환경에서 부적합하다고 평가될 수 있습니다.

     

    코드 관리의 어려움

    hexagonal 아키텍처는 초기에 의도했던 것처럼 강력한 분리를 제공하고 명확한 경계를 설정했지만, 시간이 지남에 따라 코드의 비대화가 발생하게 됩니다. 팀원이 늘어날수록, 아키텍처의 정의와 구조를 이해하기 위한 시간과 노력이 배로 증가합니다. 서로 다른 팀원들이 이해하는 방향이 조금씩 달라질 경우, 구조적으로 혼란이 생길 수 있습니다.

    이런 혼란스러운 상황은 코드 관리의 비용을 증가시키며, 결국은 아키텍처의 장점을 부담으로 바꾸는 원인이 됩니다. 특히 새로운 팀원이 아키텍처를 이해하는 데 시간 소모가 많아지는 상황이 자주 발생할 수 있습니다.

     

    결론

    hexagonal 아키텍처는 잘 활용될 경우 많은 이점을 제공하지만, 모호한 경계, 비효율적인 신규 기능 개발, 어려운 코드 관리가 문제로 발생할 수 있다는 점을 숙지해야 합니다. 각 팀과 프로젝트의 특성에 따라 아키텍처 선택이 매우 중요하므로, 항상 충분한 고민이 필요합니다.

     

     

     

    hexagonal 구조의 향후 방향성

    hexagonal architecture는 소프트웨어 개발에서 매우 인기 있는 모델 중 하나로, 다양한 시스템 요구 사항을 충족시키기 위해 사용되고 있습니다. 하지만 이 아키텍처가 모든 상황에 적합한 것은 아니며, 특정 조건에서 약점을 드러낼 수 있습니다. 이번 섹션에서는 hexagonal 구조의 향후 방향성을 탐구하며 고민해야 할 점, 적절한 상황 선택, 그리고 미래 지향적 아키텍처 가능성에 대해 논의합니다.

     

    고민해야 할 점

    hexagonal architecture를 도입하기 전에 먼저 고려해야 할 중요한 요소들은 다음과 같습니다:

    • 도메인 정의의 난제: hexagonal 구조를 적용하기 위해서는 명확한 도메인 정의가 필수적입니다. 도메인이 불분명할 경우, port와 adapter의 경계 설정에서 어려움을 겪을 수 있습니다.
    • 외부 의존성: 많은 외부 API에 의존하는 시스템에서는 hexagonal architecture의 이점을 제대로 활용하기 어려운 경우가 많습니다. 시스템의 대부분이 외부 API에 의해 작동한다면, 그로 인해 구조가 복잡해질 수 있습니다.
    • 유지보수와 학습 비용: 다양한 port와 adapter가 존재하는 hexagonal 구조는 새로운 개발자가 시스템을 이해하는 데 높은 학습 비용을 요구할 수 있습니다. 이는 팀 효율성을 저하할 수 있습니다.

    "모든 아키텍처는 장단점이 있으며, 각각의 상황에 맞는 최적의 선택이 필요하다."

     

    적절한 상황 선택

    hexagonal architecture는 모든 프로젝트에 적합한 것은 아닙니다. 아래에 이 아키텍처를 고려해야 할 상황들을 정리했습니다.

    상황 설명
    명확한 도메인 모델 존재 도메인이 확실히 정의된 경우 hexagonal 구조가 큰 장점을 가집니다.
    외부 의존성 낮음 시스템의 로직이 내부적으로 많이 처리되는 경우 유리합니다.
    여러 모듈 간 코어 로직 재사용 같은 도메인을 사용하는 여러 서비스가 있을 때 효과적입니다.

    이러한 조건들이 충족될 때 hexagonal architecture의 독립적인 특성과 유연성을 극대화할 수 있습니다

     

     

    .

     

    미래 지향적 아키텍처 가능성

    앞으로의 소프트웨어 개발에서 hexagonal architecture는 그 유연성과 확장성 덕분에 여전히 중요한 위치를 차지할 가능성이 있습니다. 하지만, 이를 위해서는 몇 가지 조건이 필요합니다.

    • 지속적인 도메인 분석: 도메인 모델의 올바른 정의와 지속적인 변경 관리를 통해 아키텍처의 재사용성을 높여야 합니다.
    • 외부 시스템과의 통합 단순화: 다양한 API와의 연동을 체계적으로 관리할 수 있는 방법론이 필요합니다.
    • 명확한 책임과 역할 분리: port와 adapter의 역할이 명확히 구분될 수 있도록 설계해야 합니다. 이를 통해 개발 및 유지보수 과정이 더욱 원활해질 것입니다.

    이러한 조건들을 통해 hexagonal architecture의 장점을 최대한 활용하며 미래 지향적이고 효과적인 아키텍처로 거듭날 수 있을 것입니다.

    함께보면 좋은글!

     

     

    반응형
Designed by Tistory.