태그 : spring

Spring XML설정파일을 위한 12가지 가장 좋은 선택

원제는 Twelve Best Practices for Spring XML Configuration Files 이다.
원문의 위치는 http://lizjason.com/blog/?p=12

2006년 1월 26일 :
ONJava.com의 Twelve Best Practices For Spring XML Configurations 글을 기반으로 예제및 설명에 대한 일부 수정

Spring은 강력한 자바 애플리케이션 프레임워크이고 자바 애플리케이션의 넓은 범위에서 사용된다. 이것은 단순함과 테스트의 용이성을 달성하기 위해 의존성삽입(Dependency Injection)을 사용한다. 의존성과 bean생성은 XML설정파일에 대개 명시된다. XML설정은 장황하고 큰 프로젝트에서는 관리하기가 어려울수도 있다. 설정파일의 가독성과 관리의 용이성이 고려되는 만큼, 나는 다음의 사항이 매우 유용하리라고 생각한다.

 

1. autowire를 사용하지 말라.
내 의견에서, autowire는 시장광고용(marketing) 기능이다. 이것은 실제 프로젝트에서 결코 사용되지 말아야 한다. 이것은 몇몇 타이핑의 수고와 설정조각을 줄이지만, 명백함과 설정의 유지보수성을 희생한다.

trollswagen, naimdjon, Johannes Brodwall, 토지님께서 autowire는 오히려 xml이 커지면 커질수록 xml의 구조를 쉽게 파악하게 해주는 정말 좋은 기능중에 하나라는 의견을 주셨습니다. autowire에 관련된 사항은 프로젝트 도입시 장,단점을 다시 살펴 사용하길 권합니다.

2. 명명 규칙을 사용하라.
이것은 자바코드와 같은 의도이다. 예를 들면 bean id를 위해, 당신은 자바 클래스 필드 명명규칙을 따를수 있다. OrderServiceDAO의 인스턴스를 위한 bean id는 orderServiceDAO가 될것이다.

 

3. 단축형태(shortcut forms)를 사용하라.
단축형태는 자식요소에서 속성으로 프라퍼티값과 참조를 이동시켜 다소 덜 장황하게 만든다. 이 단축형태는 1.2버전 이후 지원된다.

단축형태는 다음과 같은 기능이다.
1.2이전버전에서는 다음과 같이 셋팅한다.

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> <property name="url"><value>jdbc:mysql://localhost:3306/mydb</value></property> <property name="username"><value>root</value></property> </bean>

1.2이후 단축형태를 사용하면 다음과 같이 셋팅이 가능하다.

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mydb" /> <property name="username" value="someone" /> </bean>

 

4. 인자를 맞추기 위한 인덱스보다 타입을 선호하라.
인덱스를 사용하는 것은 때때로 다소 덜 장황하게 만든다. 하지만 이것은 에러를 좀더 생성하고 읽기 어렵다.

다음의 소스는 인덱스를 사용하는 예제이다.

<bean id="billingService" class="com.lizjason.spring.BillingService"> <constructor-arg index="0" value="lizjason"/> <constructor-arg index="1" value="100"/> </bean>

하지만 다음처럼 타입을 사용하는 것이 추천한다.

<bean id="billingService" class="com.lizjason.spring.BillingService"> <constructor-arg type="java.lang.String" value="lizjason"/> <constructor-arg type="int" value="100"/> </bean>

 

5. 가능하다면 bean정의를 재사용하라.
당신은 중복을 제거하기 위한 기법처럼 상속을 사용할수 있다. 당신이 할 필요가 있는 모든것은 상위 bean에 abstract=true를 명시하고 자식 bean에 parent참조를 두는 것이다. 당신이 클래스나 factory메소드를 명시하지 않는다면, bean은 함축적으로 abstract상태가 된다.

예를 들면 다음과 같이 셋팅한다.

<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean id="userManager" parent="txProxyTemplate"> <property name="target"> <bean class="org.appfuse.service.impl.UserManagerImpl"> <property name="userDAO" ref="userDAO" /> </bean> </property> </bean>

 

