백엔드 팀은 이번 주 추가 기능 구현 보다는 기존 코드를 손보는 시간을 갖기로 했다. 우선 자신의 스코프가 아니더라도 프론트엔드에 대응해야할 상황이 나올 것에 대비해 코드 리뷰를 진행했다. 각자 작성한 라우터, 미들웨어, 커스텀 라이브러리, CRUD 로직에 대해 설명하는 시간을 가졌다.
코드 리뷰와 동시에 리펙토링도 진행했다. 분량을 줄일 수 있는 코드, DB 중복 조회를 하는 코드, 코딩 컨벤션에 맞지 않는 변수명 등을 수정했다.
무한 스크롤 기능을 추가해달라는 요청이 있어서 기능을 추가했다. 여기서 ORM은 도저히 못 쓰겠다고 판단했다. 정교한 작업이 필요한 DB transaction은 raw query로 처리하는게 훨씬 편했다.
const { categorySpace, categoryInterest, categoryStudyMate } = req.query;
let { page } = req.query;
// 페이지네이션에 필요한 것 : page query string, total number of posts, total page
if (!page) page = 1;
const postPerPage = 9;
const totalCnt = await Post.count();
const totalPage = Math.ceil(totalCnt / postPerPage);
const offset = (page - 1) * postPerPage;
// 로그인한 사람이 좋아요, 북마크했는지 확인할 때 쓸 변수. 토큰 유무에 따라 재할당 할 수 있으므로 let 선언
// WHERE에 사용할 조건문을 담을 List
let condition = [];
if (categoryInterest)
condition.push(`Post.categoryInterest='${categoryInterest}'`);
if (categorySpace) condition.push(`Post.categorySpace='${categorySpace}'`);
if (categoryStudyMate)
condition.push(`Post.categoryStudyMate='${categoryStudyMate}'`);
/*
* 조건이 안 들어온다 -> WHERE 없이 빈 문자열 처리
* 조건이 한 개 이상 들어온다 -> WHERE 붙이고, 조건 배열을 " AND "로 join하고 붙인다.
*/
let where =
condition.length === 0 ? "" : `WHERE ${condition.join(" AND ")}`;
const sqlQuery = `SELECT Post.postId, Post.imageCover, Post.title, Post.categorySpace, Post.categoryStudyMate, Post.categoryInterest, Post.contentEditor, Post.date, Post.userId,
COUNT(DISTINCT Likes.likeId) AS likeCnt,
COUNT(DISTINCT Bookmarks.bookmarkId) AS bookCnt
FROM Posts AS Post
LEFT OUTER JOIN Likes AS Likes ON Post.postId = Likes.postId
LEFT OUTER JOIN Bookmarks AS Bookmarks ON Post.postId = Bookmarks.postId
${where}
GROUP BY Post.postId
LIMIT ${postPerPage}
OFFSET ${offset};`;
const posts = await sequelize.query(sqlQuery, {
type: Sequelize.QueryTypes.SELECT,
});
기억에 남는 코드...
클린 아키텍처라는 책을 구입해서 읽기 시작했다. 사실 내용이 너무 어려워서 지금 수준으로는 책 안의 지식을 흡수하기 어렵다..... 흰 건 종이요, 까만건 글씨.....
DB, 파일 저장소 물리적 분리
추가 기능에 대해서는 TypeScript를 적용하기로 했다. 빨리 공부해야 할 듯.
동료 중 1명의 코드 리뷰를 16시간에 걸쳐 진행했다. 본인이 작성한 코드를 설명하는건 둘째 치고, 어떤 기능을 해야 하는지 조차 설명 못한다. 신이시여...... 본인의 코드를 나와 다른 동료가 설명해주는 식으로 진행이 됐다.
코드 리뷰를 진행하면서 배움의 태도에 대해 다시 생각해 보는 계기가 되었다. 배움에 있어서 내 내면에 쓸데 없는 자존심이나 고집이 꿈틀대지는 않는지 항상 잘 관찰해야겠다.
슬슬 취업 걱정이 밀려오기 시작하는데, 항해 크루원 중 한 분이 AI/ML 회사 면접 제의를 했다. 뜻밖의 제안에 몸둘 바를 몰랐다. 다만 AI/ML은 아직까지는 내 관심사가 아니었기에 고민이 된다. 경력기술서도 작성하고 있다. 아직은 많이 초라하다.