본문 바로가기
개발/Field-Passer 프로젝트

[Field-Passer 프로젝트] SpringBoot 로그인 시 예외 처리하기

by 코코의 주인 2023. 1. 30.

 로그인 기능 구현이 생각보다 시간이 오래 걸렸다. 사실 기능 구현만 하는 건 쉬웠는데 예외처리도 하고 완성도를 높이려다 보니 부가적으로 할 것이 많았다.

 

처음 구현한 것

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로 출력한다.

댓글