달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
SpringJDBC를 사용할때, PreparedStatement 의 파라미터를 로그에 찍기 위해서는 로그레벨을 TRACE로 해야 한다.

<logger name="org.springframework.jdbc.core" additivity="false">
    <level value="TRACE" />
    <appender-ref ref="console" />
</logger>

Posted by fromm0
|
최근 Spring MVC를 사용하면서 가장 주요하게 사용하는 기능은 두가지입니다.
1. Bean Validation
2. Custom ArgumentResolvers

Bean Validation 의 경우 Spring 3.0 에서 mvc:annotation-driven 을 통해 간단하게 사용할 수 있습니다.
하지만 Custom ArgumentResolvers 를 사용하기 위해 AnnotationMethodHandlerAdapter 를 사용하게 되는 경우 빈 등록 과정에서 중복으로 등록되는 어려움이 발생합니다.

@ 이전설정
<!-- @Controllers의 Formatting, Validation, Conversion -->
<mvc:annotation-driven />
<!-- Controller의 파라미터 처리자(WebArgumentResolver) -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolvers">
        <list>
            <bean class="openframework.common.utils.GukArgumentResolver" />
        </list>
    </property>       
</bean>

@ 바꾼설정
<!-- Controller의 파라미터 처리자(WebArgumentResolver) -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolvers">
        <list>
            <bean class="openframework.common.utils.GukArgumentResolver" />
        </list>
    </property>
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="validator">
                <bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
            </property>
        </bean>
    </property>
</bean>

편리하긴 하나, mvc:annotation-driven 를 제거하고 webBindingInitializer에 validator 를 수동으로 지정했습니다.
그러니 잘 돌아가네요.





Posted by fromm0
|
Spring 프레임워크를 사용함에 있어서 가장 좋은 기능중 하나가 선언적인 트랜잭션 관리를 통해 코드에 트랜잭션 관리를 위한 코드를 하나도 넣지 않아도 된다는 것입니다.
3.0에서는 Spring AOP와 @Transactional 애노테이션을 제공하여 그 기능을 사용할 수 있는데요.

Spring AOP를 사용함에 있어서 발행하는 많은 문제를 해결하기 위해서는 SpringSource Tools Suite(정확히는 Spring IDE의) 의 AOP Extension을 사용해서 시각적으로 확인하는 것이 가장 좋습니다.

@ Spring IDE AOP Extension eclipse plugin


메뉴얼을 볼때 기본 설정은 대략 아래와 같습니다.
조금 다른건 저는 Spring Bean을 인터페이스가 아닌 클래스로 사용하기 때문에 proxy-target-class속성값이 true인 점 정도죠.
그리고 expose-proxy 값을 true로 주었습니다. AOP가 적용되어야 할 메서드 두개중 한군데가 계속 적용이 되길래 테스트 코드를 돌렸더니 JUnit 에러에서 친절하게 저 옵션을 켜달라고 해서 추가했습니다.
AOP가 적용되어야 할 메서드 중 일부만 적용될 경우 테스트 코드를 돌려보시거나 저 설정을 고려해보시면 될듯 합니다.
Spring AOP Extension을 사용하면 아래처럼 설정파일에 아이콘을 pointcut이 작동함으로 시각적으로 보여줍니다.
@ Spring AOP설정


그리고 그 대상 소스에도 함께 표기가 되죠. 즉 이 두 아이콘이 표기되면 설정상에 문제가 없다는 뜻입니다.
@ 대상 코드


근데, 이렇게 하더라도 안되는 경우가 있습니다.
특히 Spring @MVC 를 사용할때인데요. 이 경우 설정파일에서 @Controller 를 컨포넌트 스캔할때 옵션을 확인해보시면 됩니다.
use-default-filters를 false로 설정하시거나, @Service, @Repository를 모두 exclude로 제외하시면 됩니다.

<context:component-scan base-package="com.naver.newsstand.service" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>






Posted by fromm0
|
▣ 에러에 대한 설명
애기 보느라 계속 집중하지 못해 주말 내내 보고 있는 에러이다.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.engine.ConfigurationImpl
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:574)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
    at javax.servlet.GenericServlet.init(GenericServlet.java:212)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4058)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4364)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.engine.ConfigurationImpl
    at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:43)
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:269)
    at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:161)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1469)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409)
    ... 32 more

