diff --git a/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java b/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java index 5f364ed8..0a75712f 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java +++ b/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java @@ -91,12 +91,12 @@ public static User emailUser(String email, String password, String username, Str /* OAuth2로 로그인한 유저 저장 */ - public static User googleUser(String email, String username){ + public static User googleUser(String email, String username, String nickname){ return User.builder() .email(email) .username(username) .authType(AuthType.GOOGLE) - .nickname("user_" + UUID.randomUUID().toString().split("-")[0])//닉네임은 자동으로 생성해주고, 나중에 수정할 수 있도록 함 + .nickname(nickname)//닉네임은 자동으로 생성해주고, 나중에 수정할 수 있도록 함 .tier(Tier.NEWBIE) .role(UserRole.USER) .isDeleted(false) @@ -104,12 +104,12 @@ public static User googleUser(String email, String username){ .build(); } - public static User githubUser(String email, String username){ + public static User githubUser(String email, String username,String nickname){ return User.builder() .email(email) .username(username) .authType(AuthType.GITHUB) - .nickname("user_" + UUID.randomUUID().toString().split("-")[0])//닉네임은 자동으로 생성해주고, 나중에 수정할 수 있도록 함 + .nickname(nickname)//닉네임은 자동으로 생성해주고, 나중에 수정할 수 있도록 함 .tier(Tier.NEWBIE) .role(UserRole.USER) .password(UUID.randomUUID().toString()) diff --git a/src/main/java/org/ezcode/codetest/domain/user/model/enums/Adjective.java b/src/main/java/org/ezcode/codetest/domain/user/model/enums/Adjective.java new file mode 100644 index 00000000..a3515360 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/domain/user/model/enums/Adjective.java @@ -0,0 +1,14 @@ +package org.ezcode.codetest.domain.user.model.enums; + +public enum Adjective { + 멋있는, 용감한, 지혜로운, 화려한, 귀여운, 빠른, 우아한, 차분한, 활발한, 낙천적인, + 신중한, 다정한, 수줍은, 배려심깊은, 온화한, 고요한, 명랑한, 정직한, 활기찬, 친절한, + 대담한, 유쾌한, 상냥한, 유능한, 청명한, 명석한, 순수한, 부지런한, 용의주도한, 근면한, + 사려깊은, 명민한, 단호한, 냉철한, 호기심많은, 생기있는, 열정적인, 자유로운, 모험적인, 헌신적인, + 깔끔한, 독창적인, 진중한, 똑똑한, 실용적인, 신비한, 젠틀한, 유연한, 다재다능한, 배짱있는, + 순발력있는, 선량한, 인내심강한, 집중력있는, 민첩한, 풍부한, 과감한, 창의적인, 합리적인, 끈질긴, + 호감가는, 매력적인, 성실한, 강직한, 강한, 따뜻한, 겸손한, 깨끗한, 솔직한, 여유로운, + 정중한, 낭만적인, 조용한, 담백한, 균형잡힌, 용맹한, 재치있는, 평화로운, 반듯한, 침착한, + 성격좋은, 책임감있는, 다감한, 푸근한, 온순한, 시원한, 명쾌한, 적응력강한, 근엄한, 정돈된, + 유쾌발랄한, 기운찬, 생동감있는, 적극적인, 야무진, 통찰력있는, 포용력있는, 추진력있는, 자제력있는, 열의있는 +} diff --git a/src/main/java/org/ezcode/codetest/domain/user/model/enums/Noun.java b/src/main/java/org/ezcode/codetest/domain/user/model/enums/Noun.java new file mode 100644 index 00000000..2a042944 --- /dev/null +++ b/src/main/java/org/ezcode/codetest/domain/user/model/enums/Noun.java @@ -0,0 +1,14 @@ +package org.ezcode.codetest.domain.user.model.enums; + +public enum Noun { + 다람쥐, 여우, 사자, 독수리, 고양이, 토끼, 늑대, 부엉이, 코끼리, 호랑이, + 펭귄, 고래, 하마, 치타, 스컹크, 개미, 판다, 미어캣, 침팬지, 바다표범, + 거북이, 흑표범, 제비, 두루미, 수달, 기린, 삵, 두더지, 캥거루, 백조, + 청설모, 돌고래, 까마귀, 다람이, 삽살개, 들소, 갈매기, 두꺼비, 족제비, 코뿔소, + 산양, 올빼미, 알파카, 스라소니, 수리부엉이, 원숭이, 문어, 뱀장어, 메추라기, 기러기, + 앵무새, 너구리, 청둥오리, 고슴도치, 사슴, 아르마딜로, 말, 버팔로, 쥐, 뱀, + 까치, 도마뱀, 너털곰, 스컹크곰, 오소리, 타조, 얼룩말, 해달, 족제비쥐, 앵무, + 붉은여우, 산호, 코끼리개미, 사마귀, 박쥐, 해파리, 해마, 노루, 담비, 고라니, + 공작, 새우, 매, 독수리부엉이, 개, 고양이상어, 악어, 큰눈도롱뇽, 망토원숭이, 비버, + 코알라, 바다사자, 기린사슴, 비둘기, 토끼상어, 족제비상어, 검독수리, 황조롱이, 흰수염고래, 퓨마 +} diff --git a/src/main/java/org/ezcode/codetest/domain/user/repository/UserRepository.java b/src/main/java/org/ezcode/codetest/domain/user/repository/UserRepository.java index 8b966bae..3300481f 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/repository/UserRepository.java +++ b/src/main/java/org/ezcode/codetest/domain/user/repository/UserRepository.java @@ -16,4 +16,7 @@ public interface UserRepository { Optional findUserById(Long id); User findByEmailAndProvider(String email, String provider); + + boolean existsByNickname(String nickname); + } diff --git a/src/main/java/org/ezcode/codetest/domain/user/service/CustomOAuth2UserService.java b/src/main/java/org/ezcode/codetest/domain/user/service/CustomOAuth2UserService.java index d5bbda9b..20411904 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/service/CustomOAuth2UserService.java +++ b/src/main/java/org/ezcode/codetest/domain/user/service/CustomOAuth2UserService.java @@ -21,6 +21,7 @@ public class CustomOAuth2UserService extends DefaultOAuth2UserService { private final UserRepository userRepository; + private final UserDomainService userDomainService; @Override @Transactional @@ -51,10 +52,13 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic User findUser = userRepository.getUserByEmail(oAuth2Response.getEmail()); if (findUser == null) { - User newUser = User.googleUser(oAuth2Response.getEmail(), username); + String nickname = userDomainService.generateUniqueNickname(); + User newUser = User.googleUser(oAuth2Response.getEmail(), username, nickname); log.info("newUser: {} 새로운 유저", newUser); try { userRepository.createUser(newUser); + } catch (IllegalStateException e) { + throw new OAuth2AuthenticationException("닉네임 생성 실패입니다"); } catch (Exception e) { log.error("OAuth 사용자 생성 실패 : {}", e.getMessage()); throw new OAuth2AuthenticationException("사용자 생성 실패입니다"); diff --git a/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java b/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java index b462b31e..2e772d3f 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java +++ b/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java @@ -1,5 +1,7 @@ package org.ezcode.codetest.domain.user.service; +import org.ezcode.codetest.domain.user.model.enums.Adjective; +import org.ezcode.codetest.domain.user.model.enums.Noun; import org.ezcode.codetest.domain.user.exception.AuthException; import org.ezcode.codetest.domain.user.exception.AuthExceptionCode; import org.ezcode.codetest.domain.user.model.entity.User; @@ -18,6 +20,7 @@ public class UserDomainService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; + private static final java.util.Random RANDOM = new java.util.Random(); public void checkEmailUnique(String email) { if (userRepository.findByEmail(email).isPresent()) { @@ -67,4 +70,21 @@ public void isDeletedUser(User user) { throw new AuthException(AuthExceptionCode.ALREADY_WITHDRAW_USER); } } + + public String generateUniqueNickname() { + for (int i = 0; i < 10000000; i++) { + String nickname = generateRandomNickname(); + if(!userRepository.existsByNickname(nickname)) { + return nickname; + } + } + throw new IllegalStateException("중복된 닉네임 생성 불가"); + } + + private static String generateRandomNickname() { + Adjective adjective = Adjective.values()[RANDOM.nextInt(Adjective.values().length)]; + Noun noun = Noun.values()[RANDOM.nextInt(Noun.values().length)]; + int number = RANDOM.nextInt(1000); + return adjective.name() + noun.name() + number; + } } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserJpaRepository.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserJpaRepository.java index c7779410..20398c8d 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserJpaRepository.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserJpaRepository.java @@ -10,4 +10,6 @@ public interface UserJpaRepository extends JpaRepository { User findUserByEmail(String email); User findUserByEmailAndAuthType(String email, AuthType authType); + + boolean existsByNickname(String nickname); } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserRepositoryImpl.java index 04c97018..1243669d 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserRepositoryImpl.java @@ -38,4 +38,9 @@ public User findByEmailAndProvider(String email, String provider) { return userJpaRepository.findUserByEmailAndAuthType(email, AuthType.from(provider)); } + @Override + public boolean existsByNickname(String nickname) { + return userJpaRepository.existsByNickname(nickname); + } + }