Skip to content

Commit

Permalink
feat: 카카오 회원가입 시 중복되지 않는 랜덤한 닉네임으로 설정되도록 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
jaeuk520 committed Oct 1, 2024
1 parent 1f6de76 commit 647e6a2
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 19 deletions.
5 changes: 5 additions & 0 deletions src/main/java/com/ku/covigator/domain/member/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,9 @@ public void updateMemberInfo(String nickname, String password) {
this.nickname = nickname;
this.password = password;
}

public void updateNickname(String nickname) {
this.nickname = nickname;
}

}
60 changes: 47 additions & 13 deletions src/main/java/com/ku/covigator/service/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.ku.covigator.dto.response.KakaoTokenResponse;
import com.ku.covigator.dto.response.KakaoUserInfoResponse;
import com.ku.covigator.exception.badrequest.DuplicateMemberException;
import com.ku.covigator.exception.badrequest.DuplicateMemberNicknameException;
import com.ku.covigator.exception.badrequest.PasswordMismatchException;
import com.ku.covigator.exception.notfound.NotFoundMemberException;
import com.ku.covigator.repository.MemberRepository;
Expand All @@ -30,6 +31,9 @@ public class AuthService {
private final KakaoOauthProvider kakaoOauthProvider;
private final S3Service s3Service;

private static final String BASE_NICKNAME = "코비게이터";
private static final int MAX_UID = 99999;

@Transactional(readOnly = true)
public String signIn(String email, String password) {
Member member = memberRepository.findByEmailAndPlatform(email, Platform.LOCAL)
Expand All @@ -41,15 +45,18 @@ public String signIn(String email, String password) {
// 로컬 회원가입
public String signUp(Member member, MultipartFile image) {

// 회원 가입 중복 검증
validateDuplicateMemberByEmailAndPlatform(member.getEmail(), Platform.LOCAL);
// 닉네임 중복 검증
validateNicknameDuplication(member.getNickname());

// 이메일 중복 검증
validateEmailDuplication(member.getEmail());

// 패스워드 인코딩
String encodedPassword = passwordEncoder.encode(member.getPassword());
member.encodePassword(encodedPassword);

// S3에 프로필 이미지 업로드
if(image != null && !image.isEmpty()) {
if (image != null && !image.isEmpty()) {
String uploadedImageUrl = s3Service.uploadImage(image, "profile");
member.addImageUrl(uploadedImageUrl);
}
Expand All @@ -72,34 +79,61 @@ public KakaoSignInResponse signInKakao(String code) {

// 회원 가입 여부 확인
String email = kakaoUserInfoResponse.kakaoAccount().email();
Optional<Member> member = memberRepository.findByEmailAndPlatform(email, Platform.KAKAO);
Optional<Member> savedMember = memberRepository.findByEmailAndPlatform(email, Platform.KAKAO);

// 가입된 회원 반환
if(member.isPresent()) {
String token = jwtProvider.createToken(member.get().getId().toString());
if (savedMember.isPresent()) {
String token = jwtProvider.createToken(savedMember.get().getId().toString());
return KakaoSignInResponse.fromOldMember(token);
}

// 신규 닉네임 생성
String nickname = createRandomNickname();
Member member = kakaoUserInfoResponse.toEntity();
member.updateNickname(nickname);

// 신규 회원 저장
Member savedMember = memberRepository.save(kakaoUserInfoResponse.toEntity());
String token = jwtProvider.createToken(savedMember.getId().toString());
Member newMember = memberRepository.save(member);
String token = jwtProvider.createToken(newMember.getId().toString());
return KakaoSignInResponse.fromNewMember(token);

}

// 회원 가입 중복 검증
private void validateDuplicateMemberByEmailAndPlatform(String email, Platform platform) {
Optional<Member> savedMember = memberRepository.findByEmailAndPlatform(email, platform);
if (savedMember.isPresent()) {
// 닉네임 중복 검증
private void validateNicknameDuplication(String nickname) {
Optional<Member> member = memberRepository.findByNickname(nickname);
if (member.isPresent()) {
throw new DuplicateMemberNicknameException();
}
}

// 이메일 중복 검증 (로컬)
private void validateEmailDuplication(String email) {
Optional<Member> member = memberRepository.findByEmailAndPlatform(email, Platform.LOCAL);
if (member.isPresent()) {
throw new DuplicateMemberException();
}
}

// 비밀 번호 검증
private void validatePassword(String password, String encodedPassword) {
if(!passwordEncoder.matches(password, encodedPassword)) {
if (!passwordEncoder.matches(password, encodedPassword)) {
throw new PasswordMismatchException();
}
}

// 신규 닉네임 생성
private String createRandomNickname() {
String nickname;
do {
nickname = BASE_NICKNAME + (int) (Math.random() * MAX_UID + 1);
} while (isNicknameDuplicated(nickname));
return nickname;
}

// 닉네임 중복 여부 확인
private Boolean isNicknameDuplicated(String nickname) {
return memberRepository.findByNickname(nickname).isPresent();
}

}
15 changes: 15 additions & 0 deletions src/test/java/com/ku/covigator/domain/member/MemberTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -127,4 +127,19 @@ void updateMemberInfo() {
assertThat(member.getNickname()).isEqualTo("covi2");
assertThat(member.getPassword()).isEqualTo("covigator123!");
}

@DisplayName("회원 닉네임을 변경한다.")
@Test
void updateNickname() {
//given
Member member = Member.builder()
.nickname("covi")
.build();

//when
member.updateNickname("covi2");

//then
assertThat(member.getNickname()).isEqualTo("covi2");
}
}
13 changes: 7 additions & 6 deletions src/test/java/com/ku/covigator/service/AuthServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -252,8 +252,8 @@ void returnIsNewFalseWhenExistsMemberLogIn() {

KakaoUserInfoResponse userInfoResponse =
new KakaoUserInfoResponse(
new KakaoUserInfoResponse.KakaoAccount("name", email,
new KakaoUserInfoResponse.KakaoAccount.Profile("nickname", "image")));
new KakaoUserInfoResponse.KakaoAccount(email,
new KakaoUserInfoResponse.KakaoAccount.Profile("image")));
given(kakaoOauthProvider.getKakaoUserInfo(any())).willReturn(userInfoResponse);

//when
Expand Down Expand Up @@ -283,8 +283,8 @@ void registerNewMemberWhenKakaoLoginDespiteOfLocalMemberExists() {

KakaoUserInfoResponse userInfoResponse =
new KakaoUserInfoResponse(
new KakaoUserInfoResponse.KakaoAccount("name", email,
new KakaoUserInfoResponse.KakaoAccount.Profile("nickname", "image")));
new KakaoUserInfoResponse.KakaoAccount(email,
new KakaoUserInfoResponse.KakaoAccount.Profile("image")));
given(kakaoOauthProvider.getKakaoUserInfo(any())).willReturn(userInfoResponse);

//when
Expand All @@ -303,8 +303,8 @@ void returnIsNewTrueWhenNewMemberLogIn() {

KakaoUserInfoResponse userInfoResponse =
new KakaoUserInfoResponse(
new KakaoUserInfoResponse.KakaoAccount("name", "email",
new KakaoUserInfoResponse.KakaoAccount.Profile("nickname", "image")));
new KakaoUserInfoResponse.KakaoAccount("email",
new KakaoUserInfoResponse.KakaoAccount.Profile("image")));
given(kakaoOauthProvider.getKakaoUserInfo(any())).willReturn(userInfoResponse);

//when
Expand All @@ -313,4 +313,5 @@ void returnIsNewTrueWhenNewMemberLogIn() {
//then
assertThat(response.isNew()).isEqualTo("True");
}

}

0 comments on commit 647e6a2

Please sign in to comment.