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>
루트에 등록