다가오는 다음을 향해
[Spring MVC] DB 로그인, 로그아웃 구현 본문
[ 개발환경 ]
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(); 세션 객체의 오브젝트를 초기화 시켜준다.
'국비학원 공부노트 > Spring MVC' 카테고리의 다른 글
[Spring MVC] 댓글 구현(게시판 구현 후 ) (0) | 2022.04.14 |
---|---|
[Spring MVC] 게시판 구현 (0) | 2022.04.13 |
[Spring MVC] 기본동작 구현 (0) | 2022.03.15 |
[Spring MVC] JSTL Templates 추가 (0) | 2022.03.10 |
[Spring MVC] Server Auto Reload 변경 (0) | 2022.03.10 |