상품관리 (로그인 / 로그아웃)
Back-End/Spring 2019. 6. 12. 18:23- 상품관리 (로그인 / 로그아웃 기능 구현) -
세션을 사용해서 세션이 아이디와 비밀번호를 저장한 후 페이지를 이동해도 로그인 정보가 그대로 넘어가게 할 예정
뷰 => 컨트롤러 => 서비스 => 모델 => 뷰
-로그인-
menu.jsp 페이지에서 로그인 링크를 누르면 login.do( login.jsp 페이지 ) 로 이동. login.jsp 페이지에서 아이디와 비밀번호를 입력하고 로그인 버튼을 누르면 id 값 (btnLogin) 이 위쪽에 있는 javaScript 구문으로 넘겨받아서 아이디와 비밀번호가 DTO와 DAO를 거쳐서 컨트롤러에 맵핑된 login_check로 넘어간다. name값이 null값이 아니면 (로그인이 성공하면) home페이지로 이동하고, 로그인이 실패하면 login 페이지로 되돌아간다. |
menu.jsp (로그인과 로그아웃 페이지로 이동하는 태그를 추가)
1 2 3 4 5 6 7 8 9 10 11 12 13 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %> <!-- 다른페이지에 include되는 페이지 --> <a href = "${path }/memo/list.do">한줄메모장</a> ㅣ <a href = "${path }/upload/uploadForm">업로드 테스트</a> ㅣ <a href = "${path }/shop/product/list.do">상품목록</a> ㅣ <div style = "text-align: right;"> <a href = "${path }/member/login.do">로그인</a> //login.do로 이동하는 링크를 만듬 <a href = "${path }/member/logout.do">로그아웃</a> //logout.do로 이동하는 링크를 만듬 </div> | cs |
회원테이블은 기존에 만들어놓은 테이블을 사용한다. (member 테이블)
MemberDTO.java (계층별 데이터 교환 클래스)
member테이블에 있는 속성명과 맞춰서 만든다. (데이터를 넣고 빼고가 자유롭게...)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package com.example.spring02.model.member.dto; import java.util.Date; public class MemberDTO { private String userid; private String passwd; private String name; private String email; private Date join_date; public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getJoin_date() { return join_date; } public void setJoin_date(Date join_date) { this.join_date = join_date; } @Override public String toString() { return "MemberDTO [userid=" + userid + ", passwd=" + passwd + ", name=" + name + ", email=" + email + ", join_date=" + join_date + "]"; } } | cs |
MemberDAO.java (DB연결 클래스)
1 2 3 4 5 6 7 8 | package com.example.spring02.model.member.dao; import com.example.spring02.model.member.dto.MemberDTO; public interface MemberDAO { public String loginCheck(MemberDTO dto); //DTO에서 값을 받아 로그인을 체크하는 메소드 } | cs |
MemberDAOImpl.java (DB연결 구현 클래스)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.example.spring02.model.member.dao; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Repository; import com.example.spring02.model.member.dto.MemberDTO; @Repository public class MemberDAOImpl implements MemberDAO { //mybatis를 호출하기 때문에 Inject을 받아야한다 (의존성 주입) @Inject SqlSession sqlSession; @Override public String loginCheck(MemberDTO dto) { //loginCheck메소드를 구현 return sqlSession.selectOne("member.login_check", dto); //sqlsession의 selectOne메소드에 한가지 값(dto)를 담아서 리턴함 //mapper을 호출하기 위해 mapper id와 저장할 값을 지정 } } | cs |
memberMapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 --> <mapper namespace="member"> <select id = "Login_check" resultType = "com.example.spring02.model.member.dto.MemberDTO"> <!-- id 속성에는 해당 sql문을 참조하는 이름 (파일)을 적고 => Login_check resultType는 검색결과의 레코드를 어떤 형태로 변환시킬건지 작성한다. --> <!-- 즉 Login_check파일에서 밑에 있는 sql문을 참조하고 (실행하고) 그 결과를 MemberDTO 타입으로 변환 (다른 계층으로 자료를 이동시키기 위해) 한다. --> select * from member where userid = #{userid} and passwd = #{passwd} <!-- 회원의 아이디와 비밀번호가 모두 일치하는 회원의 모든 정보를 검색하는 sql문 --> </select> </mapper> | cs |
MemberService.java (회원 서비스 인터페이스)
1 2 3 4 5 6 7 8 9 10 11 12 | package com.example.spring02.service.member; import javax.servlet.http.HttpSession; import com.example.spring02.model.member.dto.MemberDTO; public interface MemberService { //HttpSession은 사용자 인증정보를 처리하는 클래스 public String loginCheck(MemberDTO dto, HttpSession session); //로그인 체크 메소드 public void logout(HttpSession session); //로그아웃 체크 메소드 } | cs |
MemberServiceImpl.java (회원 서비스 인터페이스 구현 클래스)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package com.example.spring02.service.member; import javax.inject.Inject; import javax.servlet.http.HttpSession; import org.springframework.stereotype.Service; import com.example.spring02.model.member.dao.MemberDAO; import com.example.spring02.model.member.dto.MemberDTO; //서비스 계층에서 서비스를 처리하는 어노테이션이므로 서비스 어노테이션을 반드시 붙여야 한다. @Service public class MemberServiceImpl implements MemberService { // 서비스는 dao를 호출하기 때문에 의존성을 주입해야한다. @Inject MemberDAO memberDao; @Override public String loginCheck(MemberDTO dto, HttpSession session) { // 로그인 체크 메소드 // 그러니까 DTO => DAO 로 넘어가는 과정 // 아이디와 비밀번호가 맞으면 이름이 넘어오고 틀리면 null이 넘어온다. // dao 클래스에 로그인 체크 메소드에 매개값으로 주어진 이름을 name변수에 저장 String name = memberDao.loginCheck(dto); if (name != null) {// 맞으면 // 세션변수 등록 session.setAttribute("userid", dto.getUserid()); // DTO에 저장된 회원의 아이디를 userid라는 이름으로 세션에 저장 session.setAttribute("name", name); // 위에서 로그인체크를 할때 받은 name를 세션에 저장하고 이 이름을 name라고 저장한다. } return name; } @Override public void logout(HttpSession session) { // 세션을 모두 초기화시킴 (로그아웃이므로 세션에 저장된 회원정보를 없애야 한다.) // invalidate( )메소드를 사용하면 사용자의 id까지 바뀌어버린다. session.invalidate(); } } | cs |
MemberController.java (회원정보 컨트롤러)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.example.spring02.controller.member; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.example.spring02.service.member.MemberService; @Controller @RequestMapping("/member/*") // 클래스 전체에서 사용하는 공통적인 url 매핑, 매핑을 할때 공통적인 코드를 줄이기 위해서 사용한다. public class MemberController { private static final Logger logger = LoggerFactory.getLogger(MemberController.class); // MemberController의 로그를 출력하기 위해 getLogger 메소드를 사용해서 LoggewrFactory 에 담고 logger 변수에 저장 // 컨트롤러에서 서비스를 호출하기 때문에 어노테이션을 사용해서 의존성을 주입해야한다. // 객체 생성과 소멸을 스프링에서 관리하게끔 하기 위해 @Inject MemberService memberService; @RequestMapping("login.do") // 이쪽에 있는건 세부적인 매핑 // login.do로 요청을 하면 member 폴더의 login.jsp 파일로 이동해서 로그인 할 수 있는 화면을 만들어주게끔 한다. public String login() { return "member/login"; } } | cs |
login.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <%@ 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> <%@ include file="../include/header.jsp"%> <script> //아래쪽에서 id값을 받아서 데이터를 전송한다. //click 메소드 안에 있는 함수를 실행해서 id와 비밀번호를 저장하고 //빈 값(공백값) 이면 경고창을 출력하고, 커서를 이동시킨다. // val () 메소드는 form (양식)의 값을 가져오거나 값을 설정하는 메소드 // focus () 메소드는 해당 요소에 포커스를 부여하고, 텍스트 창의 경우 커서를 위치시켜 바로 입력이 가능하도록 하던가 // 버튼의 경우, 엔터키를 눌렀을때 클릭 효과를 낸다. $(function(){ $("#btnLogin").click(function(){ var userid = $("#userid").val(); var passwd = $("#passwd").val(); if(userid==""){ alert("아이디를 입력하세요."); $("#userid").focus(); return; } if(passwd==""){ alert("비밀번호를 입력하세요."); $("#passwd").focus(); return; } //아이디와 비밀번호가 맞으면 login_check페이지로 넘어간다. document.form1.action = "${path}/member/login_check.do"; document.form1.submit(); }); }); </script> </head> <body> <%@ include file="../include/menu.jsp"%> <h2>로그인</h2> <form name="form1" method="post"> <table border="1" width="400px"> <tr> <td>아이디</td> <td><input id="userid" name="userid"></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" id="passwd" name="passwd"></td> </tr> <tr> <td colspan="2" align="center"> <!-- type가 button타입이기 때문에 데이터 전송기능이 없다. --> <!-- 그래서 id값을 javascript에 줘서 자바스크립트에서 데이터를 전송할 수 있게끔 한다. --> <button type="button" id="btnLogin">로그인</button> <!-- param(파라미터)를 사용해서 값이 다시 넘어오는 경우 로그인이 안되어있으면 (nologin) --> <!-- 먼저 로그인 하라는 메시지를 출력한다. --> <c:if test="${param.message == 'nologin' }"> <div style="color: red;">먼저 로그인 하세요.</div> </c:if> <!-- param(파라미터)를 사용해서 값이 넘어오는 경우에 아이디와 비밀번호가 틀려서 'error'과 같으면 --> <!-- 아이디 또는 비밀번호가 일치하지 않는다는 메시지를 출력함 --> <c:if test="${param.message == 'error' }"> <div style="color: red;">아이디 또는 비밀번호가 일치하지 않습니다.</div> </c:if> <!-- 또한 로그아웃틀 하게되면 로그아웃이 되었다는 메시지를 출력함 --> <c:if test="${param.message == 'logout' }"> <div style="color: red;">로그아웃 되었습니다.</div> </c:if> </table> </form> </body> </html> | cs |
login 페이지에서 로그인 정보를 쓰고 로그인 버튼을 누르면 컨트롤러의 logincheck 로 넘어감.
MemberController.java 중 일부
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //View (login 페이지에서 아이디와 비밀번호를 쓰게 되면 컨트롤러에서 이 메소드를 거쳐서 logincheck페이지로 이동함) @RequestMapping("login_check.do") public ModelAndView login_check(@ModelAttribute MemberDTO dto, HttpSession session) { //login페이지에서 넘어와서 DTO에 저장된 아이디와 비밀번호를 @ModeAttribute어노테이션을 사용해서 한꺼번에 2개를 다 받는다. //사용자가 로그인한 정보를 계속 가지고 있게 하기 위해서 세션도 받는다. //로그인 성공 => 이름이 넘어옴, 실패 => NULL이 넘어옴 String name = memberService.loginCheck(dto, session); //서비스 계층에 loginCheck메소드의 매개값으로 dto (아이디, 비밀번호, 세션) 변수 name에 저장 ModelAndView mav = new ModelAndView(); // 데이터를 보낼 뷰와 데이터를 동시에 설정하기 위해 ModelAndView타입의 객체를 생성한다. if (name != null) { //로그인이 성공하면 시작페이지로 이동함. mav.setViewName("home"); }else {//로그인이 실패하면 login 페이지로 다시 돌아감 mav.setViewName("member/login"); mav.addObject("message", "error"); //로그인 페이지에 에러라는 값을 준다. 그러면 그 에러메시지를 값으로 받아서 경고메시지 출력 } return mav; } | cs |
-로그아웃-
MemberController.java 중 일부
1 2 3 4 5 6 7 8 | @RequestMapping("logout.do") //logout.do에 매핑 public ModelAndView logout( HttpSession session, ModelAndView mav) { memberService.logout(session); //세션 초기화 작업 mav.setViewName("member/login"); //이동할 페이지의 이름 mav.addObject("message","logout"); //변수 저장 return mav; //페이지로 이동 } | cs |
login.jsp 중 일부
mav에 있는 logout 메시지가 아래 구문에서 걸려서 "로그아웃 되었습니다" 메시지를 출력한다.
1 2 3 4 5 | <c:if test="${message == 'logout' }"> <div style="color:red;"> 로그아웃되었습니다. </div> </c:if> | cs |
'Back-End > Spring' 카테고리의 다른 글
상품관리 (관리자 로그인/로그아웃) (0) | 2019.06.17 |
---|---|
상품관리 (장바구니 기능구현 - 삭제, 비우기, 수정) (3) | 2019.06.14 |
상품관리 (상품 상세 보기 구현) (0) | 2019.06.12 |
상품관리 (상품 목록 보기 구현) (0) | 2019.06.12 |
상품테이블 만들기, File Upload 테스트 (0) | 2019.06.11 |