ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. NestJs & Hexagonal - [ ports ]
    공부하기/node.js 2023. 2. 12. 20:52

    헥사고날 아키텍처로 애플리케이션을 만들기 위해서 우선 in-bound-port, out-bound-port 인터페이스와 dto의 타입을 미리 선언하고 in bound port를 implements한 service를 사용하여 테스트 케이스를 작성할 생각입니다. 

    구현된 서비스는 모두 null을 리턴하고, 곧 작성할 테스트 케이스에서 실패하는 테스트 케이스를 작성하는데 활용할 예정입니다.

    전체 코드는 여기를 참고해 주시고 이 포스팅은  Survey Create 과정을 기준으로 진행됩니다.


    survey-module 디렉토리 구조


    Survey Create UseCase

    • SurveyController : 컨트롤러는 service를 의존하는 것이 아닌 in bound port인 interface를 의존한다.
    • CreateSurveyInport : 설문지를 생성하기 위한 interface
    • CreateSurveyServicce : CreateSurveyInport( interface )의 구현체
    • CreateSurveyOutPort : 비즈니스 로직에서 외부 시스템인 데이터베이스를 사용하기 위한 interface

     

     

    survey create in-bound-port ( 외부의 요청을 받는 포트 )

    src/survey/in-port/survey-create.ip.ts

    export type SurveyCreateInPortInputDto = {
      name: string;
      description: string;
    };
    
    export type SurveyCreateInPortOutputDto = {
      id: number;
      name: string;
      description: string;
    };
    
    // provider token
    export const CREATE_SURVEY_INBOUND_PORT = 'CREATE_SURVEY_INBOUND_PORT' as const;
    
    export interface CreateSurveyInPort {
      execute(
        params: SurveyCreateInPortInputDto,
      ): Promise<SurveyCreateInPortOutputDto>;
    }
    • SurveyCreateInportInputDto : in bound port의 input type
    • SurveyCreateInPortOutputDto : in bound port의 output type
    • CREATE_SURVEY_INBOUND_PORT : in bound port의 DI를 위한 provider token 값
    • CreateSurveyInport : in bound port ( controller가 의존하는 인터페이스 )

    out-bound-ports ( 비즈니스 로직이 외부 시스템에 요청하는 포트 )

    src/survey/out-port/survey-create.op.ts

    export type SurveyCreateOutPortInputDto = {
      name: string;
      description: string;
    };
    
    export type SurveyCreateOutPortOutputDto = {
      id: number;
      name: string;
      description: string;
    };
    
    // provider token
    export const CREATE_SURVEY_OUTBOUND_PORT =
      'CREATE_SURVEY_OUTBOUND_PORT' as const;
    
    
    export interface CreateSurveyOutPort {
      execute(
        params: SurveyCreateOutPortInputDto,
      ): Promise<SurveyCreateOutPortOutputDto>;
    }
    • SurveyCreateOutPortInputDto : out bound port의 input type
    • SurveyCreateOutPortOutputDto : out bound port의 output type
    • CREATE_SURVEY_OUTBOUND_PORT : out bound port의 DI를 위한 provider token 값
    • CreateSurveyOutPort : out bound port ( service가 의존하는 인터페이스 )

    service

    src/survey/survey-create.service.ts

    import { Injectable } from '@nestjs/common';
    import {
      CreateSurveyInPort,
      SurveyCreateInPortInputDto,
      SurveyCreateInPortOutputDto,
    } from '../in-port/survey-create.ip';
    
    @Injectable()
    export class SurveyCreateService implements CreateSurveyInPort {
      execute(
        params: SurveyCreateInPortInputDto,
      ): Promise<SurveyCreateInPortOutputDto> {
        return null;
      }
    }

    SurveyCreateService : in bound port의 구현체

Designed by Tistory.