09009

[Spring] 예제1 - 로그인 페이지 동작 코드 수정 본문

Back-End/Spring
[Spring] 예제1 - 로그인 페이지 동작 코드 수정
09009

로그인 성공과 실패 시나리오 설계

성공 - redirect

실패 - forwarding으로 설계할 예정이다.

 

로그인 페이지 현재 상태

✍ views/member/loginPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> 로그인 페이지 </h1>
<form action = "...">
	ID : <input type="text"><br>
	PW : <input type="password"><br>
	<input type="submit" value="로그인"><br>
</form>

<a href="./registerPage">회원가입</a> 
<a href="/finalproject/member/registerPage">회원가입</a>
<a href="http://localhost:8181/finalproject/member/registerPage">회원가입</a>
</body>
</html>

페이지 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> 로그인 페이지 </h1>
<form action = "./loginProcess" method="post">
	ID : <input type="text" name="user_id"><br>
	PW : <input type="password" name="user_pw"><br>
	<input type="submit" value="로그인"><br>
</form>

<a href="./registerPage">회원가입</a> 
<!-- <a href="/finalproject/member/registerPage">회원가입</a>
<a href="http://localhost:8181/finalproject/member/registerPage">회원가입</a> -->
</body>
</html>

로그인 실행

RequestMapping 작업과 fowarding할 jsp 파일을 아직 생성하지 않았기 때문에 아래와 같이 에러 페이지가 출력된다.

loginProcess 생성

✍  MemberController.java

	@RequestMapping("loginProcess")
	public String loginProcess(MemberDto params) {
		
		return "";
	}

jsp의 form에서 입력한 parameter들을 받아오기 때문에 메서드는 dto 매개변수로 받아와야 한다.

(값을 받아오는 경우 변수명 작성이 중요하다)

 

✍ MemberServiceImpl.java

로그인할 때 회원 정보를 조회하는 코드 추가

	// controller 쪽에서 있는지 없는지 판단해야하므로 리턴타입을 만든다.
	public MemberDto getMemberByIdAndPw(MemberDto memberDto) {
		return null;
	}

아이디 비밀번호 조회 쿼리 작성

아직 아이디 중복 체크 조건과 unique 제약 조건을 설정하지 않았다는 것을 참고하자.

 

이제 mybatis를 이용해서 인터페이스에 메서드 하나를 생성하고 xml에 쿼리를 작성하여  mapping 해주면 된다.

 

-----------------------------------------------------------------

* tip

insert, delete, update 사실상 리턴타입은 void

select는 리턴타입을 고려해야함

-----------------------------------------------------------------

 

MemberSqlMapper.java

package com.ja.finalproject.member.mapper;

import com.ja.finalproject.dto.MemberDto;

public interface MemberSqlMapper {
	
	// insert, delete, update 사실상 리턴타입은 void
	// select는 리턴타입 고려해야함
	public void insert(MemberDto memberDto);
	// selectby: 무엇을 기준으로 select할 것인지에 따라 컬럼명을 생성한다.
	public MemberDto selectByUserIdAndPw(MemberDto memberDto);
	
}

 

이제 쿼리를 작성하면 된다.

** select는 꼭 result 타입을 설정해주어야 한다. **

 

MemberSqlMapper.xml

	<!--  select는 꼭 result 타입을 세팅해주어야 한다. -->
	<select id="selectByUserIdAndPw" resultType="com.ja.finalproject.dto.MemberDto">
		SELECT * 
		FROM fp_member
		WHERE user_id = #{user_id}
		AND user_pw = #{user_pw}	
	</select>

MemberServiceImpl.java

	// controller 쪽에서 있는지 없는지 판단해야하므로 리턴타입을 만든다.
	public MemberDto getMemberByIdAndPw(MemberDto memberDto) {
		MemberDto sessionUser =  memberSqlMapper.selectByUserIdAndPw(memberDto);
		// 데이터베이스에 select된 결과로서의 dto -> sessionUser
		return sessionUser;
	}

✍ MemberController.java

	@RequestMapping("loginProcess")
	public String loginProcess(MemberDto params) {
		MemberDto sessionUser = memberService.getMemberByIdAndPw(params);
		if (sessionUser == null) {
			// 로그인 실패한 경우 -> jsp로 forwarding 
			return "member/loginFail";
		} else {
			// 로그인 성공한 경우
			
		}
		return "";
	}

 

* 로그인 인증 성공할 때 꼭 필요한 것

로그인 인증된 사용자는 사이트를 돌아다닐 때 계속 로그인된 상태이어야 한다.

메모리를 가지고 있어야함 → 세션 저장공간 필요

세션은 하나의 컴퓨터에만 적용이 된다. 이번 예제에서는 세션 인증방식으로만 적용한다.

 

세션은 웹 브라우저를 끄면 로그인이 끊긴다.

웹 브라우저 끄기 전까지는 로그인 상태가 유지될 것이다. or 30분 지나면 소멸된다.

./ 상대경로

/ 절대경로

 

로그인 성공하면 게시판 페이지로 이동하도록 설계한다.

현재 링크는 member/loginProcess이므로 ./ 작성하면 안된다.

../는 한 칸 앞으로 간다.

 

✍ MemberController.java

	@RequestMapping("loginProcess")
	public String loginProcess(HttpSession session, MemberDto params) {
		MemberDto sessionUser = memberService.getMemberByIdAndPw(params);
		if (sessionUser == null) {
			// 로그인 실패한 경우 -> jsp로 forwarding 
			return "member/loginFail";
		} else {
			// 로그인 성공한 경우
			session.setAttribute("sessionUser", sessionUser); // 세션에 저장
			return "redirect:../board/mainPage";
		}
	}

 

로그인 실패 페이지 만들기

✍ views/member/loginFail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
로그인 실패, 아이디 혹은 비밀번호를 확인해주세요. <br>
<a href="./loginPage">로그인 페이지로 이동</a>
</body>
</html>

테스트

회원가입

아이디와 비밀번호 중복된 데이터를 일부러 insert 한다.

아이디, 비밀번호가 중복된 데이터로 로그인을 해보면

 

package com.ja.finalproject.member.mapper;

import com.ja.finalproject.dto.MemberDto;

public interface MemberSqlMapper {
	
	// insert, delete, update 사실상 리턴타입은 void
	// select는 리턴타입 고려해야함
	public void insert(MemberDto memberDto);
	// selectby: 무엇을 기준으로 select할 것인지에 따라 컬럼명을 생성한다,
	public MemberDto selectByUserIdAndPw(MemberDto memberDto);
	
}
<!--  select는 꼭 result 타입을 세팅해주어야 한다. -->
	<select id="selectByUserIdAndPw" resultType="com.ja.finalproject.dto.MemberDto">
		SELECT * 
		FROM fp_member
		WHERE user_id = #{user_id}
		AND user_pw = #{user_pw}	
	</select>

리턴타입이 특정 dto 하나이므로 0,1개이면 에러가 뜨지 않지만 2 이상이면 에러가 발생한다.

 

에러 화면

여러 개의 행을 출력하고 싶으면 ArrayList와 같은 자료구조로 리턴타입을 설정하는 메서드를 설계해야 한다.

 

 

로그인 실패 화면

로그인 성공 화면