레이어드와 헥사고날 아키텍처

justindevcode·2024년 9월 20일

아키텍처

목록 보기
1/1
post-thumbnail

레이어드와 헥사고날 아키텍처

레이어드 아키텍처의 과거와 장점

소프트웨어 개발에서 레이어드 아키텍처는 오랫동안 표준적인 구조로 사용되어 왔습니다. 레이어드 아키텍처는 소프트웨어를 여러 계층(layer)으로 나누어 각 계층이 독립적으로 기능하도록 하는 방식입니다. 예를 들어, 프레젠테이션, 애플리케이션, 비즈니스 로직, 데이터베이스 계층 등으로 나뉘며, 계층 간의 명확한 경계를 통해 유지보수와 코드 재사용성을 높였습니다.

레이어드 아키텍처를 사용한 이유는 크게 두 가지로 요약할 수 있습니다:

  • 단순하고 직관적인 구조: 초보 개발자부터 숙련 개발자까지 이해하기 쉬운 구조입니다. 각 계층은 특정 역할에 집중하여 코드의 복잡성을 줄이고, 계층별 책임이 명확하게 나뉘어져 있습니다.

  • 유지보수 용이성: 각 계층의 코드가 독립적으로 작동하기 때문에, 특정 계층에 문제가 생겼을 때 다른 계층에 미치는 영향을 최소화할 수 있습니다. 코드 변경도 특정 계층만 수정하면 되므로 유지보수가 용이합니다.

레이어드 아키텍처의 한계

하지만 시스템이 확장되면서, 레이어드 아키텍처의 몇 가지 한계가 점점 드러났습니다.

  • 비효율적인 외부 의존성 처리: 데이터베이스나 외부 API와 같은 의존성이 늘어나면서, 각 계층의 강한 결합도가 문제로 작용합니다. 비즈니스 로직이 외부 의존성에 너무 의존하게 되어, 변경이 생길 때마다 여러 계층을 수정해야 하는 상황이 발생합니다.

  • 성능 저하: 큰 규모의 애플리케이션에서는 다수의 요청이 중첩되고, 데이터베이스와 외부 시스템 호출이 늘어나면서 응답 속도가 느려집니다. 특히 대규모 트래픽을 처리할 때는 이러한 성능 저하가 심각한 문제가 됩니다.

  • 확장성 문제: 애플리케이션이 커질수록 모든 계층이 연관되기 때문에 수평 확장(Scaling)이 어렵습니다. 이로 인해 특정 기능을 추가하거나 확장할 때마다 코드 복잡도가 기하급수적으로 증가하게 됩니다.

대안 아키텍처와 선택

이러한 문제를 해결하기 위해 다양한 아키텍처 패턴이 제안되었습니다:

  • 마이크로서비스 아키텍처 (MSA): 마이크로서비스는 각 기능을 독립된 서비스로 분리하여 배포 및 운영합니다. 이는 확장성 문제를 해결할 수 있지만, 각 서비스 간의 통신 및 데이터 일관성 관리가 복잡해집니다.

  • 이벤트 주도 아키텍처 (EDA): 시스템 내 이벤트를 중심으로 데이터 처리를 진행하여 비동기적으로 서비스 간 통신을 관리합니다. 이는 실시간 데이터 처리에 유리하지만, 이벤트의 일관성 문제를 해결하는 데 많은 노력이 필요합니다.

  • CQRS (Command Query Responsibility Segregation): 읽기와 쓰기를 분리하여 성능을 최적화하는 아키텍처입니다. 읽기 작업은 빠르고 효율적으로 처리하며, 쓰기 작업은 데이터 일관성을 보장하는 데 집중합니다. 하지만 두 개의 데이터 모델을 관리해야 하므로 복잡도가 증가합니다.

핵사고날 아키텍처의 선택 이유

핵사고날 아키텍처(헥사고날 아키텍처)는 이런 문제들에 대한 균형 잡힌 해법을 제시합니다. 이 패턴은 애플리케이션의 비즈니스 로직을 외부 의존성(데이터베이스, API, UI 등)으로부터 완전히 분리하는 것을 목표로 합니다. 외부와의 의존성은 '포트(Port)'와 '어댑터(Adapter)'를 통해 추상화되며, 이를 통해 외부 시스템의 변화에도 비즈니스 로직은 영향을 받지 않도록 설계됩니다.

핵사고날 아키텍처를 선택한 이유는 다음과 같습니다:

  • 외부 의존성의 유연한 처리: 외부 서비스나 데이터베이스의 변경이 있을 때도 비즈니스 로직을 수정할 필요 없이 어댑터만 변경하면 되므로 유지보수가 훨씬 용이합니다.

  • 독립적 확장성: 애플리케이션의 핵심 비즈니스 로직과 외부 의존성을 분리하므로, 각 부분을 독립적으로 확장하고 최적화할 수 있습니다. 이는 대규모 시스템에서 중요한 확장성과 성능 문제를 해결합니다.

  • 테스트 용이성: 외부 시스템과의 의존성이 제거된 상태에서 비즈니스 로직을 테스트할 수 있으므로, 더 빠르고 간편한 단위 테스트가 가능합니다. 이는 CI/CD 파이프라인에서도 큰 이점으로 작용합니다.

외부 의존성을 다룰 때의 장점과 유의점

핵사고날 아키텍처의 가장 큰 장점은 외부 의존성을 붙일 때 생깁니다. 예를 들어, 새로운 데이터베이스나 외부 API를 도입할 때 비즈니스 로직을 전혀 건드리지 않고, 해당 의존성을 처리하는 어댑터만 구현하면 됩니다. 이는 시스템의 확장성 측면에서 큰 이점을 제공합니다.

하지만 유의해야 할 점도 있습니다:

  • 구현 복잡도: 기존의 레이어드 아키텍처에 비해, 어댑터와 포트 구조를 관리하는 데 더 많은 복잡도가 생깁니다. 특히, 많은 수의 외부 의존성을 다룰 때는 각 의존성마다 어댑터를 설계하고 유지보수해야 하므로 관리 비용이 증가할 수 있습니다.

  • 초기 학습 곡선: 핵사고날 아키텍처는 레이어드 아키텍처에 비해 상대적으로 덜 직관적이기 때문에, 팀에서 이 패턴을 도입할 때는 어느 정도의 학습 기간이 필요합니다. 팀원 간의 공통된 이해도가 필요하므로 충분한 문서화와 교육이 필수적입니다.

결론

레이어드 아키텍처는 소규모 애플리케이션이나 단순한 시스템에서 여전히 효과적인 선택일 수 있지만, 대규모 시스템이나 빠르게 변화하는 외부 의존성을 다루는 현대의 소프트웨어 환경에서는 그 한계가 분명히 드러납니다. 핵사고날 아키텍처는 외부 의존성과 비즈니스 로직을 명확히 분리함으로써 이러한 문제들을 해결하고, 확장성, 유지보수성, 그리고 테스트 용이성을 크게 향상시킵니다.

핵사고날 아키텍처를 도입함으로써, 팀은 외부 시스템의 변화에도 빠르고 유연하게 대응할 수 있으며, 더 나아가 미래의 요구사항에 맞추어 시스템을 쉽게 확장할 수 있는 기반을 마련할 수 있습니다.

profile
("Hello World!");

0개의 댓글