Spring

[Spring] Day08 (Code): 마이페이지, 회원정보 수정 및 삭제

jnk1m 2022. 3. 25. 22:27

마이페이지

1. controller

//마이페이지
	@GetMapping("mypage")
	public void mypage() {
		System.out.println("mypage 요청!");
	}

 

2. mypage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MY Page</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css"> 
</head>
<body>

<%--로그인 안했을 때 alert 띄우고 로그인폼으로 이동--%>
<c:if test="${sessionScope.memId == null}"> 
	<script>
		alert("로그인 후 사용 가능합니다.");
		window.location.href="/member/login";
	</script>
</c:if>


<%--로그인 했을 때 보여주기--%>
<c:if test="${sessionScope.memId != null}"><br/>
<h1 align="center">마이 페이지</h1>
<table>
	<tr>
		<td><a href="/member/modify">회원 정보 수정</a></td>
	</tr>
	<tr>
		<td><a href="/member/delete">회원 탈퇴</a></td>
	</tr>
	<tr>
		<td><a href="/member/main">메인</a></td>
	</tr>
</table>
</c:if>

</body>
</html>

 

회원 정보 수정 (modify): 회원 정보를 가져옴

1. 컨트롤러 

#1.컨트롤러에서 ID 뽑아 서비스에 전달하는 방식

@GetMapping("modify")
	public void modify(HttpSession session, Model model) {
		System.out.println("modify 요청!");
		//로그인한 회원 정보를 전체 뽑아서 뷰에 전달하는 비즈니스 로직이 필요.
		//서비스야 회원 정보 DB에서 가져와서 나한테 전달해줘
		
		//#1. 컨트롤러에서 ID뽑아 서비스에 전달
		//세션에서 id 뽑기. Object로 돌려주니 String으로 형변환해서 담기. 
		String id=(String)session.getAttribute("memId"); //세션에서 getAtri를 하면 리턴 타입이 오브젝트가 됨 그래서 형변환
		MemberVO member = memberService.getMember(id);
		model.addAttribute("member", member); //뷰까지 멤버라는 이름으로 모든 필드가 채워진 정보를 전달. 
		//내가 받아서 뷰에 전달할게
		
		
	}

 

#2. 서비스에서 직접 id 뽑아서 사용

	@GetMapping("modify")
	public void modify(HttpSession session, Model model) {
		System.out.println("modify 요청!");
		MemberVO member = memberService.getMember();
		model.addAttribute("member", member);
	}

 

 

2.  서비스, 서비스Impl

#1.컨트롤러에서 ID 뽑아 서비스에 전달하는 방식

//회원 한명 정보 가져오기 회원 정보 가져와서 컨트롤러에 리턴해줘야 함. 회원 정보 가지고 있는 멤버vo로 리턴
	public MemberVO getMember(String id); //#1. 컨트롤러에서 id 뽑아서 던져주면 매개변수o

-

//회원 정보 가져오기 #1.
	@Override
	public MemberVO getMember(String id) {
		MemberVO member = memberMapper.getMember(id); //실행한 쿼리문 결과를 member로 받아서 컨트롤러에 전달해줄거임
		return member; //컨트롤러한테 전달해줄게
	}

 

#2. 서비스에서 직접 id 뽑아서 사용

public MemberVO getMember();//#2. 서비스에서 직접 id 뽑아서 사용하면 매개변수 x

-

	//회원 정보 가져오기 #2
	@Override
	public MemberVO getMember() {
		String id = (String)(getSession().getAttribute("memId"));
		MemberVO member = memberMapper.getMember(id);
		return member;
	}

 

 

3. 매퍼

//회원 한명 정보 가져오기 //레코드 한줄을 가져올 수 있는건 VO.레코드 한줄이라 리스트 필요x
	public MemberVO getMember(String id);//id를 필요로 하니 매개변수로 던져주기

-

<!-- 회원 정보 수정 -->
  <select id="getMember" resultType="com.member.domain.MemberVO">
  	select * from springMember where id = #{id}
  </select>

 

