spring/spring

Step03_MyBatis (Member 회원목록)

bono.html 2022. 8. 31. 13:16

 

초기설정 및 HomeController

 

HomeController

package com.gura.step03;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

	// /home.do 요청이 왔을때 동작하는 컨트롤러 메소드 
	@RequestMapping("/home.do")
	public String home(HttpServletRequest request) {

		// DB 에서 읽어온 공지사항 이라고 가정하자 
		List<String> noticeList=new ArrayList<>();
		noticeList.add("Spring Framework 시작입니다.");
		noticeList.add("화이팅!");
		noticeList.add("어쩌구...");
		noticeList.add("저쩌꾸...");

		// view page 에 전달할 Model(data) 을  request 영역에 담기
		request.setAttribute("noticeList", noticeList);

		// /WEB-INF/views/home.jsp 페이지로 forward 이동해서 응답
		return "home";
	}
	
}

 

 

home.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/home.jsp</title>
</head>
<body>
	<div class="container">
		<h1>인덱스 페이지 입니다.</h1>
		
		<ul>
			<li><a href="${pageContext.request.contextPath }/member/list.do">회원목록보기</a></li>
		</ul>
		
		<h2>공지사항</h2>
		<ul>
			<c:forEach var="tmp" items="${requestScope.noticeList }">
				<li>${tmp }</li>
			</c:forEach>
		</ul>
	</div>
</body>
</html>

 

 

spring DB, mybatis 설정

2022.08.31 - [시작하기] - spring DB, mybatis 설정

 

servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
	
    <!-- 
     JNDI 데이터 소스 객체 얻어오는 설정   
     Servers/context.xml 에 설정된 oracle 접속정보 가 있어야 된다. 
      
     <Resource name="jdbc/myoracle" auth="Container"
             type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
             url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
             username="scott" password="tiger" maxTotal="20" maxIdle="10"
             maxWaitMillis="-1"/>          
   -->
   <beans:bean id="dataSource" 
      class="org.springframework.jndi.JndiObjectFactoryBean">
      <beans:property name="jndiName" value="java:comp/env/jdbc/myoracle"/>
   </beans:bean>
   
   <!-- 
      위는 아래의 코드와 같다
      dataSource = new JndiObjectFactoryBean();
      dataSource.setJndiName("java:comp/env/jdbc/myoracle");
    -->
   
   
   <!-- 
      SqlSessionFactory 객체 
      Configuration.xml 문서가 어디에 있는지 알려야 한다. 
   -->
   <beans:bean id="sessionFactory" 
      class="org.mybatis.spring.SqlSessionFactoryBean">
      <beans:property name="dataSource" ref="dataSource"/>
      <beans:property name="configLocation"
   value="classpath:com/gura/step03/mybatis/Configuration.xml"/>
   </beans:bean>
   <!-- 
      sessionFactory=new SqlSessionFactoryBean();
      sessionFactory.setDataSource(dataSource);
      sessionFactory.setConfigLocation("classpath:com/gura/xxx");
    -->
   

   <!-- 
      SqlSession 인터페이스를 구현한 
      SqlSessionTemplate(SqlSession) 객체 
      Dao 가 의존하는 객체 
   -->
   <beans:bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
      <beans:constructor-arg name="sqlSessionFactory" 
         ref="sessionFactory"/>
   </beans:bean>
   
   
   
   <!-- 
      위의 bean 설정을 java code 로 환산 하면 아래와 같다 
      
      dataSource = new JndiObjectFactoryBean();
      dataSource.setJndiName("java:comp/env/jdbc/myoracle");
      
      sessionFactory=new SqlSessionFactoryBean();
      sessionFactory.setDataSource(dataSource);
      sessionFactory.setConfigLocation("classpath:com/gura/xxx");
      
      new SqlSessionTemplate(sessionFactory);
    -->
    
	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="com.gura.step03" />
	
	
	
</beans:beans>

 

Servers -> context.xml 설정

