Node.js

Layered pattern, 관심사의 분리 (feat. MVC pattern)

selonjulie 2022. 6. 14. 11:11

관심사의 분리 Seperation of concern(SoC)

  • 코드에서 봐야할 부분, 보지 말아야할 부분을 구분할 수 있다
    • 프론트: html, css, javascript: 구조, 디자인, 기능 을 각각 나눠보는 것 
    • 백앤드: 백앤드 자체가 기능이지만, 그 기능에서 또 관심사를 나눌 수 있음
      • 서버: 데이터 가공 - 정보가 만들어짐 
      • 만들어진 형태를 json이라는 형태로 클라이언트에 보내줌 (텍스트일 수도 있고, 다른 형태 일 수 도 있음)
      • 식당에서 고객, 요리사와 비슷함.
        • 고객의 요청없이 요리를 하지는 않음 (요청-응답)
        • 직원의 역할도, 나눌 수 있음 (관심사의 분리) 
      • 한 파일 -> 한 Layer (업무별로 나누어진): 각 역할이 명확, 독립적, 서로에게 끼치는 영향 최소화, 높은 가독성, 재사용성

식당과 비교

 

관심사의 분리 전
관심사의 분리 (Controller, Service, Dao)

 

 

MVC(Model–view–controller) pattern

View

  • 본래 MVC는 서버 사이드에서 한번에 다뤄지던 구조
  • View는 클라이언트(유저)와 상호작용이 일어남 - 화면을 보여주기 위한 역할
  • React, Angular, Vue 

Controller

  • View레이어에서 유저의 동작이 닿는곳에 필요한 데이터 변화가 일어날때 HTTP요청이 백엔드 서버로 보내짐
  • HTTP 요청을 받아서 처리하는 곳이 controller
  • view(유저인터페이스 레이어)와 model(데이터를 담당하는 레이어)를 잇는 다리 역할을 하는 부분
  • 요처의 요청을 처리해서 응답함

 

Model

  • 서비스에 필요한 모든 데이터 모델 정의
  • model레이어에서 정의된 데이터베이스 스키마를 통해서만 데이터베이스에 접근해서 CRUD로직을 처리할 수 있음
  • Prisma

 

Layered Pattern

  • Presentation layer: 입력-출력 담당하는 부분
    • Client와 직접 연결 됨, controller
    • API 엔드포인트 정의
    • HTTP 요청을 읽어드리는 로직 구현 (request body 받고, key가 있는지 없는지 확인)
    • 실제 시스템이 구현하는 비지니스 로직은 다음 레이어로 전달
  • Business layer: 비지니스 로직 구현 실제 업무규칙 (비밀번호 규칙, 어떤 상품을 올릴 것인지 등
    • 가장 안쪽에 있는 레이어, 가장 중요함, service, domain
    • 실제 시스템이 구현해야하는 로직 구현
      • eg. 비밀번호 길이가 8자 미만이면 회원가입 거부
  • Persistence layer/storage: 한번만 저장하는게 아니라 영구적으로 저장해야하는 것
    • 데이터베이스DB 관련 로직 구현 (SQL이 있다면 여기에), model, dao
    • 필요한 데이터 생성, 수정, 읽기(CRUD) 처리
  • 특징: 단방향성(한 곳으로 이동), SoC
  • app.js
    • userController.js (presentation layer)
    • userService.js (business layer)
      • 함수 이름은 실제 비지니스이름으로 만드는게 좋음
      • async는 비동기 함수, 이를 불러오기 위해서는 await 를 사용해야함
    • userDao.js (persistence layer)
      • 데이터 접근 객체 Data Access Object: 일부 종류의 데이터베이스나 기타 퍼시스턴스 매커니즘에 추상 인터페이스를 제공하는 객체이다. 응용 프로그램의 호출들을 퍼시스턴스 계층에 매핑시킴으로써 DAO는 데이터베이스의 상세한 사항을 노출시키지 않고 특정 데이터의 일부 동작을 제공하게 된다. 이러한 분리는 단일 책임 원칙을 지원