이 아티클의 영문 원본은
http://java.sun.com/mailers/techtips/en ··· html%231
에서 볼수 있습니다.
샘플 애플리케이션의 기술 및 프레임워크 요약
JSP, JPA 또는 Spring에 익숙하지 않은 독자를 위해 간략하게 설명하자면,
- JSF(JavaServer Faces Technology)는 웹 애플리케이션을 위한 서버측 사용자 인터페이스(UI) 컴포넌트 프레임워크로서 구성, 재사용 및 확장 가능한 UI 컴포넌트를 제공하고 이벤트 처리, 입력 변환기 및 검증자를 지원하며 탐색 모델, 컴포넌트 렌더링 모델 및 (입력 이벤트를 서버측 동작으로 변환하기 위한)관리 빈 모델을 제공함으로써 고급 대화형 웹 UI의 개발을 간소화한다.
- Java EE 및 Java SE 애플리케이션을 위해 POJO(plain old Java object) 기반의 지속성 모델을 제공하는 JPA(Java Persistence API)는 관계형 데이터가 Java 개체에 매핑되는 방식에 대한 모든 세부사항을 다루며 개체 관계 매핑(O/R)을 표준화한다.
- Spring은 Java Enterprise 애플리케이션 개발을 위한 경량급 POJO 지향 오픈 소스 프레임워크로서, 연결 풀링과 같은 애플리케이션 서버 기능을 다시 만들거나 개체 관계 매핑 계층을 제공하지 않는다. 그 대신 기존 Java Enterprise 애플리케이션 서버 기술을 더 쉽고 투명하게 사용할 수 있도록 IoC(Inversion of Control), 종속 관계 삽입, AOP(Aspect Oriented Programming) 및 추상화/서비스 계층을 지원한다.
샘플 애플리케이션
이 팁의 샘플 애플리케이션에서는 애완동물 가게에서 판매하는 애완동물의 온라인 카탈로그를 표시한다.

