Skip to content

[feat] 닉네임 자동 생성 및 필터링 기능 구현#1130

Open
kiwoook wants to merge 5 commits intobe/devfrom
be/feat/1123-auto-nickname
Open

[feat] 닉네임 자동 생성 및 필터링 기능 구현#1130
kiwoook wants to merge 5 commits intobe/devfrom
be/feat/1123-auto-nickname

Conversation

@kiwoook
Copy link
Contributor

@kiwoook kiwoook commented Mar 20, 2026

✅ 체크리스트

  • merge 타겟 브랜치 잘 설정되었는지 확인하기 (fe/dev, be/dev)

🔥 연관 이슈

🚀 작업 내용

AI 활용하여 닉네임 검열 기능 및 대시보드는 소스코드가 너무 길어져서 닉네임 생성과 1차 필터링 기능 먼저 PR로 올립니다.

  1. 닉네임 생성 기능 추가
  2. 비속어 필터링 라이브러리를 통해 방 생성, 입장 시 닉네임 검증

💬 리뷰 중점사항

중점사항

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 플레이어 닉네임 무작위 생성 기능 추가
    • 방 생성 및 입장 시 비속어 필터링 추가
    • 무작위 닉네임 생성 API 엔드포인트 추가
  • 설정

    • 릴레이 지연 시간을 구성 가능하도록 변경
  • 문서

    • 닉네임 시스템 설계 문서 추가

@github-actions
Copy link

Backend Test Results

206 files  + 5  206 suites  +5   1m 52s ⏱️ -1s
749 tests +34  748 ✅ +34  1 💤 ±0  0 ❌ ±0 
771 runs  +54  770 ✅ +54  1 💤 ±0  0 ❌ ±0 

Results for commit 7b67d67. ± Comparison against base commit 8579ae2.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

방 생성/입장 시 닉네임 비속어 검증을 추가하고, 방 내 중복을 피하는 랜덤 닉네임 생성 API를 제공해 닉네임 관련 UX/정책을 애플리케이션 레벨에서 일관되게 적용합니다.

Changes:

  • badwordfiltering 라이브러리를 활용한 닉네임 비속어(공백 우회 포함) 검증 로직 및 에러코드 추가
  • 랜덤 닉네임 생성기 + GET /rooms/nickname/random 엔드포인트 추가 (옵션 joinCode로 방 내 중복 제외)
  • QR 관련 설정(QrProperties, QrCodeConfig) 패키지 정리 및 Outbox relay 폴링 주기 설정값화

Reviewed changes

Copilot reviewed 25 out of 25 changed files in this pull request and generated no comments.

