개발 단계에서 좋은 코드의 구조를 생각하는 것은 쉽지 않습니다. 코드 아키텍처를 구상할 때는 확장성(extensibility), 재사용성(reusability), 유지 보수 가능성(maintainabiliy), 가독성(readability)와 같은 요소들을 염두해야합니다.
다행히도 코드의 구조를 어떻게 구성하고 관리해야 하는지는 이미 많이 다루어졌으며, 그에 관한 정성이나 패턴은 많이 나와있습니다. 그 중에서 백엔드 API 코드에 가장 널리 적용되는 패턴 중 하나는 레이어드 아키텍처 패턴입니다.
Multi-tier 아키텍처 패턴이라고도 하는 레이어드 아키텍처는 코드를 논리적인 부분 혹은 역할에 따라 독립된 모듈로 나누어서 구성하는 패턴입니다. 그리고 각 모듈이 서로의 의존도에 따라 층층히 쌓듯이 연결되어서 전체의 시스템을 구현하는 구조입니다. 그래서 마치 레이어(layer)를 쌓아 놓은 것 같은 형태의 구조가 됩니다.
각 시스템 마다 경우가 다를 수 있으나 일반적으로 보통 다음과 같은 3개의 레이어가 존재합니다.
- presentation layer
- business layer
- persistence
Presentation layer(User Interface)
Presentation layer는 해당 시스템을 사용하는 사용자 혹은 클라이언트 시스템과 직접적으로 연결되는 부분입니다. 웹사이트에서는 UI 부분에 해당하고 백엔드 API에서는 엔드포인트 부분에 해당합니다. 그러므로 presentation layer에서 API의 엔드포인트들을 정의하고 전송된 HTTP 요청(request)를 읽어 들이는 로직을 구현합니다. 하지만 그 이상의 역할은 담당하지 않습니다. 실제 시스템이 구현하는 비즈니스 로직은 다음 레이어로 넘기게 됩니다.
다음과 같은 역할을 담당합니다.
- EndPoint
- Authentication
- JSON Translation
Business layer(Business Logic)
Business layer라는 이름 그대로 비즈니스 로직을 구현하는 부분입니다. 실제 시스템이 구현해야하는 로직을 이 레이어에서 구현하게 됩니다. 백엔드 API에서는 Presentation layer에서 전송된 요청을 읽어들여 요청에 맞게 동작하는 로직을 구현하면 됩니다. 예를 들어 회원가입 요청 시 필수적인 요소들이 다 포함되어 있지 않으면 거부한다던가 하는 로직 등이 비즈니스 로직이며, buisiness layer에서 구현하게 됩니다.
다음과 같은 역할을 담당합니다.
- Business Logic
- Validation
- Authorisation
Persistence layer(Data Access)
Persistence layer는 데이터베이스와 관련된 로직을 구현하는 부분입니다. Business layer에서 필요한 데이터를 생성, 수정, 읽기 등을 처리하여 실제로 데이터베이스에서 데이터를 저장, 수정, 읽어 들이기를 하는 역할을 합니다.
다음과 같은 역할을 담당합니다.
- Storage Logic
레이어드 아키텍처의 핵심 요소
레이어드 아키텍처의 핵심 요소는 단방향 의존성입니다. 각각의 레이어는 오직 자기보다 하위에 있는 레이어에만 의존합니다. 그러므로 presenstation layer는 business layer에게 의존하고, business layer는 persistence layer에게만 의존하게 됩니다.
또 다른 핵심 요소는 "sepration of concerns"입니다. 즉 각 레이어의 역할이 명확하다는 의미입니다. 예를들어 Persistation layer에는 비즈니스 로직이 전혀 구현되어 있지 않습니다.
위와 같은 요소들 떄문에 레이어드 아키텍처의 구조로 코드를 구현하면 각 레이어가 독립적이고 역할이 분명하므로 코드의 확장성이 높아집니다. 코드의 구조를 파악하기 쉬울 뿐만 아니라 재사용 가능성도 높아집니다.
또한 역할이 명확하게 나뉘어 있으므로 각 레이어를 테스트하는 테스트 코드의 작성도 훨씬 수월해집니다.
Flask 프레임워크를 이용한 Layered architecture 프로젝트 샘플을 깃허브에 정리해두었으니 참고하셔도 좋습니다. 이에 관한 설명은 추후 포스팅할 예정입니다.
https://github.com/JH7770/layered_architecture
백엔드 API 패턴인 레이어드 아키텍처 패턴(layered architecture)에 대하여 알아보았습니다.
참고
'About > Flask' 카테고리의 다른 글
[Flask] JWT access token 인증(로그인 토큰 인증) (0) | 2022.01.19 |
---|---|
[RabbitMQ] Python에서 Pika를 이용한 RabbitMQ 사용 (Topic Queue) (0) | 2022.01.05 |
[Flask] 비동기 호출(태스크 큐, 토픽 큐, RabbitMQ) (0) | 2022.01.04 |
[Flask] Session 객체를 이용한 동기식 호출 (0) | 2021.12.31 |
[Flask] Flask-SQLAlchemy 사용해보기 (1) | 2021.12.30 |