216. 헥사고날 아키텍처 (Hexagonal Architecture) - Ports and Adapters 포트 앤 어댑터 도메인 중심 설계 결합도 분리 의존성 역전 테스트 용이성

핵심 인사이트: (205번 계층형 한계 돌파) 3층짜리 빌딩(계층형)을 잘 지었다고 좋아했다. 근데 제일 밑바닥 1층에 오라클 DB(데이터)가 떡하니 버티고 있으니, 2층의 핵심 뇌(비즈니스 로직)가 무조건 1층 DB한테 종속당해 버렸다. DB가 오라클에서 몽고DB로 바뀌니 2층의 뇌 코드도 싹 다 뜯어고쳐야 했다. "야! 제일 중요한 건 우리 회사의 돈을 버는 '비즈니스 뇌(도메인)' 코드야! 이 뇌를 빌딩 맨 꼭대기나 정중앙으로 끌어올려서 투명한 유리관에 넣어 보호해! 밖에서 들어오는 웹 화면이든, 밑에서 올라오는 DB 데이터든 무조건 뇌 주변에 '콘센트 구멍(Port)'을 파놓고, 거기에 맞는 '돼지코 어댑터(Adapter)'만 끼워서 연결하게 만들어!! 그럼 나중에 DB가 바뀌어도 돼지코(어댑터)만 갈아 끼우면 뇌 코드는 1줄도 안 건드려도 되잖아!" 도메인 로직을 외부의 더러운 기술로부터 100% 격리하는 육각형의 철갑, 헥사고날 아키텍처다.

Ⅰ. 고전적 계층형(Layered) 아키텍처의 비극 (DB 종속성)

  • 205번 3계층(UI ➜ 비즈니스 ➜ DB)의 치명적 단점은 화살표의 방향이 위에서 아래로(단방향) 향한다는 것입니다.
  • 2층(비즈니스 뇌)이 1층(DB 쿼리)을 직접 호출(Call)하기 때문에, 오라클 전용 SQL 문법이 뇌 코드 안으로 더럽게 파고들어 섞입니다. 뇌(도메인)가 껍데기 기계 기술(DB)에 노예처럼 종속되어버렸습니다.

Ⅱ. 헥사고날 아키텍처 (Hexagonal / Ports and Adapters) 🌟

  • 개념: 앨리스터 코오번(Alistair Cockburn)이 제안한 구조로, 시스템의 가장 핵심인 '비즈니스 로직(도메인 모델)'을 정중앙(육각형의 안쪽)에 꽁꽁 숨겨두고, 외부의 모든 기술(웹 화면, DB, 외부 API)은 육각형 바깥쪽에서 '포트(Port)'와 '어댑터(Adapter)'를 통해서만 내부 뇌와 통신하도록 설계하여, 내부 도메인 코드를 외부 기술 변화로부터 100% 완벽하게 격리시키는 패턴입니다.

Ⅲ. 육각형을 떠받치는 3대 핵심 컴포넌트 🌟 핵심 기출 🌟

1. 내부 도메인 (Inner Hexagon / Business Logic) - "절대 성역"

  • 애플리케이션의 심장입니다. "장바구니 총액 계산하기" 같은 핵심 자바 코드만 존재합니다.
  • 절대 룰: 이 안에는 스프링(Spring) 프레임워크 태그나 SQL 쿼리문 같은 '외부 기술'을 단 1줄도 적으면 안 됩니다. 오직 순수한 자바(Pure Java, POJO)로만 짜여져, 구글 클라우드로 가든 아마존으로 가든 그대로 들고 가서 돌릴 수 있는 불사조 코드여야 합니다.

2. 포트 (Port) - "콘센트 구멍 (Interface)"

  • 내부 뇌가 외부와 소통하기 위해 육각형 벽면에 뚫어놓은 '자바 인터페이스(Interface)' 규격입니다.
    • Inbound Port (들어오는 문): 외부(웹 브라우저)가 내부 뇌를 찌를 때 지켜야 할 규격입니다. (주문하기() 인터페이스)
    • Outbound Port (나가는 문): 내부 뇌가 밖(DB)으로 데이터를 내보낼 때 지켜야 할 규격입니다. (저장하기() 인터페이스)

3. 어댑터 (Adapter) - "맞춤형 돼지코" 🌟

핵심 기술입니다. 포트(구멍) 규격에 맞춰서 밖의 더러운 기술을 내부 뇌와 연결해 주는 통역사 플러그입니다.

  • Inbound Adapter: 사용자가 REST API(JSON)로 주문을 쏩니다. 이 어댑터(Spring Controller)가 JSON 껍데기를 다 까버리고, 순수한 자바 데이터로 번역해서 내부 주문하기() 포트 구멍에 꽂아줍니다.
  • Outbound Adapter: 내부 뇌가 저장하기() 포트 구멍으로 엑셀 데이터를 밀어냅니다. 밖에서 기다리던 아웃바운드 어댑터(JPA/MyBatis)가 이 데이터를 낚아채어 오라클 DB용 더러운 SQL 쿼리문으로 번역한 뒤 지하 DB에 꽂아버립니다.

Ⅳ. 의존성 역전 (DIP)의 기적과 테스트 🌟

  • 의존성의 방향: 화살표가 밖에서 무조건 안쪽(정중앙 육각형)을 향해 꽂힙니다. 1층(DB)이 2층(뇌)을 향해 거꾸로 꽂히는 **의존성 역전 원칙(Dependency Inversion Principle)**이 발동한 것입니다!
  • 기적의 결과: 나중에 DB를 오라클에서 몽고DB로 바꿉니다. 정중앙의 '비즈니스 뇌' 코드는 1줄도 수정하지 않습니다. 그냥 육각형 바깥에 꽂혀있던 '오라클 어댑터 돼지코'를 뽑아버리고, 1시간 만에 새로 짠 '몽고DB 어댑터 돼지코'를 포트 구멍에 찰칵 끼워 넣으면 끝납니다. (플러그 앤 플레이)
  • 테스트: DB 없이도 뇌 코드만 쏙 빼서 1초 만에 수만 번 유닛 테스트(Mocking)를 돌릴 수 있는 MSA 환경의 최고급 엘리트 아키텍처입니다.

📢 섹션 요약 비유: 기존 계층형(Layered) 아키텍처는 회사의 핵심 두뇌인 '회장님(비즈니스 로직)'이 지하 창고(DB)에 직접 내려가서 먼지를 뒤집어쓰고 엑셀 파일을 뒤지는 꼴이었습니다. 창고가 이사 가면 회장님도 짐을 싸야 했습니다(DB 종속성). 이를 부숴버린 헥사고날(Hexagonal) 아키텍처는 회장님을 빌딩 꼭대기 '무균실 유리 캡슐(육각형 내부 도메인)' 안에 가둬버린 것입니다. 회장님은 절대 방 밖으로 나가지 않고 오직 회사 운영(핵심 로직)만 고민합니다. 유리 캡슐 벽면에는 여러 개의 **'마이크와 스피커 구멍(Port)'**이 뚫려 있습니다. 지하 창고에서 서류를 올려보낼 때는 비서(어댑터 Adapter)가 서류를 받아, 회장님이 쓰는 표준 한국어(자바 인터페이스)로 깔끔하게 통역하여 스피커 구멍으로 쏙 넣어줍니다. 내일 창고가 미국식(몽고DB)으로 바뀌어 영어가 올라와도, 회장님은 알 바 아닙니다. 영어 통역이 가능한 새 비서(새 어댑터)로 갈아치우기만 하면, 회장님은 여전히 한국어만 들으며 영원히 무균실에서 평화롭게 회사를 통치할 수 있는 궁극의 도메인 보호 아키텍처입니다.