이제 회원기능에서 마지막 기능인 회원 탈퇴입니다.
먼저 정상적으로 삭제가 되는지 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 |