서문 — 이 책을 읽는 법
누구를 위한 책인가
이 책은 패턴은 아는데 “왜 쓰는지”는 모르는 개발자를 위해 썼다. 헥사고날 아키텍처의 그림을 그릴 줄 알고, 스프링으로 레이어드 애플리케이션을 매일 만들고, DDD라는 단어에 고개를 끄덕이지만 — 막상 “우리 시스템에 그게 왜 필요한데?”라는 질문 앞에서는 “요즘 다 그렇게 하니까” 이상의 답이 궁한, 주니어에서 미들로 넘어가는 백엔드 개발자. 몇 년 전의 나 자신이기도 하다.
전제하는 지식도 계약으로 적어두자: 객체지향의 기본(인터페이스, 다형성)과 한두 해의 백엔드 실무 경험이면 충분하다. 특정 프레임워크 지식은 요구하지 않는다 — 예제가 자바와 스프링의 어휘를 빌리는 곳이 있지만, 논지는 언어 중립이다. 반대로 시니어 아키텍트에게 이 책의 내용 다수는 이미 아는 것일 텐데, 그 경우 이 책의 쓸모는 지식이 아니라 서사 — 아는 것들이 왜 그 순서로 태어났는가 — 쪽에 있다.
그런 독자에게 아키텍처 책이 흔히 실패하는 방식은 정해져 있다. 스타일의 카탈로그를 펼치는 것 — 레이어드는 이렇게, 헥사고날은 이렇게, 각각의 장단점은 표로. 카탈로그는 시험에는 도움이 되지만 설계에는 도움이 되지 않는다. 설계에 필요한 것은 “무엇이 있는가”가 아니라 **“그것이 왜, 어떤 문제 때문에 태어났는가”**이기 때문이다. 계기를 알아야 내 상황이 그 계기와 같은지 판단할 수 있다.
이 책의 프레임 — 그리고 그 프레임의 한계
그래서 이 책은 모든 아키텍처를 하나의 질문으로 읽는다: “이전 방식의 어떤 고통이 이것을 낳았는가?” 레이어드는 진흙공의 고통에서, 헥사고날은 레이어드의 고통에서, 마이크로서비스는 모놀리스 조직의 고통에서. 각 장의 제목 아래에는 언제나 앞 장의 병이 깔려 있다.
다만 이 프레임에 대한 경고를 저자가 먼저 하는 것이 정직하겠다. 이 역사는 선형 진보가 아니다. “고통이 만든 진화”라는 말은 자칫 “새것이 항상 낫다”로 읽히는데, 실제 역사는 두 가지 다른 모양이었다. 하나는 수렴 — 헥사고날·어니언·클린은 계단이 아니라, 서로 다른 문제의식에서 출발한 세 사람이 같은 원리에 도착한 사건이다. 다른 하나는 진자 — 모놀리스에서 마이크로서비스로 갔던 업계는 상당 부분 되돌아왔고, 다만 돌아온 자리는 출발점이 아니라 나선의 한 칸 위였다. 고통을 풀면 새 고통이 생긴다. 그 왕복까지가 역사다.
한 가지 더. “고통”이라는 말을 이 책은 감상적으로 쓰지 않는다. 4장에서 품질 속성이라는 측정 언어를 배우는 순간부터, 모든 고통은 이름을 갖는다 — 변경용이성의 결핍, 테스트가능성의 결핍, 배포독립성의 결핍. 측정할 수 없는 불만은 설계를 움직이지 못한다.
구성
Part 1 (Step 01~04) — 원론. 아키텍처라는 단어의 역사와 정의, 그것이 풀려는 문제(변경), 모든 스타일을 관통하는 하나의 원리(의존성 방향), 그리고 측정 언어(품질 속성). 이 네 장이 이후 모든 장의 도구 상자다 — 특히 Step 03의 “화살표” 없이는 Part 2가 읽히지 않으니 건너뛰지 말길.
Part 2 (Step 05~12) — 발전사. 구조가 없을 때의 자연 상태(진흙공)에서 출발해, 레이어드 → DDD → 헥사고날·어니언·클린 → 조직(Conway) → 분산 → 데이터를 지나, 진화적 아키텍처로 닫는다. 매 장은 같은 틀이다: 앞 장의 고통 → 응답 → 그 응답이 낳은 새 고통.
Part 3 (Step 13~15) — 실전. 같은 요구사항을 두 아키텍처로 구현해 diff와 테스트로 비교하고(코드는 architecture 모듈에 있으며 전부 실행된다), 달리는 시스템을 고치는 법(브라운필드)을 다루고, 선택과 기록(ADR)으로 닫는다.
예제 코드: 본문의 모든 Java 예제와 테스트는 GitHub에 있고 실제로 실행된다 — Hyeonqz/Hyeonq-Lab · architecture 모듈 . 그린필드 3종(레이어드/헥사고날), 데이터 패턴(아웃박스·멱등·원장), 규칙 축적 드리프트 시연, ArchUnit 적합도 함수까지 17개 테스트가 통과한다.
읽는 순서에 대한 경고 하나. 이 책의 장들은 서로 업고 간다 — 매 장이 앞 장의 도구(화살표, 품질 속성, 전단층, 애그리거트…)를 이름만 부르고 재사용하므로, 발췌해서 읽으면 뒷장이 반만 읽힌다. 특히 Part 1(Step 01~04)은 반드시 순서대로. Part 2부터는 관심 장으로 건너뛰되, 막히면 그 장이 회수하는 앞 장으로 돌아가면 된다.
각 장의 골격은 같다: 여는 질문 → 본문 → 흔한 오해 바로잡기 → 요약과 다음 장 예고 → 원전 표. 오해 절만 이어 읽어도 하나의 짧은 책이 된다. 원전 표의 문헌들은 부록 C에 연표로 모아뒀다 — 이 분야는 연도를 틀리게 유통되는 이야기가 유난히 많아서, 연표 자체가 오독 방지 장치다.
이 책의 후렴
열다섯 장에 걸쳐 반복되는 문장이 셋 있다. 미리 적어둔다.
- 아키텍처란 되돌리기 비싼 결정들과 그 근거이며, 구조는 그 흔적이다. (Step 01)
- 좋은 아키텍처는 중요한 결정을 신중히 먼저 내리고, 바뀔 법한 결정을 최대한 늦게 내릴 수 있게 한다. (Step 02)
- 모든 것은 트레이드오프다 — 목표는 최선이 아니라 가장 덜 나쁜 것이다. (Step 04)
책을 덮은 뒤에 남는 것이 이 세 문장이라면, 이 책은 제 몫을 한 것이다.