dto 클래스의 별칭 지정해주는 어노테이션
전에 쓰던거 session => sql session template
다른 점 따로 close()를 안해줘도 된다.
또한 template의 기능 업그레이드 버전인 MyBatis를 사용할 수 있다.
properties 로딩 => alias설정 => 4가지 정보설정 => 맵퍼 등록 => MySqlSessionFactory xml 로딩 => getSqlSession : SqlSession 리턴 사용
properties 로딩 => 4가지 정보 이용 DataSource생성 =>
SqlSessionFactoryBean(생성): 맵퍼등록, dto클래스 위치지정, DataSource 사용
SqlSessionTemplate 빈생성 : SqlSessionFactoryBean 사용
dao : SqlSessionTemplate빈 실제 사용
코드가 스프링을 사용하지 않을 때에 비해서 많이 간소해졌다.
dml문에 필요한 commit문이 필요하지 않고
close문 또한 필요하지 않게 되었다.
config.xml 코드 설정
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 0. 어노테이션 활성화 -->
<context:annotation-config></context:annotation-config>
<!-- 1. properties 등록 -->
<context:property-placeholder location="classpath:com/config/jdbc.properties"/>
<!-- 2. DataSource 생성 -->
<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.userid}"></property>
<property name="password" value="${jdbc.passwd}"></property>
</bean>
<!-- 3. SqlSessionFactoryBean 생성, DataSource, mapper저장, alias지정 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="mySqlSessionFactory">
<property name="dataSource" ref="myDataSource"></property>
<property name="mapperLocations"> <!-- mapper설정 -->
<list>
<value>classpath:com/config/DeptMapper.xml</value>
</list>
</property>
<property name="typeAliases">
<list>
<value>com.dto.DeptDTO</value> <!-- dto클래스에서 alias명을 지정 @Alias("alias명") -->
</list>
</property>
</bean>
<!-- 4. 마지막 SqlSessionTemplate 생성, SqlSession과 동일한 기능 실제 dao에서 사용할 객체 -->
<bean id="mySqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="mySqlSessionFactory"></constructor-arg>
</bean>
<!-- dao, service 등 필요한 곳에서 자동주입받음, 또는 명시적 주입 -->
</beans>
DeptDAO.java
package com.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import com.dto.DeptDTO;
public class DeptDAO {
@Autowired
SqlSessionTemplate session; //기존의 SqlSession과 동일
public SqlSessionTemplate getSession() {
return session;
}
public void setSession(SqlSessionTemplate session) {
this.session = session;
}
public List<DeptDTO> select() {
return session.selectList("selectAll");
}
public int insert(DeptDTO dto) {
return session.insert("insert", dto);
}
public void update(DeptDTO dto) {
session.update("update", dto);
}
public int delete(int i) {
return session.delete("delete", i);
}
}
DeptService.java
package com.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.dao.DeptDAO;
import com.dto.DeptDTO;
public class DeptService {
@Autowired
DeptDAO dao;
public DeptDAO getDao() {
return dao;
}
public void setDao(DeptDAO dao) {
this.dao = dao;
}
public DeptService() {
super();
// TODO Auto-generated constructor stub
}
public List<DeptDTO> select() {
return dao.select();
}
public int add(DeptDTO dto) {
return dao.insert(dto);
}
public void update(DeptDTO dto) {
dao.update(dto);
}
public int delete(int i) {
return dao.delete(i);
}
}
DeptMain.java
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.dto.DeptDTO;
import com.service.DeptService;
public class DeptMain {
public static void main(String[] args) {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:com/config/dept.xml");
// SqlSessionTemplate session = ctx.getBean("mySqlSessionTemplate", SqlSessionTemplate.class);
// System.out.println(session);
DeptService service = ctx.getBean("deptService", DeptService.class);
// DeptDTO xx = new DeptDTO(99, "영업", "제주");
// int n = service.add(xx);
// System.out.println(n);
service.update(new DeptDTO(99, "aa", "aa"));
int n2 = service.delete(99); System.out.println(n2);
List<DeptDTO> list = service.select();
for (DeptDTO d : list) {
System.out.println(d);
}
}
}
form=>servlet : 파싱, db연동, 출력용데이터
폼데이터 파싱에 getParameter, getParameterValues 2가지 함수를 제공함
=> jsp전송, jsp 출력 처리
환경설정 : web.xml
스프링은 mvc패턴을 무조건 사용함
form => controller가 처리(/login => 함수에서 처리)
폼데이터 파싱에 다양한 방법을 제공함
=> jsp위임 출력처리
환경설정 : web.xml을 쓰고 => root-context.xml(db설정, 기타 필요한 빈생성) ,
servlet-context.xml (controller설정)
2가지를 추가로 사용
new -> spring Legacy Project -> speing mvc project 선택하고 이름입력
top-level package 설정 : 최소 3번ㅇ은 들어가야함
마지막 패키지명이 주소가 됨 (중요)
pom.xml 수정해야함
<artifactId>app</artifactId> <!-- context 주소, 하지만 수정한다고 바뀌지는 않음 -->
자바버전 11
스프링버전 4.3.22.릴리즈
home을 바로 찾아갈 수 있는 이유 : servlet-context.xml에서 ViewResolver가 처리해줘서
@RequestMapping("/")으로 주소 처리
WEB-INF/spring/appServlet/serclet-context.xml에 있는
인터날 리소스뷰 리졸버로 "/WEB-INF/views/" 가 앞에, ".jsp"가 뒤에 자동으로 붙음
프론트 파일은 위의 경로에 무조건 위치해야함.
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //bean생성 등록 피요함 Servlet-context.xml
public class TestController {
public TestController() {
super();
System.out.println("controller 기본생성자 호출");
}
// "/test_1/"처리
@RequestMapping("/")
public String main() { //servlet과 동일
System.out.println("/ 주소 요청됨");
return "/WEB-INF/views/aaa.jsp"; //응답처리할 jsp 파일 이름 aaa.jsp
}
@RequestMapping("/kkk")
public String kkk() { //servlet과 동일
System.out.println("/kkk 요청=====================");
return "/WEB-INF/views/hello.jsp"; //응답처리할 jsp 파일 이름 aaa.jsp
}
@RequestMapping("/kkk2")
public String kkk2() {
System.out.println("/kkk2 요청===============");
return "/WEB-INF/views/home.jsp";
}
}
특징
@RequestMapping("/aaa") 해당 주소로 controller를 요청return "xxx"; 리턴값이 응답할 JSP의 파일명.@RequestMapping(value="/login", method=RequestMethod.GET)
이런 식으로 서브밋의 GET/POST를 제한할 수 있다.
또한 만약 아래와 같이 같은 주소에 다른 2개의 함수를 만들고 각각 GET/POST를 다르게 제한을 준다면 GET요청시 GET제한이 걸린 함수로 이동하고, POST요청시 POST제한이 걸린 함수로 이동한다.
마치, 오버로딩과 비슷한 느낌의 작동방식이다.