Server/Node.js

Sequelize - 자식 테이블까지 한 번에 Insert 치는 방법 (Join Insert) + 상황에 따라 다른 쿼리를 날리는 방법

JaeHoney 2021. 12. 19. 19:26

자식 테이블까지 Insert 하기

const result: Product = await Product.create(createProductDto, {
    include: includeStatement
});

// ProducdtDto.ts
export interface CreateProductDto {
    name: string;
    description?: string;
    count?: number;
    productImages?: ProductImageDto[];
}

typescript 예시입니다.  Sequelize의 include를 사용하면 관계를 맺고있는 자식 테이블까지 함께 insert를 칠 수 있습니다. hasOne이든 hasMany든 Sequelize가 그에 맞게 insert를 해줍니다 !

 

상황에 다른 쿼리?

위 코드는 많은 상황에서 문제가 발생할 수 있습니다.

 

특히 자식 테이블의 필드들이 전부 nullable이고, 1:0이 될 수 있는 관계라면 그 자식테이블의 정보를 API Request로 전송받지 않더라도(Insert할 필요가 없는데도) null로 판단해서 부모의 fk만 가진채 빈 껍데기로 insert 되어서 DB에 들어가게 됩니다.

 

그래서 우리는 존재하는 필드만 include에 포함시켜야 합니다. 그런데 include:{ option } 안에서 분기(if)를 칠 수 있는 방법은 없습니다.

 

아래와 같은 방법을 사용하면 이를 해결할 수 있습니다.

const includeStatement = [];
if(createProductDto.productImages) includeStatement.push(ProductImage);
if(createProductDto.productLimit) includeStatement.push(ProductLimit);
if(createProductDto.productOption) includeStatement.push(ProductOption);
if(createProductDto.productCompany) includeStatement.push(ProductCompany);

const result: Product = await Product.create(createProductDto, {
    include: includeStatement
});

 

감사합니다