이번장에서는 회원 기능을 작성하도록 할텐데요.

회원기능에 적용해야 할 기능들은 크게 4가지로 나뉘어 집니다.

 

회원 가입, 로그인, 비밀번호 변경, 회원 탈퇴

 

게시판의 C R U D 와 다를게 없습니다.

 

이제 한번해보도록 하겠습니다.

 

먼저 프로젝트를 실행하면 처음 열리는 home.jsp에 로그인 기능을 하는 코드를 추가합니다.

이는 나중에 변경합니다!

 

<!-- home.jsp -->

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<html>
<head>
	<title>Home</title>
 
 	<script>
		
 	var result = '${result}'; // 쌍따음표 말고 따음표로 해야 데이터를 가져옴
 	
 	if(result === "registerOK") {
 		alert("회원가입에 성공하였습니다.");
 	} 
 	
 	</script>
</head>
<a href="/board/listPage">게시판</a><br />

<body>
	
	<form method ="post" autocomplete="off" action="/user/login">
		
		<div>
			<label for="identification">아이디</label>
			<input type="text" id="identification" name="identification" />
		</div>
		
		<div>
			<label for="password">비밀번호</label>
			<input type="password" id="password" name="password" />
		</div>
		
		<div>
			<button type="submit">로그인</button>
		</div>
	</form>
	
	<button type="button" onclick="location.href='/user/register'">회원가입</button>
	
</body>
</html>

 

1. USER 테이블 생성

 

   
create table user(
 identification varchar(50) NOT NULL PRIMARY KEY,
 password    varchar(3000)   not null,
 name    varchar(50)    not null,
 create_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 unique(name)
);

 

테이블을 생성했으니 VO를 작성해야 합니다.

 

2. UserVO 생성

 

package kr.co.web.domain;

import java.util.Date;

public class UserVO {
	
	private String identification;
	private String password;
	private String name;
	private Date create_date;
	
	public String getIdentification() {
		return identification;
	}
	public void setIdentification(String identification) {
		this.identification = identification;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getCreate_date() {
		return create_date;
	}
	public void setCreate_date(Date create_date) {
		this.create_date = create_date;
	}
}

 

 

3. userMapper.xml 작성

 

<?xml version="1.0" encoding="UTF-8"?>

<!-- DTD 선언 -->
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
	
<mapper namespace="userMapper">
	
   <insert id="register">
   		insert into user(identification, password, name)
   		values( #{identification}, #{password}, #{name})
   </insert>
   	
</mapper>

 

4. UserDAO 작성

 

<!-- UserDAO -->

package kr.co.web.persistence;

import kr.co.web.domain.UserVO;

public interface UserDAO {

	public void register(UserVO vo) throws Exception;
    
}

 

<!-- UserDAOImpl -->

package kr.co.web.persistence;

import javax.inject.Inject;

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

import kr.co.web.domain.UserVO;

@Repository
public class UserDAOImpl implements UserDAO{
	
	@Inject
	private SqlSession session;
	
	private static final String NS = "userMapper";
	private static final String REGISTER = NS + ".register";
	
	@Override
	public void register(UserVO vo) throws Exception {
		session.insert(REGISTER, vo);
	}

}

 

 

5. UserService 작성

 

<!-- UserService -->

package kr.co.web.service;

import kr.co.web.domain.UserVO;

public interface UserService {

	public void register(UserVO vo) throws Exception;

}

 

<!-- UserServiceImpl -->

package kr.co.web.service;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.co.web.domain.UserVO;
import kr.co.web.persistence.UserDAO;

@Service
public class UserServiceImpl implements UserService {
	
	@Inject
	private UserDAO user;
	
	@Override
	public void register(UserVO vo) throws Exception {
		user.register(vo);
	}
	
}

 

 

6. UserController 작성

 

<!-- UserController -->

package kr.co.web.controller;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
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.servlet.mvc.support.RedirectAttributes;

import kr.co.web.domain.UserVO;
import kr.co.web.service.UserService;

@Controller
@RequestMapping("/user/*")
public class UserController {

	@Inject
	private UserService service;
	
	private static final Logger logger = LoggerFactory.getLogger(UserController.class);
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public void registerGET() throws Exception {
		logger.info("registerGET");
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String registerPOST(UserVO vo, RedirectAttributes ra) throws Exception {
		logger.info("registerPOST");
		service.register(vo);
		ra.addFlashAttribute("result", "registerOK");
		
		return "redirect:/";
	}
	
}

 

/register인 경로가 2개가 있는데요~

자세히 보시면 GET과 POST로 구분이 되는것을 볼 수 있습니다.

예를 들어

회원가입을 할 때 보이는 페이지를 GET 방식

회원가입 페이지에서 입력 폼에 입력을하고 회원가입을 누를 때 동작하는 방식을 POST라고 

이해하시면 됩니다.

 

ra.addFlashAttribute("result", "registerOK");

return "redirect:/";

 

해당 코드는 사용자가 회원가입을 하고 리다이렉트로 로그인페이지로 넘겨주는데

경고창으로 '회원가입에 성공하였습니다' 라고 알려주기 위해 jsp로 model값을 보내는 것 입니다.

 

7. register.jsp 작성

 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
 <title>게시판</title> 
</head>
<body>

<form method="post" autocomplete="off">
 	
 	<div>
 		<label for="identification">아이디</label>
 		<input type="text" id="identification" name="identification" />
 	</div>
 	
 	<div>
 		<label for="password">비밀번호</label>
 		<input type="password" id="password" name="password" />
 	</div>
 	
 	<div>
 		<label for="name">이름</label>
 		<input type="text" id="name" name="name" />
 	</div>
 	
 	<div>
 		<button type="submit">가입</button>
 	</div>
 	
</form>

	<div>
		<button onclick ="location.href='/'">처음</button>
	</div>
</body>
</html>

 

지금까지 게시판 프로젝트를 진행하면서 설명을 했지만 

기억이 사라지신 분들을 위해 부가설명을 하도록 하겠습니다.

<label> 태그의 for속성이 "identification" 이고

<input> 태그의 id와 name이 "identification" 입니다.

이는 label과 input이 같은것이다~ 라고 알려주는 것이고

 

여러분들이 무조건 알아야 할 것은 "name" 속성입니다

이 name속성은 DB에 있는 컬럼과 동일하게 작성해야합니다. ( DB == VO == name 속성)

 

 

 

 

회원 가입 버튼을 클릭합니다.

 

 

 

가입버튼을 누르면 register post 메서드가 실행이 되어 

controller -> service -> dao -> mapper -> db 

같은 방향으로 흘러가 정상적으로 

아이디가 test인 회원이 회원가입을 할 수 있습니다.

 

회원가입을 했으니 한번 DB를 확인 해볼까요? 

 

 

정상적으로 회원가입이 되었습니다!

 

지금은 password가 aaaa라고 출력이되지만

회원기능을 마치고 스프링 시큐리티를 이용해 암호화를 진행 할 예정입니다.

+ Recent posts