2024. 2. 12. 15:41ㆍDaily Codig Reminder
기존 mybatis 설정
config.xml ⇒properties 로딩 ⇒ alias 설정 ⇒ 4가지 정보 설정⇒ 맵퍼 등록
⇒mySqlSessionFactory xml로딩 ⇒ getSqlSession : ssql session리턴 사용
스프링 설정
properties 로딩 ⇒ 4가지 정보 이용 DataSource 생성 ⇒
SqlSessionFactoryBean (생성): 맵퍼등록, dto 클래스 위치 지정, dataSource 사용
SqlsessionTemplate 빈 생성 : SqlSessionFactoryBean 사용
dao : SqlsessionTemplate 빈 실제 사용
tx_annotation
main
import java.util.List;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.entity.OrderDTO;
import com.entity.ProductDTO;
import com.service.ProductService;
public class DeptMain {
public static void main(String[] args) {
GenericXmlApplicationContext ctx=
new GenericXmlApplicationContext("classpath:com/config/product.xml");
ProductService service= ctx.getBean("deptService", ProductService.class);
List<ProductDTO> list= service.selectProduct();
System.out.println("주문전 상품록록 =============================================");
for (ProductDTO d : list) {
System.out.println(d);
}
// 상품 주
System.out.println("p01 상품 3개 주문합니다");
try {
service.addOrder("p01", 3);
} catch (Exception e) {
System.out.println("에러가 발생하여 롤백처리.");
}
System.out.println("주문 후 상품록록 =============================================");
list = service.selectProduct();
for (ProductDTO dto : list) {
System.out.println(dto);
}
System.out.println(" 주문 후 order 테이블 목록==================================");
List<OrderDTO> oList = service.selectOrder();
for (OrderDTO dto : oList) {
System.out.println(dto);
}
}
}
dao
public class ProductDAO {
//Mybatis 사용
SqlSessionTemplate template;
public void setTemplate(SqlSessionTemplate template) {
this.template = template;
}
// 전체 상품 목록
public List<ProductDTO> selectProduct() {
// sysout template
return template.selectList("productList");
}// end select
// 전체 주문 목록
public List<OrderDTO> selectOrder() {
return template.selectList("orderList");
}// end select
public void addOrder(String pcode, int quantity) throws Exception{
OrderDTO dto = new OrderDTO();
dto.setPcode(pcode);
dto.setQuantity(quantity);
int n = template.insert("order.orderInsert", dto); //정상 insert
System.out.println("order table insert = "+n);
// template.update("product.productUpdate",dto);//에러 발생
template.update("product.produc ",dto);//에러 발생 코드
}// end insert
// 주문
}
service
public class ProductService {
ProductDAO dao;
public ProductDAO getDao() {
return dao;
}
public void setDao(ProductDAO dao) {
this.dao = dao;
}
//占쏙옙瞿占쏙옙占�
public List<ProductDTO> selectProduct(){
//sysout dao
return dao.selectProduct();
}
public List<OrderDTO> selectOrder() {
return dao.selectOrder();
}
//특占쏙옙 占쏙옙占쌘듸옙
@Transactional///////////////////////////////////////////
public void addOrder(String pcode, int quantity) throws Exception{
dao.addOrder(pcode, quantity);
}
productmapper
<mapper namespace="product">
<select id="productList" resultType="com.entity.ProductDTO">
select pcode,pname,price,quantity
from t_product
order by pcode asc
</select>
<update id="productUpdate" parameterType="com.entity.ProductDTO">
update t_product
set quantity = quantity - #{ quantity }
where pcode = #{pcode}
</update>
ordermapper
<mapper namespace="order">
<select id="orderList" resultType="com.entity.OrderDTO">
select num, pcode, quantity
from t_order order by num
</select>
<insert id="orderInsert" parameterType="com.entity.OrderDTO">
insert into t_order ( num, pcode, quantity )
values ( t_order_seq.nextval, #{pcode} , #{quantity} )
</insert>
bean
<?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"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 필수 context, tx check-->
<!-- 어노테이션 활성화-->
<context:annotation-config></context:annotation-config>
<!-- tx 처리 시작-->
<!--1. properties등록 -->
<context:property-placeholder location="classpath:com/config/db.properties"/>
<!-- 2. DataSource생성-->
<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${oracle.username}"></property>
<property name="password" value="${oracle.password}"></property>
</bean>
<!-- 3.tx처리용 txManager생성 및 tx annotaion활성화 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"></property>
</bean>
<!--4. <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="false"/> -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- tx 처리 끝 -->
<!-- Mybatis 설정 -->
<!-- 3. SqlSessonFactoryBean생성, mapper지정, alias지정 -->
<bean id="mySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myDataSource"></property>
<property name="mapperLocations">
<list>
<value>classpath:com/config/productMapper.xml</value>
<value>classpath:com/config/orderMapper.xml</value>
</list>
</property>
<!-- <property name="mapperLocations" value="classpath:com/dao/*.xml" /> -->
<!-- <property name="typeAliasesPackage" value="com.test" /> -->
<property name="typeAliases">
<list>
<value>com.entity.OrderDTO</value><!-- dto클래스에서 alias명 지정 @Alias('alias명') -->
<value>com.entity.ProductDTO</value><!-- dto클래스에서 alias명 지정 @Alias('alias명') -->
</list>
</property>
</bean>
<!-- 4.마지막 SqlSessinTemplate 생성, SqlSession과 동일한 기능 -->
<bean id="mySqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="mySqlSessionFactory"></constructor-arg>
</bean>
<!--5. 필요한 빈 생성 -->
<bean id="deptDAO" class="com.dao.ProductDAO">
<property name="template" ref="mySqlSessionTemplate"></property>
</bean>
<bean id="deptService" class="com.service.ProductService">
<property name="dao" ref="deptDAO"></property>
</bean>
</beans>
주문전 상품록록 =============================================
ProductDTO [pcode=p01, pname=TV, price=1000, quantity=10]
ProductDTO [pcode=p02, pname=iPhone, price=500, quantity=5]
ProductDTO [pcode=p03, pname=G3, price=600, quantity=20]
p01 상품 3개 주문합니다
order table insert = 1
에러가 발생하여 롤백처리. 주문 후 상품록록
=============================================
ProductDTO [pcode=p01, pname=TV, price=1000, quantity=10]
ProductDTO [pcode=p02, pname=iPhone, price=500, quantity=5]
ProductDTO [pcode=p03, pname=G3, price=600, quantity=20]
주문 후 order 테이블 목록==================================
mybatis3
dao
package com.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.entity.OrderDTO;
import com.entity.ProductDTO;
/*
-- 상품테이블
drop table t_order purge;
drop table t_product purge;
create table t_product
( pcode varchar2(10) primary key,
pname varchar2(10),
price number(4),
quantity number(4) );
-- 주문 테이블
create table t_order
( num number(4) primary key,
pcode varchar2(10) references t_product(pcode),
quantity number(4) );
create sequence t_order_seq;
insert into t_product( pcode,pname,price,quantity) values ( 'p01','TV',1000, 10 );
insert into t_product( pcode,pname,price,quantity) values ( 'p02','iPhone',500, 5 );
insert into t_product( pcode,pname,price,quantity) values ( 'p03','G3',600, 20 );
commit;
*/
@Repository
public class ProductDAO {
@Autowired
SqlSessionTemplate template;
public void setTemplate(SqlSessionTemplate template) {
this.template = template;
}
@Transactional //트렌젝션추가
public void addOrder(String pcode, int quantity) throws Exception{
OrderDTO dto = new OrderDTO();
dto.setPcode(pcode);
dto.setQuantity(quantity);
int n = template.insert("order.orderInsert", dto);
System.out.println("order table insert = "+n);
// template.update("product.productUpdate",dto);//에러 발생
template.update("product.produc ",dto);//에러 발생 코드
}// end insert
// 전체 상품 목록
public List<ProductDTO> selectProduct() {
return template.selectList("productList");
}// end select
// 전체 주문 목록
public List<OrderDTO> selectOrder() {
return template.selectList("orderList");
}// end select
// 주문
}
service
package com.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.dao.ProductDAO;
import com.entity.OrderDTO;
import com.entity.ProductDTO;
@Service("deptService")
public class ProductService {
@Autowired
ProductDAO dao;
public ProductDAO getDao() {
return dao;
}
public void setDao(ProductDAO dao) {
this.dao = dao;
}
//占쏙옙瞿占쏙옙占�
public List<ProductDTO> selectProduct(){
return dao.selectProduct();
}
public List<OrderDTO> selectOrder() {
return dao.selectOrder();
}
//특占쏙옙 占쏙옙占쌘듸옙
@Transactional
public void addOrder(String pcode, int quantity) throws Exception{
dao.addOrder(pcode, quantity);
}
}
없앤빈
<!--5. 필요한 빈 생성 -->
<!-- <bean id="deptDAO" class="com.dao.ProductDAO">
<property name="template" ref="mySqlSessionTemplate"></property>
</bean>
<bean id="deptService" class="com.service.ProductService">
<property name="dao" ref="deptDAO"></property>
</bean> -->
form ⇒ servlet :파싱 ,
getParameter, getParameterValues) , db연도ㅇ, 출력용데이터 ⇒jsp전송, jsp 출력처리
환경설정:web.xml
spring form⇒controller 가 처리 (/login ⇒ 함수에서 처리)
폼네이터파싱 다양한 방법제공 ⇒jsp 위임 출력처리
환경설정: web.xml ⇒ root-context.xml , servlet-context.xml ,
mvc
<artifactId>app</artifactId> : 주소 , 수정해도 주소 안바뀜
<java-version>11</java-version>
<org.springframework-version>4.3.22.RELEASE</org.springframework-version>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mvc</groupId>
<artifactId>test_1</artifactId>
<name>06Day1_MVC_basic01</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>11</java-version>
<org.springframework-version>4.3.22.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>11</source>
<target>11</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
servlet 한군데서 처리
@Controller 붙이기
@RequestMapping("/")
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
public TestController() {
super();
System.out.println("controller 기본생성자 호출");
}
// "/test_1/"처리
@RequestMapping("/")//get, post 둘다 처리
public String main() {//servlet과 동일
System.out.println("/ 주소요청됨");
return "/WEB-INF/views/aaa.jsp";//응답요청을 할 jsp 파일이름 test.jsp
}
@RequestMapping("/kkk")//get, post 둘다 처리
public String kkk() {//servlet과 동일
System.out.println("/kkk 요청");
return "/WEB-INF/views/hello.jsp";//응답요청을 할 jsp 파일이름 test.jsp
}
@RequestMapping("/kkk2")//get, post 둘다 처리
public String kkk2() {//servlet과 동일
System.out.println("/kkk2 요청");
return "/WEB-INF/views/home.jsp";//응답요청을 할 jsp 파일이름 test.jsp
}
}
BEAN만 적으면 주소를 적어야 함
<bean id="xxx" class="com.controller.TestController"></bean>
mvc
@Controller
public class MainController {
public MainController() {
super();
System.out.println("controller 기본생성자 호출");
}
@RequestMapping("/aaa")//get, post 둘다 처리
public String aaa() {//servlet과 동일
System.out.println("/ 주소요청됨");
return "home";//응답요청을 할 jsp 파일이름 test.jsp
}
@RequestMapping("/target")//get, post 둘다 처리
public String target() {//servlet과 동일
System.out.println("/ target 주소요청됨");
return "target";//응답요청을 할 jsp 파일이름 test.jsp
}
beans 덕분에 경로 안적어도 로딩이 됨
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
<!-- 이름만 써도 로딩이 됨 -->
</beans:bean>
<beans:bean id="xxx" class="com.controller.MainController"></beans:bean>
<context:component-scan base-package="com.test.testapp" />
mvc2
@Controller
public class MainController {
public MainController() {
super();
System.out.println("main기본생성자");
}
@RequestMapping("/loginForm")//get, post 둘다 처리
public String loginForm() {//servlet과 동일
System.out.println("/loginForm 요청");
return "loginForm";//응답요청을 할 jsp 파일이름 test.jsp
}
@RequestMapping("/index")//get, post 둘다 처리
public String index() {//servlet과 동일
System.out.println("/index 요청");
return "index";//응답요청을 할 jsp 파일이름 test.jsp
}
@RequestMapping("/login")//get, post 둘다 처리
public String login() {//servlet과 동일
System.out.println("/login 요청");
return "login";//응답요청을 할 jsp 파일이름 test.jsp
}
<h1>
loginForm.jsp
</h1>
<form action="login" method="post">
<input type="text" name="username" required="required"><br>
<input type="password" name="password" required="required"><br>
<input type="email" name="email" required="required"><br>
<input type="submit" value="전송"><br>
</form>
전송 클릭시 login.jsp 로 이동
이 액션은 controller 에서 만들어놓은 함수로 연결도어 링크로 빠짐
→ get 방식인데 form이 post 일 때
@RequestMapping(value = "/login" , method = RequestMethod.GET)//get, post 둘다 처리
public String login() {//servlet과 동일
System.out.println("/login 요청");
return "login";//응답요청을 할 jsp 파일이름 test.jsp
}
@RequestMapping(value = "/login" , method = RequestMethod.POST)//get, post 둘다 처리
public String loginPost() {//servlet과 동일
System.out.println("/login 요청");
return "login";//응답요청을 할 jsp 파일이름 test.jsp
}
이렇게 다른방식이면 form 에 입력된방식으로 운영됨.
단, get get /postpost 같이는 안됨
'Daily Codig Reminder' 카테고리의 다른 글
parameter, session (0) | 2024.02.16 |
---|---|
parameter (1) | 2024.02.12 |
spring- jdbc (1) | 2024.02.08 |
@Autowired, CoC ,@Qualifier ,lifecycle (1) | 2024.02.08 |
props, autowired (1) | 2024.02.07 |