문제 없지만 subdocument와 populate의 차이를 알면 더 잘 사용할 수 있을 것이다. populate는 reference로 사용될 뿐, 그 자체가 하나의 top-level document이고 subdocument는 일반적인 부모-자식 관계와 유사하다.
후자도 가능하겠으나 그렇다면 비효율적이고 데이터 무결성이 깨진다고 볼 수 있다.
문제는 없으나 일반 사용자용/관리자용 CRUD 페이지를 따로 만드는 것이 바람직해 보인다. 그리고 토큰과 인증 같은 경우는 미들웨어를 적극 활용하도록.
router 함수로 API 요청을 보낼텐데 res.render를 통해서 다른 URL 주소로 접근한다면, 하나의 경로가 다른 경로에 의존적이므로 RESTful해 보이지 않는다.
pool을 구축하는 차원에서 enum을 사용한 것 같은데, enum 배열에 요소가 추가된다면 db에서 자체적으로 조회를 할 것이므로 리소스를 잡아먹게 된다. enum은 날짜와 같이 바꾸지 않을 속성을 활용하는 게 더 맞는 것 같다.
router에서 async 이하에 정의된 controller(request hanlder?)도 사실 분리해서 router-controller-businiess logic->db 구조를 만들면 좋다.
왜 많은 보안 라이브러리 중에 bcrypt를 사용할까? 이는 다른 기능의 라이브러리를 사용할 때도 마찬가지로 던져야 할 질문이다.
var, let은 지양하고 깃헙에 코드를 올릴 때 console.log()는 지워주는 것이 좋다.