에러로 의심되는 상황에 과연 log4j를 이용한 error level로 logging을 할것인가?
아니면 Exception을 발생시킬 것인가?

난 후자다.

일단 전자는 유저의 interaction 이 필요하다. 내가 직접 들어가서 보지 않으면 모른다는 이야기다.
하지만 후자는 Exception 발생으로 인한 다양한 조치가 가능해진다. Exception을 Handling하는 여러
Resolver들도 여러 프레임웍에서 지원해 준다.

내 생각에 에러는 명백한 에러라고 정의를 해주고 그 담에 그 에러를 조치하는게 낫다.
아무리 logging level을 조절하여 필요한 log만 추출한다고 해도 원하는 로그만 찾기에는 귀찮고 어려운 일이다. RuntimeException을 활용하여 다음의 원칙을 지켜보자

Be specific
Throw early
Catch Late


원칙으로 Exception을 Handling한다면 우리의 코드는 좀더 블링블링해 지지 않을까


참고 :  http://martin.ankerl.com/2006/06/16/exception-handling-versus-logging/  
신고

'01.Java' 카테고리의 다른 글

JMX Url  (0) 2012.04.02
run Hadoop Mapreduce Job Remotely(Cluster)  (0) 2012.03.13
Exception Handling vs. Error Logging  (0) 2012.02.14
JUnit Test. 그리고 Stub, Mock  (0) 2011.12.27
java.io.FilenameFilter 활용  (0) 2011.08.09
[예시] byte단위로 잘라서 String 만들기  (0) 2010.11.25
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
maven으로 hadoop-core를 추가해서 사용하고 tomcat위에 기동할 경우

servlet 관련 에러가 나올때가 심심치 않게 있다. -_-

hadoop-core는 jetty관련 lib와 의존 관계가 있기 때문에 servlet 2.5 및 jsp 2.1 등이

딸려 들어와 tomcat의 그것들과 마구 충돌이 나

tile2configurer에서 에러를 마구 내뿜는다.

lib를 대조한 끝에 결국 찾아내긴 했는데 정말 이렇게 까지 해야하는 건가 의구심이 든다 ㅠㅠ

  <!-- Hadoop -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>${ver.hadoop.core}</version>
<exclusions>
<exclusion>
<artifactId>jets3t</artifactId>
<groupId>net.java.dev.jets3t</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-2.1</artifactId>
<groupId>org.mortbay.jetty</groupId>
</exclusion>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>org.mortbay.jetty</groupId>
</exclusion>
<exclusion>
<artifactId>servlet-api-2.5</artifactId>
<groupId>org.mortbay.jetty</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api-2.1</artifactId>
<groupId>org.mortbay.jetty</groupId>
</exclusion>
</exclusions>
</dependency>

이정도까지 해야하는 건지 좀 더 연구한뒤 정리해야겠다. 
신고
Posted by Stewie
maven 빌드에서 emma를 이용하여 code coverage를 계산하는 와중에 문득 그런 생각이 들었다.
package를 위해 test를 한 뒤 emma reporting을 위해 test를 두번이 하는 이유는 뭘까?

친절하게도 emma faq에서 설명해 주고 있다.

 
또한 여기서 여러 개발자들의 생각들을 볼 수 있다.
http://issues.hudson-ci.org/browse/HUDSON-1557 
신고

'03.Build Process' 카테고리의 다른 글

