[TypeORM] @Many-to-Many 저장하고 불러오기

서로 다른 두 개의 Entity(Story, Tag)에서 Story와 Tag를 @Many-to-Many로 Relation을 생성하고 @JoinTable을 통해 StoryId와 TagId를 JOIN하는 테이블을 생성하였다. 이러한 상황에서 JOIN 시킨 테이블에 StoryId와 TagId를 저장하는 순서는 다음과 같다.(태그 3개, 스토리 1개를 DB에 저장하는 상황으로 가정한다.)

 

1. Tag1, Tag2, Tag3를 각각 Tag 테이블에 저장한다.

2. Story를 저장할 때, Story.tags로 JoinTable한 부분에 Story.tags = [Tag1, Tag2, Tag3]와 같이 입력하여 Story 테이블로 저장한다.

 

위의 과정을 코드로 구현하면 다음과 같다.

const tag1 = new Tag();
tag1.name = "#NestJS";
await connection.manager.save(tag1);

const tag2 = new Tag();
tag2.name = "#TypeORM";
await connection.manager.save(tag2);

const tag3 = new Tag();
tag3.name = "#@Many-To-Many";
await connection.manager.save(tag3);

const story = new Story();
story.title = "";
story.body = "@Many-To-Many에 대해 알아보자!";
story.tags = [tag1, tag2, tag3];
await connection.manager.save(story);

불러오는 순서는 다음과 같다.

 

1. @JoinTable()을 선언한 테이블로 접근한다.

2. 해당 테이블의 relation에서 "tags"를 find() 함수의 옵션값으로 제공하여 불러온다.

 

위의 과정을 코드로 구현하면 다음과 같다.

// TypeORM find()를 사용할 경우
const storyRepo = connection.getRepository(Story);
const stories = await storyRepo.find({ relations: ["tags"] });

// TypeORM QueryBuilder를 사용할 경우
const stories = await connection.getRepository(Story)
    	.createQueryBuilder("story")
    	.leftJoinAndSelect("story.tags", "tag")
    	.getMany();