Spring MVC 에 JSR 303 Bean Validator 를 적용하기 위해 Hibernate Validator 를 사용하는데 에러가 발생한다.
특별히 설정한게 없다. 그냥 Hibernate Validator 를 위해 pom.xml 파일에 아래 설정이 다인데.

        <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-validator</artifactId>
             <version>4.1.0.Final</version>
         </dependency>



해결방법
이거 어디서 사용하는 거야.. 라며 지웠던 것이 원인이었다.T.T
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.5.10</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.5.10</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.10</version>
            <scope>runtime</scope>
        </dependency>



  관련URL
1. http://blog.inflinx.com/2010/03/10/jsr-303-bean-validation-using-spring-3/
2. http://codemunchies.com/2010/07/spring-mvc-form-validation-with-hibernate-validator/
Posted by fromm0
|
Spring이 버전을 업그레이드하면서 문서를 보면 역시 아쉬운 건 실제 적용된 샘플 소스인거 같습니다.
그래서인지 Spring사이트에서도 간단한 샘플을 이미 제공하고 있는데요..
주소가 https://src.springframework.org/svn/spring-samples/ 입니다.



좀더 다양하게 연동되어 완성된 애플리케이션 샘플이야 AppFuse를 보면 되지만, 특정 부분만 바로 파악하기 위해서는 아무래도 해당 부분만 적용된 샘플이 아쉬울수 밖에 없다고 보여지네요.

근데 이 샘플 소스를 받아 돌려도면 간혹 아래와 같은 에러가 발생합니다.

# 에러 메시지
org.apache.jasper.JasperException: Unable to read TLD "META-INF/c.tld" from JAR file "file:/D:/MyLucy/workspace/SPRING_SAMPLE/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/mvc-basic/WEB-INF/lib/jstl-1.2.jar": org.apache.jasper.JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV

# 에러 메시지 화면


해결하기 위해서는 WEB-INF/lib 아래 Tomcat이 가지는 jar파일과 중복되는 두가지 파일을 지워주시면 됩니다.
WAS가 Tomcat이 아니라면 다른 에러가 뜰수도 있겠네요. ^^






Posted by fromm0
|
SpringSource Tool Suite 이 free로 전환된다고 합니다.
여기서 Free의 개념이 좀 모호하긴 한데.. SpringSource 팀 블로그의 글 을 보니 Free의 개념을 간단히 설명해두었네요.
STS is available at no cost and free for all development purposes

모든 개발에서 비용이 들지 않고 자유롭게 사용할 수 있다는 뜻으로 보입니다.

제품 사이트 주소는 http://www.springsource.com/products/sts 이구요.
http://www.springsource.com/products/sts/registration 에서 등록 후 다운로드 받으시면 됩니다.

1. 등록페이지


2. 라이센스 공지


3. 다운로드 페이지


현재 안정버전은 2.0.2 이구요.. 마일스톤 버전은 2.1.0 M1 까지 나와있습니다.


'자바' 카테고리의 다른 글

[ibatis] ibatis 3.0 beta1 릴리즈  (5) 2009.08.09
[ibatis] 홈페이지개편.??  (2) 2009.07.23
[CI툴] hudson  (0) 2009.04.05
[JSON] Jackson JSON Processor  (0) 2009.03.01
[jersey] 1.0.2 릴리즈  (0) 2009.03.01
Posted by fromm0
|
Spring 2.5.6과 JUnit 4.5 로 테스트 코드를 작성할 때 테스트를 실행할 때 다음과 같은 에러가 발생합니다.

java.lang.NoClassDefFoundError: org/junit/Assume$AssumptionViolatedException
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:240)
    at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
    at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
    at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:61)
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:54)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:52)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)

제가 사용한 JUnit 의 jar파일은 junit-4.5.jar 인데 이 파일을 사용하면 발생한다는 군요.
이 에러를 해결하기 위해서는 JUnit 4.4를 사용하시거나 junit-dep-4.5.jar 파일을 사용해야 합니다.

● 참고 : http://jira.springframework.org/browse/SPR-5145

Posted by fromm0
|
[이전 블로그 백업글][2008.2.14]

* 기존의 3.8을 사용하는 테스트 코드

