[아키텍쳐, 자바] 소프트웨어 아키텍쳐 패턴에 따른 자바 패키지 구조화

레이어드 아키텍쳐 패턴

레이어드(layered) 아키텍쳐에서 각각의 레이어는 애플리케이션 내에서 특별한 역할과 책임을 가지고 있으며 그 역할과 책임에 따라 레이어 내에 컴포넌트들이 위치한다. 레이어와 계층(티어)의 용어 구분이 존재한다. 레이어는 한 소프트웨어 내 논리적 역할 분리 기준, 계층은 시스템 내 물리적 역할 분리 기준으로 보기도 한다. 레이어드 아키텍처는 역할 및 책임별로 레이어를 정의한 후 레이어를 기준으로 하나의 소프트웨어를 논리적으로 구분한다. 계층 아키텍처는 역할 및 책임별로 서비스(소프트웨어)를 정의한 후 서비스를 기준으로 하나의 시스템을 물리적으로 구분된 서비스의 집합으로 구성한다.

각 레이어는 특정 요청을 처리하여 작업 수행을 완료하기 위해 추상화되어 있으므로 레이어들은 서로의 구체적인 로직에 대해 알지 못한다. 즉, 레이어드 아키텍쳐 패턴은 컴포넌트간 관심사의 분리라는 특징을 가지며 잘 정의된 컴포넌트 인터페이스와 한정된 범위 덕분에 컴포넌트들을 보다 효율적으로 분류할 수 있다.

추상화 뿐만 아니라 각 레이어들은 서로 격리되어 있어 한 계층 내의 컴포넌트 변경이 다른 레이어에 영향을 주지 않도록 함으로써 레이어 간 결합도를 낮추고 한 레이어 내 컴포넌트들의 응집도는 높인다. 레이어 간 영향도를 낮추고 의존성 방향을 원하는 대로 설정하기 위해 인터페이스를 사용한다.

레이어 격리를 통해 각 레이어에서 사용되는 애플리케이션 프레임워크의 교체와 같은 기술적 요소 변화 및 리팩토링은 다른 레이어에 영향을 주지 않게 된다.

레이어드 아키텍처에는 대표적으로 3레이어 아키텍처가 있다. 레이어 아키텍쳐 패턴은 애플리케이션 내부 컴포넌트들을 논리적으로 다음 세 개의 레이어로 구분한다.

  1. 프레젠테이션(표현) 레이어: 사용자와의 상호 작용이 일어나는 인터페이스 역할을 수행한다.
  2. 애플리케이션(서비스) 레이어: 비즈니스 로직에 따라 데이터를 처리하는 역할을 수행한다.
  3. 데이터베이스(영속) 레이어: 데이터를 저장하고 저장된 데이터를 조회하는 데이터 관리 역할을 수행한다.

헥사고날 아키택처 패턴

헥사고날(hexagonal) 아키텍처란

패키지 구조화

기능별 패키지화

기술별 패키지화

3레이어드 아키텍처와 자바 패키지 구조

3레이어드 아키텍쳐 패턴을 사용하는 자바 애플리케이션의 경우 세 개의 논리적으로 분리된 레이어에 따라 패키지를 구조화할 수 있다. 레이어는 애플리케이션의 서비스 구현 로직(비즈니스 로직)과는 연관이 없는 기술적인 영역으로 바라볼 수 있으며 레이어 별로 패키지를 분리할 수 있다. 이를 레이어 별 패키지 구조화라고 한다.

클라이언트의 요청을 받아 처리하는 웹 애플리케이션의 경우 레이어 별 패키지 구조의 예는 다음과 같다. 도메인(비즈니스) 별 패키지가 최상단 레이어 별 패키지 내에 각각 존재하게 된다.

- controller
  - domainA
  - domainB
- service
  - domainA
  - domainB
- repository
  - domainA
  - domainB

프레젠테이션 레이어에 MVC 패턴을 적용한다면 다음과 같은 구조가 가능하다.

- model
  - domainA
  - domainB
- view
  - domainA
  - domainB 
- controller 
  - domainA
  - domainB
- service
  - domainA
  - domainB
- repository
  - domainA
  - domainB 

레이어드 아키텍처를 사용하되 레이어 별 패키지화 대신 기능 별 패키지 구조화의 예는 다음과 같다.

- domainA
  - controller
  - service
  - repository
- domainB
  - controller
  - service
  - repository 

프레젠테이션 레이어에 MVC 패턴을 적용한다면 다음과 같은 구조가 가능하다.

- domainA
  - model
  - view
  - controller 
  - service
  - repository
- domainB
  - model
  - view
  - controller 
  - service
  - repository 

헥사고날 아키텍처와 자바 패키지 구조

헥사고날 아키텍쳐 패턴을 사용하는 자바 애플리케이션의 경우 두 개의 논리적으로 분리된 영역 따라 패키지를 구조화할 수 있다. 영역에는 비즈니스 개념과 로직이 포함되는 도메인 모델 객체와 서비스 객체가 위치하는 내부 영역과 외부 API, 데이터 저장 객체 등이 위치하는 외부 영역이 있다.

이 중 외부 영역은 서비스 구현 로직(비즈니스 로직)과는 연관이 없는 기술적인 영역이다.

클라이언트의 요청을 받아 처리하는 웹 애플리케이션의 경우 레이어 별 패키지 구조의 예는 다음과 같다. 도메인(비즈니스) 별 패키지가 최상단 레이어 별 패키지 내에 각각 존재하게 된다.

- controller
  - domainA
  - domainB
- service
  - domainA
  - domainB
- repository
  - domainA
  - domainB

참고

Comments