로그인 기능 구현이 생각보다 시간이 오래 걸렸다. 사실 기능 구현만 하는 건 쉬웠는데 예외처리도 하고 완성도를 높이려다 보니 부가적으로 할 것이 많았다.
처음 구현한 것
public AdminLoginVO adminLogin(AdminLoginRequestDTO admin, HttpSession session) {
//회원 존재 확인
if (memberRepository.findAdminByEmail(admin.getEmail()).isPresent()) {
Member member = memberRepository.findAdminByEmail(admin.getEmail()).get();
//비밀번호 일치 확인
if (member.getPassword().equals(admin.getPassword())) {
session.setAttribute("email", member.getEmail());
return AdminLoginVO.builder()
.resultCode("success")
.resultData(AdminLoginResponceDTO.builder()
.email(member.getEmail())
.profileImg(member.getProfileImg())
.memberName(member.getMemberName()).build()
).build();
}
else {
return AdminLoginVO.builder()
.resultCode("wrong password")
.build();
}
}
else {
return AdminLoginVO.builder()
.resultCode("not exist")
.build();
}
}
로그인에 필요한 모든 로직이 하나의 if문 안에서 실행된다. 예외 처리도 따로 없다.
리팩터링 한 것
@Override
public AdminLoginVO adminLogin(AdminLoginRequestDTO admin, HttpSession session) throws Exception{
if (!isValidEmail(admin.getEmail())) {
throw new Exception("failed : 입력이 이메일 형식이 아닙니다.");
}
try {
Member member = memberService.findAdminByEmail(admin.getEmail()).get();
if (isValidPassword(admin, member)) {
session.setAttribute("email", member.getEmail());
memberService.updateVisitCount(member.getId());
return AdminLoginVO.builder()
.resultCode("success")
.resultData(AdminLoginResponceDTO.builder()
.email(member.getEmail())
.profileImg(member.getProfileImg())
.memberName(member.getMemberName())
.build())
.build();
} else {
throw new Exception("failed : 비밀번호가 틀렸습니다.");
}
} catch (NullPointerException e) {
throw new Exception("failed : 존재하지 않는 회원입니다.");
}
}
/**
* 비밀번호 매칭 검사
* @param admin
* @param member
* @return
*/
private boolean isValidPassword(AdminLoginRequestDTO admin, Member member) {
if (member.getPassword().equals(admin.getPassword())) {
return true;
} else {
return false;
}
}
/**
* 이메일 형식 유효성 검사
* @param email
* @return
*/
private static boolean isValidEmail(String email) {
String regex = "^[_a-z0-9-]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(email);
if(m.matches()) {
return true;
} else {
return false;
}
}
이메일 유효성 검사를 추가하고, DB의 비밀번호와 사용자가 입력한 비밀번호가 일치하는지 확인하는 메서드를 따로 분리했다.
입력이 이메일 형식이 아니거나, 비밀번호가 일치하지 않거나, 입력한 이메일로 회원 정보를 찾을 수 없을 때 예외를 던지도록 했다.
@PostMapping("/admin/auth/login")
@ResponseBody
public AdminLoginVO adminLogin(@RequestBody AdminLoginRequestDTO adminLoginRequest, HttpSession session) {
try {
return adminService.adminLogin(adminLoginRequest, session);
} catch (Exception e) {
return AdminLoginVO.builder()
.resultCode(e.getMessage())
.build();
}
}
던져진 예외는 컨트롤러에서 받아서 에러 메세지를 resultCode로 출력한다.
'개발 > Field-Passer 프로젝트' 카테고리의 다른 글
[Field-Passer 프로젝트] 쿼리 최적화 (N + 1 문제 해결하기) (0) | 2023.02.04 |
---|---|
[Field-Passer 프로젝트] Spring Data JPA 페이징 처리하기 (0) | 2023.02.03 |
[Field-Passer 프로젝트] Rest API에서 JSON 반환하기 (1) | 2023.01.29 |
[Field-Passer 프로젝트] JPA 사용해서 Entity 설계하기 (0) | 2023.01.29 |
[Field-Passer 프로젝트] 패키지 구조 결정하기 (0) | 2023.01.27 |
댓글