Spring Batch Admin Webapps 실행 법


-Eclipse 3.7

-Maven


1. Web PJT 생성 (maven default web)

2. Dependency Add (이거 외 spring batch 랑 spring도 같이 넣어줌)

		<dependency>

			<groupId>org.springframework.batch</groupId>

			<artifactId>spring-batch-admin-manager</artifactId>

			<version>1.2.0.BUILD-SNAPSHOT</version>

		</dependency>

3. classpath에 batch-default.xml 생성

batch.jdbc.driver=com.mysql.jdbc.Driver
batch.jdbc.url=jdbc:mysql://host:3306/name
batch.jdbc.user=${user}
batch.jdbc.password=${password}
batch.schema.script=classpath:/org/springframework/batch/core/schema-mysql.sql
batch.drop.script=classpath:/org/springframework/batch/core/schema-drop-mysql.sql
batch.business.schema.script=classpath:/delete-table.sql
batch.data.source.init=true


- classpath에 /delete-table.sql 도 역시 생성


4. packing 혹은 eclise에서 server로 기동 


신고
Posted by Stewie

상황은 이렇다.

1. A라는 snapshot 프로젝트가 있고 B라는 녀석은 private Nexus에 배포된 A라는 jar을 참조한다.
2. A를 deploy하지만 B라는 프로젝트는 A녀석이 바뀐지 모른다. (그대로 x.x.x-SNAPSHOT 버전일테니)
3. 개발 PC의 로컬(${user.home}/.m2/)에 지속적으로 바뀌는 SNAPSHOT 버전의 lib들을 update 하고 싶다.


 
		
			nexus
			http://IP:PORT/nexus/content/groups/public
			
				always
			
		
이 같은 옵션을 통해 private nexus repository를 계속 reload 한다.
updatePolicy의 default value는 daily 다.

참조 : http://docs.codehaus.org/display/MAVEN/Repository+-+SNAPSHOT+Handling
신고
Posted by Stewie
# webapps에서 Exception이 발생한 error level 혹은 warn level의 로그 만 별도의 file로 저장을 하고 싶을 때가 있다. 방법은 아주 간단하다


log4j.xml에서
<appender name="errorAppender" class="org.apache.log4j.DailyRollingFileAppender">
	<param name="File" value="[로그파일명]" />
	<param name="Append" value="false" />
	<param name="DatePattern" value=".yyyy-MM-dd" />
	<param name="threshold" value="WARN" />
	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="%d %5p [%c - %l] : %m%n" />
	</layout>
</appender>

와 같이 appender를 지정 한 뒤 rootLogger혹은 다른 logger에 추가만 해주면 되겠다. 쉽다.

키 포인트는 threshold 변수 인데 지정한 Level 이하의 log는 제외하고 append 하게 해준다.

 참고> FATAL > ERROR > WARN > INFO > DEBUG > TRACE
신고
Posted by Stewie
1. 기존의 Request, Response가 arg로 있는 형태
MockHttpServletRequest, MockHttpServletResponse를 사용하여 injection 받은 Controller 직접 invoke

2. ModelAndView 를 Return 하는 형태
ModelAndViewAssert 의 assert*를 사용하여 값을 비교

3. (Model model) 이 arg 인 형태
Model은 Interface이기 때문에 ExtendedModelMap를 생성하여 controller method invoke 후 
ModelAndViewAssert로 비교

4.  BindingResult 등이 arg로 있는 spring 3에서 주로 쓰는 형태
MockitoAnnotation 및 Mockito class를 사용하여 test case의 method 시작전 Mock객체를 받아놓고 구현

예)
        

import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;


       @Mock
	private BindingResult mockBindingResult;

	@Before
	public void setupTest() {
		MockitoAnnotations.initMocks(this);
		Mockito.when(mockBindingResult.hasErrors()).thenReturn(false);
	}

JUnit에 다음과 같이 표현 한다면 BindingResult 객체의 hasErrors method return값을 유저가 미리 정의 할 수 있다.


TO SUM UP....
결국 Spring MVC를 어떻게 사용하느냐에 따라 상황에 맞게 사용하면 되며 JUnit Test의 범위 역시 유저가 스스로 결정하여 assert를 적절하게 구사하면 될 것이다.

ps. ModelAndViewAssert (spring 2.5 API)가 생각보다 많은 assert method를 제공해 준다. 
신고
Posted by Stewie
   
JUnit4를 가지고 DAO를 테스트를 하다보면 insert 및 delete 등 과 같은 DB를 수정하게 되는 트랜잭션이 문제가 될 때가 있다. 더욱이 packaging을 위해 TestCase를 빈번하게 돌릴경우에는 gabage 데이터가 들어가는 경우가 많다. 이때 간단하게 설정으로 rollback을 시킬 수 있다.

1. 먼저 TransactionManager를 Bean으로 등록한다.
 
        <bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean> 

2. JUnit4의 testCase를 작성시 다음과 같이 표시를 하면 된다. 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:config/spring/context-*.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class TestDAO {

        @Test
@Transactional
public void insert(){
        } 
}
 


ps. TransactionManager의 default bean Id값과 동일할 경우 빨간색을 칠한 부분은 생략 가능하다.
 
신고
Posted by Stewie

웹어플리케이션이 구동중에 MessageSource가 변경되는 경우 ReloadableResourceBundleMessageSource를 이용하면 ResourceBundleMessageSource와 달리
재시작을 하지 않아도 된다. 하지만 이 방법은 개발시에는 유용하지만 실제 운영 서버에서는 다른 기타 문제가 발생할 수 있기 때문에 
비추하는 방법이라 한다.뿐만 아니라 ReloadableResourceBundleMessageSource에서 사용하는 MessageSource 파일은 classpath안에 
두지 않아야 한다. 그 이유는 애플리케이션 서버는 클래스패스에 있는 모든 리소스를 캐싱하기 때문이라 한다. 그렇기 때문에

<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/message/message-sample</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8" />
<property name="cacheSeconds">
<value>60</value>
</property>
</bean>

위처럼 정의한다면, 로케일을 기반으로 messages_<LID>.properties 와 errors_<LID>.properties 를 찾게 된다.
단 classpath 대신 WEB-INF/message/message-sample 과 같은 위치에 두는 것이 좋다


MessageSource의 사용은

예를 들어 message-sample_en_US.properties가

message = hi my name is {0} 

형태로 되어있다고 했을때

@Inject
MessageSource messagesource

messageSource.getMessage("message", new String[] {"stewie"}, "no surch", Locale.US);

같은 메서드의 결과가 hi my name is stewie 와 같이 나온다고 한다.

http://www.javajigi.net/pages/viewpage.action?pageId=207061054
http://jjaeko.tistory.com/18

신고
Posted by Stewie
TAG Spring

SimpleMappingExceptionResolver는 HandlerExceptionResolver의 구현체로서 예외가 발생하였을때
그 종류에 따라 에러 페이지를 표시한다던지, 혹은 다른 Controller를 호출하여 후속 작업을
가능하도록 하게 하여 준다. 단, view layer에서 발생하는 예외는 이름 그대로 HandlerException
Resolver이기 때문에 처리 할 수 없다.

<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="EXCEPTION 종류 class">view/error</prop>
</props>
</property>
</bean>

만약, 해당 에러 페이지로 이동하기 전 log를 남기고 싶다면 warnLogCategory property를 이용하여
남길 수 있다. 

<property name="warnLogCategory" value="abcd"/>



또 다른 방법으로는,
@Controller 가 명시된 Controller에서 @ExceptionHandler(Exception.class)을 표시한 메서드를 구현하면
실질적으로 그 컨트롤러 안에 예외가 발생하였을 경우 해당 메서드가 실행되게 된다.

    @ExceptionHandler(Exception.class)
    public void testException(Exception ex) {
        // ...
    }
    
