ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2019-08-23 개발일지
    개발일지 2019. 8. 23. 16:19

    오늘은 어제 만들었던 CustomError를 좀 손봤다

     

    각각 컨트롤러에서 CustomError 객체를 생성할 때 마다 중복되는 메시지를 일일이 타이핑하는게 넘 귀찮아서(..;;) 그냥 통합 에러 메시지를 만들었다.

     

    Class CustomError extends Error {
        constructor(errCode, errName, errMessage = '', ...params) {
            super(...params) // 인자 배열을 부모 생성자에게 전달
            
            // 오류가 발생한 위치에 대한 스택 추적 (V8 에진에서만 적용됨)
            if (Error.captureStackTrace)
            {
                Error.captureStackTrace(this, CustomError);
            }
            
            // 디버깅 정보
            this.errorCode = errCode;
            this.name = errName;
            
            if (errMessage && errMessage.length <= 0)
            {
                this.message = errMessage;
            }
            else
            {
                switch (errName)
                {
                    case 'noPost':
                        this.message = '게시글이 존재하지 않습니다.';
                        break;
                    case 'noComment': 
                        this.message = '댓글이 존재하지 않습니다.';
                    case 'noArgs': 
                        this.message = '내용을 입력하고 시도해주세요.';
                    default:
                        break;
                }
            }        
            
            // this.message = errMessage;
            this.errorDate = new Date();
        }
    }
    
    module.exports = CustomError;
    
    
    
    const CustomError = require('~~/CustomError');
    
    try {
        throw new CustomError(1, 'noPost');
    } catch (error) {
        if (error instanceof CustomError) 
        {
            ~~~
        }
    }

     

    그래서 throw할 때 에러 네임만 작성해주면 그에 맞는 에러 메시지를 자동으로 바인딩해주므로 한결 편해졌다.

    특수한 경우 throw시 에러 메시지를 직접 입력하면 입력한 메시지 내용이 반영된다.

     

    이후 모든 컨트롤러에서 throw하는 에러를 수정해줬다.

     

    그리고 게시판 기능을 위해 API를 만들고 있다.

     

    게시판 모델링을 하면서 1:N관계를 작업했는데, 별 다른 문제가 없었다가 댓글 테이블을 조회하려고 할 때 문제가 발생했다.

     

    Class Board extends Sequelize.Model {};
    
    Class Comment extends Sequelize.Model {};
    
    Board.hasMany(BoardComment);

     

    위의 코드가 게시판 모델링 예제 코드인데 핵심은 Board.hasMany(BoardComment)로 1:N 관계 설정을 했다는 것이다.

    그리고 나서 아래의 코드를 돌리니 문제가 발생했다.

     

    async (req, res) => {
        const comment = await BoardComment.findByPk(n, { include: Board });
    }

     

    위의 코드를 실행하니

    SequelizeEagerLoadingError: board is not associated to board_comment!

    라며 '니 comment 테이블은 board랑 연관없음!ㅋㅋ' 에러를 내뱉었다.

     

     

    이 부분은 comment 모델에서 board 모델에 대해 belongsTo()설정을 안해서 그런거다.

     

    Class Board extends Sequelize.Model {};
    
    Class Comment extends Sequelize.Model {};
    
    Board.hasMany(BoardComment);
    Comment.belongsTo(Board);

     

    belongsTo() 한 줄 추가하니 문제가 해결되었다.

     

    # 해결에 도움을 주신 제로초님 감사합니다. (_ _)

     

     

     

     

    이번에 시퀄라이즈를 쓰면서 JPA보다 시퀄라이즈가 한결 편하다는 느낌이 든다.

     

    JPA를 쓸 땐 직접 네이티브 쿼리를 작성하는 경우가 많았는데 시퀄라이즈 쓰면서 MS-SQL 2008 이하 버전 offset limit 구문 호환성 문제로 인해 수동으로 쿼리하나 작성한 것 외엔 다 시퀄라이즈 함수로 처리하고 있다.

     

     

    개발하면서 느끼는게 난 개발을 할 때 마다 뭔가 서비스 개발보다 프레임워크 단위를 만들듯 작업하는게 더 재밌는 것 같다.

    죠니 프레임워크를 만들어볼까...

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

    2019-08-27 개발일지  (0) 2019.08.27
    2019-08-26 개발일지  (0) 2019.08.26
    2019-08-22 개발일지  (0) 2019.08.22
    2019-08-21 개발일지  (0) 2019.08.21
    2019-08-20 개발일지  (0) 2019.08.20
Designed by Tistory.