회원가입 로직 개선

- 기본 프로필 이미지와 닉네임 자동생성을 통해 회원가입 단계 축소
This commit is contained in:
2025-03-21 00:24:15 +09:00
parent 9ed031e574
commit 4977ee99df
6 changed files with 173 additions and 1 deletions

View File

@@ -0,0 +1,65 @@
package kr.co.vividnext.sodalive.member.nickname
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.MemberRepository
import org.springframework.stereotype.Service
import kotlin.random.Random
@Service
class NicknameGenerateService(private val repository: MemberRepository) {
private val adjectives = listOf(
"감성적인", "몽환적인", "깊이있는", "따뜻한", "서정적인", "소울풀한", "잔잔한",
"선율의", "리드미컬한", "감미로운", "은은한", "잔향의", "울려퍼지는", "하모닉한",
"레트로한", "복고풍의", "아날로그적인", "빈티지한", "90년대감성", "옛날느낌의",
"시간을넘는", "과거에서온", "시간여행자의", "미래를보는", "초월적인", "운명적인",
"신비로운", "마법같은", "전설속의", "별빛의", "달빛의"
)
private val nouns = listOf(
"소리", "울림", "속삭임", "청취자", "메아리", "목소리", "공명", "음색", "감성",
"멜로디", "선율", "리듬", "하모니", "사운드트랙", "나이트클럽", "라디오스타",
"레코드판", "카세트테이프", "LP음악", "복고댄스", "클래식기타", "빈티지마이크",
"시간여행", "타임머신", "평행세계", "운명의선택", "마법진", "신비한음색",
"달빛의향연", "별빛의꿈", "마법사의속삭임", "초월적인선율"
)
private val numberRange = 1000..9999
private fun generateRandomNickname(): String {
val formatType = Random.nextInt(5)
return when (formatType) {
0 -> "${adjectives.random()}${nouns.random()}${numberRange.random()}"
1 -> "${nouns.random()}${nouns.random()}${numberRange.random()}"
2 -> "${adjectives.random()}${nouns.random()}"
3 -> "${nouns.random()}${nouns.random()}"
else -> "${adjectives.random()}${nouns.random()}${nouns.random()}${numberRange.random()}"
}
}
private fun generateNonConflictingNickname(usedNicknames: Set<String>): String {
val usedNicknameSet = HashSet(usedNicknames) // 해시셋으로 변환 (O(1) 조회 가능)
val availableNumbers = (1000..9999).shuffled()
for (num in availableNumbers) { // 숫자를 먼저 결정 (무작위)
for (adj in adjectives.shuffled()) { // 형용사 순서 랜덤화
for (noun in nouns.shuffled()) { // 명사 순서 랜덤화
val candidate = "$adj$noun$num"
if (!usedNicknameSet.contains(candidate)) {
return candidate
}
}
}
}
throw SodaException("회원가입을 하지 못했습니다.\n다시 시도해 주세요.")
}
fun generateUniqueNickname(): String {
repeat(5) {
val candidates = (1..10).map { generateRandomNickname() }
val available = candidates.firstOrNull { !repository.existsByNickname(it) }
if (available != null) return available
}
return generateNonConflictingNickname(repository.findNicknamesWithPrefix("").toSet())
}
}