뿐만 아니라 @ResponseStatus 태그도 같이 사용할 수 있어 Response Status Code를 전달할 수도 있다.

    @ExceptionHandler(Exception.class)
    @ResponseStatus(value=HttpStatus.NOT_FOUND)
    public void testException(Exception ex) {
        // ...
신고

'09.Framework' 카테고리의 다른 글

JUnit4 테스트 Datasource Rollback  (0) 2011.12.06
Spring Framework / ReloadableResourceBundleMessageSource  (0) 2011.08.16
Spring MVC SimpleMappingExceptionResolver  (0) 2011.08.16
Spring 3.0 에서 Quartz 설정  (0) 2011.08.09
iBatis 동적 SQL 작성  (0) 2009.10.25
WebWork in Action  (0) 2009.10.07
Posted by Stewie
TAG Spring

Spring 3.0 에서 제공하는 TaskExecutor와 TaskScheduler도 있지만 Quartz를 사용하는 경우도 있다.

필수 dependency
               
                <!-- Quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
</dependency> 

가장 큰 설정은 trigger와 listener

1. Trigger

org.springframework.scheduling.quartz.CronTriggerBean
org.springframework.scheduling.quartz.SimpleTriggerBean

2종류가 있는데 cronjob스럽게 돌리려면 CronTrigger를 그렇지 않고 인터벌 및 간단한 설정으로
스케쥴러를 구동시키려면 SimpleTrigger를 사용하는 것이 좋다.
 
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="testJob"/>
<property name="cronExpression" value="0/1 * * * * ?"/>
</bean>

 다음과 같이 등록하고

<bean id="testJob" class="org.springframework.scheduling.quartz.JobDetailBean"
     p:jobClass="com.test.testDaemon">
<property name="jobDataAsMap">
 <map>
   <entry key="test1Service">
    <ref bean="test1Service"/>
   </entry>
   <entry key="test2Service">
    <ref bean="test2Service"/>
   </entry>
 </map>
</property>
</bean> 

다음과 같이 설정하면 된다. testDaemon 에서 쓰이는 bean들은 map형태로 프로퍼티를 등록하면 된다. (setter구현 必)


  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="testTrigger"/>
</list>
</property>
<property name="quartzProperties">
<props>
    <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
    <prop key="org.quartz.threadPool.threadCount">3</prop>
    <prop key="org.quartz.threadPool.threadPriority">4</prop>
    <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
    <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean>


SchedulerFactoryBean에 다음과 같이 tiggers를 등록한다. quartzProperties에는 thread의 갯수 등의 각종 설정변수 들이 있다.

 
2. Listener 
Quartz에서 제공하는 TriggerListener를 구현하면 각  fire->execute-> complete 혹은 misfire되는 시점에 로깅을 남길 수 있다. 다음은 Anyframe 사이트에 있는 TriggerListener 구현체 중 하나이다.

 public class GlobalTriggerListener implements TriggerListener {
    Log logger = LogFactory.getLog(GlobalTriggerListener.class);
    String listenerType = "Non global";

    public void setListenerType(String listenerType) {
        this.listenerType = listenerType;
    }

    public void triggerFired(Trigger trigger, JobExecutionContext ctx) {
        logger.info("Scheduled " + trigger.getJobName() + " Fired!!");
    }

    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext ctx) {
        logger.info("Scheduled " + trigger.getJobName() + " Executed!!");
        return false;
    }

    public void triggerComplete(Trigger trigger, JobExecutionContext ctx, int arg) {
        logger.info("Scheduled " + trigger.getJobName() + " Completed!!");
    }

    public void triggerMisfired(Trigger trigger) {
        logger.error("Scheduled " + trigger.getJobName() + " Misfired!!");
    }

    public String getName() {
        return "GlobalTriggerListener";
    }
}

