발생한 문제 :

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가 서로 다른 것일까?
  1. @PatrickJeon 2011.09.29 12:46

    도움 감사드립니다. 저도 이걸로 해결이 되었네요....

    그냥 그러려니 하고 일단 속도를 내기 위해 진행하옵니다...ㅋ

    • STS 에서 제공하는 템플릿 프로젝트를 이용하시면
      maven 을 이용해서 손쉽게 라이브러리를 추가할 수 있습니다. ^^

      pom.xml 에다가
      cgilib.jar 관련한 항목만 첨가하면 메이븐이 알아서 라이브러리를
      추가해주죠. ^^ 프로젝트 들어와서 메이븐으로 스프링 프레임워크를 관리하니 편하더라구요.

  2. 천방애비 2011.11.14 01:10

    선 댓글 후 재도전 해보겠습니다. 제가 보는 책이 왠지 허니몬님이 보는책과 같다는 느낌이.. ㅎㅎ

  3. 이형규 2012.01.17 11:41

    안녕하세요
    저도 같은 오류가 나서 위와 같은 방법으로 라이브러리 3개를 추가 했는데요
    오류가 계속 발생하네요

    Cannot load configuration class:

    혹시 알 수 있을까요

    • 오류 메시지랑 application context가 있어야 확인할 수 있을 것 같은데요. ^^; 혹시 사용하시는 스프링 버전이 어떻게 되시나요?

  4. 지나가다 2012.05.16 21:18

    정말 감사합니다. 저도 이글 보고 해결하였습니다. 정말 이런 거 많으면 힘들어요!!

  5. 샤인 2012.11.16 16:01

    혹시 토비의 SPRING들 보시나요..ㅋㅋ

  6. 이주희 2013.05.23 15:34

    덕분에 저두 해결했네요~~^^

  7. 최흥길 2014.05.15 10:37

    저도 계속
    java.lang.ClassNotFoundException: org.objectweb.asm.Type
    이 에러때문에 삽질하다가 여기 첨부해주신
    com.springsource.net.sf.cglib-2.1.3.jar 로 바꾸니까 바로 되네요;;;;

    http://mvnrepository.com 에서 다운받은걸로 해봐도 계속 안됬는데...;;;
    뭐가 다른걸까요... ㅡ.ㅡ;;;

    혹시 아시는분있으면 댓글좀 부탁드립니다...

  8. 최흥길 2014.05.15 10:44

    https://github.com/cglib/cglib 가면

    readme 에
    cglib-#.#_#.jar binary distribution, CGLIB classes only,
    it must be used to extend cglib classes dependant on ASM API

    cglib-nodep-#.#_#.jar binary distribution, CGLIB and renamed ASM classes,
    not extendable

    이런 노티가 있네요;
    어제는 피곤했나봅니다...쿨럭;;;

  9. 스프링 프레임워크 3.2.x 이상으로 올리시게 되면 더이상 CGLIB는 필요하지 않으실 겁니다. ^^;

    http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/migration-3.2.html#migration-3.2-inline-cglibs

  10. LiCH 2015.04.07 17:50

    똑같은 책보면서 똑같은 문제로 고민하다, 여기서 해결하고 갑니다.
    감사합니다. ^^

토비의스프링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