KAPUIST / Node-Recruiter

노드 간단 이력서 CRUD
0 stars 0 forks source link

숙련주차 과제 피드백 - 정영훈 튜터 #23

Open jyh7a opened 1 month ago

jyh7a commented 1 month ago

과제 하시느라 수고 많으셨습니다. layered architecture 패턴을 사용해서 과제 잘 완료 하였고. README, commit message 도 굉장히 잘 작성해 주셨습니다.

아래는 프로젝트 피드백입니다.


1. 폴구 구조 수정(상수 관리 폴더 생성)

프로젝트 폴더 구조 예시에서 constants 폴더에서 auth.constant.js, env.constant.js 등 여러 상수들을 관리합니다. 이런식으로 상수들을 객체로 관리해서 내보내게 되면 process.env. 을 사용 했을때는 자동완성이 되지않아서 프로그래머가 실수가 나올 수 있지만 상수를 객체로 만들어서 관리하면 ENV_CONSTANTS. 을 사용하면 사용할 수 있는 속성들이 자동완성으로 나오기때문에 실수 없이 상수들을 관리할 수 있습니다.

수정 전)

const options = {
  accessSecretKey: ENV_CONSTANTS.ACCESS_TOKEN_SECRET_KEY,
  accessOption: { expiresIn: "12h" },
  refreshSecretKey: ENV_CONSTANTS..REFRESH_TOKEN_SECRET_KEY,
  refreshOption: { expiresIn: "7d" }
};

수정 후)

const options = {
  accessSecretKey: process.env.ACCESS_TOKEN_SECRET_KEY,
  accessOption: { expiresIn: "12h" },
  refreshSecretKey: process.env.REFRESH_TOKEN_SECRET_KEY,
  refreshOption: { expiresIn: "7d" }
};




2. schema 오타 수정

https://github.com/KAPUIST/Node-Recruiter/blob/e6940aed9c12dec8f100988d23627eb8ccc5d2b1/prisma/schema.prisma#L60

스키마는 전체적으로 잘 작성하였고. 필요한 부분에 검색 속도를 높이기 위해서 적절하게 index 사용도 잘 해주었습니다. user_info 에서 gender가 String으로 매핑 되어 있는데 이 부분은 오타 같네요. 수정해 주세요.




3. 트랜잭션 로직 분리

https://github.com/KAPUIST/Node-Recruiter/blob/e6940aed9c12dec8f100988d23627eb8ccc5d2b1/src/services/resume.service.js#L226-L228 트랜잭션 로직도 잘 처리하였습니다. 여기에서 추가로 비지니스 로직과 DB 트랜잭션 로직을 분리하여 코드 가독성과 유지보수를 쉽게 만들 수 있습니다.

수정 후)

const updateResumeStatusLogic = async (tx, userId, resume, updateData) => {
  const updatedResume = await tx.resume.update({
    where: { resume_id: resume.resume_id },
    data: { status: updateData.status }
  });

 // ... 생략

  return createResumeUpdateLog;
};

// 이력서의 상태를 수정합니다 For Recruiter
export const updateResumeStatusForRECRUITER = async (userId, resumeId, updateData) => {
  const resume = await prisma.resume.findFirst({ where: { resume_id: resumeId } });
  if (!resume) {
    throw new ErrorHandler(STATUS_CODES.NOT_FOUND, "이력서가 존재하지 않습니다.");
  }

  // transaction 로직
  return await prisma.$transaction(async (tx) => {
    // 비즈니스 로직
    return await updateResumeStatusLogic(tx, userId, resume, updateData);
  });
};




4. getUserFromToken 함수 수정

https://github.com/KAPUIST/Node-Recruiter/blob/e6940aed9c12dec8f100988d23627eb8ccc5d2b1/src/middlewares/auth.middleware.js#L40-L42 토큰에서 유저 정보를 가져오는 함수도 잘 만들었습니다. return 값을 보니 user_id, role만 가져오기위해서 formattedData 객체를 만들었는데 처음부터 users 말고 user_info에서 유저 id, role을 가져오면 formattedData 객체를 만들지 않고 바로 처리 가능합니다. 이런식으로 자주 변경되거나 찾으려는 정보가 있으면 user, user_info 테이블을 나눠서 관리해도 됩니다.




5. 더 나아가기.

기본적으로 미리 layered architecture패턴을 사용하고 요구사항들을 잘 구현해 주었습니다.

추가적으로 api 문서화를 위한 swagger 캐싱(redis)을 사용해 보는걸 추천드립니다.

  1. swagger 사용 - API 문서화
  2. 캐싱(redis) 사용 - 데이터 베이스 부하 감소 (모든 유저의 이력서를 받는 곳에 사용 가능)
jyh7a commented 1 month ago

피드백 수정 사항입니다.

소프트웨어 디자인 패턴이 layered architecture -> mvc 입니다. controller 까지 구현 해서 mvc 패턴에 따라서 잘 구현 해주었습니다.

layered architecture패턴에서는 추가로 Repository 가 포함되는데 Repository역할은 데이터베이스나 외부 API와의 통신을 하게 됩니다. 이로써 비지니스 로직과 데이터 접근 로직을 분리하여 유지보수 및 테스트에 쉽게 코드를 작성할 수 있습니다.

layered architecture패턴이 무엇인지 간단히 찾아보고 심화 주차에서 layered architecture을 사용하니 이 패턴에 맞춰서 프로젝트를 고도화해도 좋은 경험이 될 것입니다.