Skip to content

Express 김윤기 스프린트미션7#6

Merged
devbini merged 13 commits intocodeit-sprint-fullstack:express-김윤기from
rklpoi5678:express-김윤기
Oct 14, 2025

Hidden character warning

The head ref may contain hidden characters: "express-\uae40\uc724\uae30"
Merged

Express 김윤기 스프린트미션7#6
devbini merged 13 commits intocodeit-sprint-fullstack:express-김윤기from
rklpoi5678:express-김윤기

Conversation

@rklpoi5678
Copy link
Collaborator

요구사항
판다마켓 자유게시판

기본 요구사항

  • mongoDB에서 PostgreSQL을 사용하도록 코드를 마이그레이션 해주세요.
    공통

  • PostgreSQL를 이용해 주세요.

  • 데이터 모델 간의 관계를 고려하여 onDelete를 설정해 주세요.

  • 데이터베이스 시딩 코드를 작성해 주세요.

  • 각 API에 적절한 에러 처리를 해 주세요.

  • 각 API 응답에 적절한 상태 코드를 리턴하도록 해 주세요.

자유게시판

  • Article 스키마를 작성해 주세요.
  • id, title, content, createdAt, updatedAt 필드를 가집니다.
  • 게시글 등록 API를 만들어 주세요.
  • title, content를 입력해 게시글을 등록합니다.
  • 게시글 조회 API를 만들어 주세요.
  • id, title, content, createdAt를 조회합니다.
  • 게시글 수정 API를 만들어 주세요.
  • 게시글 삭제 API를 만들어 주세요.
  • 게시글 목록 조회 API를 만들어 주세요.
  • id, title, content, createdAt를 조회합니다.
  • offset 방식의 페이지네이션 기능을 포함해 주세요.
  • 최신순(recent)으로 정렬할 수 있습니다.
  • title, content에 포함된 단어로 검색할 수 있습니다.
    댓글

[] 댓글 등록 API를 만들어 주세요.
[ ] content를 입력하여 댓글을 등록합니다.
[ ] 중고마켓, 자유게시판 댓글 등록 API를 따로 만들어 주세요.
[ ] 댓글 수정 API를 만들어 주세요.
[ ] PATCH 메서드를 사용해 주세요.
[ ] 댓글 삭제 API를 만들어 주세요.
[ ] 댓글 목록 조회 API를 만들어 주세요.
[ ] id, content, createdAt 를 조회합니다.
[ ] cursor 방식의 페이지네이션 기능을 포함해 주세요.
[ ] 중고마켓, 자유게시판 댓글 목록 조회 API를 따로 만들어 주세요.

멘토에게

  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@rklpoi5678 rklpoi5678 requested a review from devbini October 5, 2025 14:01
Copy link
Collaborator

@devbini devbini left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉 고생하셨습니다!

코드가 이전보다 보기 더 좋아진 것 같아요 !
스키마 설계도 깔끔하고, 유효성 검사같은 서비스 로직들에도 그렇게 큰 문제는 없어 보여서 세련된 코드라 느낄 수 있었답니다. 에러 핸들러도 마찬가지구요!

다만, 일부 개선이 필요한 부분이 있어서 리뷰 남겨놨어요.
크리티컬 한 건 없으니, 이런 내용이 있구나~ 하면서 알고 넘어가주시면 좋을 것 같네요 😁
추가적으로, 지금 prisma 스키마 데이터를 날짜별로 저장하고 있던데.. git의 존재 의의가 버전 관리인 만큼, 실제 사용하는 파일만 남겨주는 게 좋지 않을까 의견 드려봅니다.

너무나 고생 많으셨고, 돌아오는 프로젝트도 파이팅입니다! 🎉

export const deleteItem = async (req, res, next) => {
try {
const { itemId } = req.params;
const deleteItem = await prisma.item.findUnique({
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🪛 Fix Point

의도 하신건지, 아직 미 개발 상태인건지는 모르겠지만 코멘트 남겨드려요!
findUniqueDelete를 해 주는 메서드는 아니랍니다. 그래서 현재 상태로는 아이템이 삭제되질 않아요.
prisma.item.delete로 지워주는 코드가 필요 해 보여요 😁

또, 그냥 냅다 ID가 있든, 없든 상관 없이 prisma.item.delete로 삭제를 시도해도 됩니다.
현재 코드상 try-catch에서 잡아 줄 거라.. error Catch가 되었다면 존재하지 않는 id를 삭제하려 했다! 로
인식하는 것도 방법이에요 😊

prisma는 에러 코드를 굉장히 상세하게 던져주고 있어서,
catch를 받은 직후 error.code로 케이스를 구분 해 주면 더 보기 좋은 코드가 될 것 같아요.
지금과 같은 Not Found도 2025번 에러 케이스로 존재한답니다!
아래 내용을 한번 읽어보면 좋을 것 같아요 😁

https://www.prisma.io/docs/orm/reference/error-reference

}
next(error);
}
next();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🪛 Fix Point

현재 next()가 중복 수행될 것 같은 느낌이 있어요.
next()는 return처럼 메서드를 종료 시켜주는 게 아니라서, 현재 코드상
next(error)와 next() 두 번 실행되는 상황이 된답니다.

try 코드 내 정상적으로 수행되는 경우 next()를 호출 해 주어도 되고,
윤기님께서 편하신대로 수정 해 보면 좋지 않을까 싶어요 😁

export const getItemById = async (req, res, next) => {
try {
const { itemId } = req.params;
const { item } = await prisma.item.findUnique({
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🪛 Fix Point

아래 delete쪽은 괜찮았는데, 이 부분은 수정이 필요 해 보여요.
{ } 내부에 있는 값은 구조 분해 할당 형식으로 선언됩니다.

쉽게 말하면, await prisma.item.findUnique로 얻은 값의 결과 그 자체가 아닌,
await prisma.item.findUnique로 얻은 값의 item 객체를 찾으려 합니다.

만약 prisma.item.findUnique의 값이 null이라면, { item }은 null이 할당되는 게 아니라 오류가 나버립니다.
아래 if (!item)구문까지 가지도 못 하고 catch 문으로 빠지게 된답니다..

그러니, { item } 이 아닌 item으로 바꿔주셔야 안전할 것 같아요.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thinking

계속 item.controller쪽만 보게 되네요 🤣🤣
백엔드 서비스를 구축할 때는 가능하면, MVC 패턴을 지켜주는 게 중요하게 통용이 되고 있어요.

지금은 controller 파일에 로직과 반환, 호출이 모두 들어있는데,
중요 기능 로직들을 service 파일로 구분하고, controller는 단순 서빙만을 담당하도록 분리 해 주면
파일은 많아질지언정, 유지보수하는 데에는 큰 도움이 된답니다.

한번 읽어보세요! 😁

https://velog.io/@jybin96/Controller-Service-Repository-%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

userId Int?
name String
description String
price String
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thinking

price는 string보단 Int 형식으로 관리하는 건 어떨까요? 😁
제 취향이니 그냥 그렇구나~ 하고 생각 해 주세요 🤣🤣

@devbini devbini merged commit fcfff60 into codeit-sprint-fullstack:express-김윤기 Oct 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants