[스프링SPRING] 회원정보조회, 회원정보수정, 회원정보삭제

MemberController.java 코드 추가

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/* 회원정보보기 */
// http://localhost:8088/test/member/info
@RequestMapping(value = "/info", method = RequestMethod.GET)
public void infoGET(HttpSession session, Model model) throws Exception{

//세션 객체 안에 있는 ID정보 저장
String id = (String) session.getAttribute("id");
l.info("C: 회원정보보기 GET의 아이디 "+id);

//서비스안의 회원정보보기 메서드 호출
MemberVO vo = service.readMember(id);

//정보저장 후 페이지 이동
model.addAttribute("memVO", vo);
l.info("C: 회원정보보기 GET의 VO "+ vo);
}

/* 회원정보 수정 */
@RequestMapping(value="/update", method = RequestMethod.GET)
public String updateGET(HttpSession session, Model model) throws Exception{

//세션 객체 안에 있는 ID정보 저장
//String id = (String) session.getAttribute("id");
//l.info("C: 회원정보수정 GET의 아이디 "+id);

//서비스안의 회원정보보기 메서드 호출
//MemberVO vo = service.readMember(id);

//정보저장 후 페이지 이동
//model.addAttribute("memVO", vo);

//위의 3단계를 한 줄에 작성 가능
model.addAttribute("memVO", service.readMember((String)session.getAttribute("id")));

return "/member/updateForm";
}

@RequestMapping(value="/update", method = RequestMethod.POST)
public String updatePOST(MemberVO vo) throws Exception{
l.info("C: 회원정보수정 입력페이지 POST");

service.updateMember(vo);
return "/member/main";
}

/* 회원정보삭제 */
// http://localhost:8088/test/member/delete

@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String deleteGET(HttpSession session) throws Exception{
l.info("C: 회원정보 삭제 GET");
// 세션제어
String id = (String) session.getAttribute("id");
if(id == null) {
return "redirect:/member/main";
}
return "/member/deleteForm";
}

@RequestMapping(value = "/delete", method = RequestMethod.POST)
public String deletePOST(MemberVO vo, HttpSession session) throws Exception{
l.info("C: 회원정보 삭제 POST");
//1. 파라미터값 저장
l.info("C: deleteForm전달정보 "+vo);
// 2. 전달받은 정보를 가지고 삭제 동작 처리이동
// 3. service 객체 - 동작
service.deleteMember(vo);
// 4. 세션초기화
session.invalidate();
// 5. 페이지 이동
return "redirect:/member/main";
}




main.jsp에 링크연결

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
<link href="${pageContext.request.contextPath}/resources/style.css" rel="stylesheet" />
</head>
<body>
<h1>member/main.jsp</h1>
<%
String id = (String) session.getAttribute("id");
if(id == null) response.sendRedirect("/test/member/login");
%>
jsp표현식 세션 : <%= id %> <br>
el표현식 세션: ${id } <br>
그냥 : ${username } , ${useremail } <br>
mvo그냥 : ${mvo.username } , ${mvo.useremail } <br>
<hr>

<input type="button" value="회원정보조회" class="btn" onclick="location.href='/test/member/info'">
<input type="button" value="회원정보수정" class="btn" onclick="location.href='/test/member/update'">
<input type="button" value="로그아웃" class="btn" onclick="location.href='/test/member/logout'">
<input type="button" value="회원탈퇴" class="btn" onclick="location.href='/test/member/delete'">

<!-- 관리자일때만 메뉴확인가능 -->
<%
if(id != null){
if(id.equals("admin")){ %>
<input type="button" value="회원전체목록(관리자용)" class="btn" onclick="location.href='/test/member/memberList'">
<input type="button" value="상품전체목록(관리자용)" class="btn" onclick="location.href='/test/member/adminGoodsList'">
<input type="button" value="주문전체목록(관리자용)" class="btn" onclick="location.href='/test/member/adminOrderList'">
<%
}
}
%>




info.jsp뷰 페이지 생성

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
<body>
/member/info.jsp
<h2>마이페이지</h2>
<table border="1">
<tr>
<td>아이디</td>
<td>${memVO.userid }</td>
</tr>
<tr>
<td>비밀번호</td>
<td>${memVO.userpw }</td>
</tr>
<tr>
<td>이름</td>
<td>${memVO.username }</td>
</tr>
<tr>
<td>이메일</td>
<td>${memVO.useremail }</td>
</tr>
<tr>
<td>가입일자</td>
<td>${memVO.regdate }</td>
</tr>
</table>
<input type="button" value="메인으로" class="btn" onclick="location.href='/member/main'">
</body>s




