2020_실전프로젝트1

MyBatis CRUD 프로젝트 + 로그인 기능 추가

carrot62 2020. 12. 10. 01:56

MyBatis CRUD 프로젝트를 만드는 과정이 궁금하다면 다음 블로그 글을 참고하자: carrot62.tistory.com/104

 

MyBatis CRUD 프로젝트

시작하기 전 mybatis plugin 설치하고 가기 1. 새 Spring MVC 프로젝트 생성 2. web.xml: UTF-8 encoding filter 추가 web.xml encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding..

carrot62.tistory.com


로그인하는 기능을 추가하는 전체적인 과정은 다음과 같다:

1. Spring framework 4.2.4 로 버전 변경(pom.xml)
2. DB에 테이블 생성 및 계정 추가
3. Mybatis Mapper XML file 생성
4. UserVO class 생성
5. UserDAO class 생성
6. UserServiceImpl class 생성
7. LoginController class 생성
8. LoginInterceptor class 생성
9. Interceptor 설정(xml file) - 로그인 체크 페이지와 그렇지 않은 페이지로 구분된다


1. Spring framework 4.2.4 로 버전 변경(pom.xml)

pom.xml 파일에서 다음과 같이 변경한다


2. DB에 테이블 생성 및 계정 추가

DB4free에서 다음 쿼리문을 실행한다(로그인 할 때 사용할 계정을 만드는 과정이다):

insert into member (userid, username, password) values ('admin', '관리자', '1234')

admin이라는 id와 1234를 비밀번호로 가지는 사용자 생성
db 테이블에 성공적으로 추간된 모습


3. Mybatis Mapper XML file 생성

mappers 폴더 아래에 만들도록 한다.

MyBatis XML Mapper 선택해서 XML 파일을 생성하도록 한다

MyBatis XML Mapper 파일, user-mapper.xml 을 만든다

<?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="User">

	<select id="getUser" resultType="user">
		select userid, username from member
		where userid=#{userid} and password=#{password}
	</select>
</mapper>

mybatis-config.xml 파일에 user alias가 미리 생성되어 있어야 한다. 그렇지 않으면 Alias가 defined되지 않았다는 에러가 뜨게 되니 주의하도록 하자(에러 관련된 사진과 메시지는 맨 아래 내용을 참고하도록 하자)

4. UserVO class 생성

com.my.bat.board 폴더 아래에 UserVO.java

private String userid;
private String password;
private String username;


5. UserDAO class 생성

package com.my.bat.user;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import com.my.bat.board.UserVO;

@Repository
public class UserDAO {

	@Autowired
	SqlSessionTemplate sqlSession;
	public UserVO getUser(UserVO vo) {
		return sqlSession.selectOne("User.getUser", vo);
	}
	
	public int insertAdmin() {
		int result = sqlSession.insert("User.insertAdmin");
		return result;
	}
}


6. UserServiceImpl class 생성

user 관련 클래스의 디렉터리 참고

package com.my.bat.user;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.my.bat.board.UserVO;

@Service
public class UserServiceImpl {
	
	@Autowired
	UserDAO userDAO;
	
	public UserVO getUser(UserVO vo) {
		return userDAO.getUser(vo);
	}
	
	public int insertAdmin() {
		return userDAO.insertAdmin();
	}
}

7. LoginController class 생성

package com.my.bat.user;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.my.bat.board.UserVO;
import com.my.bat.user.UserServiceImpl;

@Controller
@RequestMapping(value="/login")
public class LoginController {
	
	@Autowired
	UserServiceImpl service;
	
	@RequestMapping(value="/login", method= RequestMethod.GET)
	public String login(String t, Model model) {
		return "login";
	}
	
	@RequestMapping(value="/loginOk", method= RequestMethod.POST)
	public String loginCheck(HttpSession session, UserVO vo) {
		String returnURL = "";
		if(session.getAttribute("login") != null) {
			session.removeAttribute("login");
			
		}
		
		UserVO loginvo = service.getUser(vo);
		if(loginvo != null) { //로그인 성공적으로 했다는 뜻
			System.out.println("로그인 성공!");
				session.setAttribute("login", loginvo);
				returnURL = "redirect:/board/list"; // 로그인 실패했다는 뜻			
		}else {
			System.out.println("로그인 실패!");
				returnURL = "redirect:/login/login"; // 로그인 실패했다는 뜻
		}
		return returnURL;
	}
	
	//로그아웃 하는 부분
	@RequestMapping(value="/logout")
	public String logout(HttpSession session) {
		session.invalidate();
		return "redirect:/login/login";
	}

}

+ login.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>
<style>
	img, label{
		display:inline-block;
	}
	label{width: 130px}
	button{background-color:blue; color:white; font-size:15px}
</style>
</head>
<body>
<div style="width:100%;text-align:center;padding-top:100px">
<img src="../img/christmas.jpg" height="250">
<form method="post" action="loginOk">
<div><label>User ID: </label><input type="text" name="userid"/></div>
<div><label>Password: </label><input type="password" name="password"/></div>
<button type="submit">login</button>
</form>
</div>
</body>
</html>

login.jsp를 생성한 후 servlet-context.xml 에 다음 구문을 추가할 것(이미지를 처리하도록)

<resources location="/resources/img/" mapping="/img/**"/>

8. LoginInterceptor class 생성

com.my.bat.user 라는 패키지 아래에 LoginCheckInterceptor.java 파일을 생성한다

package com.my.bat.user;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class LoginCheckInterceptor extends HandlerInterceptorAdapter{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		HttpSession session = request.getSession();
		Object obj = session.getAttribute("login");
		if (obj == null) {
			response.sendRedirect(request.getContextPath()+"/login/login");
			return false;
		}
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		super.postHandle(request, response, handler, modelAndView);
	}
}


9. Interceptor 설정(xml file) - 로그인 체크 페이지와 그렇지 않은 페이지로 구분된다

servlet-context.xml 파일에 다음 부분을 추가하도록 한다:

<beans:bean id="LoginCheckInterceptor" class="com.my.bat.user.LoginCheckInterceptor">
</beans:bean>

<interceptors>
  <interceptor>
     <mapping path="/**" /> 
     <exclude-mapping path="/resources/**" />
     <exclude-mapping path="/img/**" />
     <exclude-mapping path="/login/**" />
     <beans:ref bean="LoginCheckInterceptor" />
  </interceptor>
</interceptors>

 

여기까지 모두 완료했다면 테스트를 해본다.

로그인이 성공적으로 된다면 리스트가 나오는 화면이 나타나지만 그러지 않을 경우에는 login 페이지로 계속 남아있게 된다

login 화면
로그인이 실패할 경우

비밀번호를 잘못 입력할 경우 계속 로그인 창에 머물게 된다

로그인에 성공한다면

로그인 한 후에 보이는 화면:

글 추가 기능 확인:

글 수정과 삭제 기능 확인:


 [참고용 소스] 

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias alias= "board" type="com.my.bat.board.BoardVO"/>
		<typeAlias alias="user" type="com.my.bat.board.UserVO"/> 
	</typeAliases>
</configuration>

 일어날 수 있는 에러 

Class/TypeAlias 'user' not found.

다음과 같은 에러가 뜨면 mybatis-config.xml 에서 alias 부분을 확인하도록 하자.