Skip to content

[FEAT] 닉네임 중복 확인 API 구현 - #98

Merged
kimyw1018 merged 4 commits into
developfrom
feat/#95-verify-nickname-api
Aug 1, 2026
Merged

[FEAT] 닉네임 중복 확인 API 구현#98
kimyw1018 merged 4 commits into
developfrom
feat/#95-verify-nickname-api

Conversation

@p1001q

@p1001q p1001q commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

📍 개요

GET /api/users/verify-nickname 닉네임 중복 확인 API 구현

⛓️‍💥 관련 이슈


🛠️ 작업 내용

  • 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 추가
    ⚠️ Auth 도메인 파일입니다. 인증 없이 호출 가능해야 하는 API라 화이트리스트 추가가 필요해서 건드렸습니다 — 예원 님 확인 부탁드려요.
  • (드라이브바이) backingTrack 패키지명 잔재 import 경로 3개 재수정
    develop이 아직 [BUGFIX] 소셜 로그인 read-only 트랜잭션 버그 수정 #96(PR)을 반영하지 않아 이 브랜치에서도 같은 컴파일 에러가 재발해서, 동일하게 import 경로만 정정했습니다.

🔥 리뷰 요청 사항

  • 응답 형식 방향: 중복인 경우를 409 에러가 아니라 200 OK + { "available": false }로 설계했습니다.
    "중복 확인"은 실패가 아니라 정상적인 조회 결과라고 판단했는데, 이 API 스펙 자체가 명세서에 빠져있어서
    확정된 계약이 없습니다. 프론트(김나윤 님) 쪽 기대 형식과 맞는지 확인 부탁드려요.
  • SecurityConfig 화이트리스트 추가가 다른 인증 로직에 영향 없는지

✅ 체크리스트

  • 코드 컨벤션을 준수했습니다.
  • 불필요한 코드 및 import를 제거했습니다.
  • 예외 처리를 적용했습니다.
  • 테스트를 완료했습니다.
  • 관련 Issue를 연결했습니다.

📎 참고 사항

  • 같은 인증 도메인의 이용제한 및 구독 조회(GET /api/users/me/usage-status)는 MVP 범위 아니라 이번 PR에 포함하지 않았습니다.
  • UserServiceTest 5케이스(사용가능/중복/trim/필수입력누락/형식오류) 추가, 전체 테스트 통과 확인했습니다
    (기존에 리포트드린 PlayingServiceTest 무관한 실패 2건 제외).

Summary by CodeRabbit

새 기능

  • 로그인 없이 닉네임 중복 여부를 확인할 수 있는 API를 추가했습니다.
  • 입력값의 앞뒤 공백을 정리하고, 필수 입력 및 닉네임 형식을 검증합니다.
  • 닉네임, 사용 가능 여부, 안내 메시지를 제공합니다.
  • API 요청 방식과 파라미터 정보를 문서화했습니다.

테스트

  • 정상 입력, 중복 닉네임, 공백 포함 입력 및 유효하지 않은 닉네임을 검증합니다.
  • 누락되거나 잘못된 입력에 대한 오류 응답을 확인합니다.

@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

닉네임 형식 검증을 공개 메서드로 변경했습니다. 닉네임을 정규화하고 중복 여부를 조회하는 서비스를 추가했습니다. 인증 없이 호출할 수 있는 GET /api/users/verify-nickname API와 응답 DTO를 추가했습니다. 관련 단위 테스트와 컨트롤러 테스트를 추가했습니다.

Changes

닉네임 중복 확인

Layer / File(s) Summary
닉네임 검증 계약과 응답 모델
src/main/java/com/mr/domain/user/entity/User.java, src/main/java/com/mr/domain/user/dto/res/UserResponseDTO.java
validateNicknameFormat을 공개 정적 메서드로 변경했습니다. 닉네임, 사용 가능 여부, 안내 문구를 담는 NicknameCheckResponse를 추가했습니다.
중복 확인 서비스와 저장소 조회
src/main/java/com/mr/domain/user/service/UserService.java, src/main/java/com/mr/domain/user/repository/UserRepository.java, src/test/java/com/mr/domain/user/service/UserServiceTest.java, src/test/java/com/mr/domain/analysis/service/*, src/test/java/com/mr/domain/playing/service/PlayingServiceTest.java
닉네임을 trim한 뒤 형식을 검증하고 저장소에서 중복 여부를 조회합니다. 정상 입력, 중복 입력, 공백 입력, null 입력, 형식 오류를 테스트합니다. 관련 테스트의 패키지 대소문자 import도 수정했습니다.
공개 API 연결과 보안 설정
src/main/java/com/mr/domain/user/controller/UserController.java, src/main/java/com/mr/global/security/SecurityConfig.java, src/test/java/com/mr/domain/user/controller/UserControllerTest.java
GET /api/users/verify-nicknameUserService에 연결했습니다. 해당 경로를 인증 없이 허용했습니다. 성공 응답과 400 오류 응답을 테스트했습니다.

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>
Loading

Possibly related PRs

  • Musereview/BE#18: User.java의 닉네임 검증 로직과 직접 연결된 변경입니다.
  • Musereview/BE#47: UserRepository와 닉네임 검증 및 사용자 프로필 로직이 연결된 변경입니다.
  • Musereview/BE#63: UserServiceUserRepository를 사용하는 사용자 도메인 변경입니다.

Poem

닉네임을 trim하고
형식 검증을 통과하면
저장소가 중복을 확인하고
DTO가 결과를 전합니다
공개 API가 준비됐습니다 ✨

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning 분석 및 플레이잉 테스트의 backingTrack import 경로 수정 3건은 [#95]의 닉네임 API 요구와 직접 관련이 없습니다. import 경로 수정 3건을 별도 유지보수 PR로 분리하거나, 이 PR에 필요한 이유를 명시하고 범위에 포함하세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 /api/users/verify-nickname 닉네임 중복 확인 API 구현이라는 변경의 핵심을 정확히 요약합니다.
Linked Issues check ✅ Passed 직접 연결된 이슈 [#95]의 API, 검증 규칙, 테스트 요구를 구현했고 범위 제외 항목도 변경하지 않았습니다.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#95-verify-nickname-api

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment thread src/main/java/com/mr/domain/user/service/UserService.java
Comment thread src/main/java/com/mr/domain/user/controller/UserController.java Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 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

📥 Commits

Reviewing files that changed from the base of the PR and between 91fcc24 and 5f954e7.

📒 Files selected for processing (5)
  • src/main/java/com/mr/domain/user/controller/UserController.java
  • src/main/java/com/mr/domain/user/dto/res/UserResponseDTO.java
  • src/main/java/com/mr/domain/user/service/UserService.java
  • src/test/java/com/mr/domain/user/controller/UserControllerTest.java
  • src/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

@kimyw1018
kimyw1018 merged commit b81400d into develop Aug 1, 2026
2 checks passed
@p1001q
p1001q deleted the feat/#95-verify-nickname-api branch August 2, 2026 16:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ Feature - 닉네임 중복 확인 API 구현

4 participants