09009
[Spring] 예제1 - 로그인 페이지 동작 코드 수정 본문
로그인 성공과 실패 시나리오 설계
성공 - 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와 같은 자료구조로 리턴타입을 설정하는 메서드를 설계해야 한다.
로그인 실패 화면
로그인 성공 화면
'Back-End > Spring' 카테고리의 다른 글
[Spring] 예제1 - 게시판 구현 (1) | 2023.05.17 |
---|---|
[Spring] 예제1 - 메인 페이지 생성, 로그아웃 처리 (0) | 2023.05.16 |
[Spring] 예제1 - 회원가입 구현 (0) | 2023.05.16 |
[Spring] 예제1 - DB 연동 (Mybatis 설정 및 사용법), 회원가입 로직 작성 (0) | 2023.05.16 |
[Spring] 예제 1 - 회원 서비스 작성 (0) | 2023.05.16 |