달력

3

« 2024/3 »

  • 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
그냥 며칠동안 테스트 코드를 작성하면서, 발견한 사실들에 대해서 겸허히 쓴다.
일민이(Toby)는 나보고 또 Spring Framework Developer Reference를 읽어보라고, 아프게 충고를 했다.

먼저, Test코드를 작성하다 보니,
BeanFactory 의 사용법과 ApplicationContext 의 사용법이 다르다는 사실을 발견했다.
사실 ApplicationContext는 BeanFactory의 인터페이스를 상속받아 만들어진 인터페이스이다. 따라서, ApplicationContext는 BeanFactory의 모든 동작을 포함하고 있고, 비슷하게 동자을 하도록 도와준다. 둘 모두 getBean() 메소드를 사용해서 Configuration을 위해 작성한 XML파일에서 정의한 Bean을 얻을 수 있다. 아까도 이야기 했지만, ApplicationContext Interface는 BeanFactory Interface의 확장이다.

ApplicationContext와 BeanFactory Interface간의 차이점은 Singleton 빈의 로딩하는 방법에 있다. BeanFatory는 getBean() 메소드가 호출될 때까지 Bean의 생성을 미룬다. 반면에 ApplicationContext는 Singleton 빈을 미리 로딩함으로 그 빈이 즉시 사용이 가능하도록 보장해 준다.

일반적인 테스트 코드를 작성할때는 두개의 차이가 거의 없을것이다. BeanFactory는 테스트 코드를 작성하기에 매우 유용하지만, 두 Interface의 차이를 알지 못하면, 이상하게 여길수도 있다. 최근에 Scheduler를 작성하게 되면서, 테스트 코드를 작성한 적이 있는데, Quertz의 Thread가 생성이 되어서 동작을 해야 하는데, 동작을 하지 않다가 getBean("scheduler")를 실행시켜줘야만 동작을 한는 것이었다. (BeanFactory 사용시)
그러나, ApplicationContext의 사용시는 ApplicatiionContext의 인스턴트가 생성되면, Quartz의 Thread가 실행되어 정해진 시간마다 Job을 실행하는 로그를 찍었다. 이유는 위에서 설명한 이유때문이다. (테스트시 ApplicationContext를 사용할 이유가 하나 늘었다.)

그리고 또하나 발견한 것은 getBean("beanId")을 통해 Bean의 reference를 얻어 올수 있다. 하지만, 가져온 Bean의 형이 내가 생각했던 것과는 다를 수도() 이는 Bean의 원 클래스에서 반환하는 오프젝트가 반환되기 때문이다.

[AbstractApplicationContext 코드 중에서]
public Object getBean(String name) throws BeansException {
  return getBeanFactory().getBean(name);

 }