4. modify.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Modify</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css"> 
</head>
<body>
<br/>
<h1 align="center">회원 정보 수정 폼</h1>
<form action="/member/modify" method="post">
<table><!-- 컨트롤러에서 회원 정보를 가져와서 뿌려줘야 함.  -->
			<tr>
				<td>아이디 *</td> <!-- 아이디 등 바꿀 수 없는 정보는 출력만 하게 해준다.  -->
				<td>${member.id}</td>
			</tr>
			<tr>
				<td>비밀번호 *</td>
				<td><input type="password" name="pw" value="${member.pw}"/></td>
			</tr>
			<tr>
				<td>비밀번호 확인*</td>
				<td><input type="password" name="pwch"/></td>
			</tr>
			<tr>
				<td>이름*</td>
				<td>${member.name}</td>
			</tr>
			<tr>
				<td>이메일</td> <!-- 분기 처리! -->
				<c:if test="${member.email != null}">
					<td><input type="text" name="email" value="${member.email}"/></td>
				</c:if>
				<c:if test="${member.email == null }">
					<td><input type="text" name="email"/>
				</c:if>

			</tr>
			<tr>
				<td>성별</td>
				<td>				
					${member.gender}
				</td>
			</tr>
			<tr>
				<td>연령대</td> 
				<td>
				<h5>member.age: ${member.age}</h5>
				<c:if test="${member.age != null}">
					<input type="text" name="age" value="${member.age}"/>
				</c:if>
				<c:if test="${member.age == null}">
					<input type="text" name="age"/>
				</c:if>
				</td>
			</tr>
			<tr>
				<td colspan="2">
					<input type="submit" value="수정"/>
					<input type="reset" value="reset"/>
					<input type="button" value="취소" onclick="window.location='/member/mypage'"/>
				</td>
			</tr>
		</table>
</form>
</body>
</html>

 

회원 정보 수정 처리 (modifyPro)

1. 컨트롤러

//회원정보수정 처리 요청
	@PostMapping("modify")
	public String modifyPro(MemberVO member, Model model) {
		System.out.println("modify 처리 요청");
		//jsp에서 input 태그로 작성해준 정보가 넘어옴.
		//DB에서 넘어온 데이터로 수정 처리해줘
		int result = memberService.modifyMember(member);
		System.out.println("C-result modify:" + result);
		model.addAttribute("result", result);
		return "member/modifyPro";
	}

 

2. 서비스 & 서비스 Impl

//회원 정보 수정 처리
	public int modifyMember(MemberVO member);

-

	//회원정보 수정 처리 구현
	@Override
	public int modifyMember(MemberVO member) {
		HttpServletRequest request= ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
		HttpSession session = request.getSession();
		String id=(String)session.getAttribute("memId");
		member.setId(id); //member에 id 값도 채워서 mapper에 보내기
		
		int result = memberMapper.updateMember(member);
		return result; //컨트롤러에서 갱신된 레코드 수 돌려주기
	}

 

3. 매퍼

	//회원정보 수정 처리 구현
	public int updateMember(MemberVO member);

-

  <!-- 회원 정보 수정 처리 -->
  <update id="updateMember">
  	update springMember set pw=#{pw}, age=#{age}, email=#{email} where id=#{id}
  </update>

 

4. modifyPro

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Modify Pro</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css"> 
</head>
<body>
<br/>
<c:if test="${result==1}">
	<h3>${sessionScope.memId}님의 회원 정보가 수정 되었습니다.</h3>
	<button onclick="window.location='/member/main'">메인</button>
	<button onclick="window.location='/member/mypage'">마이페이지</button>
</c:if>
<c:if test="${result==0}">
	<script>
		alert("수정 실패.. 다시 시도해주세요")
		history.go(-1);
	</script>
</c:if>

</body>
</html>

 

회원 삭제 (delete & deletePro)

1. 컨트롤러

//회원 탈퇴 폼페이지
	@GetMapping("delete")
	public void delete() {
		System.out.println("delete 폼요청");
	}
	
	//회원 탈퇴 처리 요청
	@PostMapping("delete")
	public String deletePro(MemberVO member,Model model) { //pw만 넘어옴
		System.out.println("delete 처리 요청");
		
		//서비스야 id와 pw가 맞는지 체크해서 맞으면 회원 정보 삭제해줘
		int result = memberService.deleteMember(member);
		System.out.println("C delete result: " + result);
		model.addAttribute("result",result);
		return "/member/deletePro";
	}

 

2.  서비스 & 서비스 Impl

	//회원 탈퇴 처리
	public int deleteMember(MemberVO member);

-