Show a summary per file
File Description
backend/src/main/java/coffeeshout/room/application/service/NicknameValidator.java 비속어 필터 기반 닉네임 검증 서비스 추가
backend/src/main/java/coffeeshout/room/application/service/NicknameGenerator.java 형용사+명사 조합 랜덤 닉네임 생성기 추가
backend/src/main/java/coffeeshout/room/application/service/RoomService.java 방 생성/입장 시 닉네임 검증 연결 및 랜덤 닉네임 생성 기능 추가
backend/src/main/java/coffeeshout/room/ui/RoomRestController.java 랜덤 닉네임 생성 API 엔드포인트 추가
backend/src/main/java/coffeeshout/room/ui/RoomApi.java Swagger 문서에 랜덤 닉네임 생성 API 추가
backend/src/main/java/coffeeshout/room/ui/response/RandomNicknameResponse.java 랜덤 닉네임 응답 DTO 추가
backend/src/main/java/coffeeshout/room/domain/RoomErrorCode.java 비속어 포함 닉네임 에러코드 추가
backend/src/main/java/coffeeshout/room/config/RoomConfig.java BadWordFiltering Bean 등록
backend/src/main/java/coffeeshout/room/config/QrProperties.java QrProperties 패키지 이동
backend/src/main/java/coffeeshout/room/config/QrCodeConfig.java QrCodeConfig 패키지 이동
backend/src/main/java/coffeeshout/room/application/service/QrCodeService.java QrProperties import 갱신
backend/src/main/java/coffeeshout/room/infra/ZxingQrCodeGenerator.java QrProperties import 갱신
backend/src/main/java/coffeeshout/room/infra/OracleObjectStorageService.java QrProperties import 갱신
backend/src/main/java/coffeeshout/global/outbox/OutboxRelayWorker.java relay 스케줄 fixedDelay를 설정값으로 변경
backend/src/main/resources/application.yml outbox.relay.delay 기본값 추가
backend/src/main/resources/application-local.yml 로컬 outbox.relay.delay 오버라이드 및 로그레벨 조정
backend/build.gradle.kts badwordfiltering 의존성 추가
backend/docs/nickname-system.md 닉네임 시스템 설계 문서 추가
backend/src/test/java/coffeeshout/room/application/service/NicknameValidatorTest.java 닉네임 검증 단위 테스트 추가
backend/src/test/java/coffeeshout/room/application/service/NicknameGeneratorTest.java 닉네임 생성 단위 테스트 추가
backend/src/test/java/coffeeshout/room/application/RoomServiceTest.java 랜덤 닉네임 생성/비속어 검증 통합 테스트 추가
backend/src/test/java/coffeeshout/room/application/QrCodeServiceTest.java QrProperties import 갱신
backend/src/test/java/coffeeshout/room/infra/OracleObjectStorageServiceTest.java QrProperties import 갱신
backend/src/test/java/coffeeshout/room/infra/OracleObjectStorageIntegrationTest.java QrProperties import 갱신
backend/src/test/java/coffeeshout/room/infra/OracleObjectStorageCircuitBreakerTest.java QrProperties import 갱신

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@coderabbitai
Copy link

coderabbitai bot commented Mar 20, 2026

Caution

Review failed

An error occurred during the review process. Please try again later.

Walkthrough

닉네임 자동 생성 및 비속어 필터링 기능을 구현합니다. 한국어 형용사/명사 조합으로 닉네임을 생성하고, 외부 라이브러리(bad-word-filtering)를 활용하여 방 입장 시 비속어를 검사합니다. QR 코드 설정을 global에서 room 패키지로 이동하고, 스케줄러 지연을 설정 기반으로 변경합니다.

Changes

Cohort / File(s) Summary
의존성 & 설정
backend/build.gradle.kts, backend/src/main/resources/application.yml, backend/src/main/resources/application-local.yml
Bad word filtering 라이브러리 의존성 추가, outbox relay delay 프로퍼티 기반 설정 도입
QR 관련 코드 이동
backend/src/main/java/coffeeshout/room/config/QrCodeConfig.java, backend/src/main/java/coffeeshout/room/config/QrProperties.java
QrCodeConfig와 QrProperties를 global.config 패키지에서 room.config로 이동
QR 관련 임포트 업데이트
backend/src/main/java/coffeeshout/room/application/service/QrCodeService.java, backend/src/main/java/coffeeshout/room/infra/OracleObjectStorageService.java, backend/src/main/java/coffeeshout/room/infra/ZxingQrCodeGenerator.java, backend/src/test/java/coffeeshout/room/application/QrCodeServiceTest.java, backend/src/test/java/coffeeshout/room/infra/OracleObjectStorageCircuitBreakerTest.java, backend/src/test/java/coffeeshout/room/infra/OracleObjectStorageIntegrationTest.java, backend/src/test/java/coffeeshout/room/infra/OracleObjectStorageServiceTest.java
QrProperties 임포트 경로를 전체 파일에서 일괄 업데이트
닉네임 생성 기능
backend/src/main/java/coffeeshout/room/application/service/NicknameGenerator.java, backend/src/test/java/coffeeshout/room/application/service/NicknameGeneratorTest.java
형용사+명사 조합으로 닉네임 생성, 최대 50회 재시도로 중복 회피
닉네임 검증 기능
backend/src/main/java/coffeeshout/room/application/service/NicknameValidator.java, backend/src/main/java/coffeeshout/room/config/RoomConfig.java, backend/src/test/java/coffeeshout/room/application/service/NicknameValidatorTest.java
Bad word filtering을 통한 비속어 검사, SpringBean 등록
RoomService 통합
backend/src/main/java/coffeeshout/room/application/service/RoomService.java, backend/src/test/java/coffeeshout/room/application/RoomServiceTest.java
createRoom/enterRoomAsync에 닉네임 검증 적용, 새로운 생성 엔드포인트 추가
API 엔드포인트
backend/src/main/java/coffeeshout/room/ui/RoomApi.java, backend/src/main/java/coffeeshout/room/ui/RoomRestController.java, backend/src/main/java/coffeeshout/room/ui/response/RandomNicknameResponse.java
GET /rooms/nickname/random 엔드포인트 추가 (joinCode 선택)
도메인 & 문서
backend/src/main/java/coffeeshout/room/domain/RoomErrorCode.java, backend/docs/nickname-system.md
새로운 에러 코드 추가, 닉네임 시스템 전체 설계 문서 작성
OutboxRelayWorker 설정
backend/src/main/java/coffeeshout/global/outbox/OutboxRelayWorker.java
@Scheduled 고정 지연을 프로퍼티 기반 설정으로 변경 (기본값: 500ms)