만약, Factory 자체를 반환하기를 원한다면, "&"를 "beanId"앞에 붙여서 사용하면 된다.
이렇게 말이다. ==> getBean("&beanId)
이를 가르쳐 주면서 reference guide 를 잘 살 펴보라고 한다. 그래서 살펴보았더니. 딱 2줄에 걸쳐서 설명이 되어져 있다. Spring In Action에는 설명이 아예 안 되어 있다.

[BeanFactoryUtils코드 중에서]

public static boolean isFactoryDereference(String name) {
  return (name != null && name.startsWith(BeanFactory.FACTORY_BEAN_PREFIX));
 }


이 코드은 사실 AbstractBeanFactory 클래스에서 사용되는 메소드이다. 그리고
BeanFactory.FACTORY_BEAN_PREFIX 는 "&"로 정의되어 있다. 
:
Posted by 행복상자
며칠전에 SpringSouce에서 새로이 발표한 SpringSource Application Framework에 대해서 글을 소개한 적이 있다. 지난 30일 팀 블러그를 통해 발표 되었었다.
이는 Dynamic Module Kernel(DM-Kernel)을 기반으로 만들어진 현재는 베타버전의 SpringSource의 Application Platform이다.


잘 만든 Architecture도 결국은 어떻게 Deploy하고 관리 할 것이냐에 대한 고민을 하게 되는데, 이는 새로 만든 모듈들과 기존에 동작하는 모듈간에 조화로움이 관건이다.(버전 관리와 Dependency의 문제)

www.springframework.org 에 들어가 보니, Application Platform에 대한 글과 자료들이 새로 올라와 있어서 흩어 보았는데, 리눅스와 윈도우 환경에서 설치와 사용에 대한 Guide와 개발자 매뉴얼이 올라와 있어 새로운 Platform에 대한 이해에 큰 도움이 될거라 생각이 든다.
Web Site에 올라온 자료들의 목록과 링크는 다음과 같다.




각 번들에 필요한 기능들을 어떻게 가져오고 노출 시킬 것인가에 대해해, 요즘 고민 중인데, 분석을 하면서 아이디어를 얻어야 할 것 같다.
현재 내가 하고 있는 프로젝트는 공통 모듈들 개발 해야 하는데, 각 공통 모듈을 이용해서 개발해야 할 솔루션의 내부에도 외부로 노출 시켜야 할 서비스 부분이 분명 존재한다. 이를 어떻게 다른 쪽에 인지 시킬 것인지, 그리고 어떻게 가져다 써야 할 것인지에 대한 고민 중이다.



위와 같이 직접 불러다 사용하거나, 아니면 아래와 같이 공통의 라이브러리를 따로 만들고 각 번들에서 직접 호출해서 사용할 수도 있을 것이다.




:
Posted by 행복상자

이미 아는 사람들은 알겠지만, Spring Framework를 만들 "로드 존슨"의 회사명은 "Interface21"에서 "SpringSource"로 사명을 바꿨다. 그리고 더욱 왕성한 활동을 보여주고 있다.

오늘 소개하는 SpringSource Application Platform은 SpringSource의 팀 블러그에 올라온 것으로 beta release를 공개한다는 내용이다.
요즘 사내에서 개발하고 있는 Framwork는 OSGi를 기반으로 설계를 진행중이고 이를 위해서 스프링-DM을 사용하려고 한다. 그래서 관심을 갖을 수 밖에 없다.


Tomcat과 Spring을 통해서 lightweight platform을 구성이 가능하지만, modularaty(모듈화)와 non-web application에 대한 지원에 대한 단점을 안고 있다.
이를 개선하기 위한 노력으로 시작된 것이다.

아래는 Application Platform의 구성을 설명해 주는 그림인데, 여기서 중요한 역할을 하는 것은 SpringSource DMK(Dynamic Module Kernel)이다.
SpringSource Application Platform Architecture
DMK가 동작하기 위해서는 최소한의 번들들이 있어야 된다고 한다. MDK는 구동을 위해서 꼭 Tomcat을 필요로 하지도 않지만, Tomcat는 기본적으로 포함되어 있고, 언제든지 설정을 통해 넣거나 뺄수 있다. 그러나 Tomcat을 제거한다는 것은 Web Module의 Deplroy를 하지 않는 다는 것을 의미하므로 이점은 반드시 유의해야 한다.

다음은 Platform에서 지원하는 3가지 패키징 및 Deploy 방법이다.

Building Applications

  • The Platform supports applications packaged in three forms:

    1. Java EE WAR
    2. Raw OSGi bundles
    3. Platform Archive (PAR)

먼저,  WAR파일을 통해서 배포가 가능한데, 이는 배포 시점에 OSG번들과 Tomcat에 설치가 된다.
둘째로, OSGi 번들은 직접 Platform에 배포가 가능하며, Import-Package and Require-Bundle를 이용해서 번들간의 deendency의 선확인이 가능하다.
마지막으로 PAR 포맷은 Platform으로 deploy할 때 수동으로 설치가 쉽고, 로드 될때 다른 서비스와 충돌 또는 이중으로 서비스가 동작하는 것을 막아주고, Application에서 사용되는 모듈들에 대해 로직컬하게 Grouping이 가능하게 만들어 주는 잇점을 가지고 있다.
아래는 모듈간의 RAR Application의 전형적인 예이다.
PAR File Structure
Dependency는 일반적으로 Import-Package & Export-Package를 이용하여 표시한다. 그러나, Third-party 라이브러리를 이용하기 위해서는 이 것말고도 더 많은 라이브러리를 요청하는 경우가 있다. 이를 개선하기 위해서, Platform에서는 Import-Bundle 과 Import-Libary을 이용하여. Import-Bundle 은 추가적으로 다른 third-party 라이브러지를 참조할 수 있게 된다.
 


 

:
Posted by 행복상자

Spring MVC는 Spring Framework중에서 웹 개발을 쉽게 할 수 있도록 도와준다.
국내에서 출판된 책들은 Source를 제공하기는 하지만, 책을 보고 Source를 실행하려고 하면 잘 동작하지 않는다. 물론 손으로 직접 쳐서 입력할때 오타가 있기는 하지만, 서버의 설정과 환경 구성에 대해서 충분하게 설명해 주지 못하기 때문이다.

이를 위해, www.springframework.org에서는 제공하고 있는 Spring MVC를 위해서, Developing a Spring Framework MVC application step-by-step
라는 제목으로 Spring MVC개발에 대해 설명하고 있다. 2003년에 작성된 것과 올 2008년에 작성된 것이 있다.

예제는 초보자를 위해서, 개발 환경 설정과, Ant의 Build.xml 만들기와 사용법등을 부과적으로 설명하고 있다. Ant를 사용하는 법도 부과적으로 얻을 수 있다. 이에 대한 목차는 다음과 같다.(2003년도 작성)

[목차] 
Part 1 – Basic Application and Environment Setup
Part 2 – Developing and Configuring the Application
Part 3 – Adding Unit Tests and a Form to the Application
Part 4 – Implementing Database Persistence

위는 2003년도에 작성된 예제와 Sample이고 tex t위주의 설명으로 되어 있지만,  MVC개발을 위한  설정 XML 파일을 어떻게 작성해야 하는지, 그리고 Dispatcher와 Controller 그리고, View에 대한 코드들에 대해 쉽게 이해할 수 있도록 예제와 더불어 쉽게 설명하고 있다.

그리고, 2008년도에 작성된 Spring MVC step-by-step의 목차는 다음과 같은데, 설명과 함께 캡처한 이미지를 제공하여 설명을 돕고 있다.

[목차]
 

Overview
1. What's covered
2. Prerequisite software
3. The application we are building
1. Basic Application and Environment Setup
1.1. Create the project directory structure
1.2. Create 'index.jsp'
1.3. Deploy the application to Tomcat
1.4. Check the application works
1.5. Download the Spring Framework
1.6. Modify 'web.xml' in the 'WEB-INF' directory
1.7. Copy libraries to 'WEB-INF/lib'
1.8. Create the Controller
1.9. Write a test for the Controller
1.10. Create the View
1.11. Compile and deploy the application
1.12. Try out the application
1.13. Summary
2. Developing and Configuring the Views and the Controller
2.1. Configure JSTL and add JSP header file
2.2. Improve the controller
2.3. Decouple the view from the controller
2.4. Summary
3. Developing the Business Logic
3.1. Review the business case of the Inventory Management System
3.2. Add some classes for business logic
3.3. Summary
4. Developing the Web Interface
4.1. Add reference to business logic in the controller
4.2. Modify the view to display business data and add support for message bundle
4.3. Add some test data to automatically populate some business objects
4.4. Add the message bundle and a 'clean' target to 'build.xml'
4.5. Adding a form
4.6. Adding a form controller
4.7. Summary
5. Implementing Database Persistence
5.1. Create database startup script
5.2. Create table and test data scripts
5.3. Add Ant tasks to run scripts and load test data
5.4. Create a Data Access Object (DAO) implementation for JDBC
5.5. Implement tests for JDBC DAO implementation
5.6. Summary
6. Integrating the Web Application with the Persistence Layer
6.1. Modify service layer
6.2. Fix the failing tests
6.3. Create new application context for service layer configuration
6.4. Add transaction and connection pool configuration to application context
6.5. Final test of the complete application
6.6. Summary
A. Build Scripts


위의 순서대로 예제를 실행해 보았는데, 어렵지 않게 스프링 MVC에 대해 이해할 수 있었고, 개발시 환경 구성과 설정방법들에 배울 수 있었다.



:
Posted by 행복상자