늦은 프로그래밍 이야기

Layered Architecture (계층형 구조) 본문

내일배움캠프/Spring

Layered Architecture (계층형 구조)

한정규 2022. 12. 6. 16:59

Layered Architecture

3계층 구조

Presentation

 - 사용자와 상호 작용 처리

 - CLI, HTTP 요청, HTTP 처리 등을 담당

 - HTTP 요청 처리 및 HTML 렌더링에 대해 알고 있는 웹 계층

 - 흔히 말하는 MVC (Model / View / Controller) 도 이 계층에 속한다

 - 스프링에서는 @Controller 어노테이션을 사용하여 표현

 

Domain (Business or Service)

 - 서비스 / 시스템의 핵심 로직

 - 유효성 검사 및 계산을 포함하는 business 논리 계층

 - 애플리케이션이 수행해야 하는 도메인과 관련된 작업들을 담당

 - 입력 / 저장된 데이터를 기반으로 계산

 - Presentation 계층에서 받은 데이터의 유효성 (Validation) 검사

 - 어떤 Data Access를 선택할지 결정

 - 스프링에서는 @Service 어노테이션을 사용하여 표현

 

Data Access (Persistence) 계층

 - DAO 계층

 - Database / Message Queue / 외부 API와의 통신 등 처리

 - 데이터베이스 또는 원격 서비스에서 영구 데이터를 관리하는 방법을 분류하는 데이터 접근 계층

 - 스프링에서는 @Repository 어노테이션을 사용하여 표현

 

3계층 외에도 각 시스템의 상황에 따른 다양한 N계층이 있다.

DTO (Data Transfer Object)

 - 기능이 제한된 도메인 객체, 혹은 View 전용 등의 도메인과 무관하게 데이터 전달만을 위한 객체

 - 도메인 객체가 도메인 계층을 벗어나지 못하도록 지원

 - Presentation 영역에서 필요한 로직과 도메인 로직을 분리할 수 있다.

 - 도메인 로직의 오염을 방지

 

Domain

 - Business 로직만 담당하며, 외부의 특정 기술이나 구현 의존성을 최대한 피한다.

Service

 - 기반 서비스 계층 혹은 어플리케이션 계층 등으로 불린다.

 - 도메인 로직과 함께 사용되는 기반 환경의 로직들을 수행

 - Transaction

 - 메일 & SMS 발송 등 다른 인프라와의 통신을 담당하는 역할도 한다.

 


계층화의 원칙

 - 각 계층은 응집도가 높으면서, 다른 계층과는 낮은 결합도를 가진다.

 - 기본적으로 상위 계층은 하위 계층을 사용할 수 있지만, 하위 계층은 본인의 상위 계층으로 누가 있는지 인식 못하도록 해야한다.


계층화를 해야하는 이유

 - 관심범위 축소 (관심사 분리)

 - 모듈 교체의 용이성

 - 좀 더 용이한 테스트

 

관심범위 축소 (관심사 분리)

 - 격리성 (Closed)

 - 계층에서 계층으로 요청이 이동할 때 바로 아래의 계층을 거쳐야 해당 계층 아래의 다음 계층으로 이동할 수 있음을 의미

 - 아키텍쳐의 한 계층의 변경이 다른 계층의 구성 요소에 영향을 미치지 않도록 한다.

 - 격리성이 없는 계층화는 계층간 결합도가 매우 높은 애플리케이션이 되는 것 (변경하기가 매우 어렵고 수정에 대한 비용이 많이 든다)

 - 충분히 격리된 계층화를 사용하게 되면 한번에 한 계층에만 집중할 수 있는 환경을 구축할 수 있다.


출처 : https://jojoldu.tistory.com/603

 

계층형 아키텍처

학교 다닐때 잠깐 JAVA 관련 수업을 들은적이 있다. 그때 수업 내용은 넷빈즈(Netbeans) IDE를 통해 JAVA로 윈도우 애플리케이션을 만드는 것이였다. 간단한 시간표 관리 프로그램을 만드는 과제는 얼

jojoldu.tistory.com


'내일배움캠프 > Spring' 카테고리의 다른 글

Annotation  (1) 2022.12.21
UnsatisfiedDependencyException 에러 해결  (0) 2022.12.16
Spring MVC  (0) 2022.12.07
JPA  (0) 2022.12.06
Database, SQL  (0) 2022.12.06
Comments