Sequence Diagram

sequenceDiagram
    participant Client
    participant RoomApi
    participant RoomService
    participant NicknameValidator
    participant BadWordFiltering
    participant Database
    
    rect rgba(100, 150, 200, 0.5)
    note over Client,Database: 방 입장 시 닉네임 검증 플로우
    Client->>RoomApi: POST /rooms/:joinCode/enter {guestName}
    RoomApi->>RoomService: enterRoomAsync(joinCode, guestName)
    RoomService->>NicknameValidator: validate(guestName)
    NicknameValidator->>BadWordFiltering: check(guestName)<br/>blankCheck(guestName)
    alt 비속어 감지됨
        BadWordFiltering-->>NicknameValidator: true
        NicknameValidator-->>RoomService: throw InvalidArgumentException
        RoomService-->>RoomApi: InvalidArgumentException
        RoomApi-->>Client: 400 (PLAYER_NAME_CONTAINS_PROFANITY)
    else 정상 닉네임
        BadWordFiltering-->>NicknameValidator: false
        NicknameValidator-->>RoomService: (return)
        RoomService->>Database: createPlayerEntry(joinCode, guestName)
        RoomService-->>RoomApi: Room
        RoomApi-->>Client: 200 Room data
    end
    end
    
    rect rgba(200, 150, 100, 0.5)
    note over Client,Database: 닉네임 자동 생성 플로우
    Client->>RoomApi: GET /rooms/nickname/random?joinCode=ABC123
    RoomApi->>RoomService: generateRandomNickname(joinCode)
    RoomService->>Database: loadRoom(joinCode)
    Database-->>RoomService: Room {players: [names]}
    RoomService->>RoomService: collectExistingNames() → Set
    alt joinCode 제공됨 (기존 이름 제외)
        RoomService->>RoomService: nicknameGenerator.generate(existingNames)
    else joinCode 미제공
        RoomService->>RoomService: nicknameGenerator.generate(emptySet)
    end
    RoomService-->>RoomApi: randomNickname
    RoomApi-->>Client: 200 {nickname: "활발한_사자"}
    end
Loading

개선 영역 및 고려사항

1. 비속어 필터링의 화이트스페이스 우회 미흡

문제점:
테스트 케이스에서 "씨 발" (공백 포함)이 비속어로 감지된다고 검증하나, BadWordFiltering 라이브러리의 정확한 구현과 모든 우회 시나리오(Unicode 공백, 특수문자 삽입 등)에 대한 보장이 불명확합니다. 실제 운영 환경에서 추가 우회 패턴이 발생할 수 있습니다.

개선 방향:

  • 라이브러리의 check()blankCheck() 동작을 명시적으로 문서화하거나 추가 테스트 커버리지 확대
  • 필터링 실패 시 운영자 개입 프로세스 구축 (문서에 언급된 AI 감사 기능과 연계)
  • 정기적인 회귀 테스트 스위트 구성

2. 닉네임 생성 충돌 전략의 재시도 한계

