Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

KSI일기장

0428spring 마이페이지(3) 회원탈퇴 본문

Spring

0428spring 마이페이지(3) 회원탈퇴

MyDiaryYo 2023. 5. 3. 17:18

MyPageController

@Controller //bean으로 등록
@RequestMapping("/member/myPage")
@SessionAttributes({"loginMember"})	//session scope에서 loginMember를 얻어옴
public class MyPageController {

	@Autowired
	private MyPageService service;	//Service 연결

	//회원 정보 조회 이동
	@GetMapping("/info")
	public String info() {
		return "member/myPage-info";
		// WEB-INF/views/member/myPage-info
	}

	//비밀번호 변경 이동
	@GetMapping("/changePw")
	public String changePw() {
		return "member/myPage-changePw";
		// WEB-INF/views/member/myPage-info
	}

	//회원탈퇴 이동
	@GetMapping("/secession")
	public String secession() {
		return "member/myPage-secession";
		// WEB-INF/views/member/myPage-info
	}
    
    
    
    
    //회원탈퇴(세션, 쿠키 무효화)
	@PostMapping("/secession")
	public String secession(@ModelAttribute("loginMember") Member loginMember,
							SessionStatus status,
							HttpServletRequest req, HttpServletResponse resp,
							RedirectAttributes ra) {

		//회원탈퇴 서비스 호출
		int result = service.secession(loginMember);

		String message = null;
		String path = null;

		if(result>0) {

			if(result>0) {
				message = "회원탈퇴 되었습니다";
				path = "/";

				//탈퇴 후 세션 없애기
				status.setComplete();

				//탈퇴 후 쿠기 없애기
				//쿠키생성
				Cookie cookie = new Cookie("saveId", "");
				cookie.setMaxAge(0);
				cookie.setPath(req.getContextPath());
				resp.addCookie(cookie);

			}else {
				message = "비밀번호가 일치하지 않습니다";
				path = "secession";
			}

		}
		ra.addFlashAttribute("message", message);

		return "redirect:" + path;

	}

->

-HttpServletRequest  :HTTP 요청 정보(클라이언트 요청, 쿠키, 세션 등)를 제공하는 인터페이스이다

                                     :HTTP 프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용

                                      :Message Body의 stream을 읽어들이는 메서드를 가지고 있다

                                        ->ex) getParameter(ex) :ex와 같은 이름의 매개변수를 가져온다 

 - HttpServletResponse  :HTTP 응답 정보(정보처리결과)를 제공하는 인터페이스이다

                                      :HttpServletResponse객체에  응답코드, 응답메세지 등을 담아서 보낸다

 

 -SessionStatus :Session에 남긴 데이터를 정리하는데 활용하는 인터페이스이다

 

 -addFlashAttribute :addAttribute와 비슷하지만 FlashAttributes는 요청을 보낼 때 session에 넣고 넘겨준다

                                그리고 다음 요청이 처리되면 session에서 지워지게된다 (일회성)

                               

                                 addAttribute의 경우 전달한 값은 url뒤에 붙어 url파라미터형태로 전달되기때문에

                                보안상 이슈가 있을 수 있습니다, Model에 데이터를 담고 View로 전달한다,

                                 리프레시해도 데이터가 유지된다

                                  

                               addFlashAttribute의 경우 한번만 사용가능한 데이터이다,

                              한번만 사용하고 소멸하는 데이터입니다, 리프레시하면 데이터 소멸된다

                              전달한 값은 url뒤에 붙지 않아  url에 데이터가 노출되지 않아 보안상 안전하다

 

MyPageService

/**회원탈퇴 서비스
	 * @param loginMember
	 * @return
	 */
	public int secession(Member loginMember);

MyPageServiceImpl

//회원탈퇴
	@Override
	public int secession(Member loginMember) {

		//1. DB에서 현재회원의 비밀번호 조회
		String encPw = dao.checkPw( loginMember.getMemberNo());

		if(bcrypt.matches( loginMember.getMemberPw(), encPw) ) {
			//2. 비밀번호가 일치하면 회원번호를 이용해 탈퇴 진행
			return dao.secession(loginMember.getMemberNo());
		}

		//3.비밀번호가 일치하지 않으면 0 반환
		return 0;
	}

MyPageDAO

/**회원탈퇴 DAO
	 * @param memberNo
	 * @return
	 */
	public int secession(int memberNo) {
		return sqlSession.update("myPageMapper.secession", memberNo);
	}
    
    /**현재 로그인한 회원 비밀번호 조회 DAO
	 * @param memberNo
	 * @return
	 */
	public String checkPw(int memberNo) {

		return sqlSession.selectOne("myPageMapper.checkPw", memberNo);
	}

->Controller,Service,ServiceImpl에서 loginMember로 넘겨줬는데 DAO에서만 memberNo로 넘어온 이유는?

->ServiceImpl에서 DAO로 넘겨줄때 loginMember.getMemberNO()로 넘겨줬는데

   getMemberNo가 Member VO에서 얻어온 getter인데 그 변수명이 memberNo이기 때문이다 

 

myPage-mapper.xml

<!-- 비밀번호 비교를 위한 비밀번호 조회 -->
  	<select id="checkPw" resultType="string">
  		SELECT MEMBER_PW FROM MEMBER_S
  		WHERE MEMBER_NO = ${memberNo}
  	</select>

<!-- 회원탈퇴 -->
  	<update id="secession">
  		UPDATE MEMBER_S SET
		SECESSION_FL  = 'Y'
		WHERE MEMBER_NO = ${memberNo}
  	</update>