6.1. 개요

대부분의 애플리케이션은 여러 방법으로 데이터에 접근한다. 여러 사용자가 공유하는 데이터를 여럿이 수정한다. 따라서 트랜잭션 데이터 접근 속성이 필요하다. 관계형 데이터 집합을 도메인 객체로 변형하여 애플리케이션 처리를 도와준다. 웹 플로우는 "플로우가 관리하는 영속성"(flow managed persistence)을 제공하여 플로우가 객체 영속성 문맥을 만들고, 커밋하고, 닫을 수 있도록 한다. 웹 플로우는 하이버네이트와 JPA 객체 영속화 기술과 연동한다.

플로우-관리 영속성과 별도로 PesistenceContext 관리를 애플리케이션의 서비스 계층에서 완전히 캡슐화하는 패턴이 있다. 이런 경우 웹 계층은 영속화에 관여하지 않는다. 그 대신 서비스 계층으로 념주겨거나 반환받은 detached object를 가지고 동작한다. 이번 장은 플로우-관리 영속성에 초점을 맞추고 이 기능을 언제 어떻게 사용하는지 살펴보겠다.

6.2. FlowScoped PersistenceContext


이 패턴은 플로우가 시작할 때 flowScope 안에 PersistenceContext를 생성한다. 이 컨텍스트를 사용하여
플로우 실행 코드에서 데이터 접근을 하고 마지막에 영속화 요소에 대한 변경을 커밋한다. 이 패턴은 변경사항
커밋을 오직 플로우 실행 마지막에만 하기 때문에 중간 단계 편집 독립성을 제공한다. 이 패턴은 보통
낙천적인 롹킹으로 여러 사용자의 동시 수정 무결성을 보장한다. 플로우 과정을 일정 시간을 넘어서까지
저장하거나 재시작 하려면 플로우 상태에 대한 영속성 저장소를 사용해야 한다. 만약 저장과 재시작 기능이
필요 없다면 플로우 상태를 표준 HTTP 세션-기반으로 저장해도
충분하다. 그런 경우 커밋 이전에 세션 만료나 종가 발생하면 변경 사항들을 잃어버리게 된다.

 

FlowScoped PersistenceContext 패턴을 사용하려면
해당 플로우를 persistence-context로 설정하라.

 

<?xml version="1.0" encoding="UTF-8"?>

<flow
xmlns="http://www.springframework.org/schema/webflow"

     
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

     
xsi:schemaLocation="http://www.springframework.org/schema/webflow

                         
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

 

   
<persistence-context />

 

</flow>

 

그런 다음 적당한 FlowExecutionListener를 설정하여
이 패턴을 플로우에 적용하라. 만약 하이버네이트를 사용하고 있다면
HibernateFlowExecutionListener
를 등록하고, JPA를 사용하고 있다면 JpaFlowExecutionListener를 등록하라.

 

<webflow:flow-executor
id="flowExecutor" flow-registry="flowRegistry">

   
<webflow:flow-execution-listeners>

       
<webflow:listener ref="jpaFlowExecutionListener" />

   
</webflow:flow-execution-listeners>

</webflow:flow-executor>

 

<bean id="jpaFlowExecutionListener"

     
class="org.springframework.webflow.persistence.JpaFlowExecutionListener">

   
<constructor-arg ref="entityManagerFactory" />

   
<constructor-arg ref="transactionManager" />

</bean>

 

종료 지점에서 커밋 하려면 end-state commit 속성에 명시하라.

 

<end-state
id="bookingConfirmed" commit="true" />

 

이렇게. 플로우를 시작하면 리스너는 새로운 EntiryManager flowScope에 할당한다. EntityManager
persistenceContext
변수를 사용하여 여러분 플로우 내에서 어디서든 참조할 수 있다. 게다가
스프링을 사용하는 모든 데이터 접근은 자동으로 이 EntityManager를 사용하게 될 것이다. 그런 데이터 접근 작업은 중간 단계 편집을 독립적으로 관리하기 위해 항상 트랜잭션이 없거나  읽기-전용
트랜잭션으로 수행한다