기존의 회원가입에서는 이메일 형식과 패스워드 유효성 검사는 했지만, 이메일 및 닉네임 중복 검사 기능이 없었음. 이메일이 프라이머리 키이고, 닉네임이 유니크한 필드로 설정되어 있는 점을 고려하여 중복 검사를 추가하게 됨
1. MemberDao에 중복 검사 메서드 추가
DB에서 이메일과 닉네임의 중복 여부를 확인하기 위해 MemberDao 인터페이스에 isEmailExists와 isNicknameExists 메서드를 추가
@Mapper
public interface MemberDao {
public Member login(Member m) throws Exception;
public void insertMember(Member m) throws Exception;
public void updateMember(Member m) throws Exception;
public void deleteMember(String email) throws Exception;
boolean isEmailExists(String email);
boolean isNicknameExists(String nickname);
}
2. MemberService에서 중복 검사 실행
MemberService에서 MemberDao에 접근하여 이메일과 닉네임 중복을 체크. 만약 이메일이나 닉네임이 중복되면 예외를 발생시켜 회원가입을 진행하지 않도록 함
public void insertMember(Member m) throws Exception {
// 이메일 및 패스워드 유효성 검사
String email = m.getEmail();
if (!isValidEmail(email)) {
throw new Exception("유효하지 않은 이메일 형식입니다.");
}
String pwd = m.getPwd();
if (!isValidPassword(pwd)) {
throw new Exception("패스워드는 8자리 이상이어야 하며, 특수문자와 숫자를 포함해야 합니다.");
}
// 이메일 및 닉네임 중복 검사
boolean emailExists = memberDao.isEmailExists(email);
String nickname = m.getNickname();
boolean nicknameExists = memberDao.isNicknameExists(nickname);
if (emailExists && nicknameExists) {
throw new Exception("이메일이 이미 사용 중입니다. 닉네임이 이미 사용 중입니다.");
} else if (emailExists) {
throw new Exception("이메일이 이미 사용 중입니다.");
} else if (nicknameExists) {
throw new Exception("닉네임이 이미 사용 중입니다.");
}
// 패스워드 암호화 후 DB 저장
String salt = UUID.randomUUID().toString();
byte[] originalHash = OpenCrypt.getSHA256(pwd, salt);
String pwdHash = OpenCrypt.byteArrayToHex(originalHash);
m.setPwd(pwdHash);
saltDao.insertSalt(new SaltInfo(email, salt));
memberDao.insertMember(m);
}
3. MemberController에서 예외 처리
MemberController에서는 회원가입 시 예외가 발생하면, 해당 예외 메시지를 확인하여 적절한 리턴 메시지를 반환. 이메일 중복, 닉네임 중복, 그리고 기타 오류를 각각 처리.
@PostMapping("signup")
public String insertMember(@RequestBody Member m) {
try {
memberService.insertMember(m);
return "회원 가입 성공";
} catch (Exception e) {
e.printStackTrace();
if (e.getMessage().contains("이메일이 이미 사용 중입니다.") && e.getMessage().contains("닉네임이 이미 사용 중입니다.")) {
return "이메일 중복, 닉네임 중복";
} else if (e.getMessage().contains("이메일이 이미 사용 중입니다.")) {
return "이메일 중복";
} else if (e.getMessage().contains("닉네임이 이미 사용 중입니다.")) {
return "닉네임 중복";
} else {
return "회원 가입 실패에 실패했습니다. 다시 시도해주세요.";
}
}
}
4. 프론트엔드에서 예외 메시지 처리
프론트엔드에서는 signup API 호출 후, 리턴된 메시지에 따라 사용자에게 적절한 피드백을 전달.
const response = await signup(emailInput.value, passwordInput.value, nicknameInput.value);
if (response.data === "회원 가입 성공") {
welcomeMessage.style.display = "flex";
} else if(response.data === "이메일 중복, 닉네임 중복") {
emailErrorMsg.innerHTML = `이미 가입된 이메일입니다.`;
nicknameErrorMsg.innerHTML = `이미 사용중인 닉네임입니다.`;
} else if(response.data === "이메일 중복") {
emailErrorMsg.innerHTML = `이미 가입된 이메일입니다.`;
} else if(response.data === "닉네임 중복") {
nicknameErrorMsg.innerHTML = `이미 사용중인 닉네임입니다.`;
} else {
alert("회원가입에 실패했습니다. 다시 시도해주세요.");
}

