소셜 로그인, 회원가입 - 이메일 체크 로직 수정

- 이미 가입된 계정인 경우 안내 문구 자세히 안내
This commit is contained in:
Klaus 2025-04-08 15:32:45 +09:00
parent d822a4a8ac
commit a9c68f9971
2 changed files with 67 additions and 16 deletions

View File

@ -62,7 +62,6 @@ interface MemberQueryRepository {
fun getMemberProfile(memberId: Long, myMemberId: Long): GetMemberProfileResponse
fun existsByEmail(email: String): Boolean
fun existsByNickname(nickname: String): Boolean
fun findNicknamesWithPrefix(prefix: String): List<String>
}
@ -486,14 +485,6 @@ class MemberQueryRepositoryImpl(
.fetchFirst()
}
override fun existsByEmail(email: String): Boolean {
return queryFactory
.selectOne()
.from(member)
.where(member.email.eq(email))
.fetchFirst() != null
}
override fun existsByNickname(nickname: String): Boolean {
return queryFactory
.selectOne()

View File

@ -286,11 +286,22 @@ class MemberService(
isAdmin: Boolean = false,
isCreator: Boolean = false
): LoginResponse {
val member = repository.findByEmail(email = email) ?: throw SodaException("로그인 정보를 확인해주세요.")
val member = repository.findByEmail(email = email) ?: throw SodaException("없는 계정입니다.")
if (!member.isActive) {
throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.")
}
if (member.provider != MemberProvider.EMAIL) {
val provider = when (member.provider) {
MemberProvider.APPLE -> "애플"
MemberProvider.GOOGLE -> "구글"
else -> "카카오"
}
throw SodaException("해당 이메일은 $provider 계정으로 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.")
}
if (isCreator && member.role != MemberRole.CREATOR) {
throw SodaException("로그인 정보를 확인해주세요.")
}
@ -380,8 +391,23 @@ class MemberService(
fun duplicateCheckEmail(email: String): ApiResponse<Any> {
validateEmail(email)
if (repository.existsByEmail(email)) {
throw SodaException("이미 사용중인 이메일 입니다.", "email")
val findMember = repository.findByEmail(email)
if (findMember != null) {
if (findMember.provider == MemberProvider.EMAIL) {
throw SodaException("이미 사용중인 이메일 입니다.", "email")
} else {
val provider = when (findMember.provider) {
MemberProvider.APPLE -> "애플"
MemberProvider.GOOGLE -> "구글"
else -> "카카오"
}
throw SodaException(
"해당 이메일은 $provider 계정으로 이미 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.",
"email"
)
}
}
return ApiResponse.ok(message = "사용 가능한 이메일 입니다.")
@ -741,7 +767,14 @@ class MemberService(
@Transactional
fun findOrRegister(googleUserInfo: GoogleUserInfo, container: String, marketingPid: String?): Member {
repository.findByGoogleId(googleUserInfo.sub)?.let { return it }
val findMember = repository.findByGoogleId(googleUserInfo.sub)
if (findMember != null) {
if (findMember.isActive) {
return findMember
} else {
throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.")
}
}
val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID)
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
@ -749,10 +782,13 @@ class MemberService(
val stipulationPrivacyPolicy = stipulationRepository.findByIdOrNull(StipulationIds.PRIVACY_POLICY_ID)
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
val email = googleUserInfo.email
checkEmail(email)
val nickname = nicknameGenerateService.generateUniqueNickname()
val member = Member(
googleId = googleUserInfo.sub,
email = googleUserInfo.email,
email = email,
password = "",
nickname = nickname,
profileImage = "profile/default-profile.png",
@ -774,7 +810,14 @@ class MemberService(
@Transactional
fun findOrRegister(kakaoUserInfo: KakaoUserInfo, container: String, marketingPid: String?): Member {
repository.findByKakaoId(kakaoUserInfo.id)?.let { return it }
val findMember = repository.findByKakaoId(kakaoUserInfo.id)
if (findMember != null) {
if (findMember.isActive) {
return findMember
} else {
throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.")
}
}
val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID)
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
@ -782,10 +825,13 @@ class MemberService(
val stipulationPrivacyPolicy = stipulationRepository.findByIdOrNull(StipulationIds.PRIVACY_POLICY_ID)
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
val email = kakaoUserInfo.email
checkEmail(email)
val nickname = nicknameGenerateService.generateUniqueNickname()
val member = Member(
kakaoId = kakaoUserInfo.id,
email = kakaoUserInfo.email,
email = email,
password = "",
nickname = nickname,
profileImage = "profile/default-profile.png",
@ -804,4 +850,18 @@ class MemberService(
return member
}
private fun checkEmail(email: String) {
val member = repository.findByEmail(email)
if (member != null) {
val provider = when (member.provider) {
MemberProvider.APPLE -> "애플"
MemberProvider.GOOGLE -> "구글"
else -> "카카오"
}
throw SodaException("해당 이메일은 $provider 계정으로 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.")
}
}
}