발생한 문제 :

2011. 3. 18 오전 11:06:54 org.springframework.context.support.AbstractApplicationContext prepareRefresh
정보: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2626d4f1: startup date [Fri Mar 18 11:06:54 KST 2011]; root of context hierarchy
Exception in thread "main" java.lang.IllegalStateException: CGLIB is required to process @Configuration classes. Either add CGLIB to the classpath or remove the following @Configuration bean definitions: [daoFactory]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:229)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:160)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:663)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:602)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:407)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:65)
at springbook.user.dao.DaoTest.main(DaoTest.java:12)

찾아봤다.
찾은 페이지 : http://www.roseindia.net/spring/spring3/spring-cglib.shtml 
스프링 3.0 배포판에는 CGLIB 가 포함되어 있지 않다고 한다. 그래서 CGLIB를 추가한다.
관련 페이지 : http://cglib.sourceforge.net/
Download에서 cglib를 추가하면 된다.

추가해야할 항목 :
- cglib-2.1_3.jar
- cglib-nodep-2.1_3.jar

를 받으면 된다고 하더니 안되더이다...

2011. 3. 18 오후 12:15:46 org.springframework.context.support.AbstractApplicationContext prepareRefresh
정보: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2626d4f1: startup date [Fri Mar 18 12:15:46 KST 2011]; root of context hierarchy
Exception in thread "main" java.lang.IllegalStateException: Cannot load configuration class: springbook.user.dao.DaoFactory
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:246)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanFactory(ConfigurationClassPostProcessor.java:160)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:663)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:602)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:407)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:65)
at springbook.user.dao.DaoTest.main(DaoTest.java:12)
Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type
at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:180)
at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:66)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
at org.springframework.context.annotation.ConfigurationClassEnhancer.newEnhancer(ConfigurationClassEnhancer.java:101)
at org.springframework.context.annotation.ConfigurationClassEnhancer.enhance(ConfigurationClassEnhancer.java:89)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.enhanceConfigurationClasses(ConfigurationClassPostProcessor.java:238)
... 6 more
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type <-- 요놈 계속 발생....
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 12 more

그래서 현재 참고 하고 있는 교재의 라이브러리르 추가하니 한번에 된다. 뭐지?

 를 추가하니 해결...되었다.

2011. 3. 18 오후 12:17:10 org.springframework.context.support.AbstractApplicationContext prepareRefresh
정보: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2626d4f1: startup date [Fri Mar 18 12:17:10 KST 2011]; root of context hierarchy
2011. 3. 18 오후 12:17:10 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
정보: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6db3f829: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,daoFactory,userDao,connectionMaker]; root of factory hierarchy
honeymon2 등록성공
honeymon2
김지헌
solo
honeymon2 조회 성공

뭐지? 공통쪽에서 사용하는 CGLIB와 스프링에서 사용하는 CGLIB가 서로 다른 것일까?

'Java > Framework & Libs' 카테고리의 다른 글

인터페이스를 두고 DI를 적용해야 하는 이유  (0) 2011.03.29
Maven 기본 Phase 와 Goal의 관계  (0) 2011.03.25
POJO(Plain Old Java Object)  (0) 2011.03.15
Jakarta Project  (0) 2011.03.15
프레임워크 Vs. 라이브러리  (0) 2011.02.22
토비의스프링3
카테고리 컴퓨터/IT > 프로그래밍/언어 > 프로그래밍일반
지은이 이일민 (에이콘출판, 2010년)
상세보기

진정한 POJO란
객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다. 그런 POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법을 POJO 프로그래밍이라고 할 수 있다.

객체지향 프로그래밍의 기본이며 가장 궁극의 수준이라고 할 수 있겠다.
 

URL : http://jakarta.apache.org/

위키 : http://ko.wikipedia.org/wiki/자카르타프로젝트

설명 : The Apache Jakarta™ Project offers a diverse set of open source Java solutions

자카르타 프로젝트는 자바에 대한 개방형 오픈소스 자바 솔루션을 제공한다.

개인적으로 Ant, Commons, Logging, Maven, Struts, Taglibs, Tomcat, Velocity)는 조금 사용해본 것 같다. 아주 조금...

제공 솔루션

 

이 글은 스프링노트에서 작성되었습니다.

