관심사 분리원칙

Controller ↔ Service Layout ↔ Data Access Layer

이 세가지 원칙이 실제 Express 서버에 적용되면 아래와 같다.

Express Route Controller ↔ Service Class ↔ Mongoose ODM

(* Controller는 Service와 분리해야한다. 즉, Controller에 비지니스 로직을 바로 구현하게 되면 다양한 req와 res를 다루게 될때 코드의 수정이 어려워 진다. 따라서 Service Class에 비지니스 로직을 구현해야한다. 이때 분리를 위해 Service Class에 req나 res를 인자로 받아서는 안된다. )

Pub/Sub 계층을 사용하십시오

만약 서비스 분석을 시도하거나 이메일 전송과 같은 작업이 필요할 수 있다.

이러한 경우 하나의 함수에 너무 많은 것들을 처리하게 되면 금새 복잡한 코드가 될 수 있다. 따라서 단일 책임 원칙을 위배하기 때문에 책임을 분리해야 한다.

이러한 경우 이벤트를 발생시키는 방법을 적용하는게 좋다. 리스너들이 각각의 역할을 책임지게 하여 핸들러/리스너들로 파일을 나눌 수 있다.

eventEmitter.on('user_signup', ({ user, company }) => {

  eventTracker.track(
    'user_signup',
    user,
    company,
  );

  intercom.createUser(
    user
  );

  gaAnalytics.event(
    'user_signup',
    user
  );
})
eventEmitter.on('user_signup', async ({ user, company }) => {
  const salaryRecord = await SalaryModel.create(user, company);
})
eventEmitter.on('user_signup', async ({ user, company }) => {
  await EmailService.startSignupSequence(user)
})

(* 단 node에서 eventEmitter를 열 수 있는 제한이 존재하기 때문에 이러한 부분을 잘 고려해야한다.)

의존성 주입

의존성 주입 (Dependency Injection)