Maven Dependency Version Range  (0) 2012.05.11
Hudosn을 통한 Maven depoly => Nexus  (0) 2012.02.17
package emma:emma 의 goal 은 Test를 2번한다?  (0) 2012.01.02
Jenkins plugin Install (Emma, N'SIQ)  (0) 2011.12.26
Jenkins  (0) 2011.12.21
Maven vs Ant  (0) 2010.01.21
Posted by Stewie
TDD를 교육받고 아주 좋은 것이구나!라고 공감을 해도 쉽사리 프로그래밍에 적용하기 쉽지 않다. 특히 복잡한 환경일수록 여러 애플리케이션간의 종속관계에 Mock객체의 필요성을 느낌과 동시에 귀차니즘이 발동하게 되어 그냥 하던데로 하는 경우도 많았다. 

현재 진행중인 프로젝트 같이 PMD rule check 및 Test Code의 coverage를 일정수준 까지 맞춰야하는 환경이 있었다. 하지만 REST, Hadoop Infra 등등 외부종속적인 코드를 테스트하기는 쉽지 않았다. 그러면서 사용했던 것이 Mock. 그러면서 자연스레 Stub까지 공부하게 되었다.


 Stub Mock 
-Database, file system, web server 등 과의 의존성을 분리하기 위해 주로 쓰임
-Stub객체는 모든 로직을 구현
-Test를 위해 Test대상의 class를 수정해서는 안됨
-Stub은 단순해야하고 또다른 application이 되어서는 안됨 
-단위 단위 Test의 용이(하나의 Method에 집중)
-비지니스 로직이 없다
-test대상 class의 어느정도의 코드 수정은 용인
-오픈소스 프레임웍 (EasyMock, Mockito)활용 가능

즉 test 대상이되는 class가 호출하는 클래스의 메서드를 stub으로 구현해야 하기 때문에 또 그 클래스의 메서드가 또다른 stub을 호출하게 되는 상황이 발생할 수 도 있기때문에 일단 생산성이 떨어진다고 본다. 하지만 Mock객체는 소스를 수정해야(아주 약간?)하는 귀차니즘과 위험부담을 감수한다면 유저가 정의 한 Mock객체를 활용하여 아주 간단히 단위 테스트를 마칠 수 있다.

TO SUM UP......
내가 잘못 이해한 걸 수도 있지만 개인적으로는 Mock이 Stub을 대체할 수 있다고 본다. (내가 배운)TDD에 의한다면 TestCase를 만드는 것이 선행이 되며 에러가 발생하는 Class의 작성이 시작이기 때문에 class의 method단위의 테스트가 용이한 Mock를 활용하는 것이 더 TDD스럽지 않나 생각이 든다. 

사실 Framework을 사용하게 되면 정말 간단하다. Mock 객체를 만드는 것은 소스 한줄이면 되고 또한 해당 mock 객체의 method가 return하는 값을 사용자가 정의하는 것 역시 한줄이면 된다.  다만 10개의 class가 하나의 비지니스를 담당한다고 했을때 잘 설계 및 구현 되었다고 할지라도 10개의 단위테스트가 성공하는 것이 하나의 비지니스 성공을 보장할 수 있을 까란 생각도 든다.

아직 경험이 미천해서 그런것이겠지.................ㅇㅇ? 

참고
JUnit In Action
http://msdn.microsoft.com/ko-kr/magazine/cc163358.aspx  
신고

'01.Java' 카테고리의 다른 글

run Hadoop Mapreduce Job Remotely(Cluster)  (0) 2012.03.13
Exception Handling vs. Error Logging  (0) 2012.02.14
JUnit Test. 그리고 Stub, Mock  (0) 2011.12.27
java.io.FilenameFilter 활용  (0) 2011.08.09
[예시] byte단위로 잘라서 String 만들기  (0) 2010.11.25
Method Class  (0) 2010.06.07
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
Jenkins를 설치 한 뒤 밑의 plugin 을 설치했다.
참고로 내가 쓰는 빌드 환경은 maven2 다.

1. Emma
 code coverage를 확인할 수 있는 open source에는 Emma와 Cobertura가 있는데 그래프는 좀 더 후지지만 line coverage확인이 용의하다는 장점이 있었다.

1) https://wiki.jenkins-ci.org/display/JENKINS/Emma+Plugin 를 참조하여 설치하자.
2) pom.xml에 다음을 추가하자

         
 
		
			
				org.apache.maven.plugins
				maven-surefire-plugin
				true
				
					always
					xml
				
			
			
			
				org.codehaus.mojo
				emma-maven-plugin
				1.0-alpha-1
				
					
						-*.Test*
					
				
			
		
	

	
		
			
				org.codehaus.mojo
				emma-maven-plugin
				true
			
		
	
3) maven의 goal에 emma:emma를 추가해주자

2. N'SIQ