3.8버전을 사용하는 기존의 소스에서 볼껀 getConfigLocations() 메소드의 내용과 onSetUp(), onTearDown() 메소드의 오버라이드 그리고 일반적인 형태의 testGetMenuList() 라는 테스트 메소드입니다. 일단 4.x 용 코드를 보면서 차이점을 알아보겠습니다.

* 4.x를 사용하는 테스트 코드


클래스 정의 상단에 다음과 같은 코드가 있습니다.


1. @ContextConfiguration 기존에 getConfigLocations() 메소드에서 해주던 컨텍스트 설정파일의 위치를 어노테이션으로 처리하도록 변경되었습니다.

2. @RunWith Junit4를 사용하도록 RunWith 어노테이션을 사용합니다.

3. @Autowired, @Resource MenuDao 타입의 변수위에는 @Autowired 어노테이션을 사용중입니다. 이것은 타입에 의한 autowire를 하도록 지정하는 것입니다. 만약에 name에 의한 autowire를 하고자 한다면 @Resource 어노테이션으로 대체하면 됩니다.

4. @Before, @After 앞서 오버라이드되었던 두개의 메소드 onSetUp(), onTearDown() 는 메소드 이름 자체는 의미가 없고 각각 @Before, @After라는 어노테이션을 사용함으로써 각각의 기능을 수행합니다.

5. @Test 그리고 실제 테스트용 메소드는 @Test 어노테이션을 사용해서 인식하도록 하고 있습니다.

Cannot find the class file for org.junit.internal.runners.JUnit4ClassRunner 에러가 발생한다면 eclipse europa가 가지고 있는 Junit4의 상세버전은 4.3.1입니다. 하지만 Spring 2.5에서 Junit4를 사용하기 위해서는 4.4이상의 버전이 있어야만 작동합니다. 여기서 굳이 Junit 홈페이지에서 4.4를 받을 필요는 없고 spring-framework-2.5.x-with-dependencies.zip 의 lib안에 보면 Junit 디렉토리안에서 4.4 버전의 jar파일을 찾을수 있습니다.
Posted by fromm0
|
[이전 블로그 백업글][2007.11.3]

일을 하다보면 될꺼 같은데.. 해보면 에러가 뜨는 경우가 있습니다.
에러가 뜨면 음. 될줄 알았으나 역시 안되는 거였구나. 하고 넘어가는 부분이 있습니다.
물론 꼭 필요하거나 급하지 않은 경우에는 왜 에러가 뜨지 하면서 문제를 파악하곤 하는데 바쁘거나 필수 기능이 아니라면 우회적인 방법을 선택하게 되는것 같습니다.
이번에 프로젝트 하면서 그런 경우가 jsp에서 Spring의 ApplicationContext를 가져오는 것이었습니다.
처음에는 당연(?)하게도 ClassPathXmlApplicationContext 를 사용하면 되겠구나 해서 사용했습니다. 멀정히 Web Context가 올라가고도 ClassPathXmlApplicationContext 를 사용했으니 설정파일 가져오기를 최소한 두번이상 하는 셈이지요.
그래서 이런 경우라면 WebApplicationContext 라면 되겠구나 해서. 했던 기억이 있는데. 역시 에러가 잠깐 발생했던 기능도 있네요. 뭐. 이건 제 삽질 얘기구요..
방법은 다음처럼

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());


기선님이 정리하셨던 참고글.. : http://whiteship.tistory.com/1349
Posted by fromm0
|
[이전 블로그 백업글][2007.11.3]

머리가 굳어가는지 잘 까먹는다. 이래선..

1. xml에 설정하는 간단한 방법


xml설정에서는 위처럼 트랜잭션 프록시에 대상 비즈니스 객체를 삽입한 뒤 호출을 다음과 같은 형식으로 한다. 간혹 깜박깜박하는게 빈을 가져올때 commonManagerProxy를 아이디로 사용해야 하는데 commonManager를 아이디로 사용해서 왜 트랜잭션이 작동 안하지 하면서 삽질을 하곤한다.

2. AOP를 사용하는 방법


빈을 가져올때 1번의 경우와는 달리 아이디로 commonManager 를 전달하면 된다. AOP에 의해 자동으로 처리가 된다. 위 aop의 advisor에 설정되어 있는 pointcut의 * *..service.*Manager.*(..) 는 service로 끝나는 패키지에서 Manager로 끝나는 클래스의 모든 메소드에 작동한다는 것이다.
Posted by fromm0
|