국비교육(22-23)

50일차(3)/Spring(6) : MyBatis / 회원정보 수정 기능 구현 (getData, update)

서리/Seori 2022. 12. 18. 13:33

50일차(3)/Spring(6) : MyBatis / 회원정보 수정 기능 구현 (getData, update)

 

- 회원정보 불러오기, 회원정보 수정 기능 구현

- getData, update, updateform 메소드 완성하고 뷰 페이지 생성

 

 

MemberController (최종)

package com.sy.spring02.member.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.sy.spring02.member.dao.MemberDao;
import com.sy.spring02.member.dto.MemberDto;

@Controller
public class MemberController {
	
	//필요한 핵심 의존 객체를 주입받는다.
	@Autowired
	private MemberDao dao;
	
	@RequestMapping("/member/update")
	public String update(MemberDto dto) {
		dao.update(dto);
		return "member/update";
	}
	
	@RequestMapping("/member/updateform")
	public ModelAndView updateform(int num, ModelAndView mView) {//ModelAndView 객체도 받을 수 있다.
		//수정할 회원의 정보를 DB에서 불러온다.
		MemberDto dto=dao.getData(num);
		//ModelAndView 객체에 담고
		mView.addObject("dto", dto);
		//view page의 정보도 담아서
		mView.setViewName("member/updateform");
		//리턴해준다.
		return mView;
	}
	
	@RequestMapping("/member/delete")
	public String delete(int num) {//get 방식 전송 파라미터도 추출 가능
		dao.delete(num);
		return "redirect:/member/list";
	}	
	
	@RequestMapping("/member/insert")
	public String insert(MemberDto dto) { //폼 전송되는 name, addr이 자동으로 추출되어 MemberDto에 담겨서 전달된다.
		dao.insert(dto);
		return "member/insert";
	}
	
	@RequestMapping("/member/insertform")
	public String insertfrom() {
		
		// /WEB-INF/views/member/insertform.jsp로 forward 이동해서 응답
		return "member/insertform";
	}
	
	@RequestMapping("/member/list")
	public ModelAndView getList(ModelAndView mView) {
		//주입받은 MemberDao 객체를 이용해서 회원목록을 얻어온다.
		List<MemberDto> list=dao.getList();
		
		//View page에 전달할 Model을 담는다.
		mView.addObject("list", list);
		//View page 정보도 담아서
		mView.setViewName("member/list");
		
		//리턴해준다.
		return mView;
	}
}

 

MemberDaoImpl

package com.sy.spring02.member.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.sy.spring02.member.dto.MemberDto;

// component scan 을 통해서 spring 이 관리하는 bean 이 될수 있도록 어노테이션 붙여놓기
@Repository
public class MemberDaoImpl implements MemberDao{
   
   @Autowired
   private SqlSession session; // select, insert, update, delete 작업을 하기 위한 핵심 의존 객체
   
   @Override
   public void insert(MemberDto dto) {
	   /*
	    * mapper's namespace=>member
	    * sql's id=>insert
	    * parameterType=MemberDto
	    */
      session.insert("member.insert", dto);
   }

   @Override
   public void update(MemberDto dto) {
	   /*
       * mapper's namespace => member
       * sql's id => update
       * resultType => dto
       */
	   session.update("member.update", dto);      
   }

   @Override
   public void delete(int num) {
	   /*
       * mapper's namespace => member
       * sql's id => delete
       * resultType => int
       */
	   session.delete("member.delete", num);
   }

   @Override
   public MemberDto getData(int num) {
	   /*
       * mapper's namespace => member
       * sql's id => getData
       * parameterType => int
       * 
       * - selectOne() 메소드를 호출하면 mapper xml의 resultType이 바로 메소드의 return type이 된다.
       * resultType => MemberDto
       * return Type => MemberDto
       */
	  MemberDto dto=session.selectOne("member.getData", num);
	   
      return dto;
   }

   @Override
   public List<MemberDto> getList() {
      /*
       * mapper's namespace => member
       * sql's id => getList
       * 
       * - selectList() 메소드를 호출하면 List가 return type이고 
       *   mapper xml의 resultType이 바로 List의 generic type이 된다.
       * 
       * resultType => MemberDto
       * return Type => List
       */
      List<MemberDto> list=session.selectList("member.getList");
      
      return list;
   }

}

 

