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 이동되어 새로고침하는 것 같은 효과가 나는 것을 볼 수 있다.
'국비교육(22-23)' 카테고리의 다른 글
50일차(4)/Spring(7) : Service 메소드 / Todo 테이블로 실습 (1) | 2022.12.18 |
---|---|
50일차(3)/Spring(6) : MyBatis / 회원정보 수정 기능 구현 (getData, update) (0) | 2022.12.18 |
50일차(1)/Spring(4) : MyBatis 설치 / DB 데이터 불러오기 (getList) (0) | 2022.12.17 |
49일차(2)/Spring(3) : 요청 파라미터 추출 / forward, redirect 이동 / Dependency Injection (0) | 2022.12.15 |
49일차(1)/Spring(2) : MVC Project 초기 세팅 / Spring 기본 개념 익히기 (0) | 2022.12.15 |