언젠가는 펼쳐 볼 아카이브

[엘리스 SW 트랙] 1차 프로젝트 : 오피스아워 코멘트 9주차 - 1 본문

IT/엘리스 SW 트랙 7기

[엘리스 SW 트랙] 1차 프로젝트 : 오피스아워 코멘트 9주차 - 1

개발자희망생고롸파덕 2023. 11. 21. 02:19

 

오피스 아워 코멘트 반영한 백엔드 디렉터리 구조 (3 layers)

 

코드 리뷰

// CategoryAPI 일부 코드
// 대분류 /소분류 카테고리 리스트만 불러오기
router.get(
  '/:parentCategory',
  validate(categoryValidation.getCategoryByParentId),
  categoryController.getCategoryByParentId
);

...

//카테고리 수정
router.patch(
  '/',
  validate(categoryValidation.updateCategory),
  categoryController.updateCategory
);

// 카테고리 삭제
router.delete(
  '/:id',
  validate(categoryValidation.deleteCategory),
  categoryController.deleteCategory
);
  • 익명함수 형태의 validation 은 생각하지 못하고 있었는데 좋은 아이디어네요. 대신 404 에러를 발생 시키는 실제 값의 존재 여부에 대한 처리는 서비스 로직에서 처리해야 하겠네요.
// CategoryService 일부 코드

const { Category } = require('../models');
//카테고리 전체 가져오기
const categoryList = async () => {
  return await Category.find({});
};

// 특정 카테고리 가져오기
const getCategory = async (categoryParams) => {
  const data = categoryParams;
  const category = await Category.findById({ _id: data.id }).exec();
...
  • stack trace 를 위해서 exec() 를 중복 사용하신건가요? 너무 잘 하셨네요. 근데 이 에러를 catch 하는 부분이 없는 것 같습니다. controller, service 다 try-catch 구문이 없는 것 같네요. 추가 부탁드립니다.
// CategoryService 파일 일부
...
//카테고리 추가하기
const createCategory = async (categoryBody) => {
  const newCategory = await Category.create(categoryBody);

  return newCategory;
};

//카테고리 수정하기
const updateCategory = async (categoryBody) => {
  const data = categoryBody;
  // TODO DB에서 데이터 수정하기

  return { message: 'Update category Success', data };
...
  • update 성공에 대한 메세지는 따로 없어도 될 것 같습니다. 수정에 실패 했을 때 에러를 throw 하는 부분이 추가 되면 됩니다.
//카테고리 삭제하기
const deleteCategory = async (categoryParams) => {
  // TODO DB에서 데이터 가져온 후 삭제하기
  const data = categoryParams;
  const deleteItem = await Category.findById({ _id: data.id }).exec();

  if (deleteItem !== null) {
...

 

  • if(deleteItem === null) { throw new NOTFoundError("Category is not exist")} 먼저 써주시고 정상 로직은 아래 분기 없이 써주는게 더 나아 보입니다.
  • 일반적으로 false 에 대한 로직을 먼저 처리해주는게 분기문을 덜 탈 수 있는 좋은 습관입니다. 앞으로 작성하실 때, false 값에 대한 것들을 먼저 처리해주시면 좋은 코드를 작성하는데 도움이 될 겁니다. :)
//categoryController.js 일부
//카테고리 삭제
exports.deleteCategory = async (req, res, next) => {
  const data = await categoryService.deleteCategory(req.params);
  res.json(data);
...
  • 데이터 삭제 후 그 데이터가 front 에서 특별하게 필요하지 않다면 status(204) 로 response 주는게 더 나아 보입니다.

 

로그인 기능 관련 코멘트

  • 현재는 JWT만을 이용해 로그인 상태 유무를 체크하셨는데요, 이후에 리팩토링이라던지 다른 프로젝트에서는 리프레시 토큰을 사용하는 방법도 적용해보시면 좋을 것 같습니다.

MongoDB 관련 코멘트

  • mongoDB에서 popluate를 사용해서 조건을 이용해 데이터를 뽑아오고 싶은데, 시간도 많이 소요되고 잘 되지 않아서 사용하지 못했습니다. 데이터를 불러온 후에 필터링한 값들을 프론트엔드에 넘겨주는 방식으로 구현했는데, 혹시 어떻게 하면 popluate를 잘 쓸 수 있을까요?
    • 접근하신 방법도 맞는 방법이에요. MongoDB에서 popluate를 쓰는 것은 사실 권장 되지 않습니다. RDB로 따지면 join을 하는 것인데요. MongoDB는 join을 DB가 직접 해주는 것이 아니고, 내부 로직은 서버로 넘긴 후에 서버에서 데이터 형식을 맞춰서 다시 넘겨주는 방식이에요. 
    • populate를 써도 필터를 걸어준거랑 동일하게 진행되기 때문에, 전혀 지장이 없습니다.
    • 그러면 왜 populate를 사용할까요? Document DB가 관계란 것이 있고, 그것을 좀 더 명확하게 해줄 수 있기 때문에 쓰긴 합니다. 
      • 단순한 관계라면 populate를 사용하면 좋긴한데, 복잡한 관계라면 populate 보다는 필터링이 더 나을 수도 있습니다.
    • popluate 이외에도 aggregation을 사용하는 방법이 있는데요. 보통 통계 같은 곳에 많이 쓰이고, 꽤 복잡한 구조입니다. 기회가 된다면 한번 써보시길 바랍니다.

 

합동 오피스아워 코멘트

  • 실제로 현업에서 피그마&포토샵을 많이 사용하나요?
    • 코멘트 달고, 실제 어떻게 구성되어있는지 파악할 수 있는 정도만 되면 됩니다. 엄청난 스킬을 가지고 있지 않아도 사용하고, 볼 줄만 알면 됩니다.
  • 현업에서도 1차 프로젝트처럼 이렇게 짧은 시간내에 빠르게 구현해야하는 편인가요?
    • 2주로는 사실상 힘듭니다. DB 설계, API 설계, 서비스 기획 같은 게 나와야햐는데, 2주 안에 구현까지 해야하면 불가능한 일정이죠. 이 프로젝트 같은 경우는 어느정도 가이드가 나왔고, 일정도 정해져있고.. 짧은 시간 안에 구현을 하면 머릿속에 남는게 많기도 해서 2주를 주신 것 같네요 :)
    • 실제 프로젝트 기간이 2주인 경우는 거의 없습니다. 다만 신입 주니어들이 입사했을때 일정을 조금 빡빡하게 해서 과제를 주는 것 같아요. 과제를 주는 이유는 짧은 기간 내에 빠르게 결과물을 내는 게 목표가 아니라, 짧은 기간에 결과물을 내면서 좀 더 많이 써보고 배워보라는 의미로 타이트하게 내긴 합니다.

 

#엘리스트랙 #엘리스트랙후기 #리액트네이티브강좌 #온라인코딩부트캠프 #온라인코딩학원 #프론트엔드학원 #개발자국비지원 #개발자부트캠프 #국비지원부트캠프 #프론트엔드국비지원 #React #Styledcomponent #React Router Dom #Redux #Typescript #Javascript