6. import 보다는 ApplicationContext를 통해 bean정의를 조립(assembling)하는 것을 선호하라.
Ant스크립트내 import처럼, 그것들은 모듈화된 bean정의를 조립하는데 유용하다. 어쨌든, 이것은 ApplicationContext를 통해 그것들을 조립하기 위해 좀더 유연하다. 당신은 ApplicationContext의 생성자를 위해 bean정의의 배열을 전달할수 있다.

다음은 import를 조합하여 xml을 설정하는 소스이다.

<beans> <import resource="billingServices.xml"/> <import resource="shippingServices.xml"/> <bean id="orderService" class="com.lizjason.spring.OrderService"/> <beans>

import를 사용하여 xml을 조합하는 방식보다는 아래와 같이 ApplicationContext를 사용하는 것이 좀더 유연한 개발을 도와준다.

String[] serviceResources = {"orderServices.xml", "billingServices.xml", "shippingServices.xml"}; ApplicationContext orderServiceContext = new ClassPathXmlApplicationContext(serviceResources);

 

7. 가능하다면, bean 확인자로 id를 사용하라.
id를 사용하는 것은 가독성을 증가시키지 않는다. 하지만 이것은 bean참조를 확인하기 위해 XML파서에 영향을 끼칠수 있다. 만약 id가 XML IDREF제한을 위해 사용될수 없다면, 당신은 이름(name)을 사용할수 있다.

 

8. 개발시에는 의존성체크(dependency-check)를 사용하라.
당신은 bean정의의 dependency-check속성을 디폴트인 none이 아닌 다른값으로 셋팅할수 있다. 그래서 컨테이너는 당신을 위해 의존성체크를 할수 있다.

<bean id="orderService" class="com.lizjason.spring.OrderService" dependency-check="objects"> <property name="companyName" value="lizjason"/> <constructor-arg ref="orderDAO"/> </bean>

 

9. 각각의 XML파일을 위해 헤더(header) 주석을 추가하라.
XML파일내 내부 주석대신에 서술적인 id와 name을 사용하는것이 선호된다. 어쨌든, 각각의 파일이 정의된 bena을 요약하는 헤더를 가진다면 이해하기가 쉽다.

<beans> <description> 이 파일은 거래(billing) 서비스 관련 bean을 정의하고 서비스 bean템플릿을 제공하는 baseService.xml파일을 의존한다. </description> ... </beans>

 

10. 변경을 위해 팀멤버간 의사소통을 하라.
당신이 자바소스코드를 리팩토리할때, 당신은 설정파일을 그 상황에 따라 변경하고 팀멤버에게 알릴 필요가 있다.

 

11. 생성자 삽입(constructor injection)보다 setter 삽입(setter injection)을 선호하라.
생성자 삽입은 bean들이 비정상적인 상태에서 생성될수 없다는 것을 확인할수 없다. 하지만 setter 삽입은 좀더 유연하고 관리가 가능하다. 특히 클래스가 다중 프라퍼티를 가진다면 더욱 그러하다.

다음은 생성자 삽입을 사용하는 예이다.

<bean id="orderService" class="com.lizjason.spring.OrderService"> <constructor-arg ref="orderDAO"/> </bean>

다음은 setter삽입을 사용하는 예이다.

<bean id="billingService" class="com.lizjason.spring.BillingService"> <property name="billingDAO" ref="billingDAO"> </bean>

 

12. 의존성 삽입을 남용하지 말라.
마지막에, Spring ApplicationContext는 당신을 위해 자바객체를 생성할수 있다. 하지만 모든 자바객체가 의존성삽입을 통해서 생성될수는 없다. 기억하라. 강력한 IDE인 Eclipse와 IntelliJ를 사용하여, 자바코드는 좀더 읽고, XML파일보다 유지및 관리가 쉽다. 즉 의존성삽입을 설정하는 XML파일보다는 자바코드가 개발자의 입장에서는 가독성이 좋다.

by 밀리 | 2009/12/11 10:35 | JAVA | 트랙백 | 덧글(0)