2022.08.31 - [시작하기] - spring DB, mybatis 설정

 

configuration.xml

<?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">
  <configuration>
  	<!-- 사용할 Mapper xml 문서 등록하기 -->
  	<mappers>
  		<mapper resource="com/gura/step03/mybatis/MemberMapper.xml"/>
  	</mappers>
  </configuration>

 

MemberDto.java

 

MemberDao.java  - interface

package com.gura.step03.member.dao;

import java.util.List;

import com.gura.step03.member.dto.MemberDto;

public interface MemberDao {
	public void insert(MemberDto dto);
	public void update(MemberDto dto);
	public void delete(int num);
	public MemberDto getData(int num);
	public List<MemberDto> getList();
}

 

MemberMapper.xml

<?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">
   <insert id="insert" parameterType="com.gura.step03.member.dto.MemberDto">
      INSERT INTO member
      (num, name, addr)
      VALUES(member_seq.NEXTVAL, #{name}, #{addr})
   </insert>
   
   <update id="update" parameterType="com.gura.step03.member.dto.MemberDto">
      UPDATE member
      SET name=#{name}, addr=#{addr}
      WHERE num=#{num}
   </update>
   
   <delete id="delete" parameterType="int">
      DELETE FROM member
      WHERE num=#{num}
   </delete>
   
   <!-- resultType="select 된 row 하나를 담을 데이터 type" -->
   <select id="getData" parameterType="int" 
                     resultType="com.gura.step03.member.dto.MemberDto">
      SELECT num, name, addr
      FROM member
      WHERE num=#{num}
   </select>
   
   <select id="getList" resultType="com.gura.step03.member.dto.MemberDto">
      SELECT num, name, addr
      FROM member
      ORDER BY num ASC
   </select>
</mapper>

 

MemberDaoImpl - (impl 의 첫글자 대문자 형태)

package com.gura.step03.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.gura.step03.member.dto.MemberDto;

//MemberDaoImple 객체도 spring bean container 에서 관리가 되도록한다.
@Repository
public class MemberDaoImpl implements MemberDao{
   
   // spring bean container 에서 SqlSession type 객체를 찾아서 주입해(DI) 주세요 라는 의미 
   @Autowired
   private SqlSession session;
   
   @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
       *  parameterType : 
       */
      session.update("member.update", dto);
   }

   @Override
   public void delete(int num) {
      /*
       *  Mapper's namespace : member
       *  sql's id : delete
       *  parameterType : int
       */
      session.delete("member.delete", num);
   }

   @Override
   public MemberDto getData(int num) {
      /* 
       *  Mapper's namespace : member
       *  sql's id : getData
       *  pararmeterType : int
       *  resultType : MemberDto
       *   
       */
      MemberDto dto=session.selectOne("member.getData", num);
      
      return dto;
   }

   @Override
   public List<MemberDto> getList() {
      /* 
       *  Mapper's namespace : member
       *  sql's id : getList
       *  pararmeterType : 없음
       *  resultType : MemberDto
       *   
       */
      List<MemberDto> list=session.selectList("member.getList");
      
      return list;
   }

}

 

MemberController

package com.gura.step03.member.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

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

import com.gura.step03.member.dao.MemberDao;
import com.gura.step03.member.dto.MemberDto;

@Controller
public class MemberController {
   
   // spring bean container 로 부터 MemberDao 인터페이스 type 의 참조값을 DI 받는다. 
   @Autowired
   private MemberDao dao;
   
   @RequestMapping("/member/update")
   public String update(MemberDto dto) {
	   //MemberDao 객체를 이용해서 회원정보를 수정 반영하고
	   dao.update(dto);
	   //view page 로 forward 이동해서 응답
	   return "member/update";
   }
   