MemberMapper

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="member">

	<select id="update" parameterType="com.sy.spring02.member.dto.MemberDto">
		UPDATE member 
		SET name=#{name}, addr=#{addr}
		WHERE num=#{num}
	</select>

	<select id="getData" parameterType="int" resultType="com.sy.spring02.member.dto.MemberDto">
		SELECT num, name, addr
		FROM member
		WHERE num=#{num}
	</select>

	<!-- 
		parameterType의 숫자나 문자열이면 값이 하나이기 때문에
		#{ 여기는 아무 문자열이나 넣어도 된다. }
		#{num}
		#{xxx}		
	 -->
	<delete id="delete" parameterType="int">
		DELETE FROM member
		WHERE num=#{num}
	</delete>

	<!-- 
		parameterType이 dto인 경우에 값을 바인딩하는 방법은
		#{ dto의 필드명 } 과 같은 방식으로 바인딩하면 된다.
		#{ name }은 dto의 name이라는 필드에 있는 값을 해당 위치에 바인딩하라는 의미이다.
		#{ addr }은 dto의 addr이라는 필드에 있는 값을 해당 위치에 바인딩하라는 의미이다.
		즉 필드명과 일치시켜야 동작을 한다.
		#{ } 기호는 MyBatis가 해석하는 특별한 기호이다. 
	-->
	<insert id="insert" parameterType="com.sy.spring02.member.dto.MemberDto">
		INSERT INTO member
		(num, name, addr)
		VALUES(member_seq.NEXTVAL, #{name}, #{addr})
	</insert>

	<!-- 
		여기서 resultType은 select 된 row를 어떤 객체에 담을지를 결정하는 것이다.
		dto로 설정했다면
		SELECT num, name, addr 의 칼럼명과
		dto의 필드명이 반드시 일치해야 정상 동작을 한다. 
	-->
	<select id="getList" resultType="com.sy.spring02.member.dto.MemberDto">
		SELECT num, name, addr
		FROM member
		ORDER BY num ASC	
	</select>
</mapper>

 

 


 

- 수정 기능 추가

 

- 컨트롤러 추가

@RequestMapping("/member/updateform")
public ModelAndView updateform(int num, ModelAndView mView) {//ModelAndView 객체도 받을수 있다.
    //수정할 회원의 정보를 DB 에서 불러와서
    MemberDto dto=dao.getData(num);
    //ModelAndView 객체에 담고
    mView.addObject("dto", dto);
    //view page 의 정보도 담아서 
    mView.setViewName("member/updateform");
    //리턴해준다.
    return mView;
}

 

- MemberDaoImpl의 메소드 수정(getdata)

@Override
public MemberDto getData(int num) {
   /*
   * mapper's namespace => member
   * sql's id => getData
   * parameterType => int
   * 
   * - selectOne() 메소드를 호출하면 mapper xml의 resultType이 바로 메소드의 return type이 된다.
   * resultType => MemberDto
   * return Type => MemberDto
   */
  MemberDto dto=session.selectOne("member.getData", num);

  return dto;
}

 

MemberDto dto=session.selectOne("member.getData", num);

가져올 데이터가 하나이므로 selectOne 사용!

 

- selectOne() 메소드를 호출하면 mapper xml의 resultType이 바로 메소드의 return type이 된다.

 

- selectList() 메소드를 호출하면 List가 return type이고 
 mapper xml의 resultType 이 바로 List의 generic type ( MemberDto )이 된다.

 

- 둘을 비교해서 기억하기!

 

 

- mapper 작성

<select id="getdata" parameterType="int" resultType="com.sy.spring02.member.dto.MemberDto">
    SELECT num, name, addr
    FROM member
    WHERE num=#{num}
</select>

 

- #{num} 에는 아무 단어나 들어가도 된다. 어차피 하나의 값만 가져왔으므로!(위의 int)

 

 

- updateform.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>updateform.jsp</title>
</head>
<body>
	<div class="container">
		<h1>회원정보 수정 폼</h1>
		<form action="update" method="post">
			<input type="hidden" name="num" value="${dto.num }" />
			<div>
				<label for="num">번호</label>
				<input type="text" id="num" value="${dto.num }" readonly />
			</div>
			<div>
				<label for="name">이름</label>
				<input type="text" name="name" value="${dto.name }" />				
			</div>
			<div>
				<label for="addr">주소</label>
				<input type="text" name="addr" value="${dto.addr }" />				
			</div>
			<button type="submit">수정확인</button>
			<button type="reset">취소</button>
		</form>
	</div>
</body>
</html>

 

- ModelAndView에 담으면 알아서 request 영역에 담긴다.

- 어떤 키값으로, 어떤 타입으로 담았는지 기억하고 이동해야한다. 그래야 원활하게 작성할 수 있다.

 

- getData 를 사용해서 이렇게 기본값이 들어와 있다.

 


 

- 컨트롤러 - 메소드 - sql문 작성 - 뷰 페이지 생성

 

 

컨트롤러 - update

@RequestMapping("/member/update")
public String update(MemberDto dto) {
    dao.update(dto);
    return "member/update";
}

 

- 수정 폼에서 파라미터 값이 3개가 넘어온다.

- dto로 이 3개를 모두 받아올 수 있다.

 

DaoImpl - update메소드 수정

@Override
public void update(MemberDto dto) {
   /*
   * mapper's namespace => member
   * sql's id => update
   * resultType => dto
   */
   session.update("member.update", dto);      
}

 

- nameplace, id, resultType 기억

 

- mapper 작성

<select id="update" parameterType="com.sy.spring02.member.dto.MemberDto">
    UPDATE member 
    SET name=#{name}, addr=#{addr}
    WHERE num=#{num}
</select>

 

- dto에서 각각에 매칭시켜준다. 필드와 이름이 같으면!

 

 

/views/member/ update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/views/member/update.jsp</title>
</head>
<body>
	<div class="container">
		<h3>알림</h3>
		<p>
			회원 정보를 수정했습니다.
			<a href="${pageContext.request.contextPath}/member/list">확인</a>
		</p>
	</div>
</body>
</html>

- 뷰 페이지까지 생성하면 완성!