RISK IT

[TIL23_23.1.31.] [Node] Layered Pattern 개념 정리 본문

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 아키텍처의 핵심 요소

  1. 단방향 의존성
    • 각각의 레이어는 오직 자기보다 하위에 있는 레이어에만 의존함
  2. 관심사 분리 (SOC)
    • 관심사 분리: Seperation Of Concern
    • 각 레이어 별 역할이 구분되어 명확함. 역할의 중첩이 없음
  3. 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: 노드 모듈을 관리하는 파일입니다.
반응형