회원 가입하지 않은 아이디로 로그인 시도

김학준·2024년 6월 17일
0

게시판

목록 보기
5/44

문제 상황

회원가입하지 않은 아이디로 로그인을 시도했을 때 다음과 같은 예외가 발생한다.

오류 메시지

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
com.portfolio.www.dao.MemberDao.findMemberByUsername(MemberDao.java:37)

오류 발생 부분

MemberController.java

@RequestMapping("/login.do")
public String login(@ModelAttribute LoginForm form, HttpServletRequest request, Model model) {
  String msg = "";

	MemberDto memberDto = memberService.login(form);

	if (!ObjectUtils.isEmpty(memberDto)) {
		// 세션 처리
		HttpSession session = request.getSession(false);
		session.setAttribute("memberId", memberDto.getMemberId());
		msg = "로그인에 성공했습니다.";
		return "redirect:/main-page.do";

	} else {
		msg = "로그인에 실패했습니다.";
	}

  model.addAttribute("msg", msg);

  return "login";
}

해결 방법

@RequestMapping("/login.do")
public String login(@ModelAttribute LoginForm form, HttpServletRequest request, Model model) {
  String msg = "";

  try {
    MemberDto memberDto = memberService.login(form);

    if (!ObjectUtils.isEmpty(memberDto)) {
      // 세션 처리
      HttpSession session = request.getSession(false);
      session.setAttribute("memberId", memberDto.getMemberId());
      msg = "로그인에 성공했습니다.";
      return "redirect:/main-page.do";

    } else {
      msg = "로그인에 실패했습니다.";
    }
  } catch (EmptyResultDataAccessException e) {
    msg = "존재하지 않는 아이디입니다.";
  }

  model.addAttribute("msg", msg);

  return "login";
}

에러에 대한 설명을 공식 문서에서 살펴 보니 다음과 같다.

Data access exception thrown when a result was expected to have at least one row (or element) but zero rows (or elements) were actually returned.

해당 예외는 사용자의 입력값으로 인해 발생했기 때문에 사용자에게 알려주어야 한다. 예외가 발생하면 다음과 같은 방향 MemberDaoMemberServiceMemberController으로 예외가 전파된다. 마지막 컨트롤러에서 예외를 catch해 뷰에 전달할 메시지를 설정했다.
참고로 JdbcTemplate을 사용했을 때 발생했던 문제이며 MyBatis를 사용할 경우 쿼리 조회 후 해당 값이 없는 경우 null을 반환한다.

@RequestMapping("/login.do")
public String login(@ModelAttribute LoginForm form, HttpServletRequest request, Model model) {
  String msg = "";

  try {
    MemberDto memberDto = memberService.login(form);

    if (!ObjectUtils.isEmpty(memberDto)) {
      // 세션 처리
      HttpSession session = request.getSession(false);
      session.setAttribute("memberId", memberDto.getMemberId());
      msg = "로그인에 성공했습니다.";
      return "redirect:/main-page.do";

    } else {
      msg = "로그인에 실패했습니다.";
    }
  } catch (EmptyResultDataAccessException e) {
    msg = "존재하지 않는 아이디입니다.";
  }

  model.addAttribute("msg", msg);

  return "login";
}

0개의 댓글