아키텍처 패턴?
아키텍쳐 패턴은 소프트웨어의 구조를 구성하기 위한 가장 기본적인 토대를 제시한다.
각각의 시스템들과 그 역할이 정의되어 있고, 여러 시스템 사이의 관계와 규칙 등이 포함되어 있다.
따라서, 검증된 구조로 개발을 진행하기 때문에 안정적인 개발이 가능하다.
복잡한 도메인 문제를 해결할 때 아키텍처 패턴을 사용하면 모델이나 코드를 더 쉽게 변경할 수 있다는 측면에서 이점을 가질 수 있다.
대표적인 아키텍처 패턴
대표적인 아키텍처 패턴으로는 아래의 4가지를 들 수 있다.
- MVC 패턴 (Model View Controller Pattern)
- 계층형 아키텍처 패턴 (Layered Architecture Pattern)
- 클린 아키텍처 패턴 (Clean Architecture)
- 마이크로 서비스 아키텍처 패턴 (Microsevices Architecture Pattern)
계층형 아키텍쳐 패턴
계층형 아키텍쳐 패턴은 시스템을 여러 계층으로 분리하여 관리하는 아키텍쳐 패턴이다. 현재 가장 널리 채택되고 있는 아키텍처 패턴 중 하나이다.
단순하고 대중적이면서 비용도 적게 들어 사실상 모든 어플리케이션의 표준 아키텍처이다. 따라서 어떤 아키텍처 패턴을 도입할지 확신이 없을 때에는 계층형 아키텍쳐 패턴은 좋은 선택지가 될 수 있다.
계층형 아키텍처 패턴은 각 계층을 명확하게 분리해서 유지하고, 각 계층이 자신의 바로 아래 계층에만 의존하게 만드는 것이 목표이다.
계층형 아키텍쳐 패턴의 핵심
계층화의 핵심은 각 계층이 높은 응집도를 가지면서 다른 계층과는 결합도를 최소화 하는 것이다.
상위 계층은 하위 계층을 사용할 수 있지만, 하위 계층은 자신이 어떤 상위 계층에 속하는지 알 필요없이, 독립적으로 동작할 수 있어야 한다.
일반적으로 계층형 아키텍쳐 패턴에서 규모가 작은 어플리케이션의 경우 3개의 계층, 크고 복잡한 경우에는 그 이상의 계층으로 구성된다.
계층형 아키텍처 패턴의 장점
- 관심사를 분리하여 현재 구현하려는 코드를 명확하게 인지할 수 있다.
- 각 계층은 서로 독립적이며, 의존성이 낮아 모듈을 교체하더라도 코드 수정이 용이하다.
- 각 계층별로 단위 테스트를 작성할 수 있어 테스트 코드를 조금 더 용이하게 구성할 수 있다.
3계층 아키텍처
3계층 아키텍처의 구성
- 프레젠테이션 계층
- 비즈니스 로직 계층
- 데이터 엑세스 계층 | 영속 계층
1. 컨트롤러 (Controller)
: 어플리케이션의 가장 바깥 부분, 요청/응답을 처리한다.
클라이언트의 요청을 수신 한 후 서버에서 처리된 결과를 반환해주는 역할을 담당한다.
2. 서비스 (Service)
: 어플리케이션의 중간 부분, API의 핵심적인 동작이 많이 일어나는 부분이다.
아키텍처의 가장 핵심적인 비즈니스 로직이 수행되는 부분이다.
3. 저장소 (Repository)
: 어플리케이션의 가장 안쪽 부분, 데이터베이스와 맞닿아 있는 부분이다.
따라서 실제로 데이터베이스와 통신하는 계층이다.
3계층 아키텍처의 로직
1. 컨트롤러 (Controller)
2. 서비스 (Service)
3. 저장소 (Repository)
4. 전체 구조
3계층 아키텍처 구현
우선 기본 경로에 router를 연결해준다.
router의 하위에 컨트롤러를 연결, 컨트롤러 하위에 서비스를 연결, 서비스 하위에 레퍼지토리를 연결한다.
'게시글 조회 API' 하나 구성하는 예시를 통해 3계층 아키텍처를 보려고 한다.
1. router 연결 ( app.js 혹은 index.js의 기본 경로와 연결해준다)
2. controller 연결 (router.js에서 가져와서 쓰고 있는 getPosts를 controller.js에서 정의해줌)
3. service 연결 ( controller.js에서 사용하고 있는 findAllPost를 service.js에서 정의해줌)
4. repository 연결 ( service.js 에서 사용하고 있는 findAllPosts를 repository에서 정의해줌)
위와 같은 방법으로 연결된 하위계층 이외에는 접근할 수 없도록 만들어 줄 수 있다.
이와 같이 계층형 아키텍처를 사용함으로써 router에서 모든 것을 관리하던 이전 코드와는 달리 객체지향의 5원칙을 지키며 하나의 코드에서 하나의 책임만을 질 수 있도록 코드를 구현할 수 있게 되었다.
계층형 아키텍처를 사용함으로써 코드의 가독성 뿐만 아니라 코드의 유지, 보수, 관리를 용이하게 할 수 있다.