IT/TIL
[TIL23_23.1.31.] [Node] Layered Pattern 개념 정리
nomoremystery
2023. 1. 31. 17:50
반응형
1. 레이어의 종류 (일반적으로)
Presentation Layer
- 해당 시스템을 사용하는 사용자 혹은 클라이언트 시스템과 직접적으로 연결되는 부분
- 백엔드 API에서 엔드포인트 부분
- API의 엔드포인트들을 정의하고 전송된 HTTP 요청(request)들을 읽어들이는 로직까지만 담당
Business Layer
- 실제 시스템이 구현해야 하는 로직들을 이 레이어에서 구현
- (예시) 홈페이지 회원가입 엔드포인트에서 만일 비밀번호가 8자가 넘는지 확인하여 8자 미만이면 회원가입을 거부하는 로직 등
Persistence Layer
- 데이터베이스와 관련된 로직을 구현하는 부분
- Business Layer에서 필요한 데이터 생성, 수정, 읽기 등을 처리하여 실제로 데이터베이스에서 데이터를 저장, 수정, 읽어 들이기를 하는 역할
2. Layered 아키텍처의 핵심 요소
- 단방향 의존성
- 각각의 레이어는 오직 자기보다 하위에 있는 레이어에만 의존함
- 관심사 분리 (SOC)
- 관심사 분리: Seperation Of Concern
- 각 레이어 별 역할이 구분되어 명확함. 역할의 중첩이 없음
- Layered 아키텍처 적용시 장점
- 확장성
- 가독성
- 재사용성
- 테스트 가능성
3. Layered 아키텍처 적용하기
- presentation layer →
userController.js
- business layer →
userService.js
- persistence layer →
userDao.js
Dao
: Data Access Objective
Routes: endpoint 경로 라우팅
- 외부에서 들어오는 요청을 가장 먼저 맞이하여 하위 폴더로 안내하는 길잡이 역할을 하는 파일
index.js
는 향후 확장성을 고려하여 생성될 수 있는 다양한 Router들을 한 곳에 모아 관리하는 역할을 한다.
Controller (Presentation Layer)
- API의 엔드포인트들을 정의하고 전송된 HTTP 요청(request)들을 읽어 들이는 로직을 구현
- 비즈니스 로직으로 흘러들어가야 할 데이터들이 올바른 형태를 띄고 있는지 선검증 작업을 함
- (예시) 서버에서 원하는 특정 데이터의 'key'값이 요청 시 전해지지 않았을 때에는
Key Error
를 통해 사전에 에러처리로 검열
Service
- 실제 비즈니스 규칙과 로직들이 접목되는 레이어
- 어플리케이션을 직접 다루는 운영자 입장에서 기획한 비즈니스 모델들이 접목되어야 한다
- (예시) 비밀번호의 조합이 특정 형태를 띄어야 하는 규칙을 위해 정규표현식을 도입
Models
- 실질적으로 데이터베이스와 소통하는 레이어
- (예시) typeorm을 이용하여 db에 연결한 후, 앞선 레이어들을 모두 무사히 통과한 데이터들을 db에 직접 Insert
Layer dependency 순서
다음은 실제 Express를 이용한 서버 웹 개발시 Layered Pattern을 이루는 기본 구조
app.js | server.js
: Express App 으로 서버를 여는 로직입니다. 그리고 Express App 인스턴스를 만들고, 필요한 미들웨어를 붙이는 로직입니다. 경우에 따라서 app.js 와 server.js 에 각기 다른 기능을 유도하여 두가지 파일 모두를 유지할 수도 있고, 둘의 기능을 한데 모아서 한 파일만을 유지할 수도 있습니다. 개발자의 의도에 맞게 파생되어질 수 있는 다양한 경우의 수에 유의하며 코드를 작성해주시기 바랍니다.routes
: 라우팅(엔드 포인트 나누기) 로직을 담당합니다.
controllers`: 엔드포인트에 해당하는 함수 로직 - http 요청에 따른 에러 핸들링, service 로직에서 데이터를 받아와서 응답으로 내보내는 로직입니다.services
: controller 에서 넘겨받은 인자로 다양한 알고리즘(필터, 정렬 등..)을 처리해서 데이터에 접근하는 로직입니다.models
: 데이터베이스에 접근하기 위한 모델(DAO)이 정의되어 있는 폴더입니다.
아래 모듈은 의존성 없이 다양한 레이어에서 사용될 수 있지만 반복되는 로직이기에 분리해 놓은 폴더
middlewares
: 컨트롤러에 닿기 전에 반복되는 로직을 모듈화 해 놓는 폴더입니다. (ex. validateToken - 인증 / 인가)utils
: 의존성 없이 모든 레이어에서 공통적으로 자주 사용되는 로직을 모듈화 해 놓는 폴더입니다. (ex. errorGenerator).env
: 프로젝트 내에서 사용할 환경 변수를 선언해 놓는 곳이며 샘플 양식은 .env.sample에 따로 기입하여 공유합니다.node_modules
: 노드 패키지 모듈입니다..gitignore
: 위의 두 모듈을 깃이 관리하지 않도록 합니다.package.json
: 노드 모듈을 관리하는 파일입니다.
반응형