위에 javascript 객체를 사용하는데 있어서 두가지 방법이 있다.
위에 있는 것은 Class 라는 객체를 정의하는데 있어서 function 으로 위임하는 것이다.
즉 일종의 생성자가 되는 것이다.
아래에 있는 것은 객체를 json 형태로 규정해서 각 변수를 정의 한다고 볼 수 있다.
위의 소스를 봅시다. 아랫줄에 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.xml 패턴은 아주 쉽다.
controller 에서
return "common/tiles/test.jsp" 같이 리턴했다면
common={1}, tiles={2}, test={3} 이 된다.
다른거 건드릴필요 없다.
template.jsp 페이지도 만들어주자
spring-security 적용시 root-context.xml 에서 로드가 되어야 하기 때문에 해당되는 Service 나
Dao 객체등을 미리 읽어야 한다. 그래서 위와 같이 필요한 패키지나 클래스만을 읽어 사용 할 수 있다.
물론 spring 은 모든 객체를 singleton registry 형태로 관리하기 때문에 객체가 중복될 염려는 없겠다.
spring 에서 sql connection 을 위한 db 접속정보를 설정할때 보통
datasource 를 통해서 기본정보들을 넣어주게 된다
위에는 datasource 생성은 빠져있다. 만약 xml형태로 설정을 한다면 보안상 문제가 될 소지가 있다.
그래서 source 상에서 암호화를 통해 설정하는 방식도 존재한다.
하지만 db connection 을 위해서는 datasource 를 생성해야 하고 xml 상에서 생성 할 수 없다면
source 내에서 new 로 생성을 할 수 밖에 없다. 하지만 spring framework 특성상 DI 법칙에 따라
생성을 주도 할 수 있는 entrypoint 가 존재하지 않는다.
따라서 다음과 같은 방법을 사용한다.
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;
}
}
@Configuration, @Bean 의 어노테이션이 보일거다.
@Configuration 이 것은 이 java class 는 spring의 설정 역할이라는 것을 알려준다.
그리고 @Bean 은 이 메소드에서 리턴 되는 객체는 spring의 Bean객체라는 것을 알려준다.
즉 위 클래스는 소스상에서 자동으로 bean객체를 생성한다.
또한 @Configuration 은 @Component 어노테이션을 meta-annotation 으로 가지고 있기 때문에
component-scan 을 통해 자동으로 bean 으로 등록이 된다.
코드 수정함
원래 목적은 session 이 없을때는 spring-security 로 넘기는 식으로 하려 했으나
interceptor의 개입시점이 spring-security 보다 늦는 문제가 있다
그래서 sessionVo 가 소멸됬을때 session 전체를 소멸하고 다시 request url 로 이동하는 식으로 했다
이는 POST 방식일때 같은 url 로 get방식으로 이동하므로 restful 스타일에 알맞다