본문 바로가기

JavaScript & TypeScript

[NestJS] Many-to-Many 생성시에 할당하는 코드 리팩토링 (feat.TypeORM)

오늘 작성 할 포스팅은 Nest.js로 작업하면서 리팩토링 한 코드입니다.

 

작성에 앞서 현재 작업 중인 프로젝트에서 관련 부분에 대해 간단히 설명하면

미술 교육 프로그램(커리큘럼)에 준비물과 키워드, 주차별 정보가 각각 N:M 관계로 할당 되어 있는 구조이다.

 

그 중 준비물을 대표로 해서 설명해 보자면

 

create-proram.dto

 

export default class CreateProgramDto {
  @ApiProperty({
    description: '프로그램명',
    default: '프로그램1',
  })
  readonly name: string;

  @ApiProperty({
    description: '준비물',
    default: ['스케치북', '연필'],
  })
  readonly tools: string[];
  }

 

 

대략 위의 코드 처럼 현재 createProgramDto에서 준비물 정보를 배열로 받아오는데,

기존에는 아래 처럼 for 문을 돌며 하나씩 엔티티를 만들어서 반환하는 형식으로 작성을 했는데, 뭔가 이상했다..

 

toToolEntity(i: number): Tool {
leechunghyun95 marked this conversation as resolved.
Show resolved
    return Tool.from({
      name: this.tools[i],
    });
}

 

 

현재는 반복문을 돌며 엔티티 하나씩 반환하는게 아니라,

map을 사용해서 엔티티 리스트를 반환하는 형식으로 리팩토링했다.

큰 차이는 없지만 코드 가독성도 좋아진거 같다,,ㅎ

 

toToolEntities(): Tool[]{
    return this.tools.map((toolName) => Tool.from(toolName));
  }

 

 

또한 기존에는 아래 코드 처럼 반복문을 돌며 준비물을 저장하고 준비물에 프로그램을 할당하는 방식으로 작성했었는데,

 

// 준비물 저장
for (let i = 0; i < createProgramDto.tools.length; i++) {
      const newTool = createProgramDto.toToolEntity(i);
      newTool.program = newProgram;
			newTool.academy = academy;
			
			await this.toolRepository.save(newTool);
}

 

 

새로 리팩토링한 코드에서는 아래처럼 반환받은 엔티티 리스트를 프로그램에 할당하여 코드를 직관적으로 이해하기가 훨씬 좋아진것을 볼수 있다.

 

// 준비물 저장
const newTools = createProgramDto.toToolEntities();
await this.toolRepository.save(newTools)
newProgram.tools = newTools;

await this.programRepository.save(newProgram);

 

 

더 좋은 방식이 있다면 댓글로 지적해주시면 감사하겠습니다 :)