updateForm.jsp 뷰페이지생성

1
2
3
4
5
6
7
8
9
10
11
12
13
<body>
<fieldset>
<legend>회원정보수정</legend>
<form action="/member/update" method="post" name="fr">
아이디 <input type="text" name="id" value="${memVO.userid }" readonly><br>
비밀번호 <input type="password" name="pw" placeholder="비밀번호를 입력하세요" required><br>
이름 <input type="text" name="name" value="${memVO.username } "><br>
이메일 <input type="text" name="email" value="${memVO.useremail }"><br>
<input type="submit" class="btn" value="회원정보수정하기">
<input type="button" class="btn" value="메인으로" onclick="location.href='/member/main'">
</form>
</fieldset>
</body>




deleteForm.jsp 뷰페이지생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%
// 로그인 처리 -> 로그인 x (로그인페이지 이동)
String id = (String) session.getAttribute("id");
if( id == null ){
response.sendRedirect("/test/member/main");
}
%>
<fieldset>
<legend>회원탈퇴</legend>
<form action="/member/delete" method="post">
<!-- input타입중 hidden은 화면에 있는 해당 input태그를 숨겨서 정보 전달 -->
아이디 : <input type="text" name="userid" value="<%=id %>" readonly><br>
비밀번호 : <input type="password" name="userpw"><br>
<input type="submit" class="btn" value="탈퇴하기">
<input type="button" class="btn" value="뒤로가기" onclick="location.href='/member/main'">
</form>
</fieldset>




MemberService.java 인터페이스에 메서드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.itwillbs.service;

import com.itwillbs.domain.MemberVO;

public interface MemberService {
// 회원 가입 (일반회원가입테이블에 sns계정 컬럼 추가하기)
// 일반적으로는 DAO랑 같은 메소드명을 사용하여 일관성을 유지한다
public void insertMember(MemberVO vo);

// 로그인기능 DAO랑 같은 이름으로 하지않은이유? 이름이 달라도 메서드생성가능하다는 걸 보여주기 위해서.
// public MemberVO readMemberWithIDPW(String userid, String userpw) throws Exception;

// 로그인기능
public MemberVO loginMember(MemberVO vo);

//회원정보 보기
public MemberVO readMember(String id);

//회원정보 수정
public void updateMember(MemberVO vo);

//회원정보 삭제
public void deleteMember(MemberVO vo);
}




MemberServiceImpl.java 메서드 오버라이딩 코드 추가

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.itwillbs.service;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.itwillbs.domain.MemberVO;
import com.itwillbs.persistence.MemberDAO;

@Service
public class MemberServiceImpl implements MemberService {

//DB와 연결 (의존주입)
@Inject
private MemberDAO mdao;

//회원가입
@Override
public void insertMember(MemberVO vo) {
//컨트롤러 -> 서비스 호출 -> DAO 호출 -> Mapper -> DB
System.out.println("S : 회원가입() 실행");
if(vo == null) {
//처리
return;
}
mdao.insertMember(vo);
}

//로그인기능
@Override
public MemberVO loginMember(MemberVO vo) {
System.out.println("S : 컨트롤러에서 호출받으면 필요한 정보를 받아서 DAO로 전달");
MemberVO returnVO = null;
try {
returnVO = mdao.readMemberWithIDPW(vo.getUserid(), vo.getUserpw());
} catch (Exception e) {
e.printStackTrace();
returnVO = null; //실행하다 문제가 생겼을때 해당 데이터를 보내지않겠다는 의미 = 예외처리
}
return returnVO; //null이 반환되면 앞의 코드가 문제가 있다는 것을 바로 알수있다.
}

//회원정보보기
@Override
public MemberVO readMember(String id) {
System.out.println("S : readMember()실행");
MemberVO vo = null;

try {
vo = mdao.readMember(id);
} catch (Exception e) {
e.printStackTrace();
}

return vo;
}

//회원정보수정
@Override
public void updateMember(MemberVO vo) {
try {
mdao.updateMember(vo);
} catch (Exception e) {
e.printStackTrace();
}
}

//회원정보삭제
@Override
public void deleteMember(MemberVO vo) {
try {
mdao.deleteMember(vo);
} catch (Exception e) {
e.printStackTrace();
}
}
}




MemberDAO.java 인터페이스에 메서드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.itwillbs.persistence;

import com.itwillbs.domain.MemberVO;

