Spring Mybatis Example : Visit 샘플 예제 풀이
예제 작성 주요 순서
Project 생성
DB 세팅
mybatis 세팅
driver 세팅
jar 세팅
config.spring.context 패키지 세팅
dao 패키지 생성
service 패키지 생성
vo 패키지 생성
dao > VisitDAO.java 클래스 내용 추가
service > VisitService.java 클래스 내용 추가
mybitis.mapper > visit.xml 에서 sql문 작성
config.mybatis > mybatis-config.xml에서 sql문이 적힌 파일(visit.xml)을 불러오는 코드 작성
controller > ViewPath 인터페이스 생성
controller > VisitController 생성
servlet-context.xml 세팅
Spring Legacy Project
Spring Legacy Project 생성
Project name: SpringVisit
Templates: Spring MVC Project
top-level package 생성
com.myspring.visit
DB 세팅
기 생성한 id로 로그인
conn spring01/spring
user : spring01
password : spring
https://developernew.tistory.com/177
Spring Mybatis 기본 세팅 1 DB, Driver 세팅
Mybitis Spring Legacy Project 생성 SpringMybatis 스프링 레가시 프로젝트 > Spring MVC Project 생성 com.increpas.db DB 세팅 12C부터 사용자용 계정을 만들 때 c##을 붙여 만들어주어야 한다 => 계정 룰 삭제 alter session
developernew.tistory.com
샘플 일련번호 관리 객체 생성
create sequence seq_visit_idx;
샘플 테이블 생성: 방명록
create table visit (
idx int, --일련번호
name varchar2(100) not null, --작성자
content varchar2(2000) not null, --내용
pw varchar2(100) not null, --비밀번호
ip varchar2(100) not null, --IP
regdate date --작성일시
);
샘플데이터 입력
insert into visit values( seq_visit_idx.nextVal,
'일길동',
'내가 1등이닷~~~',
'1234',
'127.0.0.1',
sysdate
);
insert into visit values( seq_visit_idx.nextVal,
'일길동',
'아쉽네 2등이닷~~~',
'1234',
'127.0.0.1',
sysdate
);
select * from visit order by idx desc;
mybatis 세팅
src/main/resources에 하위 4개 패키지 생성
config.spring.context
root-context.xml파일을 config.context에 4개 복사해 넣고 파일명 명명
context-1-datasource.xml
context-2-mybatis.xml
context-3-dao.xml
context-4-service.xml
config.spring.mvc
servlet-context.xml파일을 복사해 넣기
config.mybatis / config.mybatis.mapper
아래 파일을 해당 패키지 안에 넣기
src > main > webapp > WEB-INF > Spring > web.xml
1) 한글 필터 삽입
https://developernew.tistory.com/175
Spring 한글 필터 설정 방법
: web.xml > 필터 설정 코드 붙여넣기 encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encodingFilter /*
developernew.tistory.com
2) root-context.xml 경로 변경
<!-- <param-value>/WEB-INF/spring/root-context.xml</param-value> -->
<param-value>classpath*:config/spring/context/context-*.xml</param-value>
3) servlet-context.mxl 경로 변경
<!-- <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> -->
<param-value>classpath:config/spring/mvc/servlet-context.xml</param-value>
드라이버 & jar 세팅
로그인정보 세팅(mac 연동)
src/main/resources > config.spring.context > context-1-datasource.xml
context-1-datasource.xml의 Namespaces탭의 context를 체크해 주면 코드 오류가 사라진다
src/main/resources > config.mybatis > mybatis-config.xml
<mappers></mappers> 내부에 dept를 삽입 : sql문 사용을 위해
<mapper resource="config/mybatis/mapper/dept.xml"/>
pom.xml 세팅
1.
<dependencies></dependencies>태그 안에 복사한 jar 코드 삽입
- Ojdbc8
- Commoms DBCP
- MyBatis
- MyBatis Spring
- Spring JDBC
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
2.
pom.xml에서 자바 버전 11로 고치고
spring framework 버전 4.3.14.RELEASE로 // SPRING JDBC 다운받은 버전과 일치시킴
<java-version>11</java-version>
<org.springframework-version>4.3.14.RELEASE</org.springframework-version>
Project > Properties > Project Facts
세팅한 버전에 맞추어 Web Model과 JAVA 버전 세팅
config.spring.context 패키지 세팅
src/main/resources > config.spring.context > context-1-datasource.xml
복사한 코드를 context-1-datasource.xml에 입력
<context:property-placeholder location="classpath:config/mybatis/db.properties"/>
<bean id="ds" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="defaultAutoCommit" value="false"></property>
<property name="maxTotal" value="10"></property>
</bean>
src/main/resources > config.spring.context > context-2-mybatis.xml
복사한 코드를 context-2-mybatis.xml에 입력
<bean id="factoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds" />
<property name="configLocation"
value="classpath:config/mybatis/mybatis-config.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="factoryBean" />
</bean>
서비스 패키지 생성
src/main/java > dao > VisitDAO.java
dao 패키지를 생성하여 VisitDAO 자바 클래스 생성
src/main/java > service > VisitService.java
service 패키지를 생성하여 VisitService 자바 클래스 생성
src/main/resources > config.spring.context > context-3-dao.xml
// bean생성
<bean id="deptDAO" class="dao.VisitDAO">
<property name="sqlSession" ref="sqlSession" />
</bean>
src/main/resources > config.spring.context > context-4-service.xml
//bean 생성
<bean id="visitService" class="service.VisitService">
<constructor-arg ref="visitDAO" />
</bean>
파일 구동을 위한 세팅
src/main/java > vo > VisitVO.java
vo 패키지를 생성해 VisitVO 자바 클래스 생성
src/main/java > dao > VisitDAO.java
// dao에서 기능 구현
public List<VisitVO> selectList(){
return sqlSession.selectList("visit.selectList");
}
public VisitVO selectOne(int idx) {
return sqlSession.selectOne("visit.selectOne",idx);
}
public int insert(VisitVO vo) {
return sqlSession.insert("visit.insert",vo);
}
public int update(VisitVO vo) {
return sqlSession.update("visit.update",vo);
}
public int delete(int idx) {
return sqlSession.delete("visit.delete",idx);
}
src/main/resources > config.mybatis.mapper > visit.xml
// mapper의 .xml에서 sql문 작성
<mapper namespace="visit">
<select id="selectList" resultType="visit">
select * from visit order by idx desc
</select>
<select id="selectOne" resultType="visit">
select * from visit where idx=#{idx}
</select>
<insert id="insert" parameterType="visit">
insert into visit values(seq_visit_idx.nextval,#{name},#{content},#{pwd},#{ip},sysdate)
</insert>
<update id="update" parameterType="visit">
update visit set name=#{name},content=#{content},pwd=#{pwd},ip=#{ip},regdate=sysdate where idx=#{idx}
</update>
<delete id="delete" parameterType="int">
delete visit where idx=#{idx}
</delete>
</mapper>
src/main/java > service > VisitService.java
VisitDAO에 작성되어 있는 메소드를 끌어와 return
public List<VisitVO> selectList(){
return visitDAO.selectList();
}
public VisitVO selectOne(int idx) {
return visitDAO.selectOne(idx);
}
public int insert(VisitVO vo) {
return visitDAO.insert(vo);
}
public int update(VisitVO vo) {
return visitDAO.update(vo);
}
public int delete(int idx) {
return visitDAO.delete(idx);
}
src/main/resources > config.mybatis > mybatis-config.xml
// sql문을 읽을 수 있게 세팅 : sql문을 작성한 파일을 불러온다
<mapper resource="config/mybatis/mapper/visit.xml"/>
// typeAlias 추가 : 등록해놓고 손쉽게 쓰기 위해서
<typeAliases>
<typeAlias type="vo.VisitVO" alias="visit"/>
</typeAliases>
구동 클래스 생성
src/main/java > common > ViewPath.java 인터페이스 생성
ViewPath.java 자바 인터페이스 생성 후 경로 변수 생성
public static final String VISIT = "/WEB-INF/views/visit/";
src/main/java > controller > VisitController.java 생성
@Controller
public class VisitController {
private VisitService visitService;
public VisitController(VisitService visitService) {
this.visitService=visitService;
}
@RequestMapping({"/", "/list"})
public String list(Model model) {
List<VisitVO> list = visitService.selectList();
model.addAttribute("list", list);
return ViewPath.VISIT + "list.jsp";
}
// model에다가 List<VisitVO>를 생성해 똑같이 순서대로 담고 저장
@RequestMapping("/insert_form")
public String insertForm() {
return ViewPath.VISIT + "insert_form.jsp";
}
@RequestMapping("/insert")
public String insert(VisitVO vo,HttpServletRequest request) {
String ip = request.getRemoteAddr();
vo.setIp(ip);
String content = vo.getContent();
vo.setContent(content.replaceAll("\r\n", "<br>"));
int res = visitService.insert(vo);
if(res != 0) {
return "redirect:list";
}else {
return "redirect:insert_form";
}
}
@RequestMapping("/update_form")
public String updateForm(Model model,int idx) {
VisitVO vo = visitService.selectOne(idx);
String content = vo.getContent();
vo.setContent(content.replaceAll("<br>", "\r\n"));
model.addAttribute("vo", vo);
// update와 유사하나 정보를 받아서 넘겨야 하므로 model정보를 받아온다
// model.addAttribute에 vo를 담아주고 update는 동일하게 vo 정보 필요
return ViewPath.VISIT + "update_form.jsp";
}
@RequestMapping("/update")
public String update(VisitVO vo,HttpServletRequest request) {
String ip = request.getRemoteAddr();
vo.setIp(ip);
String content = vo.getContent();
vo.setContent(content.replaceAll("\r\n", "<br>"));
int res = visitService.update(vo);
if(res != 0) {
return "redirect:/list";
}else {
return "redirect:update_form";
}
}
@RequestMapping("/delete")
public String update(int idx) { // delete만 parameter값이 int이다
visitService.delete(idx);
return "redirect:list";
}
}
src/main/resources > config.spring.mvc > servlet-context.xml
서블렛 xml beans 생성
view page 생성
visit > insert_form.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function send(f)
{
var name = f.name.value;
var content = f.content.value;
var pw = f.pw.value;
if(name==''){
alert('작성자 이름을 입력하세요');
f.name.focus();
return ;
}
if(content==''){
alert('내용을 입력하세요');
f.content.focus();
return;
}
if(pw==''){
alert('비밀번호를 입력하세요');
f.pw.focus();
return;
}
f.action = 'insert';
f.submit();//전송
}
</script>
</head>
<body>
<form method="post">
<table border="1" align="center">
<caption>::::방명록쓰기::::</caption>
<tr>
<th>작성자</th>
<td><input name="name"></td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea name="content" rows="5" cols="50"></textarea>
</td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="pw"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" value="글쓰기"
onclick="send(this.form);" >
<input type="button" value="목록보기"
onclick="location.href='list'">
</td>
</tr>
</table>
</form>
</body>
</html>
visit > list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet"
href="${ pageContext.request.contextPath }/resources/css/visit.css">
<script type="text/javascript">
function modify(f) {
var pw = f.pw.value;
var c_pw = f.c_pw.value;
if(pw != c_pw){
alert("비밀번호가 다릅니다.");
return;
}
f.method = "post";
f.action = "${pageContext.request.contextPath}/update_form"
f.submit();
}
function del(f) {
var pw = f.pw.value;
var c_pw = f.c_pw.value;
if(pw != c_pw){
alert("비밀번호가 다릅니다.");
return;
}
if(confirm('정말 삭제하시겠습니까?')==false){
return;
}
f.method = "post";
f.action = "${pageContext.request.contextPath}/delete"
f.submit();
}
</script>
</head>
<body>
<%-- 현재 ContextPath : ${ pageContext.request.contextPath }<br> --%>
<div id="main_box">
<h1>::::방명록 리스트::::</h1>
<div align="center">
<input type="button" value="글쓰기" onclick="javascript:location.href='${pageContext.request.contextPath}/insert_form'">
</div>
<c:forEach var="vo" items="${ list }">
<div class="visit_box">
<div class="type_content">
${ vo.content }<br>
</div>
<div class="type_name">작성자:${ vo.name } (${ vo.ip })</div>
<div class="type_regdate">작성일자:${ vo.regdate }</div>
<div>
<form>
<input type="hidden" name="idx" value="${ vo.idx }">
<input type="hidden" name="pw" value="${ vo.pw }">
비밀번호(${ vo.pw }):<input type="password" name="c_pw">
<input type="button" value="수정" onclick="modify(this.form);">
<input type="button" value="삭제" onclick="del(this.form);">
</form>
</div>
</div>
</c:forEach>
</div>
</body>
</html>
visit > update_form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function send(f)
{
var name = f.name.value;
var content = f.content.value;
var pw = f.pw.value;
if(name==''){
alert('작성자 이름을 입력하세요');
f.name.focus();
return ;
}
if(content==''){
alert('내용을 입력하세요');
f.content.focus();
return;
}
if(pw==''){
alert('비밀번호를 입력하세요');
f.pw.focus();
return;
}
f.action = 'update';
f.submit();//전송
}
</script>
</head>
<body>
<form method="post">
<input type="hidden" name="idx" value="${ vo.idx }">
<table border="1" align="center">
<caption>::::방명록수정::::</caption>
<tr>
<th>작성자</th>
<td><input name="name" value="${ vo.name }"></td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea name="content" rows="5" cols="50">
${ vo.content }</textarea>
</td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="pw" value="${ vo.pw }"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" value="수정하기"
onclick="send(this.form);" >
<input type="button" value="목록보기"
onclick="location.href='list'">
</td>
</tr>
</table>
</form>
</body>
</html>