다가오는 다음을 향해

[Spring MVC] DB 로그인, 로그아웃 구현 본문

국비학원 공부노트/Spring MVC

[Spring MVC] DB 로그인, 로그아웃 구현

hyeseo 2022. 3. 16. 17:16

[ 개발환경 ]
MacBook Air M1 2020년형 
eclipse [2021-3 var]
Java [zulu-8]
JSP
Tomcat [Apache Tomcat/9.0.58]

[ version ]
- springframework - 4.3.14
- aspectj - 1.8.9
- Test - 4.12

Maven repository
- mysql-connector-java  8.0.27
- spring-jdbc - 4.3.14
- spring-test - 4.3.14

mybatis - 3.4.4
mybatis-spring - 1.3.1


 

 

오늘 수업  : DB 로그인, 로그아웃

 

 

DB table 만들기


1. user table 

CREATE TABLE `scott`.`springuser` (
  `id`  VARCHAR(15) NOT NULL,
  `name` VARCHAR(15) NOT NULL,
  `password` VARCHAR(15) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

2.  user data insert

INSERT INTO `scott`.`springuser` (`id`, `name`, `password`) VALUES ('root', '관리자', 'root');
INSERT INTO `scott`.`springuser` (`id`, `name`, `password`) VALUES ('system', '시스템관리자', 'system');
INSERT INTO `scott`.`springuser` (`id`, `name`, `password`) VALUES ('user00', '영업1', 'user00');

 

3. board table (오늘 수업시간에는 연결하지 않았다.)

CREATE TABLE `board` (
  `bno` int NOT NULL AUTO_INCREMENT,
  `title` varchar(45) NOT NULL,
  `content` varchar(100) NOT NULL,
  `id` varchar(20) NOT NULL,
  `regdate` datetime NOT NULL,
  `readcnt` int NOT NULL,
  `etc` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`bno`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
CREATE TABLE `board_reply` (
  `reno` int NOT NULL AUTO_INCREMENT,
  `rewriter` varchar(45) NOT NULL,
  `rememo` varchar(45) NOT NULL,
  `redate` datetime NOT NULL,
  `bno` int NOT NULL,
  PRIMARY KEY (`reno`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 

 

 

작성파일


DAO는 mybatis를 호출, Service는 DAO, Controller는 Service를 호출하기 때문에 반대 순서로 work를 작성한다.

 

  • boardMapper.xml
  • BoardController.java
  • BoardService.java  /BoardServiceImpl.java
  • BoardDAO.java  / BoardDAOImpl.java

 

boardMapper.xml


Mybatis의 SqlSession을 호출하는 XML 매핑구문을 작성한다. (SqlSessionFactory)

<?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 namespace="kr.co.dong.boardMapper">
	<!-- 로그인 처리를 위한 SQL -->
	<select id="login" parameterType="java.util.Map" resultType="java.util.Map">
		select id, name
		from springuser
		where id=#{id} and password=#{password}
	</select>
</mapper>

 

kr.co.dong.boardMapper 네임스페이스에서 정의한 매핑 이름(id)은 login이고,

java.util.Map타입의 파라미터를 가진다.

그리고 결과데이터는 java.util.Map에 저장된다.

 

  • 네임스페이스(Namespaces):   구문을 구분하기 위해 패키지경로를 포함하여 작성한다.
  • select :  데이터베이터에서 데이터를 가져온다.(조회기능)
  • 파라미터 표기법 : #{id}, #{password}

 

▼ 위 코드에서 사용된 Select 엘리먼트 속성

속성 설명
id 구문을 찾기 위해 사용될수 있는 네임스페이스 내 유일한 구분자
parameterType 구문에 전달될 파라미터 패키지 경로를 포함한 전체 클래스 명이나 별칭
resultType 구문에 의해 리턴되는 기대타입의 패키지 경로를 포함한 전체 클래스명이나 별칭 / 매핑하려는 자바 클래스의 전체경로

참조 :https://mybatis.org/mybatis-3/ko/sqlmap-xml.html

 

 

 

 

BoardDAO.java/BoardDAOImpl.java


Mybatis로 작성한 SqlSessionFactory에서 인터페이스를 호출하기 때문에

boardDAO interface와 boardDAO를 implements한 boardDAOImpl 를 작성한다.

 

BoardDAO.java

package kr.co.dong.board;

import java.util.Map;

public interface BoardDAO {
	// 로그인 처리를 위한 메소드
	public Map login(Map<String, Object> map);
}

 

 

BoardDAOImpl.java

package kr.co.dong.board;

import java.util.Map;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

@Repository
public class BoardDAOImpl implements BoardDAO {
	
	@Inject
	private SqlSession sqlSession;
	
	private static final String nameSpace="kr.co.dong.boardMapper";

	@Override
	public Map login(Map<String, Object> map) {
		return sqlSession.selectOne(nameSpace+".login", map);
	}

}

* Map <string, Object>에서 value를 Object로 하면 Type을 클래스로 정의할 수 있기 때문에 result값 오류가 없다.

 

BoardDAO 의 login 메소드에서

mybatis의 에 정의된 SqlSession 인스턴스를 생성하여 리턴된 result를 Service로 보낸다.

sqlSession.selectOne(네임스페이스(nameSpace+".ID", 리턴타입);

 

 

 

 

 

BoardService.java/BoardServiceImpl.java


BoardDAO에서 리턴된 result를 controller로 보낸다.

 

BoardService.java

package kr.co.dong.board;

import java.util.Map;

public interface BoardService {
	// 로그인 처리를 위한 메소드
	public Map login(Map<String, Object> map);

}

 

 

BoardServiceImpl.java

package kr.co.dong.board;

import java.util.Map;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

@Service
public class BoardServiceImpl implements BoardService {
	
	@Inject
	private BoardDAO boardDAO;

	@Override
	public Map login(Map<String, Object> map) {
		return boardDAO.login(map);
	}
}

 

 

BoardController.java


❶ board/login   : GET
           -> 로그인폼으로 이동 (/login.jsp)
❷ board/login   : POST   -> Service -> DAO 호출
         a) 사용자 ok : session "user"에 값 부여 -> redircet:/
         b)사용자 no ----->    redircet:login
❸ board/logout : GET
          세션해제 ----> redirect:/

 

 

 

BoardController.java

package kr.co.dong.board;

import java.util.Map;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class BoardController {
	
	private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
	
	@Inject
	private BoardService boardService;
	
	@RequestMapping(value="board/login", method=RequestMethod.GET)	
	public String loginForm() {
		logger.info("로그인폼으로 이동");
		return "login";
	}
	
	@RequestMapping(value="board/login", method=RequestMethod.POST)
	public String login(@RequestParam Map<String, Object> map,
			HttpServletRequest request, HttpServletResponse response, HttpSession session) throws Exception {
		
		request.setCharacterEncoding("utf-8");

		logger.info("DB 로그인 확인");
		
		Map user=boardService.login(map);
		
		if (user==null) {
			logger.info("로그인 실패");
			return "redirect:login";
		} else {
			logger.info("로그인 성공");
			//세션부여 
			session.setAttribute("user", user);
			return "redirect:/";
		}
	}
	
	@RequestMapping(value="board/logout", method=RequestMethod.GET)	
	public String logout(HttpSession session) {
		logger.info("로그아웃");
		session.invalidate();
		return "redirect:/";
	}
}

 

 

loginView


 

❶ board/login   : GET
           -> 로그인폼으로 이동 (/login.jsp)

 

로그인 화면

 


❷ board/login   : POST   -> Service -> DAO 호출
         a) 사용자 ok : session "user"에 값 부여 -> redircet:/
         b)사용자 no ----->    redircet:login

 

 

✎ 로그인 성공

로그인 성공

 

✎ 로그인 실패

 


❸ board/logout : GET
          세션해제 ----> redirect:/

 

로그아웃 전
로그아웃 후

session.invalidate(); 세션 객체의 오브젝트를 초기화 시켜준다.