자바프로그래밍의 신기술 Framework

Struts 2
=========
Struts 2 Framework 은 WebWork Framework 에 기반을 두고 있습니다. WebWork Framework 은 여러해동안 좋은 아키텍처로 Framework 를 정립하여, 웹 어플리케이션 개발에 많이 활용되어 왔습니다.
이에 Struts Communites 와 WebWork Communities 들이 모여서 WebWork Framework 을 Struts 2 Framework 으로 명명하여 Framework 를 발전시키고자 합의를 하였습니다.
따라서 Struts 2 Framework 는 대부분 WebWork Framework 를 따르고 있으며, 초기의 Struts 2 Framework 는 WebWork Framework 와 같다고 여겨도 됩니다.

Struts 2 Framework 는 Struts 1.x Framework 와는 전혀 다른 아키텍처로 구성되어 있습니다. 일반적으로 Framework 든 어플리케이션이든, 버전업이 되면 기존에 있는 기능에 더 많은 기능을 추가하고, 부족한 기능을 보완하여 버전업을 합니다.

하지만 Struts 2 Framework 는 처음부터 Struts 1.x Framework 에 기반하지 않고, 전혀 다른 WebWork Framework 을 이름을 바꾸어서 새로운 아키텍처로 구성된 Struts 2 Framework 을 만들었습니다. 따라서 개발자들은 Struts 1.x Framework 와 다른 Struts 2 Framework 를 다시 익혀야 됩니다.
 
 
 
ibatis
=========
iBATIS는 간단한 XML서술자를 사용해서 간단하게 자바빈즈를 SQL statement에 맵핑시킨다. 간단함(Simplicity)이란 다른 프레임워크와 객체관계맵핑툴에 비해 iBATIS의 가장 큰 장점이다. iBATIS Data Mapper를 사용하기 위해서 당신은 자바빈즈와 XML 그리고 SQL에 친숙할 필요가 있다. 여기엔 배워야 할것도 거의 없고 테이블을 조인하거나 복잡한 쿼리문을 수행하기 위해 필요한 복잡한 스키마도 없다.
Data Mapper를 사용하면 당신은 실제 SQL문의 모든 기능을 가질수 있다. JDBC 로만 프로그래밍 할 때의 번거로움을 줄여주기 위해 재사용 모듈로 개발된 것이다.
 
 
 
 
Spring
=========
Spring를 이해하기 위해서는 IOC를 먼저 이해해야한다. IOC 란 인스턴스 생성의 제어를  개발자 본인이 아닌 다른 누군가에게 반환 준다는 개념이다. 여기서 말하는 다른 누군가란 EJB, Servlet 등 bean을 관리해 주는 컨테이너이다. 즉 IOC 란 인스턴스의 생성부터 소멸까지의 인스턴스의 생명주기 관리를 내가 아닌 컨테이너가 대신 해준다는 뜻이다.
 
Spring 컨테이너란 ?
Spring 컨테이너는 IOC를 지원한다. Spring 컨테이너란 beans 를 관리하고 애플리케이션 중요 부분을 형성한다. 즉 Spring 컨테이너는 메타데이터(xml 설정)를 통해  bean를 인스턴스화 하고 이를 조합하여 관리하는 역할을 한다. 컨테이너는 관리되는 bean 들을 의존성 삽입(Dependency Injection)을 통해 IOC 를 지원한다.
 
 
 

Highber nate
=============
Hibernate는 java환경의 object/relational mapping tool 이다. object/relational mapping(ORM) 이란 말은 object model로써 표현된 데이터를 relational, 즉 SQL base의 구조를 갖는 데이터에 대응시키기 위한 기술을 말한다.
 
Hibernate는 java class 데이터 베이스의 테이블에 mapping을 할뿐만 아니라, 데이터의 쿼리와 복원 기능도 제공하고 있다. 이덕분에 SQL과 JDBC에 의해 수작업으로 데이터를 조작했던 방식과 비교해서 개발기간을 급격히 줄일수가 있다

by 밀리 | 2008/12/19 12:46 | JAVA | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