728x90
Spring - 게시판 만들기 연습 (회원 로그인, 로그아웃 구현)
1. 실행화면
01) 로그인 상단메뉴 생성
02) 로그인 화면으로 이동
03) 로그인 성공시
상단에 로그인한 회원상태 메시지 출력, 로그아웃 버튼 생성, 환영 문구 페이지 출력
아이디나 비밀번호가 불일치하면 로그인 버튼 하단에 불일치 알림 문구 출력
04) 로그아웃
로그아웃되었는지 로그인버튼 하단에 확인 메시지 출력
2. 소스코드
01) Controller(흐름제어)
MemberController(로그인, 로그아웃 매핑)
package com.example.spring02.controller.member; import javax.inject.Inject; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.example.spring02.model.member.dto.MemberVO; import com.example.spring02.service.member.MemberService; @Controller // 현재 클래스를 스프링에서 관리하는 컨트롤러 bean으로 생성 @RequestMapping("/member/*") // 모든맵핑은 /member/를 상속 public class MemberController { // 로깅을 위한 변수 private static final Logger logger = LoggerFactory.getLogger(MemberController.class); @Inject MemberService memberService; // 01. 로그인 화면 @RequestMapping("login.do") public String login(){ return "member/login"; // views/member/login.jsp로 포워드 } // 02. 로그인 처리 @RequestMapping("loginCheck.do") public ModelAndView loginCheck(@ModelAttribute MemberVO vo, HttpSession session){ boolean result = memberService.loginCheck(vo, session); ModelAndView mav = new ModelAndView(); if (result == true) { // 로그인 성공 // main.jsp로 이동 mav.setViewName("home"); mav.addObject("msg", "success"); } else { // 로그인 실패 // login.jsp로 이동 mav.setViewName("member/login"); mav.addObject("msg", "failure"); } return mav; } // 03. 로그아웃 처리 @RequestMapping("logout.do") public ModelAndView logout(HttpSession session){ memberService.logout(session); ModelAndView mav = new ModelAndView(); mav.setViewName("member/login"); mav.addObject("msg", "logout"); return mav; } } | cs |
02) Service(비지니스 로직,DB연동 이외의 작업)
MemberService(인터페이스)
package com.example.spring02.service.member; import javax.servlet.http.HttpSession; import com.example.spring02.model.member.dto.MemberVO; public interface MemberService { // 01_01. 회원 로그인 체크 public boolean loginCheck(MemberVO vo, HttpSession session); // 01_02. 회원 로그인 정보 public MemberVO viewMember(MemberVO vo); // 02. 회원 로그아웃 public void logout(HttpSession session); } | cs |
MemberServiceImpl(인터페이스 구현 클래스)
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.MemberVO; @Service // 현재 클래스를 스프링에서 관리하는 service bean으로 등록 public class MemberServiceImpl implements MemberService { @Inject MemberDAO memberDao; // 01_01. 회원 로그인체크 @Override public boolean loginCheck(MemberVO vo, HttpSession session) { boolean result = memberDao.loginCheck(vo); if (result) { // true일 경우 세션에 등록 MemberVO vo2 = viewMember(vo); // 세션 변수 등록 session.setAttribute("userId", vo2.getUserId()); session.setAttribute("userName", vo2.getUserName()); } return result; } // 01_02. 회원 로그인 정보 @Override public MemberVO viewMember(MemberVO vo) { return memberDao.viewMember(vo); } // 02. 회원 로그아웃 @Override public void logout(HttpSession session) { // 세션 변수 개별 삭제 // session.removeAttribute("userId"); // 세션 정보를 초기화 시킴 session.invalidate(); } } | cs |
03) Model(비지니스 로직, DB연동 작업)
MemberVO(데이터 저장소)
package com.example.spring02.model.member.dto; import java.sql.Date; public class MemberVO { private String userId; private String userPw; private String userName; private String userEmail; private Date userRegdate; // java.sql.Date private Date userUpdatedate; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserPw() { return userPw; } public void setUserPw(String userPw) { this.userPw = userPw; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserEmail() { return userEmail; } public void setUserEmail(String userEmail) { this.userEmail = userEmail; } public Date getUserRegdate() { return userRegdate; } public void setUserRegdate(Date userRegdate) { this.userRegdate = userRegdate; } public Date getUserUpdatedate() { return userUpdatedate; } public void setUserUpdatedate(Date userUpdatedate) { this.userUpdatedate = userUpdatedate; } @Override public String toString() { return "MemberVO [userId=" + userId + ", userPw=" + userPw + ", userName=" + userName + ", userEmail=" + userEmail + ", userRegdate=" + userRegdate + ", userUpdatedate=" + userUpdatedate + "]"; } } | cs |
MemberDAO(인터페이스)
package com.example.spring02.model.member.dao; import javax.servlet.http.HttpSession; import com.example.spring02.model.member.dto.MemberVO; public interface MemberDAO { // 01_01. 회원 로그인 체크 public boolean loginCheck(MemberVO vo); // 01_02. 회원 로그인 정보 public MemberVO viewMember(MemberVO vo); // 02. 회원 로그아웃 public void logout(HttpSession session); } | cs |
MemberDAOImpl(인터페이스 구현 클래스)
package com.example.spring02.model.member.dao; import javax.inject.Inject; import javax.servlet.http.HttpSession; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Repository; import com.example.spring02.model.member.dto.MemberVO; @Repository // 현재 클래스를 스프링에서 관리하는 dao bean으로 등록 public class MemberDAOImpl implements MemberDAO { // SqlSession 객체를 스프핑에서 생성하여 주입 // 의존관계 주입(Dependency Injection), 느슨한 결합 @Inject SqlSession sqlSession; // mybatis 실행 객체 // 01_01. 회원 로그인체크 @Override public boolean loginCheck(MemberVO vo) { String name = sqlSession.selectOne("member.loginCheck", vo); return (name == null) ? false : true; } // 01_02. 회원 로그인 정보 @Override public MemberVO viewMember(MemberVO vo) { return sqlSession.selectOne("member.viewMember", vo); } // 02. 회원 로그아웃 @Override public void logout(HttpSession sessin) { } } | cs |
memberMappper.xml(mybatis)
<?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="loginCheck" resultType="String"> SELECT user_name AS userName FROM tbl_member WHERE user_id = #{userId} AND user_pw = #{userPw} </select> <select id="viewMember" resultType="com.example.spring02.model.member.dto.MemberVO"> SELECT user_name AS userName, user_id AS userId, user_email AS userEmail, user_regdate AS userRegdate FROM tbl_member WHERE user_id = #{userId} AND user_pw = #{userPw} </select> </mapper> | cs |
03) View(화면)
login.jsp(로그인페이지 : 로그인 성공, 실패, 로그아웃 메시지 알림)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>로그인페이지</title> <%@ include file="../include/header.jsp" %> <script> $(document).ready(function(){ $("#btnLogin").click(function(){ // 태크.val() : 태그에 입력된 값 // 태크.val("값") : 태그의 값을 변경 var userId = $("#userId").val(); var userPw = $("#userPw").val(); if(userId == ""){ alert("아이디를 입력하세요."); $("#userId").focus(); // 입력포커스 이동 return; // 함수 종료 } if(userPw == ""){ alert("아이디를 입력하세요."); $("#userPw").focus(); return; } // 폼 내부의 데이터를 전송할 주소 document.form1.action="${path}/member/loginCheck.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 name="userId" id="userId"></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="userPw" id="userPw"></td> </tr> <tr> <td colspan="2" align="center"> <button type="button" id="btnLogin">로그인</button> <c:if test="${msg == 'failure'}"> <div style="color: red"> 아이디 또는 비밀번호가 일치하지 않습니다. </div> </c:if> <c:if test="${msg == 'logout'}"> <div style="color: red"> 로그아웃되었습니다. </div> </c:if> </td> </tr> </table> </form> </body> </html> | cs |
home.jsp(메인페이지)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html> <head> <title>Home</title> <%@ include file="include/header.jsp" %> </head> <body> <%@ include file="include/menu.jsp" %> <c:if test="${msg == 'success'}"> <h2>${sessionScope.userName}(${sessionScope.userId})님 환영합니다.</h2> </c:if> </body> </html> | cs |
menu.jsp(상단 로그인상태 표시, 로그아웃 링크)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- jstl 코어 태그 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <a href="${path}/board/list.do">게시판</a> <c:choose> <c:when test="${sessionScope.userId == null}"> <a href="${path}/member/login.do">로그인</a> </c:when> <c:otherwise> ${sessionScope.userName}님이 로그인중입니다. <a href="${path}/member/logout.do">로그아웃</a> </c:otherwise> </c:choose> <hr> | cs |