#DevOps

[코드가 환경을 모르는 구조 1/7] 코드는 무엇을, 환경은 어디서 - 다시 더 깊이

[코드가 환경을 모르는 구조 1/7] 코드는 무엇을, 환경은 어디서 - 다시 더 깊이
01

Summary

"코드는 환경을 몰라야 한다" 헥사고날 아키텍처를 인프라까지 확장하는 법

AWS에서 NCP로의 이전부터 CI 속도 최적화까지, 하나의 원리로 해결하는 5가지 엔지니어링 고통

본 아티클은 소프트웨어 설계 원칙인 헥사고날 아키텍처를 애플리케이션을 넘어 인프라, 배포, 테스트 전 영역에 적용하는 방법론을 제시합니다. '무엇을' 정의하는 코드와 '어디서'를 결정하는 환경 값을 분리하여, 변화에 유연하고 안정적인 시스템을 구축하는 실무적인 인사이트를 제공합니다.

  • 01배포, 인프라, 시간, 공간, 테스트라는 5가지 축의 교체 가능성 확보
  • 02Helm과 ArgoCD를 활용한 환경별 설정 오버라이드 및 강제 기법
  • 03Pulumi와 Kotlin을 이용한 클라우드 불가지론적(Cloud-agnostic) IaC 설계
  • 04Clock 인터페이스 기반의 시간 제어를 통한 비즈니스 로직 검증 최적화
  • 05Gateway의 Rewrite Host를 활용하여 전체 환경 포크 없이 특정 서비스만 로컬로 연결

RECOMMENDATION

멀티 클라우드 도입을 고려 중이거나, 환경 간 설정 차이로 인해 배포 스트레스를 겪는 시니어 엔지니어 및 DevOps 팀에게 강력히 추천합니다.

The Problem

개발 환경과 운영 환경의 설정이 미세하게 달라지며 발생하는 배포 사고, 특정 클라우드 종속성으로 인한 확장성 저하, 그리고 테스트 및 디버깅 시 환경 의존성으로 인한 비효율성 문제를 해결하고자 합니다.

The Solution

애플리케이션 코드의 헥사고날 아키텍처 원리를 배포(Helm, ArgoCD), 인프라(Pulumi), 테스트(Testcontainers) 등 전체 레이어로 확장하여 '무엇을(로직)'과 '어디서(환경)'를 엄격히 분리하는 구조를 도입합니다.

The Result

환경 간의 경계를 구조적으로 강제함으로써 한쪽의 수정이 다른 쪽에 영향을 주지 않는 안정성을 확보하였고, 어댑터 교체만으로 실험이 가능한 환경을 구축하여 엔지니어의 이터레이션 속도를 향상시켰습니다.

Trade-off

모든 레이어에 추상화 계층(Port/Adapter)을 도입함에 따라 초기 설계 복잡도가 증가하며, 단순한 설정 변경에도 여러 층의 오버라이드 구조를 이해해야 하는 학습 곡선이 존재할 수 있습니다.

03

Key Concepts

Concept · 01

헥사고날 아키텍처 (Hexagonal Architecture)

비즈니스 로직을 외부 시스템(DB, UI, 외부 API 등)과 분리하기 위해 인터페이스(Port)와 구현체(Adapter)를 사용하는 소프트웨어 설계 방식입니다.

  • 애플리케이션뿐만 아니라 인프라 및 배포 파이프라인 설계의 핵심 원리로 사용됩니다.
Concept · 02

Port and Adapter (Interface/Implementation)

계약과 의도를 정의하는 포트와 이를 구체적으로 실행하는 어댑터를 분리하여 상호 의존성을 제거하는 구조적 단면입니다.

  • 클라우드 리소스를 Port로 정의하고 AWS나 NCP를 Adapter로 꽂아 클라우드 자체를 교체 가능하게 만듭니다.
Concept · 03

IaC (Infrastructure as Code)

수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝하는 방식입니다.

  • Pulumi와 Kotlin을 조합하여 인프라 생성 로직('무엇을')과 리전/클라우드 설정('어디서')을 분리합니다.