2013년 9월 13일 금요일

transaction 적용

/////////////////////////////



package com.jetddo.study.config;

import java.io.IOException;

import javax.sql.DataSource;

import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.jetddo.study.util.Base64Decoder;

@Configuration
public class DataSourceConfig {
 
 @Bean(destroyMethod="close")
 public DataSource dataSource() throws IOException {
  
  BasicDataSource dataSource = new BasicDataSource();
  dataSource.setDriverClassName(Base64Decoder.decode("b3JhY2xlLmpkYmMuZHJpdmVyLk9yYWNsZURyaXZlcg=="));
  dataSource.setUrl(Base64Decoder.decode("amRiYzpvcmFjbGU6dGhpbjpAMTI3LjAuMC4xOjE1MjE6b3JjbA=="));
  dataSource.setUsername(Base64Decoder.decode("amV0ZGRv"));
  dataSource.setPassword(Base64Decoder.decode("Y2RtYTIwMDQ="));
  dataSource.setDefaultAutoCommit(false);
  
  return dataSource;
  
 }
}


/////////////////////////

위의 소스를 봅시다. 아랫줄에 AutoCommit 을 false로 설정하고 있다.
true 로 설정하면 dao 에서 바로 commit 이 일어나게 된다. 문제가 발생한 경우 되돌릴수 없다.
그래서 Transaction 을 적용한다. 매우 간단하다.

ibatis 설정 xml 에 다음을 추가하자.





 
            
 
    
 
       
 
 
 
  
  

 





dao class 에 다음과 같이 설정하자

/////////////////////////////////////

package com.jetddo.study.manage.dao;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.jetddo.study.manage.model.ManageUserVo;

@Repository
@SuppressWarnings("unchecked")

public class ManageUserDao extends SqlMapClientDaoSupport {
 
 @Resource(name="sqlMapClient")
 public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
  super.setSqlMapClient(sqlMapClient);
 }
 
 @Transactional
 public List selectAll(){
  
  return (List)getSqlMapClientTemplate().queryForList("mng_usr.selectAll");
  
 }
 
 @Transactional
 public ManageUserVo selectOnebyUserUid(long usr_uid){
  
  return (ManageUserVo)getSqlMapClientTemplate().queryForObject("mng_usr.selectOnebyUserUid",usr_uid);
  
 } 
 
 @Transactional
 public void insertOne(ManageUserVo mngUsrVo){
  
  getSqlMapClientTemplate().insert("mng_usr.insertOne",mngUsrVo);

 }
 
 @Transactional
 public void deleteOnebyUserUid(long usr_uid){
  
  getSqlMapClientTemplate().delete("mng_usr.deleteOnebyUserUid",usr_uid);

 }
}

////////////////////////////////////


참고로 autocommit 을 false로 설정하면 transaction 을 통해서만 commit 이 된다.

tiles 3.0

심심해서 tiles 3.0 을 적용시켜 보았다.
설정들을 봅시다





  org.apache.tiles
  tiles-core
   3.0.0
  

   org.apache.tiles
  tiles-servlet
   3.0.0


   org.apache.tiles
   tiles-jsp
    3.0.0







    
   

 

    
        /WEB-INF/tiles.xml
    

 
 









    
        
        
        
    
    
    
     
    
    
    
     
    
    
    
     
    




설명함

알아서 파일이름 매칭시켜서 복붙하면 되고,
tiles.xml 패턴은 아주 쉽다.

controller 에서 
return "common/tiles/test.jsp" 같이 리턴했다면
common={1}, tiles={2}, test={3} 이 된다.
다른거 건드릴필요 없다.

template.jsp 페이지도 만들어주자

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="t" %>
<%@ page session="false" pageEncoding="UTF-8" %>



 
 

 Home
 
  
  

component-scan 2

component-scan 보충




 
 



spring-security 적용시 root-context.xml 에서 로드가 되어야 하기 때문에 해당되는 Service 나
Dao 객체등을 미리 읽어야 한다. 그래서 위와 같이 필요한 패키지나 클래스만을 읽어 사용 할 수 있다.

물론 spring 은 모든 객체를 singleton registry 형태로 관리하기 때문에 객체가 중복될 염려는 없겠다.