Skip to content

Conversation

@hyerinhwang-sailin
Copy link
Collaborator

@hyerinhwang-sailin hyerinhwang-sailin commented Dec 21, 2025

Related issue 🛠

Work Description ✏️

개요

  • 기존 솝탬프 유저 닉네임 정책(파트+이름) 위에, 앱잼 기간 동안만 다른 규칙(팀명/기수 기반) 을 적용할 수 있도록 app.soptamp.appjam-mode 플래그와 분기 로직을 추가했습니다.
  • SoptampUser를 1인 1레코드로 유지하면서, 앱잼 기간에는 기존 파트 기반 닉네임에서 앱잼 규칙 닉네임으로 1회 마이그레이션하도록 설계했습니다.
  • 관리자용 포인트/랭킹 캐시 초기화 API를 정리하고, 전체 동작을 검증하는 단위 테스트를 추가했습니다.

상세 변경 내용

1) 앱잼 모드 플래그 및 upsert 분기 (SoptampUserService)

  • @value("${app.soptamp.appjam-mode:false}") 필드 도입:
    false(기본값): NORMAL 시즌 모드
    true: APPJAM 모드
  • upsertSoptampUser에서 모드에 따라 로직 분기:
    NORMAL → upsertSoptampUserNormal
    APPJAM → upsertSoptampUserForAppjam

NORMAL 모드 동작

  • SoptampUser 미존재:
    최신 활동의 part 기준으로 SoptPart.getShortedPartName() + 이름 형태 닉네임 생성.
    createNewSoptampUser로 유저 생성, 포인트 0, createNewRank 호출.
  • SoptampUser 존재:
    DB에 저장된 generation과 profile.lastGeneration이 다를 때만 업데이트.
    닉네임 재생성(generatePartBasedUniqueNickname), 포인트 0으로 초기화.
    랭킹 캐시 제거 후(removeRank) 재생성(createNewRank).

APPJAM 모드 동작

  • 공통 base 닉네임 생성 규칙 (buildAppjamBaseNickname):
    AppjamUser 존재: teamName + name (예: 비트황혜린)
    미참여: lastGeneration + "기" + name (예: 37기황혜린)
  • SoptampUser 미존재:
    위 규칙으로 base 닉네임 생성 후, 전역 중복 검사(generateUniqueNicknameInternal)를 통해 필요한 경우 A, B 등의 접미사 추가.
    포인트 0으로 초기화하고 신규 유저 생성, createNewRank 호출.
  • SoptampUser 존재:
    • needsAppjamNicknameMigration을 통해 기존 닉네임이 파트 기반인지 판단:
      닉네임이 비어있거나, 어떤 SoptPart.getShortedPartName()으로 시작하면 → 파트 기반 시즌 닉네임으로 간주 → 마이그레이션 수행.
      그렇지 않으면(예: 비트황혜린, 37기황혜린, 비트황혜린A) → 이미 앱잼 스타일 닉네임으로 간주 → 업데이트 스킵.
    • 마이그레이션 시:
      base 닉네임(teamName+이름 또는 기수+기+이름) 기준으로 닉네임 다시 생성 + 유니크 보장.
      포인트 0으로 초기화.
      랭킹 캐시를 현재 상태로 덮어쓰기(updateCachedUserInfo).

2) 닉네임 유니크 체크 개선 (SoptampUserRepository)

  • existsByNicknameAndUserIdNot(String nickname, Long userId) 추가:
    동일 유저의 기존 닉네임은 중복으로 보지 않고, 다른 유저들이 같은 닉을 쓰고 있는지만 체크 가능.
    generateUniqueNicknameInternal에서 사용하여:
    기존 유저가 닉네임 업데이트 시에도 자기 자신 때문에 중복 판정되지 않도록 개선.
    동명이인/팀 내 중복 조건에서만 접미사 부여.

3) 관리자 초기화 파사드 및 컨트롤러 (AdminSoptampFacade, AdminSoptampController)

  • 파사드:
    initAllMissionAndStampAndPoints(): 스탬프/미션 전체 삭제 + 포인트 전체 초기화.
    initPoints(): 포인트만 전체 초기화.
    initRankCache(): DB 기준으로 랭킹 캐시 재빌드.
  • 컨트롤러:
    DELETE /api/v2/admin/soptamp/stamp
    DELETE /api/v2/admin/soptamp/point
    DELETE /api/v2/admin/soptamp/cache
  • makers.app.admin.password 기반 공통 비밀번호 검증 로직 추가.

앱잼 시즌 시작 시 운영 플로우:
DELETE /point로 기존 포인트 전체 초기화.
app.soptamp.appjam-mode=true 설정.
이후 로그인/프로필 동기화 타이밍에 upsertSoptampUser가 호출되면,
기존 파트 기반 닉 → 앱잼 규칙 닉으로 1회 마이그레이션 + 포인트 0으로 시작.

4) 단위 테스트 추가 (SoptampUserServiceTest)

  • NORMAL/APPJAM 각각의 주요 시나리오를 커버:
    신규 유저 생성 (파트 기반 / 팀명 기반 / 기수 기반).
    동일 기수에서의 no-op.
    기수 변경 시 닉네임 재생성 + 포인트 초기화.
    파트 기반 닉네임 → 앱잼 규칙 닉네임 1회 마이그레이션.
    이미 앱잼 스타일 닉네임인 경우 no-op.
    닉네임 충돌 시 접미사 A 부여.
    -> NORMAL/APPJAM 모드별 upsert 시나리오 전부 통과 확인.

Trouble Shooting ⚽️

Related ScreenShot 📷

Uncompleted Tasks 😅

To Reviewers 📢

@hyerinhwang-sailin hyerinhwang-sailin linked an issue Dec 21, 2025 that may be closed by this pull request
2 tasks
@hyerinhwang-sailin hyerinhwang-sailin self-assigned this Dec 21, 2025
@hyerinhwang-sailin hyerinhwang-sailin added ✨ Feat 새로운 피쳐 생성 and removed size/XXL labels Dec 21, 2025
@hyerinhwang-sailin hyerinhwang-sailin merged commit 48ba184 into dev Dec 21, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feat 새로운 피쳐 생성 size/XXL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] team info table 추가 및 솝탬프 유저 생성 로직 수정

2 participants