[개인 아키텍처 시스템 #2] 언어가 달라도 같은 골격 — 포트 기반 baseline

개인 아키텍처 시스템 시리즈

  1. #1 왜·어떻게 만들었나
  2. #2 포트 기반 baseline — 지금 이 글
  3. #3 인프라 concern 조립
  4. #4 MSA 즉시 접목

이 시스템의 비협상 규칙은 하나다. 모든 패턴은 Clean Architecture + Hexagonal(포트 기반)을 기본 골격으로 삼는다. 언어가 Go든 Java든 Flutter든, 골격은 같다.

1. 한 장으로 보는 골격

Handler → inbound port → UseCase → outbound port → Repository/Adapter, 언어별 관용구로 1:1 매핑 (원본 제작)
Handler → inbound port → UseCase → outbound port → Repository/Adapter, 언어별 관용구로 1:1 매핑 (원본 제작)

Handler → (inbound port) → UseCase → (outbound port) → Repository/Adapter. 제어(흐름)는 오른쪽으로 흐르지만, 의존성은 포트(인터페이스)로 역전시켜 안쪽(UseCase·Domain)이 프레임워크를 전혀 모르게 한다. 이 원리 자체는 지난 Go 아키텍처 시리즈에서 코드로 다뤘다 — 이 글은 그 원리를 여러 언어에 일관되게 강제하는 방식에 대한 이야기다.

2. 같은 개념, 언어별 관용구

개념 Go Java Node React Flutter
Handler(구동) Gin handler @RestController express route hook/컴포넌트 widget/bloc
UseCase usecase impl @UseCase service use-case hook usecase
Repository(피구동) GORM repo JPA repo prisma repo api client repository

이렇게 Handler/UseCase/Port/Repository라는 같은 개념을 언어별 관용구로 1:1 매핑해 두면, 새 언어를 배우거나 팀을 옮겨도 “이 코드는 어느 자리”인지 헤매지 않는다.

3. 왜 baseline을 하나로 고정했나

  • 비교 가능성 — 같은 14-섹션 틀 위에서 언어별 패턴이 나란히 비교된다.
  • 교체 용이성 — 프레임워크·ORM은 어댑터라 갈아 끼워도 UseCase는 그대로.
  • MSA 준비 — 포트 경계가 이미 그어져 있어, 나중에 서비스로 떼어내기 쉽다(4편).

참고로 MVC를 섞은 스타일도 있지만, 나는 그걸 참조용 카운터-예시로만 두고 베이스라인과 명확히 구분한다. 3편에서는 이 골격 위에 얹는 인프라 자동화를 본다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다