내 생애 첫 프로젝트를 리팩토링을 시작했다. 2주만에 5명이서 만든 이 프로젝트를 다시 코드를 뜯어보니, 처음 웹을 개발한 우리 팀원 모두가 자랑스러울 정도로, 코드는 투박하지만 프로젝트는 완성도가 높았다. 물론 프론트는 지금 봐도 잘한 것 같다.
2주 동안, 내 백엔드 팀원과 새벽 4시, 때론 아침 10시에 회의에 들어가고 날을 세워가며 개발했던 애증의 코드. 판도라의 상자를 열었다. Express 특유의 non-opinionated한 프레임워크에 인증에 대한 개념 숙지를 못한 내가, 사실상 세션도 쓰고 토큰도 사용하는 기괴한 인증방식이 눈에 보였다.
디자인 출신과 디자인 감각이 넘친 우리 팀원들 덕분에, 나의 가난하고 투박한 코드를 프론트엔드가 빛내주었다. 프론트를 바닐라 자바스크립트를 사용해서, 프론트 개념도 다시 한번 익힐겸 리팩토링을 진행하고자 했다.
다시 살아난 리프레시 북스토어
기존의 컨트롤러는 이렇게 되어있다. 기본적인 commonjs 문법이며, 함수형이다.
exports.createCategory = async (req, res, next) => {
try {
const categoryName = req.body.name;
const result = await categoryService.createCategory(categoryName);
res.status(200).json({
message: "카테고리 생성이 완료되었습니다.",
data: result,
});
} catch (error) {
res.status(error.status || 500).json({
message: error.message || "서버 오류가 발생했습니다.",
});
}
};
지금보니, 이렇게 막강의 자유도는 잘 정리되지 못한 느낌을 주었다.
리팩토링을 어떻게 해야하나 고민이 많았다.
마침 타입스크립트 진영에서는 Typescript-rest와 TSOA라는 라이브러리를 통해, nest까지는 아니지만, router를 분리해서 app 등록하는 수고스러운 일까지 덜어주는 멋진 라이브러리를 발견했다. 이것을 통해, 대략 이렇게 카테고리를 변경할 수 있었다.
@Post("user-admin/category")
@Security("sessionAuth", ["isAdmin"])
public async createCategory(
@Body() body: CreateUpdateCategoryDto
): Promise<any> {
try {
const result = await this.categoryService.createCategory(body.name);
console.log(body.categoryId);
return { message: "카테고리 생성이 완료되었습니다.", data: result };
} catch (error) {
this.setStatus(error.status || 500);
return { message: error.message || "서버 오류가 발생했습니다." };
}
}
앞으로 이어질 내용
기존 미들웨어 방식을 Security 데코레이터로 전환한 경험을 기록해보고자 한다.