Backend/Spring

Spring Mybatis Example : Visit 샘플 예제 풀이

쏠솔랄라 2023. 5. 28. 17:48

 

 

예제 작성 주요 순서

 

 

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

아래 파일을 해당 패키지 안에 넣기

 

mybatis.zip
0.00MB

 

 

 

 

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>