SchedulerFactoryBean 설정에서 다음과 같이 Listener를 등록할 수 있다.

  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggerListeners" ref="triggerListener"/> <property name="globalTriggerListeners" ref="globalTriggerListener"/>
<property name="quartzProperties">
<props>
    <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
     <prop key="org.quartz.threadPool.threadCount">3</prop>
     <prop key="org.quartz.threadPool.threadPriority">4</prop>
     <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
     <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean> 
신고

'09.Framework' 카테고리의 다른 글

Spring Framework / ReloadableResourceBundleMessageSource  (0) 2011.08.16
Spring MVC SimpleMappingExceptionResolver  (0) 2011.08.16
Spring 3.0 에서 Quartz 설정  (0) 2011.08.09
iBatis 동적 SQL 작성  (0) 2009.10.25
WebWork in Action  (0) 2009.10.07
Hibernate VS iBatis  (0) 2009.09.23
Posted by Stewie
실무에서 SQL문을 작성하다 보면 동적인 쿼리문 작성을 작성해야 할 때가 많이 있다.

이때 지겹게 if~else if 문을 통해 아주 지저분한 소스 코드를 생성할 때가 왕왕 있게 마련이다.

이때 ibatis에서는 아주 깔금하게 구현할 수 있는 방법을 제공해 준다.

 

<statement id="dynamicGetAccountList" resultMap="account-result">

  select * from account

  <dynamic prepend="WHERE">

    <isNotNull prepend="AND" property="firstName">

      (acc_first_name = #firstName#

    <isNotNull prepend="OR" property="lastName">

       acc_last_name = #lastName#

    </isNotNull>

    )

    </isNotNull>

    <isNotNull prepend="AND" property="emailAddress">

      acc_email like #emailAddress#

    </isNotNull>

    <isGreaterThan prepend="AND" property="id" campareValue="0">

      acc_id = #id#

    </isGreaterThan>

  </dynamic>

  order by acc_last_name

</statement>

 

상황에 의존적인 위 동적 statement로 부터 각각 다른 16가지의 SQL문이 생성될 수 있다. if-else구조와 문자열 연결을 코딩하는 경우 수백라인이 필요할 수도 있다.

동적 statement를 사용하는 것은 몇몇 조건적인 태그를 추가하는 것처럼 간단하게 작성할 수 있다.

 

이러한 조건들에 대해 간단히 정리하면 아래와 같다.

 

바이너리 조건 요소-바이너리 조건 요소는 정적값 또는 다른 프로퍼티값을 위한 프로퍼티값과 비교한다. 만약 결과가 true라면 몸체부분의 SQL쿼리가 포함된다.

 

바이너리 조건 속성

prepend

Statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property

비교되는 property(필수)

compareProperty

비교되는 다른 property (필수 또는 compareValue)

compareValue

비교되는 값(필수 또는 compareProperty)

 

<isEqual>

프로퍼티가 값 또는 다른 프로퍼티가 같은지 체크

<isNotEqual>

프로퍼티가 값 또는 다른 프로퍼티가 같지 않은지 체크

<isGreaterThan>

프로퍼티가 값 또는 다른 프로퍼티 보다 큰지 체크

<isGreaterEqual>

프로퍼티가 값 또는 다른 프로퍼티 보다 크거나 같은지 체크

<isLessThan>

프로퍼티가 값 또는 다른 프로퍼티 보다 작은지 체크

<isLessEqual>

프로퍼티가 값 또는 다른 프로퍼티 보다 작거나 같은지 체크

 

사용법 예제)

<isLessEqual prepend="AND" property="age" compareValue="18">

  ADOLESCENT = ’TRUE’

</isLessEqual>

 

단일 조건 요소-단일 조건 요소는 특수한 조건을 위해 프로퍼티의 상태를 체크한다.

prepend

statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property

체크하기 위한 프로퍼티(필수)

 

