diff --git a/src/main/java/com/cmc/mercury/domain/user/entity/Adjective.java b/src/main/java/com/cmc/mercury/domain/user/entity/Adjective.java new file mode 100644 index 0000000..bbb320b --- /dev/null +++ b/src/main/java/com/cmc/mercury/domain/user/entity/Adjective.java @@ -0,0 +1,20 @@ +package com.cmc.mercury.domain.user.entity; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Entity +@Getter +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class Adjective { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "adj_id") + private Long id; + + @Column(nullable = false, unique = true) + private String word; +} diff --git a/src/main/java/com/cmc/mercury/domain/user/entity/Noun.java b/src/main/java/com/cmc/mercury/domain/user/entity/Noun.java new file mode 100644 index 0000000..333e1cb --- /dev/null +++ b/src/main/java/com/cmc/mercury/domain/user/entity/Noun.java @@ -0,0 +1,20 @@ +package com.cmc.mercury.domain.user.entity; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Entity +@Getter +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class Noun { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "noun_id") + private Long id; + + @Column(nullable = false, unique = true) + private String word; +} diff --git a/src/main/java/com/cmc/mercury/domain/user/entity/User.java b/src/main/java/com/cmc/mercury/domain/user/entity/User.java index 0a63524..f3c58b0 100644 --- a/src/main/java/com/cmc/mercury/domain/user/entity/User.java +++ b/src/main/java/com/cmc/mercury/domain/user/entity/User.java @@ -20,7 +20,7 @@ public class User extends BaseEntity { @Column(name = "user_id") private Long id; -// @Column(nullable = false) + @Column(nullable = false) // @Column(length = 30) // DB 컬럼 길이 제한 -> 바이트 단위라 한글을 위해 여유 있게 private String nickname; @@ -49,10 +49,10 @@ public class User extends BaseEntity { private UserStatus userStatus; @Builder - public User(String email, OAuthType oauthType, + public User(String email, String nickname, OAuthType oauthType, String oauthId, UserStatus userStatus) { this.email = email; - this.nickname = "Mercury"; + this.nickname = nickname; this.oauthType = oauthType; this.oauthId = oauthId; this.userStatus = userStatus; @@ -61,9 +61,9 @@ public User(String email, OAuthType oauthType, // 게스트용 생성자 @Builder(builderMethodName = "TestUserBuilder", buildMethodName = "TestUserBuild") - public User(String email) { + public User(String email, String nickname) { this.email = email; - this.nickname = "TestUser"; + this.nickname = nickname; this.oauthType = OAuthType.TEST; this.oauthId = UUID.randomUUID().toString();; this.userStatus = UserStatus.ACTIVE; diff --git a/src/main/java/com/cmc/mercury/domain/user/repository/AdjectiveRepository.java b/src/main/java/com/cmc/mercury/domain/user/repository/AdjectiveRepository.java new file mode 100644 index 0000000..6465554 --- /dev/null +++ b/src/main/java/com/cmc/mercury/domain/user/repository/AdjectiveRepository.java @@ -0,0 +1,13 @@ +package com.cmc.mercury.domain.user.repository; + +import com.cmc.mercury.domain.user.entity.Adjective; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface AdjectiveRepository extends JpaRepository { + + @Query("SELECT a FROM Adjective a ORDER BY FUNCTION('RAND') LIMIT 1") + Adjective findRandomAdjective(); +} diff --git a/src/main/java/com/cmc/mercury/domain/user/repository/NounRepository.java b/src/main/java/com/cmc/mercury/domain/user/repository/NounRepository.java new file mode 100644 index 0000000..ee56944 --- /dev/null +++ b/src/main/java/com/cmc/mercury/domain/user/repository/NounRepository.java @@ -0,0 +1,13 @@ +package com.cmc.mercury.domain.user.repository; + +import com.cmc.mercury.domain.user.entity.Noun; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface NounRepository extends JpaRepository { + + @Query("SELECT n FROM Noun n ORDER BY FUNCTION('RAND') LIMIT 1") + Noun findRandomNoun(); +} diff --git a/src/main/java/com/cmc/mercury/domain/user/repository/UserRepository.java b/src/main/java/com/cmc/mercury/domain/user/repository/UserRepository.java index 34bb36e..2a3ffbf 100644 --- a/src/main/java/com/cmc/mercury/domain/user/repository/UserRepository.java +++ b/src/main/java/com/cmc/mercury/domain/user/repository/UserRepository.java @@ -19,4 +19,6 @@ public interface UserRepository extends JpaRepository { boolean existsByEmailAndOauthType(String email, OAuthType oauthType); Optional findByEmailAndOauthType(String email, OAuthType oAuthType); + + boolean existsByNickname(String nickname); } diff --git a/src/main/java/com/cmc/mercury/domain/user/service/UserService.java b/src/main/java/com/cmc/mercury/domain/user/service/UserService.java index d1c265e..d3a7b0d 100644 --- a/src/main/java/com/cmc/mercury/domain/user/service/UserService.java +++ b/src/main/java/com/cmc/mercury/domain/user/service/UserService.java @@ -2,9 +2,9 @@ import com.cmc.mercury.domain.mypage.entity.Habit; import com.cmc.mercury.domain.mypage.repository.HabitRepository; -import com.cmc.mercury.domain.user.entity.OAuthType; -import com.cmc.mercury.domain.user.entity.User; -import com.cmc.mercury.domain.user.entity.UserStatus; +import com.cmc.mercury.domain.user.entity.*; +import com.cmc.mercury.domain.user.repository.AdjectiveRepository; +import com.cmc.mercury.domain.user.repository.NounRepository; import com.cmc.mercury.domain.user.repository.UserRepository; import com.cmc.mercury.domain.user.response.UserTestRequest; import com.cmc.mercury.global.exception.CustomException; @@ -37,6 +37,8 @@ public class UserService { private final JwtProvider jwtProvider; private final HttpServletResponse response; private final HabitRepository habitRepository; + private final AdjectiveRepository adjectiveRepository; + private final NounRepository nounRepository; @Transactional public User createTestUser(UserTestRequest request) { @@ -62,6 +64,7 @@ public User createTestUser(UserTestRequest request) { User newUser = User.TestUserBuilder() .email(request.email()) + .nickname(assignNickname()) .TestUserBuild(); User savedUser = userRepository.save(newUser); @@ -131,4 +134,18 @@ public User getUser(String accessToken) { // 유효성 검증이 완료된 토큰에서 user 추출 return jwtProvider.getUserFromToken(accessToken); } + + private String assignNickname() { + + String nickname; + do { + Adjective adj = adjectiveRepository.findRandomAdjective(); + Noun noun = nounRepository.findRandomNoun(); + nickname = adj.getWord() + noun.getWord(); + + // 닉네임 중복인지 체크 + } while (userRepository.existsByNickname(nickname)); + + return nickname; + } } diff --git a/src/main/java/com/cmc/mercury/global/oauth/service/CustomOAuth2UserService.java b/src/main/java/com/cmc/mercury/global/oauth/service/CustomOAuth2UserService.java index 13c8ba4..2bf5e5e 100644 --- a/src/main/java/com/cmc/mercury/global/oauth/service/CustomOAuth2UserService.java +++ b/src/main/java/com/cmc/mercury/global/oauth/service/CustomOAuth2UserService.java @@ -3,9 +3,9 @@ import com.auth0.jwt.interfaces.DecodedJWT; import com.cmc.mercury.domain.mypage.entity.Habit; import com.cmc.mercury.domain.mypage.repository.HabitRepository; -import com.cmc.mercury.domain.user.entity.OAuthType; -import com.cmc.mercury.domain.user.entity.User; -import com.cmc.mercury.domain.user.entity.UserStatus; +import com.cmc.mercury.domain.user.entity.*; +import com.cmc.mercury.domain.user.repository.AdjectiveRepository; +import com.cmc.mercury.domain.user.repository.NounRepository; import com.cmc.mercury.domain.user.repository.UserRepository; import com.cmc.mercury.global.exception.CustomException; import com.cmc.mercury.global.exception.ErrorCode; @@ -37,6 +37,8 @@ public class CustomOAuth2UserService extends DefaultOAuth2UserService { private final UserRepository userRepository; private final AppleIdTokenVerifier appleIdTokenVerifier; private final HabitRepository habitRepository; + private final AdjectiveRepository adjectiveRepository; + private final NounRepository nounRepository; @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { @@ -155,6 +157,7 @@ private User createUser(OAuth2UserInfo oAuth2UserInfo) { User user = User.builder() .email(oAuth2UserInfo.getEmail()) + .nickname(assignNickname()) .oauthType(oAuth2UserInfo.getOAuthType()) .oauthId(oAuth2UserInfo.getOAuthId()) .userStatus(UserStatus.ACTIVE) @@ -171,4 +174,18 @@ private User createUser(OAuth2UserInfo oAuth2UserInfo) { return savedUser; } + + private String assignNickname() { + + String nickname; + do { + Adjective adj = adjectiveRepository.findRandomAdjective(); + Noun noun = nounRepository.findRandomNoun(); + nickname = adj.getWord() + noun.getWord(); + + // 닉네임 중복인지 체크 + } while (userRepository.existsByNickname(nickname)); + + return nickname; + } }