레이어드 아키텍처와 MVC 패턴을 공부하면서 진짜 머리가 너무 아팠어서 정리해봤다.
레이어드 아키텍처, Multi Tier architecture 라고도 불린다.
레이어드 아키텍처의 핵심은 관심사 분리이다.
즉, 각 레이어가 독립적으로 존재하여 레이어 서로에게 영향을 줄 일이 없는 것이다.
레이어드 아키텍처의 장점은 서로의 영역에 침범할 일이 없다는 것이다.
각 레이어끼리의 접근이 불가능하기 때문에 하위 레이어에만 접근하게 된다.
즉 Service에서 Service를, Controller에서 Controller를 접근할 수 없는 것이다.
도메인끼리 묶이기 때문에 도메인의 변경이 힘들다.
만약 User라는 도메인을 변경하면 Presentation 레이어, Persistence 레이어, Business 레이어들을 전부 바꿔야한다.
레이어드 아키텍처는 작고 간단한 애플리케이션에 적합하다.
복잡하지 않으며 초반 설계의 난이도가 쉬운편에 속하기 때문이다.
다만 규모가 커질 수록 유지 보수성, 민첩성, 시험성, 배포성 같은 특성이 점점 나빠진다.
또 DDD(도메인 주도 설계)를 할 땐 적합하다 할 수 없다.
도메인의 변경 자체가 어렵기 때문에 도메인을 위주로 설계를 해야하는 DDD와는 상성이 좋지 않다.
레이어드 아키텍처의 파일 구조는 아래와 같이 구성될 수 있다.
├── Main.java
├── model
│ ├── ModelA.java
│ └── ModelB.java
├── router
│ ├── RouterA.java
│ └── RouterB.java
└── services
├── ServiceA.java
└── ServiceB.java
싱크홀 패턴이란 각 레이어를 통과할 때 아무 비즈니스 로직도 없이 통과하는 것을 말한다.
비즈니스 로직 없이 통과하는 레이어는 그저 메모리를 잡아먹을 뿐인 작업이기 때문이다.
파일 구조를 보면 MVC 패턴이 보일 것이다.
model은 Domain(Entity), router는 controller, service는 service로 MVC 패턴과 레이어드 아키텍처의 차이점을 이해하기 힘들 수 있다.
핵심만 말하자면 디자인 패턴과 아키텍처의 차이이다.
말 드대로 코드와 파일 트리의 차이점이라고 생각하면 좋을 것 같다.
보통 Spring을 배울 때 MVC 패턴으로 배우는데 이 때 폴더를 나누는 작업에 알게 모르게 레이어드 아키텍처가 적용되어있는 경우도 많다.
또한 레이어드 아키텍처라고 무조건 위와 같이 Controller, Service, Domain 으로 나눠야 하는게 아니다. 아키텍처 설계자의 스타일에 따라 구조는 언제나 바뀔 수 있다.