문제점:
MAX_RETRY = 50으로 고정된 재시도 횟수는 생성된 닉네임 조합 수(형용사 × 명사)에 상관없이 일정합니다. 조합 수가 제한적인 경우, 초반부터 높은 실패 확률을 가질 수 있으며, 충돌이 빈번해지면 사용자 경험 저하가 발생합니다.

개선 방향:

  • 가능한 조합 수를 계산하여 재시도 횟수를 동적으로 조정하는 방식 고려
    • 장점: 이론적 최대값 대비 합리적 여유 확보
    • 단점: 추가 계산 오버헤드, 초기 구현 복잡도 증가
  • 대안으로 UUID 또는 인크리멘탈 ID 접미사 추가 (필요시)
    • 장점: 충돌 완전 회피, 간단함
    • 단점: 닉네임 형식 변경, 사용자 친화성 저하

3. 패키지 이동(QrProperties)의 로컬 영향 범위 불명확

문제점:
QrPropertiesglobal.config.properties에서 room.config로 이동할 때, 전체 테스트 및 프로덕션 설정에서 임포트가 일괄 업데이트되었습니다. 그러나 다른 모듈이나 외부 패키지에서 이 클래스를 참조하고 있다면 컴파일 오류가 발생합니다.

개선 방향:

  • 빌드 전 IDE/컴파일러 전체 스캔을 통해 모든 참조 확인 (이미 수행되었을 가능성 높음)
  • 장기적으로 설정 클래스를 room.config에 한정하지 않고, 공유 설정은 중립적 패키지 유지
    • 장점: 크로스 모듈 의존성 명확화, 순환 참조 회피
    • 단점: 패키지 구조 정리 필요

4. RoomErrorCode 추가 시 enum 메시지만 확장

문제점:
PLAYER_NAME_CONTAINS_PROFANITY 에러 코드 추가는 메시지 텍스트만 포함하며, 에러 분류(clientError, serverError 등) 별도 메타데이터나 HTTP 상태 코드 매핑이 명시적으로 보이지 않습니다. 향후 글로벌 에러 처리기가 이 코드를 일괄 처리할 때 상태 코드 불일치 위험이 있습니다.

개선 방향:

  • RoomErrorCode에 HTTP 상태 코드 필드 추가 (예: PLAYER_NAME_CONTAINS_PROFANITY(400, "..."))
    • 장점: 에러 핸들링 일관성 보증, 에러 타입 명시
    • 단점: enum 구조 복잡화
  • 또는 글로벌 @ExceptionHandler에서 InvalidArgumentException → HTTP 400으로 표준화하고 문서화

5. Outbox Relay Delay 프로퍼티 설정의 기본값 일관성

문제점:
application.yml에서 기본값 500ms, application-local.yml에서 5000ms로 설정되어 있습니다. @Scheduled(fixedDelayString = "${outbox.relay.delay:500}")에 인라인 기본값이 지정되어, 프로파일별 설정과 코드 기본값이 분산되어 있습니다. 향후 기본값 변경 시 여러 위치를 동시 수정해야 합니다.

개선 방향:

  • application.yml의 기본값을 신뢰 가능한 단일 진실 공급원으로 유지하고, 코드의 인라인 기본값 제거
    • 장점: 한 곳에서만 관리, 오류 감소
    • 단점: 프로퍼티 누락 시 전체 애플리케이션 부팅 실패 가능성 (existing fallback 제거)
  • 현재 방식 유지 시 주석으로 명시적 강조

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch be/feat/1123-auto-nickname

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 and usage tips.

Tip

You can disable sequence diagrams in the walkthrough.

Disable the reviews.sequence_diagrams setting to disable sequence diagrams in the walkthrough.

@kiwoook kiwoook self-assigned this Mar 20, 2026
@kiwoook kiwoook requested a review from theminjunchoi March 20, 2026 16:00
@kiwoook kiwoook added BE 백엔드 업무 라벨 ✨feat 새로운 기능 또는 요구사항을 추가 labels Mar 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

BE 백엔드 업무 라벨 ✨feat 새로운 기능 또는 요구사항을 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants