티스토리 툴바



2012/01/26 11:32

Jrebel - 작서중

크리에이티브 커먼즈 라이선스
Creative Commons License

사용화 버전이라 달러를 주고 사용해야 하지만 social 버전은 무료로 가용이 가능하다.
social 버전은 페이스북과 트윗 아이디만 있으면 
https://social.jrebel.com/dashboard 
페이지에서 로그인 한뒤 무료 라이센스를 발급받을수 있다.


사용이유.
class 파일을 변경할때마다 서버가 재가동 되는 시간만 줄일수 있어도 프로그램 개발시 많은 시간을 줄일수가 있다. 즉, 퍼블리싱 되는 시간까지 조절 할 수 있다. 

java파일 뿐만아니라 플러그인을 통해 스트럿츠, 아이바티스(마이바티스),스프링 등등 xml도 런타임에 적용 할 수 있다



 
* 플러그인 설치 후 사용과정.
http://zeroturnaround.com/jrebel/eclipse-jrebel-tutorial/
저작자 표시
Trackback 0 Comment 0

Trackback : http://mycup.tistory.com/trackback/130 관련글 쓰기

2012/01/17 12:34

Spring Transaction rollback @Annotation 처리 (선언적 트랜잭션 처리) - 작성중..

크리에이티브 커먼즈 라이선스
Creative Commons License
transaction rollback 누구나가 programming 을 하다보면 트랜잭션 처리에 대해 생각을 하게 된다.
물론 학부시절에는 롤백보다는 일단 life cycle 을 익히고 실행/동작하는것에 focus가 맞춰있다보니 이젠 이런 내용들을 .....



선언적 트랜잭션
특징 : 1. Transaction Template과 달리 트랜잭션 처리를 코드에서 수행하지 않음.
         2. 설정 파일이나 어노테이션을 이용해서 트랜잭션의 범위, 롤백의 규칙을 정의

방법 :
        1.<tx:advice> 태그를 이용한 트랜잭션 처리
        2.TransactionProxyFactoryBean Class를 이용한 트랜잭션 처리 
        3. @Transaction  어노테이션을 이용한 처리.


여기서 소개할 트랜잭션 처리 방식은 2.TransactionProxyFactoryBean과 3.@Transaction 을 이용한 두가지 방법이다.  

 
1. 먼저 TransactionProxyFactoryBean 을 이용한 트랜잭션 처리

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

<property name="configLocations">

<list>

<value>classpath:ibatis/sql-map-config.xml</value>

</list>

</property>

<property name="useTransactionAwareDataSource">

<value>true</value>

</property>

<property name="dataSource" ref="dataSource" />

</bean>


<!-- Transaction manager for a single JDBC DataSource -->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

<bean id="abstractTxDefinition" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">

<property name="transactionManager" ref="transactionManager" />

<property name="transactionAttributes">

<props>

<prop key="update*">PROPAGATION_REQUIRED</prop>

<prop key="delete*">PROPAGATION_REQUIRED</prop>

<prop key="insert*">PROPAGATION_REQUIRED</prop>

<prop key="add*">PROPAGATION_REQUIRED</prop>

<prop key="remove*">PROPAGATION_REQUIRED</prop>

<prop key="clear*">PROPAGATION_REQUIRED</prop>

<prop key="rename*">PROPAGATION_REQUIRED</prop>

<prop key="move*">PROPAGATION_REQUIRED</prop>

<prop key="import*">PROPAGATION_REQUIRED</prop>

<prop key="set*">PROPAGATION_REQUIRED</prop>

<prop key="create*">PROPAGATION_REQUIRED</prop>

<prop key="store*">PROPAGATION_REQUIRED</prop>

<prop key="import*">PROPAGATION_REQUIRED</prop>

<prop key="request*">PROPAGATION_REQUIRED</prop>

<prop key="approve*">PROPAGATION_REQUIRED</prop>

<prop key="start*">PROPAGATION_REQUIRED</prop>

<prop key="execute*">PROPAGATION_REQUIRED</prop>

<prop key="*confirm*">PROPAGATION_REQUIRED</prop>

<prop key="*report*">PROPAGATION_REQUIRED</prop>

<prop key="*save*">PROPAGATION_REQUIRED</prop>

<prop key="redraft*">PROPAGATION_REQUIRED</prop>

<prop key="report*">PROPAGATION_REQUIRED</prop>

<prop key="apporove*">PROPAGATION_REQUIRED</prop>

<prop key="reject*">PROPAGATION_REQUIRED</prop>

<prop key="redraft*">PROPAGATION_REQUIRED</prop>

<prop key="accept*">PROPAGATION_REQUIRED</prop>

<prop key="copy*">PROPAGATION_REQUIRED</prop>

<prop key="get*">PROPAGATION_REQUIRED</prop>

<prop key="eval*">PROPAGATION_REQUIRED</prop>

<prop key="multi*">PROPAGATION_REQUIRED</prop>

<prop key="handle*">PROPAGATION_REQUIRED</prop>

<prop key="*">PROPAGATION_SUPPORTS, readOnly</prop>

</props>

</property>

</bean>


<!-- DataSource  -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="${jdbc.driverClassName}" />

<!-- <property name="driverClassName" value="com.p6spy.engine.spy.P6spyDriver" /> -->

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

</bean>


1.1  TransactionProxyFactoryBean 
트랜잭션을 처리해주는 프록시를 생성해주는 클래스
1.2 프로퍼티
*target
-트랜잭션을 적용할 대상 객체를 설정.
*transactionManager
-트랜잭션 관리자 설정
*transactionAttributes
-트랜잭션 속성 설정에 사용되는 Properties 객체 설정.
*<prop> key & 형식

PROPAGATION_NAME, ISOLATION_NAME,readOnly,timeout,+Exception1,-Exception2


PROPAGATION_NAME : 
- 필수항목
- PROPAGATION_REQUEST와 같은 트랜잭션 전파 규칙이 위치한다.
ISOLATION_NAME :
- ISOLATION_DEFAULT 와 같은 트랜잭션 결리 레벨이 위치.
readOnly :
- 트랜잭션을 읽기 전용으로 설정
timeout :
- 트랜잭션의 타임 아웃 시간을 초 단위로 설정
롤백규칙 :
- '+' , '-'를 이용하여 설정
- 예외클레스 이름앞에 '+'를 붙이면 해당 예외가 발생하더라도 커밋을 수행.
- '-'를 붙이면 롤백을 수행.




2. @Transactional 을 이용한 처리 방법
-2.5 ver. 에서 사용가능하며 메서드나 클래스에 적용하여 사용한다.
Class 사용예제

@Transactional
public class TestServiceImpl implements ITestService{


Method 사용예제


 
 


저작자 표시
Trackback 0 Comment 0

Trackback : http://mycup.tistory.com/trackback/129 관련글 쓰기

2012/01/09 10:33

Spring DI(Dependency Injection) 의존 - 내용수정중

크리에이티브 커먼즈 라이선스
Creative Commons License
스프링 컨테이너가 지원하는 핵심개념 중의 하나이다.
이 개념은 스프링과 상관없이 다양한 프레임 워크에서 활용되고 있는 개념이다.
간단히 말하자면, 객체사이의 의존관계를 객체 자체에서가 아닌 외부 설정을 이용하여 주입을 함으로써
각 객체간의 의존관계를 맺는다는 것이다.


 BeanFactory <-ApplicationContext <- WebApplicationContext


일반적으로  다른 클레스의 Method를 호출 할때는 다음과 같이 Instance Variable 하여 객체를 붕어빵 틀에 넣어 찍어 내듯이 new 를 이용하여 객체를 생성하여 사용한다.(일반적인 객체 의존)

@Service(name="testService")
public class TestService{

private TestDao testDao = new TestDao()

public void testMehtod(){

testDao.method();

}


 
하지만 위와 같이 직접 호출 하게 되면 단위테스트가 어려워 진다고 한다.
TestDao 라는 클레스의 명칭이 바뀌게 되기라도 하면, 소스 전체를 수정하고 컴피일을 해야하는 문제가 있다.
 또한 DB가 변경 되기라도 하면 이와 관련된 DB Connection 정의 클레스를 수정해줘야 하는 문제도 생길수 있다.

이러한 연관관계를 정립하고 효과적으로 구성 할 수 있는 처리방법이 몇가지 있으나(JNDI, Factory Pattern)
Spring에서는 이것을 외부화 하고, 외부에서 이러한 연관 관계를 규정하고, 해당 클래스에 주입해 주는 개념을 도입하여 사용하는 것.  이것이 바로 DI(IoC)의 핵심이다.

의존성(Dependency)  주입(Injection) DI의 방법에는 세가지 방법이 있다.
 셋터 주입(setter), 생성자 주입(constructor), 메소드 주입(method) 으로 나뉜다.

다음은 셋터 주입과 생성자 주입 예제이다. 
*Class

@Controller
public class TestController{

private ITestService testServiceImpl;

private ITestDao testDaoImpl;

//Setter Injection
public setTestService(ITestService testServiceImpl){

this.testServiceImpl = testServiceImpl;



//Constructor Injection
public  TestController(ITestDao  testDaoImpl){

this.testDaoImpl = testDaoImpl;

 *XML

<bean id="testController" class="www.dongbu.com.web.test.TestController">

<constructor-arg>

<ref local="testDaoImpl" />

</constructor-arg>  
<property name="testServiceImpl" ref="testServiceImpl" /> 

</bean> 
<bean id="testServiceImpl" class="com.dongbu.com.web.test.service.impl.TestServiceImpl">

<bean id="testDaoImpl" class="com.dongbu.com.web.test.dao.impl.TestDaoImpl">


 

 

DI개념만...  실행에 필요한 예저 Code는 생략... 

AOP 관점지향 프로그래밍.. 이것을 어찌 하리오. 

일단 시간이 되면 @Transaction 처리
 
저작자 표시

'Spring' 카테고리의 다른 글

Spring DI(Dependency Injection) 의존 - 내용수정중  (0) 2012/01/09
Spring Quartz 1-2  (0) 2010/12/14
Spring Quartz 1-1  (0) 2010/12/14
Spring Timer Sample  (0) 2010/12/14
Trackback 0 Comment 0

Trackback : http://mycup.tistory.com/trackback/128 관련글 쓰기

2011/12/20 22:41

310018

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
2011/12/20 16:30

java Collections list Sort, reverse 정렬 - 작성중

크리에이티브 커먼즈 라이선스
Creative Commons License

멀티정렬일 경우....
implements Comparator<T>

Comparator<CompetencyEvaluationMasterModel> comparator = new Comparator<CompetencyEvaluationMasterModel>() {

public int compare(CompetencyEvaluationMasterModel o1, CompetencyEvaluationMasterModel o2) {

return o1.getCa_yyyy().compareTo(o2.getCa_flag());

}

};

Collections.reverse(yyyyFlagList);

Collections.sort(yyyyFlagList, comparator);


저작자 표시
Trackback 0 Comment 0

Trackback : http://mycup.tistory.com/trackback/126 관련글 쓰기