CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성)[INSERT], Read(읽기)[SELECT], Update(갱신)[UPDATE], Delete(삭제)[DELETE]를 묶어서 일컫는 말이다. 사용자 인터페이스가 갖추어야 할 기능(정보의 참조/검색/갱신)을 가리키는 용어로서도 사용된다.
CRUD만들기 예:
가장먼저 beans를 만든다.
이는 내가 어떤 정보를 넣을 것인지 테이블 각 열의 최상단에 위치한 항목이라고 생각하면 된다.
여기서 중요한 점은 [com.lat.beans] 패키지를 만들어 다양한 beans를 하나의 패키지에 넣어서 관리한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 |
package com.lat.beans;
public class Dept {
private int num;
private String name;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
|
cs |
위에서 만든 beans를 보면
Class 명으로는 Dept(부서)
Dept Class 안에 변수로는 private로 num과 name이 있다.
SQL에서는 Primary Key, Foreign Key를 통해서 여러 테이블의 관계를 결정하기 때문에
num의 경우 PK라는 것을 알 수가 있다.
private의 경우 public과는 다르게 해당 클래스 내에서만 사용할 수 있으므로
getter & setter를 만들어 다른 곳에서도 Dept Class의 num과 name을 사용할 수 있도록 한다.
그 다음으로 알아볼 것은 [com.lat.dao] 패키지이다.
[com.lat.dao] 패키지의 주 역할은 java와 SQL을 연결시키는 것이다.
명명규칙으로 만들고자 하는 Class이름 뒤에 DAO를 붙인다.
이를 위해서 가장 먼저 interface로 DeptDAO와 DeptMapper를 만든다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
package com.lat.dao;
import java.util.List;
import com.lat.beans.Dept;
public interface DeptDAO {
public void insertDept(Dept dept);
public void updateDept(Dept dept);
public void deleteDept(Dept dept);
public Dept detailDept(Dept dept);
public List<Dept> listDept();
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
package com.lat.dao;
import java.util.List;
import com.lat.beans.Dept;
public interface DeptMapper {
public void insertDept(Dept dept);
public void updateDept(Dept dept);
public void deleteDept(Dept dept);
public Dept detailDept(Dept dept);
public List<Dept> listDept();
}
|
cs |
만드는 과정은 interface명만 다르고 안에 내용은 같다.
내용으로는 insert, update, delete, detail&list 가 눈에 띄는데 이는 SQL 쿼리문과 연결시키 위한 밑작업이라는 것을 알 수가 있다.
다음으로 만들어야 할 것은 SQL 쿼리 문이다.
이는 Mybatis라는 Framework를 사용했으므로 주 기능은 Spring도 제공하는 JDBC 부분 중 쿼리 부분만 따로 xml로 만들어 관리 및 코딩 효율을 올려주는 역할을 한다.
이를 만들기 위해서 DeptMapper와 똑같은 이름을 가진 xml 파일을 만들어 준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 |
<?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="com.lat.dao.DeptMapper">
<resultMap type="Dept" id="DeptResultMap">
<result property="num" column="NUM" />
<result property="name" column="NAME" />
</resultMap>
<select id="listDept" resultMap="DeptResultMap">
SELECT num, name
FROM dept
</select>
<select id="detailDept" parameterType="com.lat.beans.Dept"
resultType="com.lat.beans.Dept">
SELECT num, name
FROM dept
WHERE num=#{num}
</select>
<insert id="insertDept" parameterType="com.lat.beans.Dept">
INSERT INTO dept(num, name)
VALUES (#{num}, #{name})
</insert>
<update id="updateDept" parameterType="com.lat.beans.Dept">
UPDATE dept
SET name=#{name}
WHERE num=#{num}
</update>
<delete id="deleteDept">
DELETE from dept
WHERE num=#{num}
</delete>
</mapper> |
cs |
DeptMapper.xml 을 만들 때 가장 먼저 beans 에 해당하는 항목들을 가져온 후, DAO에서 만든 interface 중 insert, update, delete, detail&list 에 해당하는 쿼리문을 각각 작성해준다.
이작업이 완료되면 Mybatis의 쿼리문과 java Spring과 연결시키는 코드를 작성해야 한다.
우선 Class DeptDAOService를 만든다. 명명 규칙으로 DAOService 만 뒤에 붙여주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 |
package com.lat.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.lat.beans.Dept;
@Repository
public class DeptDAOService implements DeptDAO {
@Autowired
private SqlSession sqlsession;
@Override
public void insertDept(Dept dept) {
// TODO Auto-generated method stub
DeptMapper deptMapper = sqlsession.getMapper(DeptMapper.class);
deptMapper.insertDept(dept);
}
@Override
public void updateDept(Dept dept) {
// TODO Auto-generated method stub
DeptMapper deptMapper = sqlsession.getMapper(DeptMapper.class);
deptMapper.updateDept(dept);
}
@Override
public void deleteDept(Dept dept) {
// TODO Auto-generated method stub
DeptMapper deptMapper = sqlsession.getMapper(DeptMapper.class);
deptMapper.deleteDept(dept);
}
@Override
public Dept detailDept(Dept dept) {
// TODO Auto-generated method stub
DeptMapper deptMapper = sqlsession.getMapper(DeptMapper.class);
return deptMapper.detailDept(dept);
}
@Override
public List<Dept> listDept() {
// TODO Auto-generated method stub
DeptMapper deptMapper = sqlsession.getMapper(DeptMapper.class);
return deptMapper.listDept();
}
}
|
cs |
DeptDAOService Class는 DeptDAO를 implements(상속)을 받는다.
그 후 Spring인 @Autowired를 통해 SqlSession의 Singleton을 만들어 객체생성의 횟수를 줄여 메모리 사용량을 줄여준다.
implements를 했으므로 interface에 미완성된 부분을 완성시켜주는데 여기서 SQL 쿼리문과 연결시키는 작업을 해준다.
이제 기본적인 작업은 끝났고 View단과 Control단만 남았다. 우선 Control단을 먼저 만들어 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107 |
package com.lat.controller;
import java.util.List;
import java.util.Locale;
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 org.springframework.web.servlet.ModelAndView;
import com.lat.beans.Dept;
import com.lat.dao.DeptDAOService;
@Controller
public class DeptController {
@Autowired
private DeptDAOService deptDAOService;
@RequestMapping(value = "/dept/listDept")
public ModelAndView list() {
List<Dept> list = deptDAOService.listDept();
ModelAndView view = new ModelAndView("dept/listDept");
view.addObject("list", list);
return view;
}
@RequestMapping(value = "/dept/insertDept")
public ModelAndView insertDept() {
ModelAndView view = new ModelAndView("dept/insertDept");
return view;
}
@RequestMapping(value = "/dept/insert")
public String insert(HttpServletRequest request) {
String num = request.getParameter("num");
String name = request.getParameter("name");
Dept dept = new Dept();
dept.setNum(Integer.parseInt(num));
dept.setName(name);
deptDAOService.insertDept(dept);
return "redirect:listDept";
}
@RequestMapping(value = "/dept/update")
public String update(HttpServletRequest request) {
String numVal = request.getParameter("num");
int num = 0;
if (numVal != null)
num = Integer.parseInt(numVal);
String name = request.getParameter("name");
Dept dept = new Dept();
dept.setNum(num);
dept.setName(name);
deptDAOService.updateDept(dept);
return "redirect:listDept";
}
@RequestMapping(value = "/dept/updateDept")
public ModelAndView updateDept(HttpServletRequest request) {
String numVal = request.getParameter("num");
int num = 0;
if (numVal != null)
num = Integer.parseInt(numVal);
Dept dept = new Dept();
dept.setNum(num);
Dept deptRlt = deptDAOService.detailDept(dept);
ModelAndView view = new ModelAndView("dept/insertDept");
view.addObject("dept", deptRlt);
return view;
}
@RequestMapping(value = "/dept/delete")
public String deleteDept(HttpServletRequest request) {
String numVal = request.getParameter("num");
int num = 0;
if (numVal != null)
num = Integer.parseInt(numVal);
Dept dept = new Dept();
dept.setNum(num);
deptDAOService.deleteDept(dept);
return "redirect:listDept";
}
@RequestMapping(value = "/dept/detailDept")
public ModelAndView detail(Locale locale, HttpServletRequest request) {
String numVal = request.getParameter("num");
int num = 0;
if (numVal != null)
num = Integer.parseInt(numVal);
Dept dept = new Dept();
dept.setNum(num);
ModelAndView result = new ModelAndView();
Dept deptRlt = deptDAOService.detailDept(dept);
result.addObject("dept", deptRlt);
result.setViewName("dept/detailDept");
return result;
}
}
|
cs |
간단하게 표하나를 만들고 CRUD에 알맞는 기능을 갖추어 주고, 화면에 Table을 먼저 뿌린 후 행을 추가하는 기능인 insert를 넣었고, num에 PK값을 주었기 때문에 num을 조회하면 update, delete할 수 있도록 만들었다.
이 기능대로라면 view단의 경우 1. 메인화면인 Table을 뿌리는 화면, 2. 조회하는 화면, 3. 뿌리는 화면이 필요하다. 그래서 아래와 같이 만들었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import="com.lat.beans.Dept"%>
<%@ page import="java.util.*"%>
<!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=EUC-KR">
<title>detailDept</title>
</head>
<body>
Dept상세보기
<%
Dept dept=(Dept)request.getAttribute("dept");
if(dept==null) dept=new Dept();
%>
<table border="1">
<tr>
<td>Num</td>
<td><%=dept.getNum()%></td>
</tr>
<tr>
<td>Name</td>
<td><%=dept.getName()%></td>
</tr>
<tr>
<td colspan="2">
<form method="post" action="updateDept">
<input type="hidden" name="num" value="<%=dept.getNum() %>"/>
<input type="submit" value="수정"/>
</form>
<form method="post" action="delete">
<input type="hidden" name="num" value="<%=dept.getNum() %>"/>
<input type="submit" value="삭제"/>
</form>
</td>
</tr>
</table>
</body>
</html> |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 |
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import="com.lat.beans.Dept"%>
<%@ page import="java.util.*"%>
<!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=EUC-KR">
<title>insertDept</title>
</head>
<body>
<%
Dept dept=(Dept)request.getAttribute("dept");
if(dept==null) dept=new Dept();
%>
<form method="post"
<% if(dept.getNum()==0){%>
action="insert"
<% }else{%>
action="update"
<% }%>
>
<table border="1">
<tr>
<td>num</td>
<td colspan="2">
<% if(dept.getNum()==0){%>
<input type="text" name="num" value="<%=dept.getNum()%>"/>
<%}else{%>
<input type="hidden" name="num" value="<%=dept.getNum()%>"/>
<%=dept.getNum()%>
<% }%>
</td>
</tr>
<tr>
<td>name</td>
<td colspan="2"><input type="text" name="name" value="<%=dept.getName()==null?"":dept.getName() %>"/></td>
</tr>
<tr>
<td>
<%if(dept.getNum()==0){%>
<input type="submit" value="등록"/>
<%}else{%>
<input type="submit" value="수정"/>
<%}%>
<input type="reset" value="취소"/>
</td>
<td>
<a href="listDept">
<input type="button" value="뒤로가기"/>
</a>
</td>
</tr>
</table>
</form>
</body>
</html> |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 |
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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=EUC-KR">
<title>listDept</title>
</head>
<body>
<table border="1">
<tr>
<td>num</td>
<td>name</td>
</tr>
<c:forEach items="${list}" var="dept">
<tr>
<td>
<a href="detailDept?num=${dept.num}">
${dept.num}
</a>
</td>
<td>${dept.name}</td>
</tr>
</c:forEach>
<tr>
<td colspan="2">
<a href="insertDept">
<input type="button" value="insert"/>
</a>
</td>
</tr>
</table>
</body>
</html> |
cs |
이제 서버를 가동시켜서 실행을 하면된다.
서버의 경우 무료인 Tomcat을 사용하였고, 개발환경 역시 무료인 Eclipse를 사용했다.
'Legend 개발자 > Spring' 카테고리의 다른 글
CRUD-example(Projectr_AttachFile) (0) | 2017.11.03 |
---|---|
CRUD-example(Member_AttachFile) (0) | 2017.11.03 |
CRUD-example(Exam_AttachFile) (0) | 2017.11.03 |
CRUD-example(investment) (0) | 2017.11.02 |
CRUD-example(reward) (0) | 2017.11.02 |