public interface MemberDAO {
//해당 도메인에 관련된 기능 선언
public String getTime();

//C: 회원가입
public void insertMember(MemberVO vo);

//R: 회원 정보 조회 - 사용자 ID 해당하는 정보 가져오기
public MemberVO readMember(String userid) throws Exception;

//R: 회원 정보 조회 - ID,PW정보에 해당하는 사용자 정보
public MemberVO readMemberWithIDPW(String userid,String userpw) throws Exception;

//U: 회원정보수정
public void updateMember(MemberVO vo) throws Exception;

//D: 회원탈퇴
public void deleteMember(MemberVO vo) throws Exception;
}




MemberDAOImpl.java 메서드 오버라이딩 코드 추가

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.itwillbs.persistence;

import java.util.HashMap;
import java.util.Map;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.itwillbs.domain.MemberVO;

@Repository
public class MemberDAOImpl implements MemberDAO {

//DB연결 (xml에서 만들어진 객체를 가져다 사용하고자함 = 의존 주입)
@Inject
private SqlSession sqlSession; //mapper위치까지 접근 가능 but mapper가 여러개일수있음 => mapper구분필요

//mapper구분하는 값 namespace
private static final String namespace = "com.itwillbs.mappers.memberMapper";

@Override
public String getTime() {
String result = sqlSession.selectOne(namespace+".getTime"); //괄호안에 쿼리구문입력하기
return result;
}

//회원가입구현 -> memberMapper.xml 작성 후 아래 메서드 작성 -> MemberDAOtest.java 이동
@Override
public void insertMember(MemberVO vo) {
System.out.println("#####");
sqlSession.insert(namespace+".insertMember", vo); //괄호안은 (쿼리구문, 매개변수)순으로 입력하기
}

//회원 정보 조회-사용자 ID 해당하는 정보 가져오기
@Override
public MemberVO readMember(String userid) throws Exception {
//테스트(컨트롤러) 호출 -> 정보를 저장 -> DB로이동
MemberVO vo = sqlSession.selectOne(namespace+".readMember", userid); //괄호안의 물음표를 콤마뒤에 쓰는거임
return vo;
}

//인터페이스 선언 -> 서브클래스 구현
//회원 정보 조회 - ID,PW정보에 해당하는 사용자 정보
@Override
public MemberVO readMemberWithIDPW(String userid, String userpw) throws Exception {
//테스트(컨트롤러) 호출 -> 정보를 저장 -> DB로이동

//String인자를 2개를 가져갈 수 없기때문에 파라미터 두개를 객체인 Map에 넣어서 가지고 넘긴다
//return sqlSession.selectOne(namespace+".readMemberWithIDPW", userid, userpw);

// DB로 정보를 전달하기 위해서는 sqlSeesion 객체 활용
// * 1개 이상의 정보를 전달할때는 객체 단위로 전달
// * 객체(VO) 안에 저장이 안되는 정보의 경우 Map을 사용
// Map은 key-value형태 : 이때 key값은 sql구문의 #{ㅇㅇㅇ} 이름과 같아야함

Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("userid", userid);
paramMap.put("userpw", userpw);

return sqlSession.selectOne(namespace+".readMemberWithIDPW", paramMap);
}

//회원정보 수정(정보를 가지고 mapper로 이동)
@Override
public void updateMember(MemberVO vo) throws Exception {
sqlSession.update(namespace+".updateMember", vo);
}

//회원탈퇴
@Override
public void deleteMember(MemberVO vo) throws Exception {
int check = sqlSession.delete(namespace+".deleteMember",vo);
System.out.println("DAO : deleteMember() "+check);
}
}




memberMapper.xml SQL쿼리 추가

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
32
33
34
35
36
37
38
39
40
<?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="com.itwillbs.mappers.memberMapper">
<select id="getTime" resultType="string">
select now()
</select>

<!-- values(?,?,?,?) sql문법 대신에 Mybatis 문법#{}을 사용
get() 또는 set() 마이바티스가 결정해서 메서드실행-->
<insert id="insertMember">
insert into tbl_member(userid,userpw,username,useremail)
values (#{userid},#{userpw},#{username},#{useremail})
</insert>

<select id="readMember" resultType="com.itwillbs.domain.MemberVO">
select *
from tbl_member
where userid=#{userid}
</select>

<select id="readMemberWithIDPW" resultType="com.itwillbs.domain.MemberVO">
select *
from tbl_member
where userid=#{userid} and userpw=#{userpw}
</select>

<update id="updateMember">
update tbl_member set username=#{username}, useremail=#{useremail},updatedate=now()
where userid=#{userid} and userpw=#{userpw}
</update>

<delete id="deleteMember">
delete from tbl_member where userid=#{userid} and userpw=#{userpw}
</delete>
</mapper>