   @RequestMapping("/member/updateform")
   public String updateform(int num, HttpServletRequest request) {
	   //MemberDao 객체를 이용해서 수정할 회원의 정보를 DB에서 불러온다.
	   MemberDto dto=dao.getData(num);
	   
	   //view page에 전달할 모델(data) 를 request 영역에 담는다.
	   request.setAttribute("dto", dto);
	   
	   //view page 로 forward 이동해서 수정할 회원폼을 출력해 준다.
	   return "member/updateform";
   }
   
   @RequestMapping("/member/delete")
   public String delete(int num) {
	   //MemberDao 객체를 이용해서 DB 에서 삭제하고
	   dao.delete(num);
	   //view page로 forward 이동해서 응답한다.
	   return "member/delete";
   }
   
   @RequestMapping("/member/insert")
   public String insert(MemberDto dto) {
	   //MemberDao 객체를 이용해서 추가하기
	   dao.insert(dto);
	   //view page로 forward 이동해서 응답하기
	   return "member/insert";
   }
   
   @RequestMapping("/member/insertform")
   public String insertform() {
	   
	   return "member/insertform";
   }
   
   @RequestMapping("/member/list")
   public String list(HttpServletRequest request) {
      
      
      List<MemberDto> list=dao.getList();
      
      request.setAttribute("list", list);
      /*
       *  /WEB-INF/views/member/list.jsp 페이지로 forward 이동해서 
       *  회원 목록을 출력하면된다.
       *  
       *  그런데... 회원목록은 어떻게 얻어오지? 
       */
      return "member/list";
   }
}

 

list.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/list.jsp</title>
</head>
<body>
<div class="container">

	<a href="${pageContext.request.contextPath }/member/insertform.do">회원 추가하러 가기</a>

	<h1>회원 목록 입니다.</h1>
	<table>
		<thead>
			<tr>
				<th>번호</th>
				<th>이름</th>
				<th>주소</th>
				<th>수정</th>				
				<th>삭제</th>
			</tr>
		</thead>
		<tbody>
			<c:forEach var="tmp" items="${requestScope.list }">
				<tr>
					<td>${tmp.num }</td>
					<td>${tmp.name }</td>
					<td>${tmp.addr }</td>
					<td>
						<a href="${pageContext.request.contextPath }/member/updateform.do?num=${tmp.num }">수정</a>
					</td>
					<td>
						<a href="${pageContext.request.contextPath }/member/delete.do?num=${tmp.num }">삭제</a>
					</td>
				</tr>
			</c:forEach>
		</tbody>
	</table>
</div>
</body>
</html>

 

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

 

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">
      <h1>알림</h1>
      <p>
         <strong>${param.name }</strong> 님의 정보를 추가 했습니다.
         <a href="${pageContext.request.contextPath }/member/list.do">목록보기</a>
      </p>
   </div>
</body>
</html>

 

delete.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>/member/delete.jsp</title>
</head>
<body>
<div class="container">
	<h1>알림</h1>
	<p>
		<strong>${param.num }</strong> 번 회원의 정보를 삭제 했습니다.
		<a href="list.do">목록보기</a>
	</p>
</div>
</body>
</html>

 

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>/views/member/updateform.jsp</title>
</head>
<body>
<div class="container">
   <h1>회원 정보 수정 폼 입니다.</h1>
   <form action="update.do" method="post">
      <input type="hidden" name="num" value="${dto.num}"/>
      <div>
         <label for="num">번호</label>
         <input type="text" id="num" value="${requestScope.dto.num }" disabled/>
      </div>
      <div>
         <label for="name">이름</label>
         <input type="text" name="name" id="name" value="${dto.name }"/>
      </div>
      <div>
         <label for="addr">주소</label>
         <input type="text" name="addr" id="addr" value="${dto.addr}"/>
      </div>
      <button type="submit">수정확인</button>
      <button type="reset">취소</button>
   </form>
</div>
</body>
</html>

 

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">
   <h1>알림</h1>
   <p>
      <strong>${param.num }</strong> 번 회원의 정보를 수정 했습니다.
      <a href="list.do">목록보기</a>
   </p>
</div>
</body>
</html>