- Language
Javascript ES6
- Front-End
HTML5
CSS
ejs 3.1.6
Bootstrap 5.1.2
- Back-End
Node.js 16.9.1
express 4.17.1
mongoDB 5.0.2
mongoose 6.0.7
Joi 17.4.2
- ETC
Jest 7.2.4
Insomnia 2021.5.3
Git 2.32.0 / Github
draw.io 15.4.0
기능을 어떻게 분류하면 좋을까 고민했다. 지금은 백엔드를 다루고 있으니, 결국 내가 다루는 리소스를 기준으로 분류를 해 봤다.
회원가입
로그인
로그인 검사
app.use("/", renderRouter);
app.use("/api/users", usersRouter);
app.use("/api/postings", postingsRouter);
rootRouter.get("/", home);
rootRouter.get("/postings", getPostings);
rootRouter.get("/postings/:id/detail", getDetail);
rootRouter.get("/postings/:id/edit", getEdit);
rootRouter.get("/signup", getSignup);
rootRouter.get("/login", getLogin);
userRouter.post("/", validateSignUp, postSignup);
userRouter.post("/auth", postAuth);
// 페이지 별로 로그인 검사를 위해 별도 API 준비
userRouter.get("/me", authMiddleware, getMe);
postingRouter
.route("/")
.get(readAllPostings)
.post(authMiddleware, postPostings);
postingRouter
.route("/:id")
.patch(authMiddleware, patchPostings)
.delete(authMiddleware, deletePostings);
postingRouter
.route("/:id/comments")
.post(authMiddleware, postComment)
.get(authMiddleware, getComments)
.delete(authMiddleware, deleteComment)
.patch(authMiddleware, patchComment);
const userSchema = new mongoose.Schema({
username: { type: String, required: true },
email: { type: String, required: true },
password: { type: String, required: true },
});
const postingSchema = new mongoose.Schema({
title: { type: String, required: true },
author: { type: String, required: true },
createdAt: { type: Date, default: Date.now, required: true },
password: { type: String, required: true },
text: { type: String, required: true },
});
const commentSchema = new mongoose.Schema({
ownedPosting: { type: mongoose.Types.ObjectId, required: true },
author: { type: String, required: true },
text: { type: String, required: true },
createdAt: { type: Date, default: Date.now, required: true },
});
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
Middleware
Jest, Application Test
Jest?
test("테스트 설명", () => {
expect("검증 대상").toXxx("기대 결과");
});
Application Test
애플리케이션 테스트는 테스트 기준, 관점에 따라 다양한 테스트 방법이 존재한다. 나는 Joi schema에 대한 검증을 진행하였으므로, 프로젝트 수행 단계에 따른 테스트 중 단위 테스트(Unit test)를 진행했다고 볼 수 있겠다.
Schema는 회원가입 form data를 받아서 입력값이 형식에 맞는지 확인하기 위한 것이다.
export const isSignUp = async (signUpForm) => {
try {
await signUpSchema.validateAsync(signUpForm);
return true;
} catch (error) {
return false;
}
};
toEqual matcher에서 true/false를 사용하기 위해 테스트 코드를 간단하게 작성했다. 입력 값이 schema 검증을 성공하면 true를 반환하며, 실패하면 false를 반환한다.
테스트 결과는 아래와 같다.
테스트 케이스를 작성하면서 스스로와 많이 타협했다.(...) 얼마나 정교하게 테스트 케이스를 짜냐에 따라 테스트 코드도 변경해야 할 것 같고, 테스트 케이스도 수 십 가지는 더 만들 수 있을 것 같다.
2주차부터 나사가 좀 빠져있었다. 게임하고 노느라 공부할 시간이 절대적으로 부족했다. 시간이 부족하다 보니 새로 배운 MySQL, sequelize를 적용할 수가 없었고, 또다시 mongoDB와 mongoose를 써서 프로젝트를 진행했다. 다음 주 부터는 정신 바짝 차리고 항해에 임해야겠다.
이번 팀에서는 코드 리뷰를 진행했다. 확실히 다른 사람의 코드에서 배울 점이 많았고, 내 코드에서 피드백을 받는 것도 도움이 된다고 느껴졌다.
3주차는 다른 크루원들의 질문을 많이 받았다. 질문에 답변을 해주면서, 자연스럽게 내가 알고 있는 개념이 다시 정리가 되었다. 동시에, 질문을 할 때에도 고민을 해보고, 신중히 질문을 하는 것이 좋다는 것을 다시 깨달았다. 고민 과정에서 문제가 해결되기도 하고, 좋은 질문이 가야 좋은 답변이 온다.
미들웨어
https://m.blog.naver.com/limoremo/220073573980
https://expressjs.com/ko/guide/using-middleware.html
https://12bme.tistory.com/289
Jest
https://www.daleseo.com/jest-basic/