Listing Items 페이지, list.jsp가 카탈로그의 동물을 3열 테이블로 표시한다. 각 행은 동물의 이름, 사진 및 가격을 싣고 있다. 한 페이지에 최대 10개의 행이 표시된다. 또한 카탈로그의 총 항목 수 중 현재 표시된 항목도 알려 준다(예: "Item 31 ..40 out of 102"). 사용자가 페이지의 링크를 클릭하여 카탈로그상의 다음 또는 이전 애완동물 10개를 표시하거나 목록상의 특정 동물의 세부 정보를 표시할 수 있다.
이 팁에서는 샘플 애플리케이션 중 동물의 테이블을 표시하는 기능을 집중적으로 살펴 보고자 한다. 샘플 애플리케이션의 다른 기능이 구현되는 방법에 대해서는 블로그 항목, JSF, Spring 2.0 및 Java Persistence API를 사용하는 샘플 애플리케이션에서 확인할 수 있다.
애플리케이션에서 JSF 사용
list.jsp 페이지의 코드를 살펴보면 JSF 컴포넌트를 사용함을 알 수 있다. 예를 들어, 다음 dataTable 컴포넌트는 애완동물의 테이블을 표시한다.
<h:dataTable value='#{item.items}' var='dataTableItem' border="1" cellpadding="2" cellspacing="0">
dataTable 컴포넌트는 결과의 집합을 테이블에 표시할 때 유용하다. JSF 애플리케이션에서 dataTable의 수퍼클래스인 UIData 컴포넌트는 데이터 개체의 컬렉션에 대한 바인딩을 지원한다. UIData 컴포넌트는 데이터 소스의 레코드별로 반복하는 작업을 담당한다. dataTable 컴포넌트의 HTML 렌더러는 HTML 테이블 형태로 데이터를 표시한다.
dataTable 태그의 값 속성은 표현식 #{item.items}에서 식별하는 카탈로그 항목의 목록을 가리킨다. 이 값은 관리 Bean 이름 항목을 갖는 관리 빈의 항목 등록 정보에 바인딩된다.
var 속성은 dataTableItem에서 식별하는 목록상의 단일 항목을 가리킨다. UIData 컴포넌트가 목록에서 반복되므로 dataTableItem에 대한 참조 각각이 목록상의 현재 항목을 가리킨다.
JSF 열 컴포넌트는 테이블의 열을 표시한다. 예를 들어, 다음 열 컴포넌트는 가격 열을 표시한다.
<h:column> <f:facet name="header"> <h:outputText value="Price"/> </f:facet> <h:outputText value="#{dataTableItem.price}"/> </h:column>
열 태그는 UIData 컴포넌트의 데이터 열을 나타낸다. UIData 컴포넌트가 데이터 행에서 반복하면서 테이블의 행별로 각 열 태그와 연결된 UIColumn 컴포넌트를 처리한다. UIData 컴포넌트는 항목의 목록인 (item.items)에서 반복하면서 dataTableItem.price를 표시한다. UIData가 항목의 목록에서 반복할 때마다 각 열에 하나의 셀을 렌더링한다.
dataTable 및 열 태그는 facet 태그를 사용하여 반복 또는 업데이트되지 않은 테이블 부분을 나타낸다. 머리글, 바닥글 및 캡션 등이 여기에 해당된다.
애플리케이션에서 Spring 사용
Spring의 설계 목표 중 하나는 다른 Java EE 기반 웹 프레임워크 및 기술과 손쉽게 통합하는 것이다. 사실 Spring을 JSF와 통합하려면 JSF 애플리케이션의 빈 리소스와 탐색 규칙을 나열하는 파일인 faces-config.xml에서 Spring DelegatingVariableResolver를 구성하면 된다.
Spring DelegatingVariableResolver는 JSF 애플리케이션이 표준 JSF VariableResolver 구현을 위한 사용자 정의 대체 클래스를 등록할 수 있게 한다. 표준 JSF VariableResolver는 평가 시 변수 참조를 해결한다. Spring DelegatingVariableResolver는 먼저 기본 JSF 구현의 원래 Resolver에 위임한 다음 Spring 루트 WebApplicationContext에 위임한다. WebApplicationContext는 스프링 빈이라고 부르는 빈 집합을 인스턴스화, 구성하고 그 수명 주기를 관리한다. 즉 스프링 빈을 JSF 관리 빈의 관리 등록 정보로 구성할 수 있다.
예를 들어, 다음은 샘플 애플리케이션 faces-config.xml 파일의 단편이다. 이 예에서 catalogService라는 스프링 빈은 JSF 관리 빈 클래스 ItemController의 관리 등록 정보로 구성된다.
<application> <variable-resolver> org.springframework.web.jsf.DelegatingVariableResolver </variable-resolver> </application> <managed-bean> <managed-bean-name>item</managed-bean-name> <managed-bean-class> sessionpagination.ItemController </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>catalogService</property-name> <value>#{catalogService}</value> </managed-property> </managed-bean>
ItemController의 <managed-bean-scope>이 세션으로 정의된다. 세션 범위가 있는 JSF 관리 빈은 세션에 저장된다. 즉 빈의 등록 정보는 HTTP 세션의 수명 동안 살아 있다.
catalogService는 Spring 구성 리소스 파일 WEB-INF/applicationContext.xml에서 스프링 빈인 CatalogDAO로 정의된다. 다음은 그 파일의 단편이다.
<bean id="catalogService" class="service.CatalogDAO"/> <bean name="itemController" class="sessionpagination.ItemController"> <property name="catalogService"> <ref bean="catalogService"/> </property> </bean>
<property name="catalogService"> 요소는 ItemController의 setCatalogService 메소드를 참조한다. 그에 응답하여 Spring 루트 WebApplicationContext는 catalogService 스프링 빈을 JSF 관리 빈 ItemController의 catalogService 등록 정보에 삽입한다. 다음은 ItemController 소스 파일의 단편이다.
public class ItemController { private CatalogService catalogService; public void setCatalogService( CatalogService catalogService) { this.catalogService = catalogService; } public DataModel getItems() { if (model==null || index != firstItem){ model=getNextItems(); } return this.model; } public DataModel getNextItems() { model = new ListDataModel( catalogService.getItems( firstItem,batchSize)); index = firstItem; return this.model; }
getItems() 메소드는 DataModel에서 catalogService로부터 반환된 항목 개체의 List를 래핑한다. UIData는 DataModel 인스턴스가 나타내는 데이터 개체의 컬렉션에 대한 데이터 바인딩을 지원한다. DataModel 인스턴스의 기본이 되는 데이터 컬렉션은 행 색인에서 접근 가능한 행 개체의 컬렉션으로 모델링된다. 이 API는 지정된 행 색인으로 위치하고 현재 행 색인에 해당하는 데이터를 나타내는 개체를 가져올 수 있는 메커니즘을 제공한다.
JPA와 Spring 사용
스프링 빈 CatalogDAO에서는 JPA의 EntityManager Query 개체를 사용하여 항목의 목록을 반환한다. CatalogDAO의 소스 코드를 보면 EntityManager 필드에 @PersistenceContext 주석이 있음을 알 수 있다. 이는 엔터티 관리자가 EJB(nterprise JavaBeans Technology) 세션 빈에 삽입되는 것과 동일한 방법으로 엔터티 관리자를 스프링 빈에 삽입한다.
public class CatalogDAO implements CatalogService { @PersistenceContext(unitName="PetCatalogPu") private EntityManager em; public List<Item> getItems(int firstItem,int batchSize) { Query q = em.createQuery("select object(o) from Item as o"); q.setMaxResults(batchSize); q.setFirstResult(firstItem); List<Item> items= q.getResultList(); return items; }
createQuery 메소드는 Java Persistence 쿼리 언어 문을 실행하기 위해 Query 클래스의 인스턴스를 만든다. Query의 setMaxResults() 메소드는 가져올 최대 결과 수를 설정하며, setFirstResult 메소드는 가져올 첫 번째 결과의 위치를 설정한다.
Item은 Entity 클래스, 즉 일반적인 Java Persistence 엔터티 개체로서 항목 인스턴스를 저장하는 ITEM 테이블로 매핑한다. Item의 소스 코드를 살펴보면 엔터티의 두 요구사항에 부합함을 알 수 있다.
- 이 클래스에는
@Entity주석이 있다. - 기본 키 식별자에는
@Id주석이 있다.
@Entity public class Item implements java.io.Serializable { @Id private String itemid; private String name; private String description; @OneToOne(cascade={CascadeType.PERSIST}) private Address address; @ManyToOne private Product product; ...
name 및 description과 같은 필드는 개체 필드에서 데이터베이스 테이블 중 같은 이름의 열에 대한 기본 매핑이므로 주석을 붙일 필요가 없다. 일대일 및 다대일과 같은 O/R 관계가 주소 및 제품의 주석에 지정되어 있다.
ItemController ManagedBean은 firstItem 및 batchSize 속성을 기준으로 Items의 목록을 페이징하며, 이를 CatalogService getItems(firstItem, batchSize) 메소드에 대한 매개변수로 전달하는데, 이 메소드는 애완동물 테이블에 표시할 항목을 가져온다.
요약
이번 팀에서는 Spring을 JSF 및 JPA와 함께 사용하는 방법을 예를 통해 살펴봤다. 특히 JSF dataTable 및 DataModel을 사용하여 엔터티의 목록을 표시하는 방법을 소개했는데, 여기서는 JPA와 Spring 2.0을 사용하여 데이터베이스에서 엔터티를 가져온다.
Spring과 JSF를 사용하는 것에 대한 자세한 내용은 "Spring - Java/J2EE Application Framework" 문서의 15장, Integrating with other web frameworks를 참조한다.
이 팁에서 참조한 샘플 애플리케이션에 대한 자세한 내용은 블로그 항목 JSF, Spring 2.0 및 Java Persistence API를 사용하는 샘플 애플리케이션을 참조한다.
샘플 코드 실행하기
이 팁에 대한 샘플 코드는 NetBeans 프로젝트로서 사용 가능하다. NetBeans IDE를 사용하여 샘플 코드를 빌드하고 실행할 수 있다.
설정
- NetBeans 5.5.1을 다운로드하고 설치한다.
- Spring 2.1을 다운로드하고 압축를 푼다(종속 버전으로 다운로드).
- GlassFish V1을 다운로드하고 설치한다.
또는 Sun의 GlassFish 이진 배포판인 Sun Java System Application Server PE 9를 사용할 수 있다.
- GlassFish 서버를 NetBeans에 추가한다.
- NetBeans를 시작하고 Runtime 창으로 전환한다(Ctrl+5).
- Servers 노드를 마우스 오른쪽 버튼으로 클릭하고 Add Server를 선택한다.
- Sun Java System Application Server를 선택한다.
- GlassFish를 설치한 위치로 이동하여 Finish를 선택한다.
- NetBeans를 시작하고 Runtime 창으로 전환한다(Ctrl+5).
NetBeans에서 Spring 라이브러리 만들기
- (Tools 메뉴에서)NetBeans Library Manager를 열고 Spring이라는 새 라이브러리를 만든다.
- 클래스 경로에 다음 jar를 추가한다.
dist/spring.jardist/weaving/spring-aspects.jarlib/jakarta-commons/commons-logging.jarlib/log4j/log4j-1.2.9.jar .
- Sources를 Spring
src디렉토리로 설정한다. - Javadoc을 Spring
docs\api디렉토리로 설정한다.
샘플 코드 열기 및 실행:
- 샘플 코드를 다운로드하고 압축을 푼다. 이제 압축이 풀린 디렉토리가
<sample_install_dir>/SpringJPA과 같이 나타난다. 여기서<sample_install_dir>는 샘플 패키지를 설치한 디렉토리이다. 예를 들어, Windows 시스템의C:\경로에 해당 컨텐츠의 압축을 풀었다면 새로 생성된 디렉토리는C:\SpringJPA이 되어야 한다.
- NetBeans IDE를 시작한다. File 메뉴에서 Open Project를 클릭하고 방금 압축을 푼
SpringJPA디렉토리를 선택한다.SpringJPA애플리케이션은 NetBeans Enterprise Application Project로서 실제로는SpringJPA및SpringJPA-war의 두 프로젝트로 구성되어 있다.SpringJPA-war는SpringJPA프로젝트의 Java EE Module이다.SpringJPA-war는 war 파일을 생성하며,SpringJPA는 war를 포함하는 ear 파일을 생성한다.
프로젝트를 열면 Reference Problems 대화 상자가 나타난다. 이는 Enterprise Application Project가 J2EE Module의 절대 경로를 저장하기 때문이다. 참조 문제를 해결하려면
SpringJPA-war의 위치를 구성해야 한다. 그러나 먼저 대화 상자에서 Close를 클릭한다.SpringJPA프로젝트가 굵은 빨간색으로 표시되는데, 여전히 참조 문제가 있다는 의미이다. SpringJPA프로젝트를 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 Resolve Reference Problems를 선택한다. Resolve Reference Problems 대화 상자를 사용하여SpringJPA-war모듈을 그 프로젝트에 매핑한다. 그러면SpringJPA디렉토리 아래에 하위 디렉토리가 나타난다.
SpringJPA프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Open Required Projects를 선택한다. 이제 종속 관계가 정확해졌으며,SpringJPA-war프로젝트는 항상SpringJPA프로젝트와 함께 열린다. 그러나 웹 모듈과 관련하여 또 다른 참조 문제가 있는데, 프로젝트 빌드에 필요한 Spring jar 파일을 참조하기 때문이다.
- Spring 라이브러리를
SpringJPA-war에 추가한다. Project 창의SpringJPA-war아래서
- Libraries를 마우스 오른쪽 버튼으로 클릭하고 Add Library를 선택한다.
- 목록에서 Spring Library를 선택한 다음 Add Library를 클릭한다.
- Libraries를 마우스 오른쪽 버튼으로 클릭하고 Add Library를 선택한다.
SpringJPA\setup\javadb.properties파일의 등록 정보를 알맞게 편집한다.
- 다음과 같이 Java DB 데이터베이스를 시작한다.
- Tools 메뉴에서 Java DB Database를 선택한다.
- Start Java DB Server를 선택한다.
- Tools 메뉴에서 Java DB Database를 선택한다.
- 다음과 같이 프로젝트를 빌드한다.
- Projects 창에서
SpringJPA노드를 마우스 오른쪽 버튼으로 클릭한다.
- Clean과 Build Project를 선택한다.
- Projects 창에서
- 다음과 같이 프로젝트를 실행한다.
- Projects 창에서
SpringJPA노드를 마우스 오른쪽 버튼으로 클릭한다.
- Run Project를 선택한다.
- Projects 창에서
프로젝트를 실행할 때 브라우저가 JSF, Java Persistence API 및 Spring 2.0 샘플 애플리케이션(http://localhost:8080/SpringJPA-war/)의 시작 페이지를 표시해야 한다.

"Java SE" 카테고리의 다른 글
- 리스너 리스트를 위한 WEAKHASHMAP 사용하기 (댓글 1개 / 트랙백 0개) 2006/03/08
- J2SE 5.0의 Java 2D API 기능 강화 (댓글 2개 / 트랙백 0개) 2006/05/12
- 3D 화면(scene)에 빛 효과 주기 (댓글 1개 / 트랙백 0개) 2004/07/30
- 다이얼로그 Modality (댓글 1개 / 트랙백 0개) 2006/06/09
- 쿠키 처리 (댓글 22개 / 트랙백 3개) 2007/07/23
- 사용자 데이터그램 프로토콜의 프로그래밍 (댓글 1개 / 트랙백 0개) 2004/06/30
- 락(LOCKS) (댓글 1개 / 트랙백 0개) 2005/09/22
- Java Web Start 퍼시스턴스 (댓글 3개 / 트랙백 0개) 2006/12/24
- AFFINETRANSFORM 이해하기 (댓글 3개 / 트랙백 0개) 2003/09/09
- 사용자 인터페이스에서 Action 사용하기 (댓글 5개 / 트랙백 2개) 2007/02/22
TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/432
-
JSF, Sping과 JPA 결합
Tracked from ★ dingpong의 조그만 휴식 공간 ★ 삭제JSF, Sping과 JPA 결합강좌 입니다. JSF(JavaServer Faces Technology)는 웹 애플리케이션을 위한 서버측 사용자 인터페이스(UI) 컴포넌트 프레임워크로서 구성, 재사용 및 확장 가능한 UI 컴포넌트를 제공하고 이벤트 처리, 입력 변환기 및 검증자를 지원하며 탐색 모델, 컴포넌트 렌더링 모델 및 (입력 이벤트를 서버측 동
2007/09/19 22:32
댓글을 달아 주세요
항상 요긴한 정보로 도움을 많이 받고 있습니다. 자바 신기술 따라잡기에 썬 개발자 네트워크만큼 좋은 곳도 없나봅니다. 언제나 좋은 자료 감사합니다.
2007/09/16 22:42스트럿츠만 해보구 스프링 프레임워크에 아직 경험이 없어...스프링에 대해 관심이 많았는데..sdn에 스프링과 관련된 정보 올려주셔서 유용하게 보구 갑니다.
2007/09/18 10:13JSF두 가치 공부해봐야겠네요~
찾고 있던 정보가 여기 있었네요.
2007/09/18 19:43퍼가서 찬찬히 봐야겠어요. 감사합니다^^
JSF, Sping과 JPA 에 대한 이해 그리고 결합에 대한 정보까지 감사합니다.
2007/09/19 03:01좋은 정보 감사해요~
2007/09/19 03:20좋은자료 많이 많이 올려주세요..감사
2007/09/19 06:40ㅇㅎ- 이러한 방법이 있었군요.!
2007/09/19 12:38유용한 정보 감사합니다.
2007/09/19 13:07많은 도움이 되었습니다.감사합니다.
2007/09/19 19:16앞으로도 좋은 정보 많이 부탁드립니다.
2007/09/19 19:18저에게 많은 도움이 되어서 정말 좋은데 차근차근 알아가도록 할께요..정보 감사합니다^^
2007/09/19 19:19직접적인 개발자가 아니라서 정확한 세부사항까지 이해하기는 어려웠지만 나름 좋은 지식공유가 된것 같아서 기쁘네요... 앞으로도 좋은 지식발견이 되었으면 좋겠습니다. 감사합니다...!
2007/09/19 21:06좋은 정보 감사드려요 ^^ 잘보고 갑니다.
2007/09/19 22:33해당 용어에 대한 설명부터 해서 괜찮은 소스 코드 까지.. 이해하고 공부하는데 도움이 많이 되서 좋은 것 같습니다^-^
2007/09/19 22:34좋은 정보 감사드려요 %^^
2007/09/19 22:59많이 알고 갑니다.
제목이 Sping이 아니라.. Spring 아니가요? 틀린것 같아요..
2007/10/05 21:45태그도 틀렸어요.. Sping -> Spring
2007/10/05 21:46