회원가입 시 이메일과 닉네임 중복 검사를 추가하여, 사용자가 이미 존재하는 이메일이나 닉네임으로 가입하지 않도록 방지할 수 있게 됨.
'[LG 유플러스] 유레카 > 프로젝트' 카테고리의 다른 글
[번개장터 클론코딩][Spring Boot] 이미지 저장 방식, 사용자 인증, 로그인 유효시간 및 토큰 관리 (0) | 2025.03.19 |
---|---|
[번개장터 클론코딩][JS] 기본 구조, 로그인, 회원가입 구현, SPA (0) | 2025.03.15 |
[번개장터 클론코딩][Spring Boot] 로그인, 회원가입 기능 구현 (0) | 2025.03.14 |
기존의 회원가입에서는 이메일 형식과 패스워드 유효성 검사는 했지만, 이메일 및 닉네임 중복 검사 기능이 없었음. 이메일이 프라이머리 키이고, 닉네임이 유니크한 필드로 설정되어 있는 점을 고려하여 중복 검사를 추가하게 됨
1. MemberDao에 중복 검사 메서드 추가
DB에서 이메일과 닉네임의 중복 여부를 확인하기 위해 MemberDao 인터페이스에 isEmailExists와 isNicknameExists 메서드를 추가
@Mapper
public interface MemberDao {
public Member login(Member m) throws Exception;
public void insertMember(Member m) throws Exception;
public void updateMember(Member m) throws Exception;
public void deleteMember(String email) throws Exception;
boolean isEmailExists(String email);
boolean isNicknameExists(String nickname);
}
2. MemberService에서 중복 검사 실행
MemberService에서 MemberDao에 접근하여 이메일과 닉네임 중복을 체크. 만약 이메일이나 닉네임이 중복되면 예외를 발생시켜 회원가입을 진행하지 않도록 함
public void insertMember(Member m) throws Exception {
// 이메일 및 패스워드 유효성 검사
String email = m.getEmail();
if (!isValidEmail(email)) {
throw new Exception("유효하지 않은 이메일 형식입니다.");
}
String pwd = m.getPwd();
if (!isValidPassword(pwd)) {
throw new Exception("패스워드는 8자리 이상이어야 하며, 특수문자와 숫자를 포함해야 합니다.");
}
// 이메일 및 닉네임 중복 검사
boolean emailExists = memberDao.isEmailExists(email);
String nickname = m.getNickname();
boolean nicknameExists = memberDao.isNicknameExists(nickname);
if (emailExists && nicknameExists) {
throw new Exception("이메일이 이미 사용 중입니다. 닉네임이 이미 사용 중입니다.");
} else if (emailExists) {
throw new Exception("이메일이 이미 사용 중입니다.");
} else if (nicknameExists) {
throw new Exception("닉네임이 이미 사용 중입니다.");
}
// 패스워드 암호화 후 DB 저장
String salt = UUID.randomUUID().toString();
byte[] originalHash = OpenCrypt.getSHA256(pwd, salt);
String pwdHash = OpenCrypt.byteArrayToHex(originalHash);
m.setPwd(pwdHash);
saltDao.insertSalt(new SaltInfo(email, salt));
memberDao.insertMember(m);
}
3. MemberController에서 예외 처리
MemberController에서는 회원가입 시 예외가 발생하면, 해당 예외 메시지를 확인하여 적절한 리턴 메시지를 반환. 이메일 중복, 닉네임 중복, 그리고 기타 오류를 각각 처리.
@PostMapping("signup")
public String insertMember(@RequestBody Member m) {
try {
memberService.insertMember(m);
return "회원 가입 성공";
} catch (Exception e) {
e.printStackTrace();
if (e.getMessage().contains("이메일이 이미 사용 중입니다.") && e.getMessage().contains("닉네임이 이미 사용 중입니다.")) {
return "이메일 중복, 닉네임 중복";
} else if (e.getMessage().contains("이메일이 이미 사용 중입니다.")) {
return "이메일 중복";
} else if (e.getMessage().contains("닉네임이 이미 사용 중입니다.")) {
return "닉네임 중복";
} else {
return "회원 가입 실패에 실패했습니다. 다시 시도해주세요.";
}
}
}
4. 프론트엔드에서 예외 메시지 처리
프론트엔드에서는 signup API 호출 후, 리턴된 메시지에 따라 사용자에게 적절한 피드백을 전달.
const response = await signup(emailInput.value, passwordInput.value, nicknameInput.value);
if (response.data === "회원 가입 성공") {
welcomeMessage.style.display = "flex";
} else if(response.data === "이메일 중복, 닉네임 중복") {
emailErrorMsg.innerHTML = `이미 가입된 이메일입니다.`;
nicknameErrorMsg.innerHTML = `이미 사용중인 닉네임입니다.`;
} else if(response.data === "이메일 중복") {
emailErrorMsg.innerHTML = `이미 가입된 이메일입니다.`;
} else if(response.data === "닉네임 중복") {
nicknameErrorMsg.innerHTML = `이미 사용중인 닉네임입니다.`;
} else {
alert("회원가입에 실패했습니다. 다시 시도해주세요.");
}

회원가입 시 이메일과 닉네임 중복 검사를 추가하여, 사용자가 이미 존재하는 이메일이나 닉네임으로 가입하지 않도록 방지할 수 있게 됨.
'[LG 유플러스] 유레카 > 프로젝트' 카테고리의 다른 글
[번개장터 클론코딩][Spring Boot] 이미지 저장 방식, 사용자 인증, 로그인 유효시간 및 토큰 관리 (0) | 2025.03.19 |
---|---|
[번개장터 클론코딩][JS] 기본 구조, 로그인, 회원가입 구현, SPA (0) | 2025.03.15 |
[번개장터 클론코딩][Spring Boot] 로그인, 회원가입 기능 구현 (0) | 2025.03.14 |