프레임워크가 어떤 것인지 이해하려면 라이브러리와 프레임워크가 어떻게 다른지 알아야 한다.

라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접제어한다.

단지 동작하는 중에 필요한 기능이 이쓸 때 능동적으로 라이브러리를 사용할 뿐이다.

 

반면에 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다.

보통 프레임워크가 위에 개발한 클래스를 등록해두고, 프레임워크가 흐름을 주도하는 중에 개발자가 만든 애플리케이션코드를 사용하도록 만드는 방식이다.

프레임워크에는 분명한 제어의 역전 개념이 적용되어 있어야 한다. 애플리케이션 코드는 프레임워크가 짜놓은 틀에서 수동적으로 동작해야 한다. 

 

--> 라이브러리를 사용하는 애플리케이션 : 애플리케이션이 필요할 때 라이브러리를 사용

--> 프레임워크를 사용하는 애플리케이션 : 프레임워크가 흐름을 주도하다가 필요한 애플리케이션을 사용

 

출처 : 토비의 스프링3, 1장_오브젝트와 의존관계

토비의스프링3
카테고리 컴퓨터/IT > 프로그래밍/언어 > 프로그래밍일반
지은이 이일민 (에이콘출판, 2010년)
상세보기


이 글은 스프링노트에서 작성되었습니다.

현재 자바모델링(http://javamodeling.com)에서 스터디에 참가하고 있다.

Struts2를 학습하던 중에 이 글의 제목과 관련된 내용을 만나볼 수가 있다.
위와 같은 문제가 발생을 하는 경우를 접하게 되었다. 가만히 읽어보면, result success 가 정의되지 않았다는 이야기를 내보내고 있다.

이 증상과 관련된 소스는 struts2.xml 과 LoginAction_KJH.java 와 관련이 되어 있다.
정확하게는 스트럿츠에서 사용하는 interface com.opensymphony.xwork2.Action 에 정의된 SUCCESS와 관련이 되어 있다.


struts2.xml
       
<action name="login" class="com.javamodeling.struts2.login.LoginAction_KJH">
       <result name="success">success.jsp</result><!-- return SUCCESS 인데, 찾는건 소문자로 찾네? -->
       <result name="error">failure.jsp</result>
</action>

LoginAction_KJH.java
        public String execute() {
           
            if (this.userid.equals(this.password)) {
                return SUCCESS;
            } else {
                return ERROR;
            }
        }

interface com.opensymphony.xwork2.Action 에서 정의한 SUCCESS를 확인해보자.
항목에서 SUCCESS = "success"로 선언되어있는 것이핵심이다. ^^;

LoginAction_KJH.java 소스에서는 return SUCCESS 를 보면 "SUCCESS"가 리턴될 것 같은 것이 일반 사람들의 마음이다(나만 그럴까?)

strtus.xml 을 보면 <action></action> 태그 사이에 <result name="success">success.jsp<result/>로 적어놓은 것이 보일 것이다. 물론 이렇게 되어 있으면 정상적으로 작동한다. 혹시, <result name="SUCCESS">success.jsp<result/>로 작성되어 있지 않은지 확인해보자.

"SUCCESS"로 되어 있다면 "success"로 수정을 하자. 그런 후에 실행해보자.
정상적으로 실행이 되는 것을 확인해볼 수 있을 것이다.

이런 원인은 JUnit TestCode를 작성하여 확인해볼 수 있었다. excute()에서 리턴되는 값 때문에 생긴문제라는 확신을 하게 되었다.
요즘 TDD(Test Driven Development)에 대해서 공부를 하고 있는데, 이렇게 활용할 수 있다는 발견에 공부한 보람을 느끼며 더 열심히 해야겠다.

"SUCCESS"를 "success"로 변경하면,
정상적으로 실행된 것을 확인해볼 수 있다. 이를 통해서, LoginAction_KJH.java의 execute()에서 return SUCCESSreturn ERROR의 반환값을 확인해볼 수 있다.

이런 인식의 오해를 해결하는 방법이라면

return "SUCCESS" 나 return "success"와 같이 반환되는 값을 정확하게 정의를 해주고 나서
struts.xml 에서 <result name=""></result>에서 name을 정의해주는 것이 아닐까?

+ Recent posts