Skip to content

Commit

Permalink
Feat: 소셜로그인 회원가입 시, 중복이면 닉네임을 7자 이내로 자르고 끝에 2글자(구분자 포함 3글자)의 임의값을 붙인다.
Browse files Browse the repository at this point in the history
기타 참고사항:
- UserService에서 중복 닉네임을 조회하는 과정이 NicknameGenerator에 추가된 메서드와 정확히 똑같음. 해당 메서드를 끌어다쓸까 하다가, 새로운 클래스를 끌어올 만큼의 이점은 없는 것 같아 보류.
- UserService의 불필요한 import문 제거
  • Loading branch information
GyungA committed Jul 13, 2024
1 parent f0069c2 commit 8a56932
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@
import com.elice.ustory.domain.user.repository.UserRepository;
import com.elice.ustory.global.exception.model.*;
import com.elice.ustory.global.jwt.JwtTokenProvider;
import com.elice.ustory.global.oauth.kakao.KakaoService;
import com.elice.ustory.global.oauth.naver.NaverService;
import com.elice.ustory.global.redis.naver.NaverTokenService;
import com.elice.ustory.global.redis.refresh.RefreshTokenService;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.transaction.Transactional;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,17 @@ public void naverSignUp(String naverNickname, String naverEmail){
String encodedPassword = passwordEncoder.encode(randomPassword);
// 닉네임에 포함된 특수문자를 제거한다.
String cleanedNickname = nicknameGenerator.normalizeNicknameForOAuth(naverNickname);
// 닉네임을 정해진 길이에 맞게 자른다.
// 닉네임을 규정된 길이에 맞게 자른다.
String trimmedNickname = nicknameGenerator.trimNicknameForOAuth(cleanedNickname);
// TODO: 중복 여부를 조회한다. 중복이면 닉네임을 7자 이내로 자른다. 임의의 값을 추가한다.
// if (userRepository.countByNicknameWithSoftDeleted(cleanedNickname) > 0) {
//
// }
// String generatedNickname = trimmedNickname + "#" + nicknameGenerator.generateRandomPostfix();
// 중복이 아니면, 닉네임을 10자 이내로 자른다.
// 중복 여부를 조회한다. 중복이면 닉네임을 7자 이내로 자르고, 겹치지 않을 때까지 임의의 postfix 3글자를 만들어 붙인다.
if (nicknameGenerator.checkDuplicateNickname(trimmedNickname)) {
trimmedNickname = nicknameGenerator.trimNicknameForPostfix(trimmedNickname);

do {
trimmedNickname = trimmedNickname + nicknameGenerator.SEPARATOR + nicknameGenerator.generateRandomPostfix();
} while (nicknameGenerator.checkDuplicateNickname(trimmedNickname));
}

Users builtUser = Users.addUserBuilder()
.email(naverEmail)
.loginType(Users.LoginType.NAVER)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
package com.elice.ustory.global.util;

import com.elice.ustory.domain.user.constant.RegexPatterns;
import com.elice.ustory.domain.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.Random;

@Component
@RequiredArgsConstructor
public class NicknameGenerator {
private final UserRepository userRepository;

private static final int NICKNAME_MAX_LENGTH = RegexPatterns.NICKNAME_MAX_LENGTH;
private static final String SEPARATOR = "#"; // 닉네임과 임의값 사이의 구분자
public static final String SEPARATOR = "#"; // 닉네임과 임의값 사이의 구분자

private static final int POSTFIX_LENGTH = 2;
private static final int POSTFIX_LENGTH_WITH_SEPARATOR = POSTFIX_LENGTH + 1;

public String generateRandomPostfix() {
int leftLimit = 48; // 숫자 '0'의 ASCII 코드
Expand Down Expand Up @@ -43,4 +49,21 @@ public String trimNicknameForOAuth(String cleanedNickname) {
String trimmedNickname = cleanedNickname.length() > NICKNAME_MAX_LENGTH ? cleanedNickname.substring(0, NICKNAME_MAX_LENGTH) : cleanedNickname;
return trimmedNickname;
}

public String trimNicknameForPostfix(String nickname) {
if (nickname == null) {
return null;
}
int availableLength = NICKNAME_MAX_LENGTH - POSTFIX_LENGTH_WITH_SEPARATOR;
String trimmedNickname = nickname.length() > (availableLength) ? nickname.substring(0, availableLength) : nickname;
return trimmedNickname;
}

public boolean checkDuplicateNickname(String nickname) {
if (userRepository.countByNicknameWithSoftDeleted(nickname) > 0) {
return true;
} else {
return false;
}
}
}

0 comments on commit 8a56932

Please sign in to comment.