[feat] 유저 정보 등록 API 구현 #72
Conversation
|
""" Walkthrough사용자 상세 정보를 최초 1회 등록할 수 있는 새로운 POST Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant UserController
participant UserInfoService
participant UserRepository
participant User
Client->>UserController: POST /info (UserInfoRegisterRequestDto)
UserController->>UserInfoService: registerUserInfo(userId, dto)
UserInfoService->>UserRepository: findById(userId)
UserRepository-->>UserInfoService: User entity 반환
UserInfoService->>User: 정보 등록/수정 (setter 호출)
UserInfoService->>UserRepository: save(User)
UserInfoService-->>UserController: 완료/예외 반환
UserController-->>Client: 응답 반환
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~15–20 minutes Suggested reviewers
Poem
""" Note ⚡️ Unit Test Generation is now available in beta!Learn more here, or try it out under "Finishing Touches" below. 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (4)
🚧 Files skipped from review as they are similar to previous changes (4)
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (3)
src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java (2)
15-16: 생년월일 형식 검증 추가를 고려해보세요.현재
birthDate는 단순 문자열로 정의되어 있고 주석으로만 형식이 명시되어 있습니다.@Pattern어노테이션을 사용하여 YYYY-MM-DD 형식을 강제하는 것을 고려해보세요.@NotBlank(message = "생년월일은 필수입니다.") +@Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$", message = "생년월일은 YYYY-MM-DD 형식이어야 합니다.") private String birthDate; // YYYY-MM-DD
24-25: 장애 정보 조건부 검증 로직 추가를 고려해보세요.현재
userType이DISABLED일 때disabilityType과mobilityAid가 필수인지 선택사항인지 명확하지 않습니다. 비즈니스 요구사항에 따라 커스텀 밸리데이션을 추가하는 것을 고려해보세요.src/main/java/com/wayble/server/user/entity/User.java (1)
61-62: 장애 관련 필드의 데이터 타입 검토를 고려해보세요.현재
disabilityType과mobilityAid가 자유 텍스트 String으로 정의되어 있습니다. 주석에 명시된 고정된 값들(발달장애, 시각장애 등)을 고려하면, 데이터 일관성을 위해 enum 타입 사용을 고려해볼 수 있습니다.// 예시 public enum DisabilityType { DEVELOPMENTAL, VISUAL, PHYSICAL, HEARING } public enum MobilityAid { GUIDE_DOG, CANE, COMPANION, WHEELCHAIR }Also applies to: 64-65
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
src/main/java/com/wayble/server/user/controller/UserController.java(3 hunks)src/main/java/com/wayble/server/user/dto/UserInfoRegisterRequestDto.java(1 hunks)src/main/java/com/wayble/server/user/dto/UserLoginRequestDto.java(0 hunks)src/main/java/com/wayble/server/user/entity/User.java(2 hunks)src/main/java/com/wayble/server/user/exception/UserErrorCase.java(1 hunks)src/main/java/com/wayble/server/user/service/UserInfoService.java(1 hunks)
💤 Files with no reviewable changes (1)
- src/main/java/com/wayble/server/user/dto/UserLoginRequestDto.java
🔇 Additional comments (6)
src/main/java/com/wayble/server/user/exception/UserErrorCase.java (1)
18-19: 새로운 에러 케이스 추가가 적절합니다.
USER_INFO_ALREADY_EXISTS에러 케이스가 올바르게 추가되었습니다. HTTP 상태 코드 400과 에러 코드 1009가 적절하고, 메시지도 명확합니다.src/main/java/com/wayble/server/user/controller/UserController.java (1)
119-137: 새로운 사용자 정보 등록 엔드포인트가 잘 구현되었습니다.인증 처리, 요청 검증, 서비스 호출이 적절하게 구현되어 있고, Swagger 문서화도 완전합니다. Authentication에서 userId를 안전하게 추출하는 로직도 올바릅니다.
src/main/java/com/wayble/server/user/service/UserInfoService.java (2)
36-43: 장애 정보 설정 로직이 적절합니다.
UserType.DISABLED일 때만 장애 관련 필드를 설정하고, 그렇지 않을 때는 null로 초기화하는 로직이 올바르게 구현되어 있습니다.
26-29: 프로필 중복 등록 검증 로직 검토 필요User 엔티티(
src/main/java/com/wayble/server/user/entity/User.java)에는 아래와 같이 프로필 관련 필드가 존재합니다:
- nickname
- birthDate
- gender
- userType
현재
UserInfoService.java(26–29행)에서는nickname만null여부로 중복 등록을 판단하고 있는데, 비즈니스 요건상 다음을 검토해 주세요:
- 닉네임만으로 ‘이미 등록된 정보’ 판단이 충분한지
- birthDate, gender, userType 등 나머지 프로필 필드도 함께 non-null인지 검증해야 하는지
필요 시 검증 로직을 보완해 주세요.
src/main/java/com/wayble/server/user/entity/User.java (2)
61-65: 새로운 장애 관련 필드들이 적절하게 추가되었습니다.
disabilityType과mobilityAid필드가 올바른 컬럼 매핑과 명확한 주석과 함께 추가되었습니다. 필드명과 컬럼명 모두 일관성 있게 작성되었습니다.
98-112: 새로운 setter 메서드들이 올바르게 구현되었습니다.사용자 정보 등록을 위한 모든 필요한 setter 메서드들이 적절하게 추가되었습니다. 메서드명과 매개변수 타입이 일관성 있게 작성되었습니다.
| user.setGender(dto.getGender()); | ||
| user.setUserType(dto.getUserType()); | ||
|
|
||
| if (dto.getUserType() == UserType.DISABLED) { |
There was a problem hiding this comment.
dto의 userType은 String이고 UserType.DISABLED는 구조체값인데 둘이 == 비교 연산이 가능한지 궁금합니다..!
둘의 타입을 다르게 할 거라면 UserType.DISABLED.name()로 String 값 구한 뒤, equals() 연산하는게 맞을 것 같아요..!
(제가 잘못 알고 있을 수도 있습니다!)
There was a problem hiding this comment.
현재 UserInfoRegisterRequestDto의 userType 필드는 UserType에서 enum 타입이라서 == 비교를 써도 되는거 같다고 생각했는데 혹시 제가 잘못 생각한거일까요!? 추가로 궁금해서 찾아봤더니 만약에 프론트에서 "DISABLED" 같은 String 값이 넘어온다면, 컨트롤러에서 UserType userType으로 받으면 Spring이 알아서 변환해준다고 하는데 그렇다면 이 코드를 고쳐야하는지 그대로 둬도 되는지도 궁금합니다!
There was a problem hiding this comment.
아 제가 잘못봤네요! register dto에서 disabilityType이 String인데, userType이 String으로 저장된 걸로 잘못 봤어요 ㅎㅎ
#️⃣ 연관된 이슈
#69
📝 작업 내용
스크린샷 (선택)
유저 정보 등록 성공
유저 정보 등록 실패 (이메일,비밀번호 이외에 닉네임,성별,생년월일,유저타입 등 하나라도 등록이 되어있으면 400 처리)
💬 리뷰 요구사항 (선택)
Summary by CodeRabbit