[TIL] worldcup 관련 API 만들기

김시원·2023년 5월 6일
0

TIL

목록 보기
16/50
post-custom-banner

Issues encountered

  1. config.js 에러: Tokens table을 추가하고 migrate를 하려고 했는데, 다음과 같은 에러가 나왔다 - "Dialect needs to be explicitly supplied as of v4.0.0".
  2. joi library에서 array validation하기
  3. jest library로 joi validation 성공/실패 케이스 만들기

What I tried

  1. 일단 우리 팀은 DB host, password, user 등을 환경변수에 넣어두고 github에 해당 정보가 노출되지 않도록 config.json 파일을 config.js로 변경해주었다. 내가 처음 config.js로 변환하면서 development, test, jwt, bcrypt 등의 종류로 객체를 나누고 그 객체들을 config라는 객체에 담아서 config 객체만을 export해주었다. 이때 sequelize를 사용하면서 config 객체 안의 객체 이름으로 접근을 해주어야 하는데 그 부분에서 문제가 생겼던 것이었다. 변경된 config.js 파일은 아래와 같다.
require("dotenv").config();

const env = process.env;

const development = {
  host: env.DB_HOST,
  username: env.DB_USER,
  database: env.DB_NAME,
  password: env.DB_PASSWORD,
  dialect: env.DB_DIALECT,
};
const test = {
  host: env.DB_HOST,
  username: env.DB_USER,
  database: env.DB_TEST_NAME,
  password: env.DB_PASSWORD,
  dialect: env.DB_DIALECT,
};
const jwt = {
  secretKey: env.SECRET_KEY,
  refreshExpiresIn: env.REFRESH_EXPIRES,
  accessExpiresIn: env.ACCESS_EXPIRES,
};
const bcrypt = {
  saltRounds: parseInt(env.BCRYPT_SALT_ROUNDS),
};
const host = {
  port: parseInt(env.HOST_PORT),
};

module.exports = { development, test, jwt, bcrypt, host };
  • 참고 자료: config.js 세팅하기
  • 이 에러를 발견하고, 팀원들 각자 db:generate를 해봤는데 노드 버전 16은 generate는 되고 18 이상은 generate도 동일한 에러를 만들었고, db:migrate는 전부 다 안됐다. 그래서 처음엔 노드 버전 문제라고 생각하기도 했고, 우리가 프로젝트를 처음 세팅할 때 config.json으로 설정해주어서 sequelize 내부적으로 꼬인게 아닌가 생각도 하긴했는데 다 뻘 생각이었다..ㅎ 팀원분이 에러를 해결하셨는데, 에러는 생각보다 간단한 이유때문에 생겼던거였다. 에러가 왜 생겼는지 알고 나서는 갈피도 못잡고 뻘생각만 했던 나자신이 왜그랬을까 생각도 잠깐 하긴했지만 이러면서 배우는 건가 싶기도 하고... 암튼 좋은 경험 한거라고 치자!
  1. choices = [{choice_name: "name", choice_url: "url"}] 형식으로 들어오는 choices 데이터를 joi를 사용해서 validate해보았다.
choices: Joi.array()
      .required()
      .min(2)
      .items(
        Joi.object({
          choice_name: Joi.string().required(),
          choice_url: Joi.string().uri().required(),
        })
      )
      .custom((value, helpers) => {
        if (value.length % 2 !== 0) {
          return helpers.error("custom.numofObjectsNotEven");
        }
        return value;
      })
      .message({
        "array.base": "월드컵 종목의 형식이 올바르지 않습니다.",
        "array.empty": "월드컵 종목이 비어있습니다.",
        "array.min": "월드컵 종목은 최소 2개이어야 합니다.",
        "custom.numofObjectsNotEven": "월드컵 종목 개수는 짝수이어야 합니다.",
      }),
  })
  • items()로 array의 각 데이터에 접근을 하고, Joi.object() 안에 object의 key를 설정해서 각 key에 대해 검증을 할 수 있다.
  1. 성공 케이스는 만들었다. 실패 케이스는 아직 진행중...
const validationResult = postWorldcupSchema.validate(mockRequest.body);
expect(validationResult.value).toEqual(createWorldcupRequestBodyParams);

What to learn next

  • 월요일에 진행할 사항들
    • 테스트: 월드컵 게시물 기능 단위 테스트, TDD가 뭔지 공부해보기, 통합테스트
    • 리팩토링: controller-service-repo 넘겨주는 매개변수들 객체로 만들어 관리하기
    • 디자인 패턴: 스터디 계획 & 준비

  • 서면 피드백 내용: 주제와 스코프만 봤을 땐 첫 협업이기도 해서 괜찮을 것 같다고 생각했는데, 아래 진행 상황이 굉장히 빨라서 추가사항까지 진행하실 것 같네요. 시간에 쫓기지 않는 상황이라면 스웨거를 먼저 작업하신 후, 협업하실 때 스웨거를 이용하시는 것도 좋을 것 같습니다. 또, 아시겠지만 TDD는 테스트 주도 개발의 준말로, TDD가 가장 후순위로 간다면 이 개발은 TDD라기 보다는 그냥 테스트코드를 작성하신 것으로 봐야할 것 같습니다. 테스트 코드를 나중에 적는게 나쁘다는 것이 아니라 TDD가 붙는게 부적절하다는 말입니다.
    - TDD가 뭔지 잘 몰라서 빨리 공부해야지
post-custom-banner

0개의 댓글