Project/나혼자 미슐랭

나혼자 미슐랭 개발일지 #2 – User, Restaurant, Review CRUD 개발완료

Coding Kitsune 2025. 5. 10. 10:42

 

본격적으로 API의 기본 뼈대를 구성했습니다.
User, Restaurant, Review 세 가지 핵심 도메인에 대해 CRUD(Create, Read, Update, Delete) 기능을 설계하고 구현했습니다.

 

 

📌 도메인별 엔티티 구성

  • User: username, email, password, created, deleted
  • Restaurant: name, address, category, mapUrl, avgRating, created, deleted
  • Review: user, restaurant, rating, comment, created, modified, deleted

삭제는 soft delete 방식을 채택했습니다.

 

 

 

🛠️ 개발 중 마주친 이슈와 해결 과정

1. created 필드 타입 충돌

  • 초기엔 created를 String으로 선언하고 System.currentTimeMillis()로 값 넣었는데,
    MySQL DATETIME 컬럼과 충돌하여 500 에러 발생
  • 해결: LocalDateTime으로 타입 변경 후 LocalDateTime.now() 사용

2. @NotNull vs @NotBlank 구분

  • ReviewRequest DTO에서 userId, restaurantId에 @NotBlank를 쓰려다 오류
    기본 타입 외 객체(Long 등)는 @NotNull 사용이 맞음
  • 반면, comment는 문자열이므로 @NotBlank로 처리

3. @Transactional 누락

  • UserServiceImpl에는 @Transactional이 있었으나,
    ReviewServiceImpl에서는 누락되어 rollback 불가능한 구조였음
    변경/저장 로직에는 꼭 @Transactional 추가

4. 컨벤션 통일 리팩토링

  • 메서드명, 변수명 통일: createUser, createRestaurant, createReview
  • 서비스 인터페이스와 구현체의 메서드명 일관성 유지

 

 

🧪 API 테스트 – Postman으로 진행

  • 각 엔드포인트에 대해 POST, GET, PUT, DELETE 모두 테스트
  • Postman Collection 기능으로 요청들을 정리하여 편리하게 관리
  • 실제 존재하는 ID가 필요하기 때문에 연계된 도메인 순서대로 테스트함

정상동작 확인

 

 

 

📂 디렉토리 구조 개선

기존:

service/ UserServiceImpl.java RestaurantServiceImpl.java

 

 

리팩토링 후:

service/user/UserServiceImpl.java service/restaurant/RestaurantServiceImpl.java ...
 

도메인 기준으로 폴더 분리, 협업 및 유지보수에 유리한 구조로 변경

 

 

 

 

 

✅ 해야할 BE 작업들..

1. JWT 로그인 구현 (회원가입 + 로그인)
2. Spring Security로 인증 추가
3. 리뷰 작성 → 로그인 유저만 가능하게
4. 예외처리 + 응답 포맷 통일
5. 페이징 & 정렬
6. Swagger & 테스트
7. 배포 or CI/CD

 

 

 

GitHub 링크

👉 https://github.com/Peter-Park95/solo-michelin-backend

 

GitHub - Peter-Park95/solo-michelin-backend

Contribute to Peter-Park95/solo-michelin-backend development by creating an account on GitHub.

github.com