ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2019-10-01 개발일지
    개발일지 2019. 10. 1. 17:45

    오늘은 FAQ 기능을 만들고 1:1 문의 답변 기능에 대한 모델링을 작업했다.

     

    FAQ 기능도 게시판 기반이라 목록, 검색, 페이지네이션, 상세보기, 쓰기, 수정, 삭제 정도의 기능이라 어려움은 없었다.

     

    오늘은 좀 한가지 배움이 있었는데, sequelize-typescript를 사용하면서 에러를 마주쳤기 때문이다.

     

    1:1 문의 답변 테이블의 모델링을 정의하면서 문제를 발견했다.

    1:1 문의 답변 테이블은 문의 테이블과 답변 테이블 2개가 존재한다.

     

    이전에 JS로만 모델링을 정의하던 방식대로 하나의 파일에 2개의 모델링을 정의하려고 했는데, 이게 sequelize-typescript에선 불가능했다

     

    sequelize.js로 하면 다음과 같이 하나의 파일에 두개의 모델링을 정의하고 연관관계를 맺을 수 있었다.

     

    contact.js

    const sequelize, { Sequelize } = require('sequelize');
    
    class Question extends Sequelize.Model {};
    
    Question.init({
        id: {
            type: Sequelize.BIGINT, 
            primaryKey: true, 
            autoIncrement: true
        }
        ...
    });
    
    class Answer extends Sequelize.Model {};
    
    Answer.init({
        id: {
            type: Sequelize.BIGINT, 
            primaryKey: true, 
            autoIncrement: true
        }
    });
    
    Question.hasOne(Answer);
    Answer.belongsTo(Question);

     

    이게 되니까 당연히 되는 건 줄 알고 sequelize-typescript에서 다음 처럼 모델링 정의를 시전했다.

     

    contact.ts

    import {
        Model, 
        Table, 
        Column, 
        PrimaryKey,
        AutoIncrement, 
        DataType, 
        ForeignKey, 
        BelongsTo
    } from 'sequelize-typescript';
    
    export class Question extends Model<Question> {
        @PrimaryKey
        @AutoIncrement
        @Column(DataType.BIGINT)
        id!: number;
        ...
        @ForeignKey(() => Answer)
        @Column(DataType.BIGINT)
        answerId!: number;
        
        @BelongsTo(() => Answer)
        answer!: Answer;
    }
    
    export class Answer extends Model<Answer> {
        @PrimaryKey
        @AutoIncrement
        @Column(DataType.BIGINT) 
        id!: number;
        ...
        @HasOne(() => Question)
        question!: Question;
    }

     

    근데 앱을 실행하니까 다음과 같은 에러를 발생시키더라.

     

    Answer는 정의 되지 않았어.

     

     

    Question 모델에서 정의한 answer의 타입인 Answer가 정의되지 않았다고 한다.

    스크립트에 Answer가 Question 밑에 정의되어 있으니 Answer에 대한 타입을 찾지 못하는 것으로 보인다.

     

    Answer를 먼저 정의해도 Answer에서 question을 통해 Question 타입을 정의하고 있으니 여전히 Question이 정의되지 않았다고 에러를 뱉는다.

     

    이 경우엔 그냥 각각의 모델 파일로 분리시켜서 정의를 하자.

     

    question.ts

    import {
        Model, 
        Table, 
        Column, 
        PrimaryKey,
        AutoIncrement, 
        DataType, 
        ForeignKey, 
        BelongsTo
    } from 'sequelize-typescript';
    
    import Answer from './answer';
    
    export default class Question extends Model<Question> {
        @PrimaryKey
        @AutoIncrement
        @Column(DataType.BIGINT)
        id!: number;
        ...
        @ForeignKey(() => Answer)
        @Column(DataType.BIGINT)
        answerId!: number;
        
        @BelongsTo(() => Answer)
        answer!: Answer;
    }

     

    answer.ts

    import {
        Model, 
        Table, 
        Column, 
        PrimaryKey,
        AutoIncrement, 
        DataType, 
        ForeignKey, 
        BelongsTo
    } from 'sequelize-typescript';
    
    import Question from './question';
    
    export default class Answer extends Model<Answer> {
        @PrimaryKey
        @AutoIncrement
        @Column(DataType.BIGINT) 
        id!: number;
        ...
        @HasOne(() => Question)
        question!: Question;
    }

     

     

    최대한 sequelize-typescript How to use에서 사용하라는 방식대로 사용하는 것이 정신건강에 좋겠지...?

    '개발일지' 카테고리의 다른 글

    2019-10-04 개발일지  (0) 2019.10.04
    2019-10-02 개발일지  (0) 2019.10.02
    2019-09-30 개발일지  (0) 2019.09.30
    2019-09-27 개발일지  (0) 2019.09.27
    2019-09-26 개발일지  (0) 2019.09.26
Designed by Tistory.