계층형 아키텍처 패턴 ( 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에서는 아래의 플로우를 기반으로 로직이 수행된다.

  1. 클라이언트( Client )가 어플리케이션에 요청( Request )을 보낸다.
  2. 요청( Request )을 URL에 알맞은 컨트롤러( Controller )가 수신 받는다.
  3. 컨트롤러( Controller )는 요청을 처리하기 위해 서비스( Service )를 호출한다.
  4. 서비스( Service )는 필요한 데이터를 가져오기 위해 저장소( Repository )에게 데이터를 요청한다.
  5. 서비스( Service )는 저장소( Repository )에서 가져온 데이터를 가공해 컨트롤러( Controller )에게 데이터를 전달한다.
  6. 컨트롤러( Controller )는 서비스( Service )의 결과물( Response )을 클라이언트( Client )에게 전달해준다.

서버 개발자들은 서버에서의 처리과정이 대부분 유사하다는 점을 인식하고, Controller, Service, Repository 라는 3개의 계층으로 분리했다. 각 계층 별로 하는 일을 정리해 보자.

 

컨트롤러( Controller )

 

  • 클라이언트의 요청( Request )을 받는다.
  • 요청에 대한 처리는 서비스에게 위임한다.
  • 클라이언트에게 응답( Response )을 반환한다.

 

서비스( Service )

 

  • 사용자의 요구사항을 처리하는 핵심
  • DB 정보가 필요할때 Repository 에게 요청한다.

 

저장소( Repository )

 

  • 데이터베이스 관리( 연결, 해제, 자원 관리 ) 역할을 담당한다.
  • 데이터베이스의 CRUD 작업을 처리한다.

 

전체적인 구조

 

+ Recent posts