[TIL] 20.09.07~08 Shot.ly 스프린트

김지욱·2020년 9월 10일
0

코드스테이츠

목록 보기
35/38

공식문서에 익숙해지자

이번에는 Sequelize ORM을 사용하는 스프린트를 진행했다. 스프린트를 진행할 때 공식문서 보다는 누군가 개념을 정리해둔 블로그 내용이나 예시들을 많이 찾아봤었는데 이번 스프린트는 내가 잘 못 찾은 건지 원하는 내용들이 없어서 거의 공식문서만을 이용해서 해결해야 했었다. 그리고 한 동기분의말 처럼 스프린트를 진행하기 위한 힌트들이 공식문에 다 나와있었다. 덕분에 이번 스프린트에서 공식문서를 이용하는 방법을 조금 더 알게 된 거 같다.

감사합니다

이번 과제는 잘 되는 거 같은데 잘 안됐다. 이게 무슨 말인가 하면 내가 구현한 기능을 포스트맨을 이용해서 확인하면 정상 작동을 하는데 테스트 케이스를 확인해 보면 통과되지 못하는 문제들이 상당히 많았다. 도저히 어디서부터 꼬이기 시작한 건지 몰라서 헬프데스크에 질문을 올려뒀었다. 늦은 시간이라 다음날 답변이 달릴 거라 생각했는데 코드스테이트 엔지니어 분이 아닌 같은 동기분인 갓 대성님께서 질문을 보고 연락을 주셨다. 그리고 한 시간이 넘는 시간 동안 줌에서 문제를 해결하는 과정을 하나하나 알려주셨다. 정말 감사하고 도움이 많이 되는 시간이었다.

오답노트

코드에는 크고 작은 문제들이 상당히 많았었다. 특정 개념에 대해서 완전한 이해가 없는 상태로 작성을 하다 보니 문제점들이 생겼다

1. await의 리턴값이 무엇이고 동기와 비동기에 대해서 생각 해 보자

문제코드

post: async (req, res) => {
    let { url } = req.body;
    let result = await utils.getUrlTitle(url, (err, title) => {
      if (err) throw err;
      else {
        db.url.create({ url, title })
      }
    })
    res.status(201).json(result);
  },
  • utils에서 가저온 getUrlTitle 함수는 Promise 형식이 아니었고
  • 그래서 여기서 제대로 된 동기 처리가 이루어 지지 않고 있었다.
  • 리턴 시켜주는 값 조차도 없어서 undefined가 나오고 있었다.

해결

post: async (req, res) => {
    let { url } = req.body;
    let result = await new Promise((resolve, reject) => {
      utils.getUrlTitle(url, (err, title) => {
        if (err) throw err;
        else {
          resolve(db.url.create({ url, title }));
        }
        reject(err);
      })
    })
    res.status(201).json(result);
  },

new Promise 를 사용해서 강제로 프로미스 패턴으로 만들어 주었다.

2. redirect & increment

문제코드

redirect: async (req, res) => {
    let result = await db.url.increment(
      { visits: 1 }, { where: { id: req.params.id } });
    console.table(res.body)
    res.status(302).json(result)

  }
  • result의 값을 제대로 가저오고 있지 않았다.
  • Sequelize의 increment의 사용 방법이 잘못 되었다.
  • 리디렉션이 되고 있지 않았다.

해결

let { id } = req.params
let result = await db.url.findOne({ where: { id } })
// url의 파라미터를 얻어오고 
// result에 url모델에서 id 부분을 선택한다.

await result.increment('visits')
// 선택한 id를 가지고 있는 모델의 visits를 증가시킨다.

res.redirect(result.dataValues.url);
//리디렉션할 result를 이용해서 url을 넣어준다.

0개의 댓글