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>