Issues encountered
- config.js 에러: Tokens table을 추가하고 migrate를 하려고 했는데, 다음과 같은 에러가 나왔다 -
"Dialect needs to be explicitly supplied as of v4.0.0"
.
- joi library에서 array validation하기
- jest library로 joi validation 성공/실패 케이스 만들기
What I tried
- 일단 우리 팀은 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 내부적으로 꼬인게 아닌가 생각도 하긴했는데 다 뻘 생각이었다..ㅎ 팀원분이 에러를 해결하셨는데, 에러는 생각보다 간단한 이유때문에 생겼던거였다. 에러가 왜 생겼는지 알고 나서는 갈피도 못잡고 뻘생각만 했던 나자신이 왜그랬을까 생각도 잠깐 하긴했지만 이러면서 배우는 건가 싶기도 하고... 암튼 좋은 경험 한거라고 치자!
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에 대해 검증을 할 수 있다.
- 성공 케이스는 만들었다. 실패 케이스는 아직 진행중...
const validationResult = postWorldcupSchema.validate(mockRequest.body);
expect(validationResult.value).toEqual(createWorldcupRequestBodyParams);
What to learn next
- 월요일에 진행할 사항들
- 테스트: 월드컵 게시물 기능 단위 테스트, TDD가 뭔지 공부해보기, 통합테스트
- 리팩토링: controller-service-repo 넘겨주는 매개변수들 객체로 만들어 관리하기
- 디자인 패턴: 스터디 계획 & 준비
- 서면 피드백 내용: 주제와 스코프만 봤을 땐 첫 협업이기도 해서 괜찮을 것 같다고 생각했는데, 아래 진행 상황이 굉장히 빨라서 추가사항까지 진행하실 것 같네요. 시간에 쫓기지 않는 상황이라면 스웨거를 먼저 작업하신 후, 협업하실 때 스웨거를 이용하시는 것도 좋을 것 같습니다. 또, 아시겠지만 TDD는 테스트 주도 개발의 준말로, TDD가 가장 후순위로 간다면 이 개발은 TDD라기 보다는 그냥 테스트코드를 작성하신 것으로 봐야할 것 같습니다. 테스트 코드를 나중에 적는게 나쁘다는 것이 아니라 TDD가 붙는게 부적절하다는 말입니다.
- TDD가 뭔지 잘 몰라서 빨리 공부해야지