[FEAT] 닉네임 중복 확인 API 구현 - #98
Conversation
📝 WalkthroughWalkthrough닉네임 형식 검증을 공개 메서드로 변경했습니다. 닉네임을 정규화하고 중복 여부를 조회하는 서비스를 추가했습니다. 인증 없이 호출할 수 있는 Changes닉네임 중복 확인
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
actor Client
participant UserController
participant UserService
participant UserRepository
Client->>UserController: GET /api/users/verify-nickname?nickname=...
UserController->>UserService: checkNicknameAvailable(nickname)
UserService->>UserService: trim and validate nickname format
UserService->>UserRepository: existsByNickname(normalizedNickname)
UserRepository-->>UserService: duplicate status
UserService-->>UserController: NicknameCheckResponse
UserController-->>Client: ApiResponse<NicknameCheckResponse>
Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (2)
src/test/java/com/mr/domain/user/controller/UserControllerTest.java (2)
37-55: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win사용 불가 응답도 컨트롤러 테스트로 검증하세요.
현재
verifyNickname_success()는available=true만 확인합니다. 이미 사용 중인 닉네임은200 OK와$.data.available=false로 응답해야 합니다. 중복 안내 문구의 JSON 직렬화도 확인해야 합니다.
available(false)인 응답을 추가로 스텁하고 상태 코드,available,message를 검증하세요.추가 테스트 예시
+ `@Test` + void verifyNickname_taken_returns200False() throws Exception { + mockMvc = setUp(); + + UserResponseDTO.NicknameCheckResponse takenResponse = + UserResponseDTO.NicknameCheckResponse.builder() + .nickname("김뮤즈") + .available(false) + .message("중복 닉네임 안내 문구") + .build(); + given(userService.checkNicknameAvailable("김뮤즈")).willReturn(takenResponse); + + mockMvc.perform(get("/api/users/verify-nickname").param("nickname", "김뮤즈")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.available").value(false)) + .andExpect(jsonPath("$.data.message").value(takenResponse.message())); + }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/test/java/com/mr/domain/user/controller/UserControllerTest.java` around lines 37 - 55, Extend UserControllerTest.verifyNickname_success coverage with a separate unavailable-nickname test that stubs userService.checkNicknameAvailable for an already-used nickname, then verifies HTTP 200, $.data.available=false, and the serialized duplicate-nickname message.
31-35: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win보안 필터가 적용된
MockMvc테스트를 추가하세요.
MockMvcBuilders.standaloneSetup(...)설정은SecurityConfig.securityFilterChain(...)을 거치지 않습니다.GET /api/users/verify-nickname같은 공개 경로가 인증 없이 동작함을 검증하려면@SpringBootTest+@AutoConfigureMockMvc또는@WebMvcTest구성에서 보안 필터를 사용하세요. Spring Security Java-Config 문서의 다중SecurityFilterChain우선순위 설명도 참고하세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/test/java/com/mr/domain/user/controller/UserControllerTest.java` around lines 31 - 35, Update UserControllerTest so its MockMvc setup loads the application security configuration through `@SpringBootTest` with `@AutoConfigureMockMvc` or an equivalent `@WebMvcTest` configuration, instead of standaloneSetup in setUp(). Ensure the test exercises the configured SecurityFilterChain and verifies the public GET /api/users/verify-nickname path works without authentication.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@src/test/java/com/mr/domain/user/controller/UserControllerTest.java`:
- Around line 37-55: Extend UserControllerTest.verifyNickname_success coverage
with a separate unavailable-nickname test that stubs
userService.checkNicknameAvailable for an already-used nickname, then verifies
HTTP 200, $.data.available=false, and the serialized duplicate-nickname message.
- Around line 31-35: Update UserControllerTest so its MockMvc setup loads the
application security configuration through `@SpringBootTest` with
`@AutoConfigureMockMvc` or an equivalent `@WebMvcTest` configuration, instead of
standaloneSetup in setUp(). Ensure the test exercises the configured
SecurityFilterChain and verifies the public GET /api/users/verify-nickname path
works without authentication.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 20c920bd-4f7e-48cc-9349-2f238aed8fb2
📒 Files selected for processing (5)
src/main/java/com/mr/domain/user/controller/UserController.javasrc/main/java/com/mr/domain/user/dto/res/UserResponseDTO.javasrc/main/java/com/mr/domain/user/service/UserService.javasrc/test/java/com/mr/domain/user/controller/UserControllerTest.javasrc/test/java/com/mr/domain/user/service/UserServiceTest.java
🚧 Files skipped from review as they are similar to previous changes (3)
- src/main/java/com/mr/domain/user/service/UserService.java
- src/main/java/com/mr/domain/user/controller/UserController.java
- src/test/java/com/mr/domain/user/service/UserServiceTest.java
📍 개요
⛓️💥 관련 이슈
🛠️ 작업 내용
GET /api/users/verify-nickname컨트롤러/서비스 신규 구현노션 API 명세서 기준 인증 도메인 MVP 항목 중 미구현 상태였던 닉네임 중복 확인 API입니다.
이 도메인 담당자(예원 님)와 진행 상황 공유 후 제가 구현했습니다.
기존
User.updateNickname()이 쓰던 정규식(^[가-힣a-zA-Z0-9]{2,10}$)과NICKNAME_REQUIRED/NICKNAME_INVALID_FORMAT에러코드를 그대로 재사용했습니다.User의 private 검증 메서드를validateNicknameFormat()으로 public static 전환해서 엔티티 생성 없이도 형식만 검증할 수 있게 했습니다.UserRepository.existsByNickname()추가이 API는 인증 불필요(노션 명세 "토큰: No")라 로그인 사용자 컨텍스트가 없어서, 기존
existsByNicknameAndUserIdNot(본인 제외)이 아니라 단순 존재 여부만 확인하는 메서드를 새로 추가했습니다.SecurityConfig.PUBLIC_URLS에/api/users/verify-nickname추가backingTrack패키지명 잔재 import 경로 3개 재수정develop이 아직 [BUGFIX] 소셜 로그인 read-only 트랜잭션 버그 수정 #96(PR)을 반영하지 않아 이 브랜치에서도 같은 컴파일 에러가 재발해서, 동일하게 import 경로만 정정했습니다.🔥 리뷰 요청 사항
200 OK+{ "available": false }로 설계했습니다."중복 확인"은 실패가 아니라 정상적인 조회 결과라고 판단했는데, 이 API 스펙 자체가 명세서에 빠져있어서
확정된 계약이 없습니다. 프론트(김나윤 님) 쪽 기대 형식과 맞는지 확인 부탁드려요.
SecurityConfig화이트리스트 추가가 다른 인증 로직에 영향 없는지✅ 체크리스트
📎 참고 사항
이용제한 및 구독 조회(GET /api/users/me/usage-status)는 MVP 범위 아니라 이번 PR에 포함하지 않았습니다.UserServiceTest5케이스(사용가능/중복/trim/필수입력누락/형식오류) 추가, 전체 테스트 통과 확인했습니다(기존에 리포트드린
PlayingServiceTest무관한 실패 2건 제외).Summary by CodeRabbit
새 기능
테스트