Skip to content

Layer Architecture

Heesung Youn edited this page Jul 22, 2021 · 3 revisions

Afume-Server는 아래 Layer 구조를 가진다.

image

1. Layer Rule


a. Presenter layer

Request가 들어오면 이를 해석하고 적절한 DTO(Data Transfer Object)를 응답하는 책임을 수행한다.

afume-server에서 Controller와 swagger.yaml문서가 이를 정의한다.

  • [down] Business Layer와 관계

    Request가 들어 왔을 때 적절한 형태의 데이터/객체로 변환 한 이후 처리는 Business Layer으로 위임한다. Business Layer에 처리를 완료하면 Presenter Layer에서 적절한 형태로 데이터를 재 가공한다.

    ex) 응답에 필요하지 않는 정보들은 삭제한다 코드를 문자열로 변환한다.

[afume-server] Swagger.yaml

  • request/response 에 대한 엔드포인드, 데이터 형식/타입을 정의한다.

[afume-server] Controller

  • request내 데이터가 적절한 값인지 검증한다. (ex. swagger-validation 으로 위임)
  • request내 데이터를 적절한 자료형/객체로 변환한다.
  • Business Layer에서 처리한 결과값을 적절한 Response로 변환한다.

b. Business Layer

서비스와 관련된 로직을 처리하는 책임을 수행한다.

  • [down] Persistence Layer의 관계

    비즈니스 로직을 수행하기 위해서는 결국 외부에 저장된 데이터가 필요하다. 이를 Persistence Layer에 위임하고 추출된 데이터를 가져온다.

[afume-server] Service

  • 비즈니스 로직을 수행한다.
  • 공통된 작업이 존재한다면 모듈화 하여서 이를 의존한다.

주의점

  • Business Layer에서는 Request/Response에 대한 어떤 정보도 의존해서는 안된다.
  • Database에 대한 어떤 정보도 가지고 있으면 안된다.
  • Database Entitiy에 의존을 하면 안되며, DAO가 제공하는 Model에 의존한다.

c. Persistence Layer

데이터와 처리와 관련된 책임을 수행한다.

[afume-server] Dao

  • MySql DB에서 데이터를 가져온다.
  • MongoDB에서 데이터를 가져온다.
  • 데이터 조회 중 에러가 발생하면 적절한 에러를 발생시킨다.

주의점

  • 오직 데이터와 관련된 책임만 수행한다.
  • Dao는 추상화 되어야 하며 Database 별로 이를 구체화 해야 한다.

TODO List

  • 현재 DAO는 구체적이다. 추상적인 형태로 만들 필요가 있다.
  • MySQL과 MongoDB에 대한 의존을 모두 가지고 있으며 이를 각각의 구현채로 분리할 핋요가 있다.
  • 현재 dao에서 제공되는 데이트는 Sequelize의 model이다. 즉 Service가 DB Entity에 의존하고 있으며 이를 끊어줄 필요가 있다.
  • DAO는 Model Entity가 아닌 afume-server만의 Model로 변환하여 응답해야 한다.

2. Layer-Pattern는 아래 규칙을 준수

ㄱ. 단방향 의존성

상위 Layer는 하위 Layer에만 의존한다. 즉 하위 Layer는 상위 Layer에 대해서 독립적이다.

ex) Service는 Controller에 있는 함수를 호출할 수 없다.

ㄴ. 변경의 범위

상위 Layer가 가진 책임에 관하여 변경 요청이 들어 왔을 때 하위 Layer에는 변경이 발생해서는 안된다.

ex) Response 의 형태가 변경이 되었을 때 Controller보다 하위에 있는 Service, Dao에서는 변경이 발생하면 안된다.