ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL
    내일배움캠프/TIL 2022. 12. 23. 23:07

    TIL


    목표

    • MySQL 특정 컬럼 삭제하기

     

    문제

    1. 쿼리문으로 삭제는 간단하지만, sequelize를 처음 맛보는 중이라 이놈들을 어떻게 손봐줘야 할지 모름.

     

    시도

    그냥 migrations/create-user.js 와 models/user.js에서 email컬럼 관련 내용들을 삭제해 보았다.

     

    해결

    // migrations/...create-user.js
    email: {
            allowNull: false,
            unique:true,
            type: Sequelize.STRING
    },
    삭제.
    
    // models/user.js
    email: DataTypes.STRING,
    삭제.

     

    알게된것

    sequelize에서 저렇게 삭제하면 아직은 오류가 없다.
    그래서 오류를 만나기전까진 그렇게 삭제하면 되는걸로 알고 있을거고, 
    오류를 만나길 기대한다.


    목표

    • sequelize를 이용하여 게시글 테이블 만들기

     

    문제

    1. 모델을 어떻게 만들지?
    2. 모델을 잘못만들었다. 어떻게 되돌리기? 삭제? 를 하나

     

    시도

    공식문서를 봐보니 무슨말인지 몰라도 대충 느낌상으로 이해해보려한다..

    npx sequelize model:generate --name Boards --attributes title:string,content:string,userId:int

    여기선 이렇게 모델을 만들고, migrations에서 foreign key 설정을 해주지 않을까 싶어 일단 만들어보고 시도해본다.

    ERROR: Attribute 'userId:int' cannot be parsed: Unknown type 'int'

    int가 아니라 integer인가? 해보자. 맞네. integer가 맞다. 맛있다.

    되돌리고싶다 강렬히. boards가 아니라 posts로 만들어야 했다.
    그래 그냥 수정하자. 해보자.

     

    해결

    boards로 보이는, 관련있어 보이는 것들을 골라서 수정해보았다.
    migrations -> Posts 
    model -> Post
    물론 파일명도 변경했다.

     

    알게된것

    model과 migrations 에서 수정을 하면 반영이 잘 되는듯 하다!


    목표

    • foreign key를 어떻게 설정하나?

     

    문제

    1. 공식문서의 예를 봐도 모르는점이 존재함

     

    시도

    최대한 매치업시켜보고 구글링을 해봄

     

    해결

    userId: {
            allowNull: false,
            references: {
              model: {
                tableName: 'Users',
                // 'schema': 'schema'
              },
              key: 'userId'
            },
            onDelete: 'cascade',
            onUpdate: 'cascade',
            type: Sequelize.INTEGER
    },
    
    // 공식문서에서는 6번행에 스키마도 적혀있었지만,
    // 구글링에서 본 결과 스키마가 딱히 없어도 되는 듯 하여
    // 모르고 쓸바에야 조금이라도 이해가 되는 쪽만 적었다.
    // 또한 onDelete, onUpdate도 cascade로 적어주었다.
    
    // npx sequelize db:migrate 를 해보니 디비에 테이블이 잘 만들어졌고,
    // onDelete, onUpdate부분은 적용이 됐는지 잘 모르겠다. 
    // 이후에 API를 만들며 확인해봐야겠다.

     

    알게된것

    sequelize를 활용해 외래키를 만드는 방법을 알게 되었다.
    ondelete, onupdate도 여기서 이렇게 쓸 수 있구나.

     


    목표

    • 게시글 작성 API 작성

     

    문제

    1. 요구사항 4개의 에러처리를 어떻게 해야할까?(body, title, content, other)
    2. 게시글 작성을 자꾸 실패함

     

    시도

    • 데이터형식을 완전히 잘못 준 경우
    • 제목에 데이터를 입력하지 않은 경우
    • 내용에 데이터를 입력하지 않은 경우
    • 그 외 게시글 작성을 실패했을 경우

    위 4개의 경우로 잡고 예외처리를 해보았다.

    요청에서 받는 데이터가 title, content여서 디비에 title, content만 넣어줬다.
    외래키인 유저아이디도 같이 넣어줘야 했다. 그래서 미들웨어에서 전달받은 유저아이디로 값을 넣어줬다.

     

    해결

    // 제목이 비어있을 경우
    if (title == undefined) {
        return res.status(412).json({
            errorMessage: "게시글 제목의 형식이 일치하지 않습니다."
        });
    }
    
    // 내용이 비어있을 경우
    if (content == undefined) {
        return res.status(412).json({
            errorMessage: "게시글 내용의 형식이 일치하지 않습니다."
        });
    }
    
    // body의 형식이 정상적이지 않을 경우
    catch {
        return res.status(412).json({
            errorMessage: "데이터 형식이 올바르지 않습니다."
        });
    }
    
    // 게시글 작성에 실패했을 경우
    catch(err) {
        return res.status(400).json({
            errorMessage: "게시글 작성에 실패하였습니다."
        });
    }

     

    알게된것

    userId를 넣기위해 jsonwebtoken을 불러와서 verify를 사용하려는 순간,
    이미 검증미들웨어를 만들어뒀는데 검증을 두번하면 뭔가 불편한데? 생각해보니
    검증미들웨어에서 내가 뭘 넘겨줬던 것 같은데 하고 함수를 살펴보니
    유저데이터를 넘겨줬었다.
    그래서 그 데이터에서 유저아이디를 빼와서 바로 디비에 넣어줬다.

    또한 try-catch 안에 try-catch를 또 사용할 수 있다는 걸 알게 되었다.
    중복 if문 같아서 마음이 불편하긴 했는데, 구글링 내용 중
    exception 종류에 따라 적절한 위치에 catch하기 위함이라는 내용이 있었다.
    그 설명을 들으니 마음이 조금은 편안해졌다.

     

     

Designed by Tistory.