Architecture

계층형 아키텍처(Layered Architecture)

왕돼지티라노 2024. 8. 5. 17:27
반응형

아키텍처란?

IEEE 국제 표준에서는 소프트웨어 아키텍처의 정의를 다음과 같이 설명한다.

구성요소들간의 관계, 환경, 설계와 발전을 관리하는 원칙으로 이루어진 시스템의 근본적인 구조

클래스, 파일, 컴포넌트, 모듈 등 코드들이 어떻게 연관되어있고, 상호작용하는지 설계하는 것이다.

소프트웨어 아키텍처의 목표는 소프트웨어의 제작과 유지보수를 보다 쉽게 하는 것, 즉 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소화하는 것이다. 

 

아키텍처의 구성

소프트웨어는 크게 도메인과 인프라스트럭처로 나누어져있다. 도메인이란 소프트웨어로 해결하고자 하는 문제 영역을 말하고(번역앱이라면 번역, 온라인 쇼핑몰이라면 판매 프로세스가 도메인) 도메인은 서비스의 본질로, 자주 바뀌지 않는다. 인프라스트럭처는 도메인을 소프트웨어로 제공하기 위해 필요한 요소들로 구성된다. UI, DB, API 등이 인프라스트럭처에 해당된다. 도메인에 비해 인프라스트럭처는 자주 변경될 가능성이 높다.

 

계층형 아키텍처(Layered Architecture)

계층형 아키텍처는 소프트웨어 개발에서 가장 일반적으로 사용되는 아키텍처이다. 구성되는 계층의 숫자에 따라 N-계층 아키텍처(N-tier Architecture)라고 한다. 구조가 단순하고, 보편적으로 사용하기 때문에 처음 프로젝트를 시작할 때 적합하다.

각 계층은 특정 역할과 관심사별로 구분되어 특정 계층의 구성요소는 해당 계층에 관련된 기능만 수행한다.

추상화된 인터페이스로만 소통한다. 소통은 자신에게 인접한 하위 계층에 요청을 보내는 방식으로 진행된다.(자신보다 상위계층이나, 인접하지 않은 계층에는 요청하지 못한다.)

여기서 핵심은 단방향 의존성이다. 하위 계층은 상위 계층을 몰라야한다. 하위 계층은 인터페이스만 제공하고 요청만 받을 뿐이다.

가장 일반적인 계층형 아키텍처는 4-tier 아키텍처(Presentation, Business, Persistence, Database)이다.

각 계층의 특징에 대해 알아보겠다.

Presentation Layer
사용자 혹은 클라이언트 시스템과 직접적으로 연결되는 부분이다. 

Business Layer
비즈니스 로직을 구현하는 부분이다. 실제로 시스템이 구현해야 하는 핵심 로직을 담당한다. Presentation Layer로 부터 사용자의 요청을 전달받고 해당 요청을 실질적으로 처리하는 부분이다.

Persistence Layer
데이터의 영구 저장과 관리를 담당하는 부분이다. 웹 어플리케이션의 데이터베이스와의 상호작용을 처리하며, 데이터베이스와의 상호작용을 추상화한다.

Database Layer
실제 데이터베이스를 의미한다.

 

CLOSED

레이어드 아키텍처에서 'Closed'는 매우 중요한 개념이다. 이는 계층간 요청이 이동할 때 인접한 계층을 통과하는 것을 의미한다. Presentation Layer에서 Persistence Layer로 요청이 이동하기 위해서는 Business Layer를 거쳐야한다. 이렇게 독립적은 계층을 만드는 이유는 한 계층에서 변경이 발생했을 때, 다른 계층에 영향을 받지 않게 하기 위해서이다.

 

OPEN

항상 모든 계층이 닫혀있지만은 않다. 특정 요청에만 추가적인 계층이 필요한 경우가 있다. 예를 들어 DB에 데이터를 넣기 전 어떠한 작업을 하는 계층을 추가하고 싶다고 가정한다. 이 계층은 해당 기능을 사용하는 요청에서만 필요하다. 이런 경우 해당 기능을 사용하는 요청에 한해서만 이미지 합성 계층을 사용하고, 그렇지 않은 요청의 경우 해당 계층을 우회하도록 한다.

이와 같이 요청이 특정 계층을 우회하고 그 아래의 계층으로 이동가능하게 하는 것을 '개방한다'(OPEN)고 말한다.

계층 아키텍처에서는 계층 구조와 흐름을 문서화하는 것이 아주 중요하다. 어떤 계층이 열려있고 닫혀있는지 그 이유까지 문서화하거나 적절하게 전달해야한다.

 

*싱크홀 패턴

요청이 싱크홀처럼 뚝 떨어지는 것을 말한다. 하위 레이어를 거치긴 하지만, 막상 그 레이어에서는 추가적인 작업 없이 그저 전달만 하는 경우를 뜻한다. 이는 불필요한 오버헤드이다.

예를 들어 Business Layer에서는 요청을 Persistence Layer에 전달하고 결과값을 추가적인 작업 없이 다시 Presentation Layer로 넘겨주는 경우가 있다. 

아래 코드는 해당 예시이다.

public class UserService {
    private final UserRepository userRepository;
    
    public User find(int userId) {
        return userRepository.findById(userId);
    }
}

이런 경우, 레이어를 개방하여 상위 레이어에서 직접 요청을 하는 방식으로 수정할 수 있다.

 

계층형 레이어의 장단점

★ 장점
1) 각 계층이 관심사별로 분리되어있으므로 코드의 재사용성과 유지보수성이 향상된다.
2) 각 계층이 독립적으로 테스트가 가능하므로, 단위 테스트나 통합 테스트가 용이하게 수행된다.

★ 단점
1) 계층 간 통신을 통해 동작하기 때문에, 데이터의 전달 및 변환 과정에서 일부 오버헤드가 발생한다.
2) 계층이 많아질 수록 오버헤드가 증가한다.
3) 계층 간 통신을 위한 인터페이스와 로직을 추가해야하므로 복잡성이 증가한다. 특히, 대규모 프로젝트에서는 계층 간의 관리와 유지보수가 복잡해질 가능성이 크다.

반응형

'Architecture' 카테고리의 다른 글

클린 아키텍처(Clean Architecture)  (0) 2024.08.12