<isPropertyAvailable>

프로퍼티가 유효한지 체크

(이를 테면 파라미터의 프로퍼티이다.)

<isNotPropertyAvailable>

프로퍼티가 유효하지 않은지 체크

(이를 테면 파라미터의 프로퍼티가 아니다.)

<isNull>

프로퍼티가 null인지 체크

<isNotNull>

프로퍼티가 null이 아닌지 체크

<isEmpty>

Collection, 문자열 또는 String.valueOf() 프로퍼티가 null이거나 empty(“” or size() < 1)인지 체크

<isNotEmpty>

Collection, 문자열 또는 String.valueOf() 프로퍼티가 null 이아니거나 empty(“” or size() < 1)가 아닌지 체크

 

사용법 예제)

<isNotEmpty prepend="AND" property="firstName">

  FIRST_NAME = #firstName#

</isNotEmpty>

 

다른 요소들

Parameter Present : 파라미터 객체가 존재하는지 체크

Parameter Present Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분

<isParameterPresent>

파라미터 객체가 존재(not null)하는지 체크

<isNotParameterPresent>

파라미터 객체가 존재하지(null) 않는지 체크

 

사용법 예제)

<isNotParameterPresent prepend="AND">

EMPLOYEE_TYPE = ’DEFAULT’

</isNotParameterPresent>

 

Iterate : 이 태그는 Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다.

Iterate Attributes :

  prepend - the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션)

  property - 반복되기 위한 java.util.List타입의 프로퍼티 (필수)

  open - 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션)

  close - 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션)

  conjunction - 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)

<iterate>

java.util.List 타입의 프로퍼티 반복

 

사용법 예제)

<iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR">

username = #userNameList[]#

</iterate>

 

주의:iterator요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다.

신고

'09.Framework' 카테고리의 다른 글

Spring Framework / ReloadableResourceBundleMessageSource  (0) 2011.08.16
Spring MVC SimpleMappingExceptionResolver  (0) 2011.08.16
Spring 3.0 에서 Quartz 설정  (0) 2011.08.09
iBatis 동적 SQL 작성  (0) 2009.10.25
WebWork in Action  (0) 2009.10.07
Hibernate VS iBatis  (0) 2009.09.23
Posted by Stewie

WebWork in Action

09.Framework 2009.10.07 16:48

WebWork in Action

 이 문서의 내용은 Webwork In Action by Patrick Lightbody, Jason Carreira(Author) 서적을 스터디 하면서 정리한 내용 입니다.

PART 1 INTRODUCTION TO WEBWORK

PART 2 CORE CONCEPTS

DISPLAYING CONTENT

ADVANCED TOPICS

  • 12. Type conversion
  • 13. Validating form data
  • 14. Internationalization
  • 15. Best practices

Appendix WebWork architecture

문서에 대하여

  • 이 문서의 내용은 Webwork In Action 교재를 스터디 하면서 정리한 내용 입니다.
  • 최초작성자 : 김정식
  • 최초작성일 : 2007년 8월 23일
  • 이 문서는 오라클클럽 자바 웹개발자 스터디 모임에서 작성하였습니다.
  • 이 문서를 다른 블로그나 홈페이지에 퍼가실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

# 이 문서는 오라클클럽에서 작성하였습니다.
# 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
# 출처 : http://wiki.oracleclub.com/display/WEBSTUDY/WebWork+in+Action?
신고

'09.Framework' 카테고리의 다른 글

Spring Framework / ReloadableResourceBundleMessageSource  (0) 2011.08.16
Spring MVC SimpleMappingExceptionResolver  (0) 2011.08.16
Spring 3.0 에서 Quartz 설정  (0) 2011.08.09
iBatis 동적 SQL 작성  (0) 2009.10.25
WebWork in Action  (0) 2009.10.07
Hibernate VS iBatis  (0) 2009.09.23
Posted by Stewie


티스토리 툴바