

안드로이드, 플러터 개발을 할 때에도 클린 아키텍처(+MVVM) 를 사용하거나 MVC 패턴을 적용해서 구조를 잡고 시작했었다.
그렇다면 스프링 부트 프로젝트에서는 어떤 아키텍처를 사용하는지 알아보려고 한다.
소프트웨어 아키텍처란 애플리케이션의 구조와 계층을 정의하고, 각 계층의 책임을 분리하는 설계 방식이다.
쉽게 말해 “프로젝트를 어떤 방식으로 나눠서 유지보수성과 확장성을 높일지”를 정하는 설계도라고 보면 된다.
스프링 진영에서 대표적으로 사용되는 아키텍처는 다음과 같다:
그리고 최근 현업에서는 DDD(도메인 주도 설계) + 레이어드 아키텍처 조합이 흔히 쓰인다. (단, 상황에 따라 헥사고날/클린을 선택하는 팀도 있다)
레이어드 아키텍처는 애플리케이션을 서로 다른 논리적 계층으로 분리하는 패턴이다.
흔히 n-티어 아키텍처(n-tier architecture) 라고도 불리는데, 여기서 n은 계층의 수를 의미한다.
(다만 n-티어는 배포 관점, 레이어드는 논리 계층 분리를 의미한다는 점에서 개념적으로 구분된다)
가장 기본적인 구조는 다음과 같은 4계층이다:
Presentation Layer (Controller)
Business Layer (Service)
Persistence Layer (Repository)
Database
흐름은 보통 Controller → Service → Repository → Database 순으로 내려간다.
(실무에서는 Repository와 DB를 하나로 묶어 3계층 구조로 설명하기도 한다)
📌 참고 GitHub: Spring Petclinic (spring-projects)
→ 전통적인 레이어드 아키텍처의 대표적인 예시
헥사고날 아키텍처는 2005년 Alistair Cockburn이 제안한 스타일로, 흔히 Ports & Adapters 패턴이라고 부른다.
핵심은 단순하다:
👉 애플리케이션 코어(비즈니스 로직)를 외부 기술(데이터베이스, UI, 메시지, API 등)로부터 완전히 분리한다.
구조
Core (도메인 로직, 애플리케이션 서비스)
Ports (포트, 인터페이스)
Adapters (어댑터, 구현체)
JpaOrderRepositoryAdapter, KakaoPayAdapter, RabbitMQAdapter[ DB / REST API / Message Queue / UI ]
↕ (Adapters)
[ Ports (Interfaces) ]
↕
[ Application Core ]

장점
단점
카카오페이 기술 블로그에서도 이렇게 밝힌 바 있다.
“헥사고날 아키텍처를 도입했지만, 비즈니스가 단순한 상황에서는 오히려 추상화·계층이 과도해져 복잡성과 유지보수 부담이 커졌다. 결국 제거하는 선택을 했다.”
— 카카오페이 기술 블로그
📌 참고 GitHub:
클린 아키텍처는 Robert C. Martin(Uncle Bob)이 제안한 방식으로, 의존성이 항상 안쪽(도메인)으로만 흐르는 구조이다.
즉, 도메인은 프레임워크나 DB에 의존하지 않고 독립적으로 존재한다.
계층 구조
Entities (도메인 모델)
Use Cases (애플리케이션 계층)
Interface Adapters
Frameworks & Drivers
[ Frameworks & Drivers ]
↓
[ Interface Adapters ]
↓
[ Use Cases ]
↓
[ Entities ]

장점
단점
📌 참고 GitHub:
현업에서 많이 쓰이는 건 사실 DDD(도메인 주도 설계) + 레이어드 아키텍처이다.
DDD를 통해 **도메인 언어(Ubiquitous Language)**를 코드에 반영하면, 비즈니스 전문가와 개발자가 같은 언어로 소통할 수 있다는 장점이 있다.
그렇다면 왜 모바일은 클린 아키텍처를 많이 쓰고, 스프링에서는 DDD+레이어드가 더 흔할까?
모바일/프론트엔드
스프링(Spring Boot)
@RestController, @Service, @Repository만으로 전형적인 계층 구조 완성✅ 정리