[목차]
9. Controller 처리, DB연동
① 요청 파라미터
② get/post 방식이 다른 동일 요청 처리
③ DB 연동 - DataSource
④ DB연동 - JdbcDaoSuport
⑤ DB연동 - Mybatis(xml), (root-servlet.xml사용)
⑥ DB연동 - mybatis(annotation), (root-servlet.xml사용)
[내용]
① 요청 파라미터
= sprweb10_para_url
- index.jsp
<body>
<h2>* 요청 파라미터 연습</h2>
<h3>get</h3>
<a href="kbs/login?type=admin">관리자</a><br>
<a href="kbs/login?type=user">일반 사용자</a><br>
<a href="kbs/login">파라미터 없음</a><br>
<h3>post</h3>
<form action="kbs/login? method="post">
data : <input type="text" name="type" value="user">
<input type="submit" value="전송">
</form>
<hr>
<h2>* 요청 URL로 정보전달</h2>
<form action="mbc/korea" method="get">
data : <input type="text" name="name" value="tom">
<input type="submit" value="전송">
</form>
<br>
<form action="mbc/usa" method="get">
data : <input type="text" name="name" value="james">
<input type="submit" value="전송">
</form>
<h2>* 요청 URL로 정보전달2</h2>
<form action="ent/bighit/singer/bts" method="get">
신곡 : <input type="text" name="title" value="다이너마이트">
<input type="submit" value="전송">
</form>
<form action="ent/yg/singer/blackpink" method="get">
신곡 : <input type="text" name="title" value="아이스크림">
<input type="submit" value="전송">
</form>
</body>
=> 요청 url ? 뒤의 key = value 값을 이용하여 정보 전달. (get/post)
=> 요청 url 중 mbc/ 뒤의 값으로 정보 전달.
=> 요청 url 중 ent/ ? /singer/? 각 ent/ singer 뒤의 값으로 정보 전달.
- servlet-context.xml
<context:component-scan base-package="aa.bb.controller" />
=> <context:componet-scan> : controller pakage의 어노테이션 스캔.
- LoginController
@Controller // controller 동작
public class LoginController {
@RequestMapping(value="kbs/login", params = "type=admin")
public ModelAndView aa() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("show");
modelAndView.addObject("msg","관리자");
return modelAndView;
}
@RequestMapping(value="kbs/login", params = "type=user")
public ModelAndView bb() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("show");
modelAndView.addObject("msg","일반고객");
return modelAndView;
}
@RequestMapping(value="kbs/login", params = "!type") // parameter가 없는경우
public ModelAndView cc() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("show");
modelAndView.addObject("msg","인자가 없음.");
return modelAndView;
}
=> @RequestMapping(value="url", params = "key=name") : value는 요청 url에, params는 key, name값에 매핑되는
요청이 들어올 경우 해당 메소드가 실행되도록 한다.
=> params 값에 따라 각각 다른 메소드가 실행되어 setViewName()의 show.jsp 파일에 addObject()로 [msg] key에
value를 전달한다.
// 요청 url의 일부를 변수로 받아 처리
@RequestMapping(value="mbc/{url}")// url변수에 요청 mbc/의 값을 대입한다.
public ModelAndView dd(
@PathVariable String url,
@RequestParam("name") String name) {
System.out.println("url : "+url+" name : "+name);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("show");
if(url.equals("korea")) {
modelAndView.addObject("msg", url+" "+name+"님 만세");
}else if(url.equals("usa")) {
modelAndView.addObject("msg", url+" "+name+"님 ㅇㅇ ");
}else {
modelAndView.addObject("msg","기타");
}
return modelAndView;
}
@RequestMapping(value="ent/{co}/singer/{singer}")
public ModelAndView ee(
@PathVariable String co,
@PathVariable String singer,
@RequestParam("title") String title) {
String datas = "소속사 : "+co+", 가수 : "+singer+", 타이틀 곡 : "+title;
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("show");
modelAndView.addObject("msg", datas);
return modelAndView;
}
}
=> @RequestMapping(value="url/{변수명}") : mbc/korea로 요청url이 들어올 경우 변수에 korea가 들어간다.
@PathVariable 타입 변수명 : 요청 url을 변수로 받도록 하는 어노테이션.
@RequestParam("<form>의 name 속성") 타입 변수 : 변수 String name에 <form>의 value값이 전달된다.
- show.jsp
<body>
결과는 ${msg}
</body>
=> EL 사용 결과값 출력.
② get/post 방식이 다른 동일 요청 처리
= sprweb11_getpost
- index.jsp
<body>
<h2>메인</h2>
회원처리 게시판 <a href="login">로그인(get)</a>
<pre>본문
</pre>
</body>
=> url요청을 login 전달. (Get방식)
- LoginController
@Controller
public class LoginController {
private String formName = "loginform";
@Autowired
private LoginForm loginForm;
@RequestMapping(value="login", method=RequestMethod.GET)
public String form() {
return formName;
}
@RequestMapping(value="login", method=RequestMethod.POST)
public String submit(LoginForm loginForm) {
if(loginForm.getUserid().equalsIgnoreCase("aa")&
loginForm.getPasswd().equalsIgnoreCase("11")) {
return "redirect:/list";//로그인 성공하면 목록보기
}else {
return formName; // 로그인 실패하면 로그인 화면으로 이동
}
}
}
=> index.jsp에서 전달한 url "login"(get 방식)으로 form()메소드가 실행된다.
=> @RequestMapping(value="url명", method=RequestMethod.GET) : 해당 url중 GET방식으로 전달할 경우만 해당
메소드가 실행된다.
=> @Controller의 클래스에 String을 리턴값으로 가지는 form() 메소드가 실행될 경우 리턴값과 동일한 jsp파일을 실행
한다. (loginform.jsp 실행)
- loginform.jsp
<body>
<h2>자료입력</h2>
<form action="login" method="post"/>
id : <input type="text" name="userid" id="userid"/><br>
pwd: <input type="text" name="passwd" id="passwd"/><br>
<input type="submit" value="전송(전통적)"/><br>
</form>
</body>
=> LoginController class의 form() 메소드 실행으로 실행된다.
=> index.jsp의 동일한 url 요청명인 "login"으로 Post방식으로 값을 전달한다.
- LoginController
@Controller
public class LoginController {
private String formName = "loginform";
@Autowired
private LoginForm loginForm;
@RequestMapping(value="login", method=RequestMethod.GET)
public String form() {
return formName;
}
@RequestMapping(value="login", method=RequestMethod.POST)
public String submit(LoginForm loginForm) {
if(loginForm.getUserid().equalsIgnoreCase("aa")&
loginForm.getPasswd().equalsIgnoreCase("11")) {
return "redirect:/list";//로그인 성공하면 목록보기
}else {
return formName; // 로그인 실패하면 로그인 화면으로 이동
}
}
}
=> @RequestMapping(value="url명", method=RequestMethod.POST) : url중 Post방식으로 송부시에 실행된다.
=> String 메소드명(FormBean 변수명) : <form>태그의 name 속성값과 동일한 변수를 가지는 FormBean을 매개변수로
가질 경우 FormBean객체에 각 값들이 대입된다.
str1.equalsIngnorseCase(str2) : str1과 str2를 대소문자 구분하지않고 비교한다.
=> Login에 성공할 경우 redirect로 클라이언트에서 요청을 실행한 것과 같이 실행하여야한다. (forward를 사용하지
않음). Redirect로 list.jsp를 실행한다.
- LoginForm
@Component
public class LoginForm {
private String userid; // <form>태그의 name속성값과 동일하게 변수를 가진다.
private String passwd;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
=> <form>태그의 name속성값과 동일하게 변수를 가지도록 작성한다. FormBean은 client의 요청을 처리할 때 사용
한다. DTO는 DB 자료를 처리할 때 사용. (용도에 따라 관례적으로 FormBean과 DTO를 사용한다)
- ListController
@Controller
public class ListController {
@RequestMapping("list")
public ModelAndView aaa() {
ModelAndView view = new ModelAndView("list");
view.addObject("msg", "로그인 성공으로 하고 뭔가를 출력함");
return view;
}
}
=> 성공시 실행할 내용을 구현한다. "msg" key에 값 전달.
- list.jsp
<body>
결과 : ${msg}
</body>
=> EL사용하여 msg값 출력
③ DB 연동 - DataSource
= sprweb12_db_legacy
- main.jsp
<body>
<h2>메인</h2>
<a href="testdb">상품보기</a>
</body>
=> "testdb" url 전달.(get 방식)
<%response.sendRedirect("testdb"); %>로 동일한 기능 수행하도록 구현가능.
- servlet-context.xml
<context:component-scan base-package="aa.bb.controller" />
<context:component-scan base-package="aa.bb.model" />
=> 어노테이션 scan.
- ListController
@Controller // 클라이언트로 부터 요청 받을 경우 동작
public class ListController {
@Autowired
private DataDao dataDao;
@RequestMapping("testdb") // url mapping
public ModelAndView listProcess() {
ArrayList<SangpumDto> list = dataDao.getDataAll();
return new ModelAndView("list", "datas", list); // list.jsp에 연결.
}
}
=> @Controller : 클라이언트로 부터 요청 받을 경우 동작.
@Autowired : setter injection 기능 수행.
@RequestMapping("url명") : url명과 동일한 url을 받을 경우 실행.
dataDao의 getDataAll()를 실행한 list값을 "datas" key에 넣어 실행한다.
- SangpumDto
public class SangpumDto {
private String code, sang, su, dan;
//getter/setter
}
=> DB 데이터를 담는 DTO 정의.
- DataDao
@Repository // DB 연결.
public class DataDao {
private Connection conn;
private PreparedStatement ptmt;
private ResultSet rs;
public DataDao() {
}
@Autowired
private DataSourceMaria dataSourceMaria;
public ArrayList<SangpumDto> getDataAll(){
ArrayList<SangpumDto> list = new ArrayList<SangpumDto>();
try {
String sql = "select * from sangdata";
conn = dataSourceMaria.getConnection();
ptmt=conn.prepareStatement(sql);
rs = ptmt.executeQuery();
while(rs.next()) {
SangpumDto dto = new SangpumDto();
dto.setCode(rs.getString("code"));
dto.setSang(rs.getString("sang"));
dto.setSu(rs.getString("su"));
dto.setDan(rs.getString("dan"));
list.add(dto);
}
} catch (Exception e) {
System.out.println("getDataAll err"+e);
}finally {
try {
if(conn != null) conn.close();
if(ptmt != null) ptmt.close();
if(rs != null) rs.close();
} catch (Exception e2) {
System.out.println(e2);
}
}
return list;
}
}
=> @Repository : 객체 생성. DB 연결하는 클래스에 사용. 기능은 @Component와 동일.
@Autowired : DriverManagerDataSource를 상속받은 클래스 객체를 setter injection한다.
getConnection() : jdbc와 연결.
prepareStatement(sql) : sql문을 get한다.
executeQuery() : sql문을 실행한 결과를 리턴한다.
rs.next() : sql 실행 결과를 한 행 단위로 읽는다.
rs.getString("record명") : 읽고 있는 sql 실행결과 라인의 Record 값을 리턴한다.
=> sql문의 실행 결과를 dto에 담고 실행결과의 한 줄씩 list에 담는다.(list.add(dto))
=> sql문의 실행결과를 ArrayList로 반환한다.
- DataSourceMaria
@Repository() // DB연동
//@Repository("dataSource")
public class DataSourceMaria extends DriverManagerDataSource{
public DataSourceMaria() {
setDriverClassName("org.mariadb.jdbc.Driver");
setUrl("jdbc:mysql://127.0.0.1:3306/test");
setUsername("root");
setPassword("123");
}
}
=> extends DriverManagerDataSource : 상속하여 DB와 연결하는 객체를 생성한다.
=> setDriverClassName() / setUrl() / setUsername() / setPassword() : JDBC연결을 위한 정보를 set한다.
- list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<body>
<h2>*상품자료(전통적)</h2>
<table border="1">
<tr>
<th>코드</th><th>품명</th><th>수량</th><th>단가</th>
</tr>
<c:forEach var="s" items="${datas}">
<tr>
<td>${s.code}</td>
<td>${s.sang}</td>
<td>${s.su}</td>
<td>${s.dan}</td>
</tr>
</c:forEach>
</table>
</body>
=> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> : EL 액션태그로 core 메소드를 액션태그를 사용
할 수 있게 library를 연결한다.
=> <c:forEach var="변수명" items="${리스트명}"> : var에 items의 list 값을 index 0 부터 null까지 반복 실행한다.
(for-each문)
=> EL사용하여 결과값 출력.
④ DB연동 - JdbcDaoSuport
= sprweb13_db_jdbc_dao_support
- index.jsp
<body>
<a href="testdb">상품보기(JbdcDaoSupport)</a>
</body>
=> DataSource와 동일
- servlet-context.xml
<context:component-scan base-package="aa.bb.controller" />
<context:component-scan base-package="aa.bb.model" />
=> DataSource와 동일
- ListController
@Controller // 클라이언트로 부터 요청 받을 경우 동작
public class ListController {
@Autowired
private DataDao dataDao;
@RequestMapping("testdb") // url mapping
public ModelAndView listProcess() {
ArrayList<SangpumDto> list = dataDao.getDataAll();
return new ModelAndView("list", "datas", list); // list.jsp에 연결.
}
}
=> DataSource와 동일
- SangpumDto
public class SangpumDto {
private String code, sang, su, dan;
//getter/setter
}
=> DataSource와 동일
- DataSourceMaria
@Repository() // DB연동
//@Repository("dataSource")
public class DataSourceMaria extends DriverManagerDataSource{
public DataSourceMaria() {
setDriverClassName("org.mariadb.jdbc.Driver");
setUrl("jdbc:mysql://127.0.0.1:3306/test");
setUsername("root");
setPassword("123");
}
}
=> DataSource와 동일
- DataDao
@Repository // DB 연결.
public class DataDao extends JdbcDaoSupport{
//@Autowired
//private DataSourceMaria dataSourceMaria; // DataDao에 주입됨.
//DataSource를 JdbcDaoSupport가 가지고 있으로 생성자를 이용한다.
public DataDao(DriverManagerDataSource dataSource) {
setDataSource(dataSource);
}
public List<SangpumDto> getDataAll(){
String sql="select * from sangdata";
return getJdbcTemplate().query(sql, new ItemRowMapper());
}
class ItemRowMapper implements RowMapper{
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
SangpumDto dto = new SangpumDto();
dto.setCode(rs.getString("code"));
dto.setSang(rs.getString("sang"));
dto.setSu(rs.getString("su"));
dto.setDan(rs.getString("dan"));
return dto;
}
}
}
=> extends JdbcDaoSupport : JdbcDaoSupport 상속 받아 기능을 수행한다.
=> @Autowird를 사용하면 DataDao객체에 dataSource가 setter injection됨으로 해당 기능이 정상동작하지않는다.
정상동작을 위해선 상속을 받고있는 JdbcDaoSupport객체에 setter injection을 하여야한다. 생성자를 이용하여
DataDao객체가 생성되면 setDataSource()가 실행되도록 하여 JdbcDaoSupport객체에 dataSource를 setter
injection한다.
=> getJdbcTemplate().query(sql, new ItemRowMapper()) : sql문이 ItemRowMapper클래스가 실행하여 한줄 씩 실행된
결과를 List 리턴.
=> implemets RowMapper : RowMapper를 상속하여 mapRow() 메소드를 오버라이딩하여 sql문을 실행한다.
- list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<body>
<h2>*상품자료(전통적)</h2>
<table border="1">
<tr>
<th>코드</th><th>품명</th><th>수량</th><th>단가</th>
</tr>
<c:forEach var="s" items="${datas}">
<tr>
<td>${s.code}</td>
<td>${s.sang}</td>
<td>${s.su}</td>
<td>${s.dan}</td>
</tr>
</c:forEach>
</table>
</body>
=> DataSource와 동일
⑤ DB연동 - Mybatis(xml) (root-servlet.xml사용)
= sprweb14_db_mybatis
- pom.xml
<!-- MariaDB driver -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
=> MariaDB, Mybatis lib 추가한다.
- main.jsp
<body>
<a href="list">상품보기(@MVC-MyBatis)</a>
</body>
=> url 요청명 list 전달.(get방식)
- servlet-context.xml
<context:component-scan base-package="pack.controller" />
<context:component-scan base-package="pack.model" />
=> 어노테이션 사용을 위한 패키지 스캔.
- db.properties
driver=org.mariadb.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=123
=> 계정정보를 가진 자바 속성 파일. key=name 형식. (암호화 파일로 구현하는 것을 지향)
- Configuration.xml
<configuration>
<typeAliases>
<typeAlias type="pack.model.SangpumDto" alias="dto"/>
<typeAlias type="pack.controller.SangpumBean" 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>
=> 공유자원을 관리하는 root-context.xml에서 DB연결을 하도록, Sql문 mapping하는 DataMapper.xml관련 설정을
제외하고 삭제.
=> DataMapper파일과 alias를 정의한다.
- DataMapper.xml
<mapper namespace="dev">
<select id="selectAll" resultType="dto">
select * from sangdata
</select>
<select id="selectSearch" parameterType="formBean" resultType="dto">
select code, sang, su, dan from sangdata
where sang like concat('%',#{searchValue},'%')
</select>
</mapper>
=> sql문과 연결되는 Mapper 파일을 작성한다.(<mapper>태그 내부에 sql문을 형식에 맞춰 작성)
=> <select> : select문 작성 시 사용되는 태그. (id속성 - 외부에서 호출할 이름 / resultType - sql문을 실행한 결과
Type / parameterType속성 - 외부로 부터 받을 매개변수의 타입, #{변수명}에 매개변수가 대입된다.)
=> like concat('%', 검색어, '%') : 검색어가 포함된 결과 반환. ( like %검색어%)
- SqlMapConfig : 미사용 (root-context.xml에서 DB연결)
- root-context.xml
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:pack/mybatis/db.properties</value>
</property>
</bean>
=> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> : 외부 파일의 프로퍼티
정보를 해당 설정파일에서 사용가능하도록 기능 제공.
=> locations 속성으로 db.properties를 read하도록 설정.
db.properties의 프로퍼티를 ${프로퍼티값}으로 사용할 수 있다.
<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>
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:pack/mybatis/Configuration.xml"></property>
</bean>
=> <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> : db를 사용할 수 있도록 기능제공.
drivaerClass, url, usernam, password를 setter 주입하여 db연결 객체 생성.
=> <bean class=org.mybatis.spring.SqlSessionFactoryBean"> : SqlSessionFatory 객체를 생성.
Configuration.xml, dataSource를 setter 주입하여 factory 객체 생성.
factory객체를 여러개 사용시에는 id속성을 사용한다.
- ListController
@Controller
//@ComponentScan("pack.model")
public class ListController {
@Autowired // setter injection
private SangpumInter sangpumInter; // 다형성 사용
@RequestMapping("list")
public Model process(Model model){
model.addAttribute("data", sangpumInter.list());
// Model객체는 addAttribe(key, value) 메소드를 사용하여 값을 전달.
return model; // 받은 요청명 그대로 송부한다.
}
}
=> @Controller : Controller 기능 수행 (servlet 동작)
=> "list" url 받을 경우 동작한다. list()메소드를 실행한 결과를 "data" key에 넣어 list.jsp에 리턴한다.
- SangpumDto
public class SangpumDto {
private String code,sang, su, dan;
//setter, getter
}
=> DB연동에 사용되는 데이터는 Dto로 작성.(select)
- SangpumBean
public class SangpumBean {
// formBean : 수정, 삭제 등의 작업이 있다면 code, sang, su, dan도 처리
// 검색용
private String searchValue;
public String getSearchValue() {
return searchValue;
}
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
}
=> insert, delete의 작업을 진행할 경우 FormBean으로 작성.
=> select문에 매개변수로 들어가 조건을 추가할 searchValue 변수 정의.
- SangpumInter
public interface SangpumInter {
List<SangpumDto> list() throws DataAccessException;
List<SangpumDto> seach(SangpumBean bean) throws DataAccessException;
//insert, update, delete ...
}
=> 테이블별로 interface로 관리한다.
=> db에서 select 전체 테이블 조회 기능을 갖출 list()메소드 선언.
=> db에서 select 특정 검색어가 들어간 데이터를 조회 기능을 갖출 search()메소드 선언.
- SangpumImpl
@Repository // DB연동
public class SangpumImpl extends SqlSessionDaoSupport implements SangpumInter{
@Autowired // 타입에 의한 매핑
// 복수개일 경우 @Quiyfied사용
public SangpumImpl(SqlSessionFactory factory) {
// root-context.xml에서 factory 객체 생성함.
setSqlSessionFactory(factory); // SqlSessionDaoSupport에 factory 주입.
}
@Override
public List<SangpumDto> list() throws DataAccessException {
return getSqlSession().selectList("selectAll");
}
@Override
public List<SangpumDto> seach(SangpumBean bean) throws DataAccessException {
return getSqlSession().selectList("selectSearch", bean);
}
}
=> @Repository : 객체생성(DB연동 기능을 갖출경우 관례적으로 @Repository사용)
=> extends SqlSessionDaoSupport : SqlSession을 제공하는 추상 클래스.(getSqlSession()메소드)
=> implements SangpumInter : 다형성을 통한 테이블별 관리를 하기 위해 interface사용
=> 생성자 setter 주입을 통해 SqlSessionFactory 객체를 sqlSessionDaoSupport에 set한다.(setSqlSessionFactory() 사용)
=> getSqlSession() : sqlSession객체의 메소드를 사용하여 sql문을 실행한 결과를 리턴한다.
=> selectList("매핑 id") : select문을 실행하여 복수의 data를 list로 리턴한다. DataMapper.xml의 id를 매개변수로
가진다.
- SearchController
@Controller
public class SearchController {
@Autowired
private SangpumInter sangpumInter;
@RequestMapping(value="search", method = RequestMethod.POST)
public ModelAndView searchProcess(SangpumBean bean) {
List<SangpumDto> list = sangpumInter.seach(bean);
return new ModelAndView("list","data", list);
}
}
=> "search" url 받을 경우 <form>태그의 name 속성들의 값을 formBean객체로 대입하여 받는다.
formBean객체를 매개변수로 search()메소드를 실행하여 list결과를 "data" key에 리턴한다.
- list.jsp
<body>
<h2>* 상품정보(@MVC - MyBatis)</h2>
<table border="1">
<tr>
<th>코드</th><th>품명</th><th>수량</th><th>단가</th>
</tr>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach var="s" items="${data}">
<tr>
<td>${s.code}</td>
<td>${s.sang}</td>
<td>${s.su}</td>
<td>${s.dan}</td>
</tr>
</c:forEach>
<tr>
<td colspan="4">
<form action="search" method="post">
이름 : <input type="text" name="searchValue">
<input type="submit" value="검색">
</form>
</td>
</tr>
</table>
</body>
=> sql 결과를 테이블 형태로 출력.
⑥ DB연동 - mybatis(annotation), (root-servlet.xml사용)
= sprweb14_db_mybatis_annotation
- main.jsp
<body>
<a href="list">상품보기(@MVC-MyBatis)</a>
</body>
=> xml방식과 동일
- servlet-context.xml
<context:component-scan base-package="pack.controller" />
<context:component-scan base-package="pack.model" />
=> xml방식과 동일
- db.properties
driver=org.mariadb.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=123
=> xml방식과 동일
- Configuration.xml : 미사용(어노테이션 사용)
- DataMapper.xml : 미사용(어노테이션 사용)
- SqlMapConfig : 미사용 (root-context.xml에서 DB연결)
- root-context.xml
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:pack/mybatis/db.properties</value>
</property>
</bean>
=> xml방식과 동일
- ListController
@Controller
//@ComponentScan("pack.model")
public class ListController {
@Autowired // setter injection
private SangpumInter sangpumInter; // 다형성 사용
@RequestMapping("list")
public Model process(Model model){
model.addAttribute("data", sangpumInter.list());
// Model객체는 addAttribe(key, value) 메소드를 사용하여 값을 전달.
return model; // 받은 요청명 그대로 송부한다.
}
}
=> xml방식과 동일
- SangpumDto
public class SangpumDto {
private String code,sang, su, dan;
//setter, getter
}
=> xml방식과 동일
- SangpumBean
public class SangpumBean {
// formBean : 수정, 삭제 등의 작업이 있다면 code, sang, su, dan도 처리
// 검색용
private String searchValue;
public String getSearchValue() {
return searchValue;
}
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
}
=> xml방식과 동일
- SangpumInter
public interface SangpumInter {
List<SangpumDto> list() throws DataAccessException;
List<SangpumDto> seach(SangpumBean bean) throws DataAccessException;
//insert, update, delete ...
}
=> xml방식과 동일
- SangpumAnnoInter
// MyBatis SQL mapping interface file
public interface SangpumAnnoInter {
@Select("select * from sangdata")
public List<SangpumDto> selectAllData();
@Select(" select code, sang, su, dan from sangdata where sang like concat('%',#{searchValue},'%')")
public List<SangpumDto> selectSearch(SangpumBean bean);
}
=> MyBatis SQL mapping interface파일 작성.
=> @Select("select sql문") : db에서 sql문 실행한 결과값을 리턴한다.
- SangpumImpl
@Repository // DB연동
public class SangpumImpl implements SangpumInter{
@Autowired
private SangpumAnnoInter sangpumAnnoInter;
@Override
public List<SangpumDto> list() throws DataAccessException {
return sangpumAnnoInter.selectAllData();
}
@Override
public List<SangpumDto> seach(SangpumBean bean) throws DataAccessException {
return sangpumAnnoInter.selectSearch(bean);
}
}
=> extends SqlSessionDaoSupport은 하지않는다.
=> @Autowired : sql mapping interface객체를 setter injection한다.
=> sql mapping interface객체의 메소드의 결과를 리턴받는다.
- SearchController
@Controller
public class SearchController {
@Autowired
private SangpumInter sangpumInter;
@RequestMapping(value="search", method = RequestMethod.POST)
public ModelAndView searchProcess(SangpumBean bean) {
List<SangpumDto> list = sangpumInter.seach(bean);
return new ModelAndView("list","data", list);
}
}
=> xml방식과 동일
- list.jsp
<body>
<h2>* 상품정보(@MVC - MyBatis)</h2>
<table border="1">
<tr>
<th>코드</th><th>품명</th><th>수량</th><th>단가</th>
</tr>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach var="s" items="${data}">
<tr>
<td>${s.code}</td>
<td>${s.sang}</td>
<td>${s.su}</td>
<td>${s.dan}</td>
</tr>
</c:forEach>
<tr>
<td colspan="4">
<form action="search" method="post">
이름 : <input type="text" name="searchValue">
<input type="submit" value="검색">
</form>
</td>
</tr>
</table>
</body>
=> xml방식과 동일
'BACK END > Spring' 카테고리의 다른 글
[Spring] 스프링 정리9 - 게시판 만들기 (0) | 2021.01.19 |
---|---|
[Spring] 스프링 정리8 - CRUD (0) | 2021.01.19 |
[Spring] 스프링 정리6 - Controller 처리 (0) | 2021.01.13 |
[Spring] 스프링 정리5 - MVC Pattern (0) | 2021.01.13 |
[Spring] 스프링 정리4 - DB연동 (0) | 2021.01.12 |