이제 회원기능에서 마지막 기능인 회원 탈퇴입니다.

 

먼저 정상적으로 삭제가 되는지 DB에서 

임시데이터를 생성하고 삭제해보겠습니다.

 

 

 

정상적으로 삭제 되었습니다.

잘 삭제가 되는것을 확인했으니 mapper를 작성하도록 하겠습니다.

 

1. 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>
   
   <select id="login" resultType="UserVO">
   		select identification, name, password
   		from user
   		where identification = #{identification} and password = #{password}
   </select>
   
   <update id="modify">
   		update user
   		set password = #{password}
   		where identification = #{identification}
   </update>
   
   <delete id="remove">
   		delete 
   		from user
   		where identification = #{identification} and password = #{password}
   </delete>
    	
</mapper>

 

회원탈퇴시에 비밀번호를 입력하여 사용자를 인증하게 됩니다.

그때 기존 비밀번호가 필요하기에 로그인 쿼리에 password를 추가해주었습니다.

 

2. DAO 작성

 

package kr.co.web.persistence;

import kr.co.web.domain.UserVO;

public interface UserDAO {

	public void register(UserVO vo) throws Exception;
	public UserVO login(UserVO vo) throws Exception;
	public void modify(UserVO vo) throws Exception;
	public void remove(UserVO vo) throws Exception;
}

 

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";
	private static final String LOGIN = NS + ".login";
	private static final String MODIFY = NS + ".modify";
	private static final String REMOVE = NS + ".remove";
	
	@Override
	public void register(UserVO vo) throws Exception {
		session.insert(REGISTER, vo);
	}
	
	@Override
	public UserVO login(UserVO vo) throws Exception {
		return session.selectOne(LOGIN, vo);
	}
	
	@Override
	public void modify(UserVO vo) throws Exception {
		session.update(MODIFY, vo);
	}
	
	@Override
	public void remove(UserVO vo) throws Exception {
		session.delete(REMOVE, vo);
	}
}

 

 

3. SERVICE 작성

 

package kr.co.web.service;

import kr.co.web.domain.UserVO;

public interface UserService {

	public void register(UserVO vo) throws Exception;
	public UserVO login(UserVO vo) throws Exception;
	public void modify(UserVO vo) throws Exception;
	public void remove(UserVO vo) throws Exception;
}

 

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);
	}
	
	@Override
	public UserVO login(UserVO vo) throws Exception {
		return user.login(vo);
	}
	
	@Override
	public void modify(UserVO vo) throws Exception {
		user.modify(vo);
	}
	
	@Override
	public void remove(UserVO vo) throws Exception {
		user.remove(vo);
	}
}

 

4. remove.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> 
 
 <script>
 	var result = '${result}';
 	
 	if(result === "removeFalse") {
 		alert("비밀번호를 다시 입력해주세요.");
 	}
 </script>
</head>
<body>

<form method="post" autocomplete="off">
 	
 	<div>
 		<label for="identification">아이디</label>
 		<input type="text" id="identification" name="identification" value="${user.identification}" readonly/>
 	</div>
 	
 	<div>
 		<label for="password">비밀번호</label>
 		<input type="password" id="password" name="password" />
 	</div>
 	
 	<div>
 		<button type="submit">회원탈퇴</button>
 	</div>
 	
</form>

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

 

설명드리지 않아도 되겠죠??

 

5. Controller 작성

 

이제 회원탈퇴를 위한 메서드를 작성하겠습니다.

 

<!-- UserController -->

	@RequestMapping(value="/remove", method = RequestMethod.GET)
	public void removeGET() throws Exception {
		logger.info("removeGET");
	}
	
	@RequestMapping(value="/remove", method = RequestMethod.POST)
	public String removePOST(UserVO vo, HttpSession session, RedirectAttributes ra) throws Exception {
		logger.info("removePOST");
		
		UserVO user = (UserVO)session.getAttribute("user");
		
		String oldPass = user.getPassword();
		String newPass = vo.getPassword();
		
		if(oldPass.equals(newPass)) {
			service.remove(vo);
			ra.addFlashAttribute("result", "removeOK");
			session.invalidate();
			return "redirect:/";
		} else {
			ra.addFlashAttribute("result", "removeFalse");
			return "redirect:/user/remove";
		}
	}

 

removePOST를 보겠습니다.

 

session.getAttribute("user");

 

 를 이용하여 로그인할 때 생성되는세션에서 user값을 받아옵니다.

기본적으로 받아오는 데이터 타입은 오브젝트(Object) 타입이므로, 오브젝트 변수를 생성하여

받거나 형변환(캐스팅)을 해주어야 하는데요.

 

session.getAttribute("user");

 

가 UserVO의 형태라는 것을 알고있기에

(UserVO)session.getAttribute("user");

형태로 형변환 할 수 있으며, UserVO형의 변수 user에 값을 넣을 수 있습니다.

 

이렇게 받아온 user는 UserVO에서 만들어 두었던 getter를 이용하여 내부에 접근할 수 있으며,

문자열 변수 oldPass에 user에 있는 비밀번호를 넣어줍니다.

다른 문자열 변수 newPass에는 회원탈퇴 페이지에 입력했던 비밀번호를 넣어줍니다.

 

회원가입할 때 만들었던 비밀번호인 oldPass와 newPass를 비교해야하는데

문자열 변수를 비교할 때 ==를 사용하여 비교하면 다른 결과가 나오는데

이는 oldPass와 newPass에 들어있는 비밀번호를 비교하는것이 아니라

주소를 비교하는것이기 때문에 다른 결과가 나오는 것입니다.

 

oldPass와 newPass에 들어있는 실제 값을 비교하고 싶으면

.equals()을 사용해야합니다.

이는 실제 변수가 가진 값을 비교하는 것입니다.

 

조건문쪽을 보시면

 

만약에 oldPass와 newPass가 같다면

삭제를 진행하고

redirectAttributes 값으로 정상적으로 삭제되었다는 모델값을 보낸 후

회원탈퇴가 되었으니 invalidate()로 세션을 무효화 시키고

return 값을 home.jsp로 설정하여 로그인페이지로 다시 가도록 설정했습니다.

 

하지만 oldPass와 newPass가 다르다면

redirectAttributes 값으로 삭제에 실패했다는 모델값을 보내고

return 값은 다시 회원삭제 페이지로 설정했습니다.

 

확인해볼까요?

 

 

회원탈퇴 버튼을 클릭하면

 

 

비밀번호를 입력하고 회원탈퇴를 클릭하면 removePOST 메서드가 실행되어

test2 사용자를 삭제합니다.

 

 

'JAVA > blog' 카테고리의 다른 글

비밀번호 암호화 기능  (0) 2020.08.05
아이디 중복검사 기능  (0) 2020.08.04
회원(3) - 비밀번호 변경  (0) 2020.07.31
회원 (2) - 로그인, 로그아웃 기능  (0) 2020.07.31
회원 (1) - 가입 기능  (0) 2020.07.31

+ Recent posts