계층형 아키텍처 패턴 ( Layered Architecture Pattern )은 시스템을 여러 계층으로 분리하여 관리하는 아키텍처 패턴이다.
현재 가장 널리 채택되고 있는 아키텍처 패턴 중 하나다. ( Spring, Nest.js을 사용할 때, 필수적으로 도입되는 아키텍터 패턴 )
단순하고 대중적이면서 비용도 적게 들어 사실상 모든 어플리케이션의 표준 아키텍처다. 어떤 아키텍처 패턴을 도입할지 확신이 없을 때 계층형 아키텍처 패턴은 좋은 선택지가 될 수 있다.
계층형 아키텍처 패턴은 각 계층을 명확하게 분리해서 유지하고, 각 계층이 자신의 바로 아래 계층에만 의존하게 만드는 것이 목표다.
계층화의 핵심은 각 계층이 높은 응집도( Cohesion )를 가지면서, 다른 계층과는 결합도( Coupling )를 최소화 하는 것이다. 여기서 상위 계층은 하위 계층을 사용할 수 있지만, 하위 계층은 자신이 어떤 상위 계층에 속하는지 알 필요없이, 독립적으로 동작할 수 있어야한다.
예를 들어, 데이터 액세스 계층( Data Access Layer )은 비즈니스 로직 계층( Business Logic Layer )에 어떤 코드들이 있는지 알 수 조차 없고, 사용하면 안된다라는 점을 기억하자.
일반적으로 계층형 아키텍처 패턴의 경우 규모가 작은 어플리케이션의 경우 3개의 계층, 크고 복잡한 경우는 그 이상의 계층으로 구성된다.
이번에 알아볼 아키텍처 패턴은 3계층 아키텍처( 3-Layered Architecture )다.
3계층 아키텍처에서 구성되는 각각의 계층( Layer )은 아래와 같다.
- 프레젠테이션 계층 ( Presentation Layer )
- 비즈니스 로직 계층 ( Business Logic Layer )
- 데이터 액세스 계층 ( Data Access Layer ) | 영속 계층 ( Persistence Layer )
계층형 아키텍처 패턴의 장점
- 관심사를 분리해 현재 구현하려하는 코드를 명확하게 인지할 수 있다.
- 각 계층은 서로 독립적이며, 의존성이 낮아 모듈을 교체하더라도 코드 수정이 용이하다.
- 각 계층별로 단위 테스트를 작성할 수 있어 테스트 코드를 조금 더 용이하게 구성할 수 있다.
3 계층 아키텍처 ( 3-Layered Architecture )
3-Layerd Architecture는 주로 아래의 3가지 계층으로 구성된다.
1. 컨트롤러( Controller ) : 어플리케이션의 가장 바깥 부분, 요청 / 응답을 처리
- 클라이언트의 요청( Request )을 수신 한 후 서버에서 처리된 결과를 반환( Response )해주는 역할을 담당한다.
2. 서비스( Service ) : 어플리케이션의 중간 부분, API의 핵심적인 동작이 많이 일어나는 부분
- 아키텍처의 가장 핵심적인 비즈니스 로직이 수행되는 부분이다.
3. 저장소( Repository ) : 어플리케이션의 가장 안쪽 부분, 데이터베이스와 맞닿아 있다.
- 실제 데이터베이스와 통신하는 계층이다.
3-Layered Architecture에서는 아래의 플로우를 기반으로 로직이 수행된다.
- 클라이언트( Client )가 어플리케이션에 요청( Request )을 보낸다.
- 요청( Request )을 URL에 알맞은 컨트롤러( Controller )가 수신 받는다.
- 컨트롤러( Controller )는 요청을 처리하기 위해 서비스( Service )를 호출한다.
- 서비스( Service )는 필요한 데이터를 가져오기 위해 저장소( Repository )에게 데이터를 요청한다.
- 서비스( Service )는 저장소( Repository )에서 가져온 데이터를 가공해 컨트롤러( Controller )에게 데이터를 전달한다.
- 컨트롤러( Controller )는 서비스( Service )의 결과물( Response )을 클라이언트( Client )에게 전달해준다.
서버 개발자들은 서버에서의 처리과정이 대부분 유사하다는 점을 인식하고, Controller, Service, Repository 라는 3개의 계층으로 분리했다. 각 계층 별로 하는 일을 정리해 보자.
컨트롤러( Controller )
- 클라이언트의 요청( Request )을 받는다.
- 요청에 대한 처리는 서비스에게 위임한다.
- 클라이언트에게 응답( Response )을 반환한다.
서비스( Service )
- 사용자의 요구사항을 처리하는 핵심
- DB 정보가 필요할때 Repository 에게 요청한다.
저장소( Repository )
- 데이터베이스 관리( 연결, 해제, 자원 관리 ) 역할을 담당한다.
- 데이터베이스의 CRUD 작업을 처리한다.
'IT' 카테고리의 다른 글
[IT] 객체 지향 설계 원칙 - S.O.L.I.D (1) | 2024.10.20 |
---|---|
[IT] 테스트 코드 ( Test Code ) (1) | 2024.09.28 |
[IT] 아키텍처 패턴 ( Architecture Pattern ) (1) | 2024.09.27 |
[IT] 객체 지향 설계 5 원칙 ( SOLID ) (1) | 2024.09.27 |
[IT] 객체 지향 프로그래밍 ( Object-Oriented Programming, OOP ) (0) | 2024.09.26 |