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

1. 소프트웨어 개발에서 절대로 바뀌지 않는 것은 없기 때문이다.
클래스 대신 인터페이스를 사용하고, new 를 이용해 생성하는 대신 DI를 통해 주입받게 하는 건 아주 단순하고 쉬운 작업이다.
2. 클래스의 구현 방식은 바뀌지 않는다고 하더라도 인터페이스를 두고 DI를 적용하게 해두면 다른 차원의 서비스 기능을 도입할 수 있기 때문이다.

3. 테스트 때문이다.  
단지 효율적인 테스트를 손쉽게 만들기 위해서라도 DI를 적용해야 한다. 그러기 위해서는 가능한 한 작은 단위의 대상에 국한해서 테스트 해야한다.  
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy
토비의스프링3
카테고리 컴퓨터/IT > 프로그래밍/언어 > 프로그래밍일반
지은이 이일민 (에이콘출판, 2010년)
상세보기


  • 클래스 밖에서는 오브젝트를 생성하지 못하도록 생성자를 private으로 만든다.

  • 생성된 싱글톤 오브젝트를 저장할 수 있는 자신과 같은 타입의 스태틱(static) 필드를 정의한다.

  • 스태틱 팩토리 메소드(static factory method)인 getInstance()를 만들고 이 메소드가 최초로 호촐되는 시점에서 한번만 오브젝트가 만들어지게 된다. 생성된 오브젝트는 스태틱
  • 필드에 저장된다. 또는 스태틱 필드의 초기값으로 오브젝트를 미리 만들어둘 수도 있다.

  • 한번 오브젝트(싱글톤)이 만들어지고 난 후에는 getInstance()  메소드를 통해 이미 만들어져 스태틱 필드에 저장해둔 오브젝트를 넘겨준다.

   싱글톤 패턴 구현방식의 문제
 

  • private 생성자를 갖고 있기 때문에 상속할 수 없다.

  • 싱글톤은 테스트하기가 힘들다.

  • 서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.

  • 싱글톤의 사용은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.

발생한 문제 :

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 프로그래밍이라고 할 수 있다.

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

+ Recent posts