[Spring] 스프링 정리8 - CRUD
[목차]
10. CRUD(Create, Read, Update, Delete)
: 스프링 사용.
: xml 의존방식 db 연결(root-context사용).
① DB 연동
② 모든 list 출력
③ 데이터 추가(Insert)
④ Data 수정(Update)
⑤ 데이터 삭제(Delete)
[내용]
= sprweb15_crud
① DB 연동
- Configuration.xml
<configuration>
<typeAliases>
<typeAlias type="pack.model.MemDto" alias="dto"/>
<typeAlias type="pack.controller.MemBean" alias="formBean"/>
</typeAliases>
<!-- DB 연결을 root-context.xml에서 하도록 수정.
<properties resource="pack/mybatis/db.properties" />
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
-->
<mappers>
<mapper resource="pack/mybatis/DataMapper.xml" />
</mappers>
</configuration>
=> DataMapper.xml 연결.
- DataMapper.xml
<mapper namespace="dev">
<select id="selectAll" resultType="dto">
select num, name, addr from mem
</select>
<select id="selectPart" parameterType="String" resultType="dto">
select num, name, addr from mem
where num=#{num}
</select>
<insert id="insertData" parameterType="formBean">
insert into mem values(#{num}, #{name}, #{addr})
</insert>
<update id="updateData" parameterType="formBean">
update mem set name=#{name}, addr=#{addr}
where num=#{num}
</update>
<delete id="deleteData" parameterType="String">
delete from mem where num=#{num}
</delete>
</mapper>
=> sql문 mapping.
- db.properties
driver=org.mariadb.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/happydb
username=root
password=123
=> 계정 정보 파일.
- root-context.xml
<!-- PropertyPlaceholderConfigurer 사용 : 외부 프로퍼티의 정보를 설정파일에서 사용가능.-->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- locations 속성으로 db.properties를 read하도록 설정 -->
<!-- db.properties의 프로퍼티를 ${프로퍼티값}으로 사용할 수 있다. -->
<property name="locations">
<value>classpath:pack/mybatis/db.properties</value>
</property>
</bean>
<!-- SimpleDriverDataSource 사용 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<!-- -->
<property name="driverClass" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
<!-- SqlSessionFactoryBean 사용 -->
<!-- 복수개일 경우 id를 셋팅 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- SqlMapConfig의 SqlSession에 Configuration.xml 연결-->
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:pack/mybatis/Configuration.xml"></property>
</bean>
=> DB 연동. SqlFactory 객체 생성.
- servlet-context.xml
<context:component-scan base-package="pack.controller" />
<context:component-scan base-package="pack.model" />
=> 어노테이션 스캔
② 모든 list 출력
- index.jsp
<body>
<h2>메인</h2>
<ul>
<li>인사관리</li>
<li>영업관리</li>
<li>물류관리</li>
<li><a href="list">회원관리</a></li>
<li>문의사항</li>
</ul>
</body>
=> url "list" (Get 방식으로 송부)
- ListController
@Controller
public class ListController {
@Autowired
private MemDaoInter daoInter;
@RequestMapping("list")
public ModelAndView list() {
/*
List<MemDto> list = daoInter.getDataAll();
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("list");
modelAndView.addObject("list", list);
return modelAndView;
*/
return new ModelAndView("list","list",daoInter.getDataAll());
}
}
=> @Controller : sevlet controller 동작.
=> url "list" 받을 경우 실행. list.jsp에 key("list")로 value(getDataAll() 리턴 값) 전달.
- MemBean
public class MemBean {
private String num;
private String name;
private String addr;
//getter/setter
}
=> FormBean작성. (insert/delete/update에 사용)
- MemDto
public class MemDto {
private String num;
private String name;
private String addr;
//getter/setter
}
=> DTO 작성(select에 사용)
- MemDaoInter
public interface MemDaoInter {
List<MemDto> getDataAll();
MemDto selectPart(String num);
boolean insertData(MemBean bean);
boolean updateData(MemBean bean);
boolean deleteData(String num);
}
=> 다형성 프로그래밍을 위한 interface 사용.
- MemDaoImpl
@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
@Autowired
public MemDaoImpl(SqlSessionFactory factory) {
setSqlSessionFactory(factory);
}
@Override
public List<MemDto> getDataAll() {
return getSqlSession().selectList("selectAll");
}
...
}
=> extends SqlSessionDaoSupport : sqlSession사용을 위해 상속진행.
=> 생성자 주입을 통한. sqlSessionFactory 객체 주입.
=> DataMapper.xml의 <select>태그의 id "selectAll" sql문 실행 결과 리턴
<select id="selectAll" resultType="dto">
select num, name, addr from mem
</select>
...
- list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<body>
<h2>*회원정보(@MVC - MyBatis : CRUD)</h2>
<a href="insert">회원추가</a><br>
<table border="1">
<tr>
<th>번호</th><th>이름</th><th>주소</th><th>변경</th>
</tr>
<c:forEach var="m" items="${list}">
<tr>
<td>${m.num}</td>
<td>${m.name}</td>
<td>${m.addr}</td>
<td>
<a href="update?num=${m.num}">수정</a>
<a href="delete?num=${m.num}">삭제</a>
</td>
</tr>
</c:forEach>
</table>
</body>
=> 모든 list 출력 결과 실행.
=> 회원추가 하이퍼링크 클릭시 url "insert" 송부.(get방식)
=> 수정 하이퍼링크 클릭시 url "update" 송부.(get방식)(num 값 전달)
=> 삭제 하이퍼링크 클릭시 url "delete" 송부.(get방식)(num 값 전달)
③ 데이터 추가(Insert)
- InsertController
@Controller
public class InsertController {
@Autowired
private MemDaoInter daoInter;
@RequestMapping(value = "insert", method = RequestMethod.GET)
public String insert() {
return "insform";
}
...
}
=> GET방식 url "insert" 받을 경우 insert() 메소드 실행.
=> insform.jsp 실행.
- insform.jsp
<body>
<h2>*회원입력</h2>
<form action="insert" method="post">
번호 : <input type="number" name="num"><br>
이름 : <input type="text" name="name"><br>
주소 : <input type="text" name="addr"><br>
<input type="submit" value="추가">
</form>
</body>
=> 회원정보 입력 <form> 생성.
=> submit시 url "insert" 송부(post방식).
- InsertController
@Controller
public class InsertController {
@Autowired
private MemDaoInter daoInter;
...
@RequestMapping(value="insert", method=RequestMethod.POST)
public String submit(MemBean bean) {
boolean b = daoInter.insertData(bean);
if(b) {
return "redirect:/list"; // list controller를 실행해야함으로 redirect로 보낸다.
}else {
return "error";
}
}
}
=> POST방식 url "insert" 받을 경우 submit() 메소드 실행.
=> <form>태그 value가 MemBean에 set된다.
=> bean값을 매개변수로 insertData()메소드 실행하여 insert 성공시 모든 list를 다시 출력하고,
실패할 경우 error.jsp 실행.
- MemDaoImpl
@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
@Autowired
public MemDaoImpl(SqlSessionFactory factory) {
setSqlSessionFactory(factory);
}
...
@Override
public boolean insertData(MemBean bean) {
try {
getSqlSession().insert("insertData", bean);
return true;
} catch (Exception e) {
System.out.println("insertData err"+e);
return false;
}
}
...
}
=> DataMapper.xml의 <insert>태그의 id "insertData" sql문 실행 결과 리턴
<insert id="insertData" parameterType="formBean">
insert into mem values(#{num}, #{name}, #{addr})
</insert>
- error.jsp
<body>
<h2>에러가 발생하였습니다.</h2>
<a href="list">회원자료</a> 보기
</body>
=> 에러 처리 jsp.
④ Data 수정(update)
- UpdateController
@Controller
public class UpdateController {
@Autowired
private MemDaoInter daoInter;
@RequestMapping(value="update", method = RequestMethod.GET)
public ModelAndView update(@RequestParam("num") String num) {
MemDto dto = daoInter.selectPart(num);
return new ModelAndView("upform","dto",dto);
}
...
}
=> GET방식 url "update" 받을 경우 update() 메소드 실행.
=> ?key=value값을 @RequestParam사용하여 num에 set.
=> selectPart()메소드 실행하여 검색 값 리턴하여 upform.jsp에 "dto"key로 값 전달.
- MemDaoImpl
@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
@Autowired
public MemDaoImpl(SqlSessionFactory factory) {
setSqlSessionFactory(factory);
}
...
@Override
public MemDto selectPart(String num) {
return getSqlSession().selectOne("selectPart",num);
}
...
}
=> DataMapper.xml의 <select>태그의 id "selectPart" sql문 실행 결과 리턴
<select id="selectPart" parameterType="String" resultType="dto">
select num, name, addr from mem
where num=#{num}
</select>
- upform.jsp
<body>
<h2>* 회원 정보 수정</h2>
<form action="update" method="post">
번호 : ${dto.num}<br>
<input type="hidden" name="num" value="${dto.num}">
이름 : <input type="text" name="name" value="${dto.name}"><br>
주소 : <input type="text" name="addr" value="${dto.addr}"><br>
<input type="submit" value="수정">
</form>
</body>
=> 검색한 Data를 초기값으로 set.
=> <form>태그 값 수정 후 submit시 url "update" post방식으로 전달.
- UpdateController
@Controller
public class UpdateController {
@Autowired
private MemDaoInter daoInter;
...
@RequestMapping(value="update", method = RequestMethod.POST)
public String submit(MemBean bean) {
boolean b = daoInter.updateData(bean);
if(b) {
return "redirect:/list";
}else {
return "error";
}
}
}
=> POST방식 url "update" 받을 경우 submit() 메소드 실행.
=> <form>태그 값 MemBean에 set.
=> bean을 매개변수로 updateData()메소드 실행하여 업데이트 성공시 list.jsp 출력. 실패 시 error.jsp실행.
- MemDaoImpl
@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
@Autowired
public MemDaoImpl(SqlSessionFactory factory) {
setSqlSessionFactory(factory);
}
...
@Override
public boolean updateData(MemBean bean) {
try {
getSqlSession().update("updateData", bean);
return true;
}catch (Exception e) {
System.out.println("updateData err"+e);
return false;
}
}
...
}
=> DataMapper.xml의 <update>태그의 id "updateData" sql문 실행 결과 리턴
...
<update id="updateData" parameterType="formBean">
update mem set name=#{name}, addr=#{addr}
where num=#{num}
</update>
...
⑤ 데이터 삭제(Delete)
- DeleteController
@Controller
public class DeleteController {
@Autowired
MemDaoInter daoInter;
@RequestMapping("delete")
public String delete(@RequestParam("num") String num) {
boolean b = daoInter.deleteData(num);
if(b) {
return "redirect:/list";
}else {
return "error";
}
}
}
=> GET방식 url "delete" 받을 경우 delete() 메소드 실행.
=> @RequestParam사용하여 num값 set.
=> num을 매개변수로 deleteData()메소드 실행하여 삭제 성공시 list.jsp 출력. 실패 시 error.jsp실행.
- MemDaoImpl
@Repository
public class MemDaoImpl extends SqlSessionDaoSupport implements MemDaoInter{
@Autowired
public MemDaoImpl(SqlSessionFactory factory) {
setSqlSessionFactory(factory);
}
...
@Override
public boolean deleteData(String num) {
try {
int result = getSqlSession().delete("deleteData", num);
return true;
}catch (Exception e) {
System.out.println("deleteData err"+e);
return false;
}
}
}
=> DataMapper.xml의 <delete>태그의 id "deleteData" sql문 실행 결과 리턴
<delete id="deleteData" parameterType="String">
delete from mem where num=#{num}
</delete>