//회원 탈퇴 처리
	@Override
	public int deleteMember(MemberVO member) {
		HttpServletRequest request= ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
		HttpSession session = request.getSession();
		String id=(String)session.getAttribute("memId");
		member.setId(id); //member에 id 값도 채워서 mapper 보내기
		
		//아이디,비번 체크 먼저하기
		int result = memberMapper.idPwCheck(member);
		
		//맞으면 delete
		if(result==1) {
			//DB 삭제 처리
			int deleteRes=memberMapper.deleteMember(member.getId());
			System.out.println("S delete result: "+ deleteRes);
			//세션 로그아웃
			session.invalidate();
		}
		//틀리면 아무것도 안함
		return result;// 컨트롤러에게 id,pw 맞느지의 결과만 전달 
	}

 

3. 매퍼

//회원 탈퇴 구현
	public int deleteMember(String id);

-

 <!-- 회원 탈퇴 처리 -->
  <delete id="deleteMember">
  	delete from springMember where id=#{id}
  </delete>

 

4. delete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>delete</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css"> 
</head>
<body>
	<br/>
	<h1 align="center">회원 탈퇴</h1>
	<form action="/member/delete" method="POST">
		<table>
			<tr> 
				<td>
				탈퇴를 원하시면 비밀번호를 입력해주세요.<br/> <!-- 패스워드 들고 컨트롤로 이동 -->
				<input type="password" name="pw"/>
				</td>
			</tr>
			<tr> 
				<td>
					<input type="submit" value="회원 탈퇴"/>
					<input type="button" value="취소" onclick="window.location='/member/mypage'"/>
				</td>
			</tr>
	
	
		</table>
	</form>
</body>
</html>

 

 

5. deletePro.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>delete Pro</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<br/>
<h3>delete Pro</h3>
	<c:if test="${result==1}">
		<h3>탈퇴 되셨습니다. 안녕히!</h3>
		<button onclick="window.location='/member/main'">메인</button>
	</c:if>
	<c:if test="${result!=1 }">
		<script>
			alert("비밀번호를 잘못 입력하셨습니다. 다시 입력해주세요.")
			history.go(-1);
		</script>
	</c:if>


</body>
</html>

 

세션:

중복 되는 코드를 메서드로 분리

MemberServiceImpl

//세션 가져오기 메서드 (메서드로 중복 코드 분리)
	private HttpSession getSession() {
		HttpServletRequest request= ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
		HttpSession session = request.getSession();
		return session;
	}

modify, mypage, delete 화면에 추가

<c:if test="${sessionScope.memId ==  null }">
	<script>
		alert("로그인 후 사용 가능합니다.");
		window.location.href="/member/login";
	</script>
</c:if>
<%--로그인 했을 때 보여주기--%>
<c:if test="${sessionScope.memId != null }">
<%--로그인 했을 때 보여줄 화면들--%>
</c:if>

 

로그인.jsp

<c:if test="${sessionScope.memId != null }">
	<script>
		alert("이미 로그인 하셨습니다.");
		window.location.href="/member/main";
	</script>
</c:if>

 

 

 

Mybatis-config

<?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">
  
  <!-- SQL문을 처리시 NULL값이 올 때 통합 처리 세팅해놓은 것 
  	통합처리를 하지 않고 개별 데이터에 하나씩 처리하기 위해서는 
  	#{id, jdbcType=VARCHAR} #{age, jdbcType=INTEGER} .. 이런 식으로 매번 작성해줘야 함.
  	
  	현재 회원가입 폼에서 age 값을 안주면 500에러가 나기 때문에 이거 하고 있는 것.. 
  	vo/dto에서 age가 int면 자동초기화 값 0. Integer는 null
  -->
<configuration>
   <settings>
      <setting name="jdbcTypeForNull" value="NULL"/>
   </settings>
   <!-- mapper.xml에서 resultType에 작성하는 VO 같은 클래스 이름이 길다..
   별칭 달아서 짧게 써보자 -->
   <typeAliases>
   	<typeAlias type="com.member.domain.MemberVO" alias="memberVO"/>
   
   </typeAliases>
   
   
   
</configuration>

mybatis-config

<!-- 커섹션 풀 역할 connection(java) == session(mybatis)-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="/WEB-INF/spring/mybatis-config.xml"/>
	</bean>

루트에 등록