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