1) https://wiki.jenkins-ci.org/display/JENKINS/NSIQ+Collector+Plugin 참고하여 설치 (hudson에서 project 생성시 maven이 아닌 free type으로 해야 NSIQ 설정이 가능)

ps. 늘 느끼는 거지만 아무것도 없을때 설정하는건 은근 까다로운데 정리해놓고보면 정말 별거 없다 -_- 

3. Deploy Plugin
hudson CI server와 deploy server가 물리적으로 다를 경우 hudson의 build만으로 자동 deploy 및 WAS를 재시작 하고 싶어질 때가 있다. 보통 SCP를 사용하여 파일을 전송한 뒤 ssh로 서버를 restart 시키는 방법도 있지만 deploy plugin으로 대체 가능하다. 이 방식은 plugin이 해당 WAS의 console를 통해 deploy하는 방식이므로 필요한 port등은 아직 확인하지 못했다.

https://wiki.jenkins-ci.org/display/JENKINS/Deploy+Plugin 를 참고하여 설치

나는 tomcat 6 에 설치를 하였는데 tomcat의 admin 계정은 
$TOMCAT_HOME/conf/tomcat-users.xml 에서 확인 가능하며 추가할 경우
<user username="user" password="user00" roles="manager"/>
만 추가해주면 된다.
 
신고

'03.Build Process' 카테고리의 다른 글

Maven Dependency Version Range  (0) 2012.05.11
Hudosn을 통한 Maven depoly => Nexus  (0) 2012.02.17
package emma:emma 의 goal 은 Test를 2번한다?  (0) 2012.01.02
Jenkins plugin Install (Emma, N'SIQ)  (0) 2011.12.26
Jenkins  (0) 2011.12.21
Maven vs Ant  (0) 2010.01.21
Posted by Stewie

Jenkins

03.Build Process 2011.12.21 19:24
Hudson의 핵심 개발진들이 만들었다고 하는 Jenkins. Java에 관련된 오픈 소스의 모든 이름을 상표명화 하고 싶어하는 Oracle이 Hudson을 가져가자 만들었다고 한다. 핵심개발자들이 만들었다고 하니 Hudson보다 앞으로 더 낫겠지 하고 생각해 본다.

1. Install
-Redhat Linux 계열은 다음과 같다.

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

yum install jenkins

jenkins.war는 /usr/lib/jenkins에 설치가 된다
기본 jenkins의 home은 $HOME/.jenkins 이다.

jenkins는 hudson과 마찬가지로 winstone을 포함하고 있기 때문에

java -jar jenkins.war 로 실행가능 하다. servlet container에 배포해도 된다.

혹시 port를 변경하고 싶거든 --httpPort=[PORT] 옵션을 사용하면 된다. (default 8080)

2. 설치후 내가 한 것
java만 딸랑 깔려 있는 linux server였다.

1.maven 설치 (다운로드 후 압축만 품)
2.여러 plugin 설치 (scp, emma, report 관련 등등) 
3.jenkins 설정
-jdk 위치 지정
-maven 위치 지정
-svn 위치 지정
-security 설정(user)
4.신규 프로젝트 생성
-svn repo. 정보 입력
-maven 설정 (goal : clean install)  - 아직 test 관련 설정 안함
-post-build step 설정 (ssh로 script 실행 : scp전송 -> remote was shutdown -> deploy -> was startup) 
 

jenkins home page에도 설명이 잘 나와있고 기존 hudson유저라면 무리없이 설정 가능하다.
얼마전에 책 한권이 나왔길레 참고했다.  

Jenkins. The Definitive Guide

다음이 기회가 되면
각종 plugin들의 세팅 및 maven pom.xml에 test 및 reporting 관련 설정을 포스팅 해야겠다. 
신고

'03.Build Process' 카테고리의 다른 글

Maven Dependency Version Range  (0) 2012.05.11
Hudosn을 통한 Maven depoly => Nexus  (0) 2012.02.17
package emma:emma 의 goal 은 Test를 2번한다?  (0) 2012.01.02
Jenkins plugin Install (Emma, N'SIQ)  (0) 2011.12.26
Jenkins  (0) 2011.12.21
Maven vs Ant  (0) 2010.01.21
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


티스토리 툴바