728x90

우선 view의 login.jsp의 form 부분을 jstl의 form 태그로 고치겠다.

<form:form action="${root }user/login_pro" method="post" modelAttribute="tempLoginUserBean">
	<div class="form-group">
		<form:label path="user_id">아이디</form:label>
		<form:input path="user_id" class="form-control"/>
		<form:errors path="user_id" style="color:red"/>
	</div>
	<div class="form-group">
		<form:label path="user_pw">비밀번호</form:label>
		<form:password path="user_pw" class="form-control"/>
		<form:errors path="user_pw" style="color:red"/>
	</div>
	<div class="form-group text-right">
        <form:button class="btn btn-primary">로그인</form:button>
        <a href="${root }user/signIn" class="btn btn-danger">회원가입</a>
	</div>
</form:form>

UserBean에서 로그인 여부를 판별할 isLogin이라는 불리언 변수를 생성한다.

로그인 여부에 따라 기능에 차이가 있어야 하므로 UserBean을 Session 영역에 저장한다.

RootAppContext에 아래 코드를 넣는다.

	@Bean("loginUserBean")
	@SessionScope
	public UserBean loginUserBean() {
		return new UserBean();
	}

로그인화면에서 유효성 검사를하기 위해 error_message에 에러메세지를 추가해준다.

Size.tempLoginUserBean.user_id = 사용자 아이디는 4 ~ 20글자여야 합니다.
Size.tempLoginUserBean.user_pw = 비밀번호는 4 ~ 20글자여야 합니다.
Pattern.tempLoginUserBean.user_id = 사용자 아이디는 영어, 숫자만 허용합니다.
Pattern.tempLoginUserBean.user_pw = 비밀번호는 영어, 숫자만 허용합니다.

가운데 Bean의 이름만 다른 것을 알 수 있다.

login처리를 위해 controller에 코드를 추가한다.

	@PostMapping("user/login_pro")
	public String login_pro(@Valid @ModelAttribute("tempLoginUserBean") UserBean tempLoginUserBean, BindingResult result) {
		if(result.hasErrors()) {
			return "user/login";
		}
		return "user/login_pro";
	}

 

서버를 실행시켜보면 오류가 뜨는 것을 알 수 있다.

이유는 Validator 때문인데, 회원 가입했을 때 UserBean에 대해 Validator가 검사한 코드에 의해 오류가 검출되었기 때문이다. 바로 아이디, 닉네임 중복확인 여부를 검사하는 validator인데, 로그인 할 때는 중복확인 여부가 필요 없으므로 수정을 해준다.

		String beanName = errors.getObjectName();
		if (beanName.equals("signInUserBean")) {
			if (userBean.getUser_pw().contentEquals(userBean.getUser_pw2()) == false) {
				errors.rejectValue("user_pw", "NotEquals");
				errors.rejectValue("user_pw2", "NotEquals");
			}

			if (userBean.isUserIdExist() == false) {
				errors.rejectValue("user_id", "UserIdExist");
			}

			if (userBean.isNicknameExist() == false) {
				errors.rejectValue("user_nickname", "NicknameExist");
			}
		}

이렇게 bean이름이 회원가입에 쓰는 signInUserBean일 때만 검사를 하도록 하면 오류가 발생하지 않는다.


로그인시 아이디와 비밀번호가 맞는지 확인하기 위한 mapper를 작성하자.

	@Select("select user_idx, user_name " +
			"from user_table " + 
			"where user_id=#{user_id} and user_pw=#{user_pw}")
	UserBean loginUser(UserBean tempLoginUserBean);	

dao를 작성한 후 service도 작성한다.

세션 영역에 저장한 loginUserBean을 받아온 후 로그인에 성공하면 loginUserBean에 idx, name을 입력하고, login여부를 true로 설정한다.

	@Resource(name="loginUserBean")
	private UserBean loginUserBean;
    
   	public void loginUser(UserBean tempLoginUserBean) {
		UserBean tempLoginUserBean2 = userDao.loginUser(tempLoginUserBean);
		if(tempLoginUserBean2 != null) {
			loginUserBean.setUser_idx(tempLoginUserBean2.getUser_idx());
			loginUserBean.setUser_name(tempLoginUserBean2.getUser_name());
			loginUserBean.setLogin(true);
		}
	}

controller도 주입받고 코드를 작성한다.

	@Resource(name="loginUserBean")
	private UserBean loginUserBean;
   
	@PostMapping("user/login_pro")
	public String login_pro(@Valid @ModelAttribute("tempLoginUserBean") UserBean tempLoginUserBean, BindingResult result) {
		if(result.hasErrors()) {
			return "user/login";
		}
		
		userService.loginUser(tempLoginUserBean);
		
		if(loginUserBean.isLogin()==true) {
			return "user/login_success";
		}
		else {
			return "user/login_fail";
		}
	}

loginUserBean의 isLogin이라는 변수가 true면 로그인 성공으로, 실패면 로그인 실패로 맵핑한다.

 

이제 로그인 view 화면에 로그인이 실패했을 때만 로그인 실패 정보를 보여주도록 수정한다.

<c:if test="${fail==true}">
	<div class="alert alert-danger">
		<h4>로그인 실패</h4>
		<p>아이디 또는 비밀번호를 확인해주세요</p>
	</div>
</c:if>

c tag를 이용해 넘어온 fail변수가 true면 경고를 띄운다.

fail은 login_fail을 통해 넘어온다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var='root' value="${pageContext.request.contextPath}/"/>
<script>
	alert('로그인에 실패했습니다.')
	location.href="${root}user/login?fail=true"
</script>

login_fail.jsp이다. fil=true를 통해 로그인에 실패했음을 전달하고,

Controller에서 이를 login.jsp로 전달한다.

	@GetMapping("user/login")
	public String login(@ModelAttribute("tempLoginUserBean") UserBean tempLoginUserBean,
						@RequestParam(value = "fail", defaultValue="false") boolean fail,
						Model model) {
		model.addAttribute("fail",fail);

		return "user/login";
	}

 

login_success는 아래와 같이 구현한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var='root' value="${pageContext.request.contextPath}/"/>
<script>
	alert('로그인 되었습니다.')
	location.href = "${root}main"
</script>
728x90

+ Recent posts