국비교육(22-23)

50일차(2)/Spring(5) : MyBatis / 회원 추가, 삭제 기능 구현 (insert, delete)

서리/Seori 2022. 12. 17. 22:56

50일차(2)/Spring(5) : MyBatis / 회원 추가, 삭제 기능 구현 (insert, delete)

 

- 회원추가, 삭제 기능 구현

- insertform, insert, delete 컨트롤러 및 메소드 추가

 

 

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/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;
	}
}

 

 

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">

	<!-- 
		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>

 

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) {
	  
   }

   @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) {
	
   }

   @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;
   }

}

 


 

- list에 회원추가 기능 추가

 

/views/member/insertform.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/insertform.jsp</title>
</head>
<body>
	<div class="container">
		<h1>회원 추가 폼</h1>
		<form action="${pageContext.request.contextPath}/member/insert" method="post">
			<div>
				<label for="name">이름</label>
				<input type="text" name="name" id="name" />
			</div>
			<div>
				<label for="addr">주소</label>
				<input type="text" name="addr" id="addr" />				
			</div>
			<button type="submit">추가</button>
		</form>
	</div>
</body>
</html>

 

- MemberController에 insertform의 컨트롤러 작성

@RequestMapping("/member/insertform")
public String insertfrom() {

    // /WEB-INF/views/member/insertform.jsp로 forward 이동해서 응답
    return "member/insertform";
}

 

- input의 name 값과 Dto의 필드명을 일치시켜주기!

 

- dao객체를 위에서 @Autowired로 주입받았기 때문에 dao.로 불러서 사용할 수 있다.

- 현재 insert() 메소드는 완성되어 있지 않지만 (인터페이스 타입) 그럼에도 작성하는데에는 문제가 없다.

 

- MemberDaoImpl에 가서 함수 완성하기

@Override
public void insert(MemberDto dto) {	   
	session.insert("member.insert", dto);      
}

 

- 이렇게 session에 insert가 들어있다.

 

 

- memberMapper에 sql문을 작성

<insert id="insert" parameterType="com.sy.spring02.member.dto.MemberDto">
    INSERT INTO member
    (num, name, addr)
    VALUES(member_seq.NEXTVAL, #{name}, #{addr})
</insert>

 

- Impl 에서 만든 메소드와 namespace, mapper id를 매칭시켜주어야 한다.

 

- 이전이라면 ?로 작성했던 자리에 무엇이 들어가는가???

- 입력받는 값이 들어가므로, insert 메소드에서 추가로 인자를 받아야한다. dto를 받도록 추가하기!

 

- insert하면서 dto타입을 받았기때문에 MemberDto 타입으로 받아오는 것!

 

- 이 3개의 정보를 잘 받아야한다. 그래야 메소드를 잘 작성할 수 있다.

 

#{ dto의 필드명 } 으로 바인딩하면 된다.

- myBatis에서는 #{ }를 쓸 수 있다. #{ } 기호는 MyBatis가 해석하는 특별한 기호이다. ? 에 바인딩할때 사용한다.

 

- 이전의 이 작업을 myBatis가 대신해주는 것이다.

 

참고) sql문 안에는 주석을 작성하면 안된다!!!

 

 

- insert의 컨트롤러 작성

@RequestMapping("/member/insert")
public String insert(MemberDto dto) { //폼 전송되는 name, addr이 자동으로 추출되어 MemberDto에 담겨서 전달된다.
    dao.insert(dto);
    return "member/insert";
}

 

- insert.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/insert.jsp</title>
</head>
<body>
	<div class="container">
		<h3>알림</h3>
		<p>
			회원 정보를 추가했습니다.
			<a href="${pageContext.request.contextPath}/member/list">확인</a>
		</p>
	</div>
</body>
</html>

 

 

- 잘 추가된다.

 


 

- 삭제 기능 추가

 

- delete의 컨트롤러 추가

@RequestMapping("/member/delete")
public String delete(int num) {//get 방식 전송 파라미터도 추출 가능
    dao.delete(num);
    return "redirect:/member/list";
}

 

- redirect 를 입력하려면 주소앞에 redirect: 를 적어주고 이동하려는 viewpage 주소를 적어주면 된다.

 

- 읽어온 파라미터값이 이 메소드의 인자로 전달된다.

 

- MemberDaoImpl 에 추가

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

 

- mapper 추가

<delete id="delete" parameterType="int">
    DELETE FROM member
    WHERE num=#{num}
</delete>

 

- 번호라는 의미에서 num을 넣었지만 아무거나 들어가도 상관없다.

- 값이 int 나 String일 경우에는!

 

- 삭제하고 바로 redirect 이동되어 새로고침하는 것 같은 효과가 나는 것을 볼 수 있다.