티스토리 뷰
AbstractFlowConfiguration에 대한 설명
AbstractFlowConfiguration은 Spring Web Flow에서 Flow(흐름)를 설정하기 위한 추상 클래스입니다. Web Flow는 사용자의 상태를 유지하면서 여러 단계의 UI 흐름을 관리하는 프레임워크이며, AbstractFlowConfiguration은 이러한 Flow를 설정할 때 공통적으로 필요한 기능을 제공하는 기반 클래스입니다.
1. AbstractFlowConfiguration의 역할
Spring Web Flow에서는 여러 개의 Flow를 설정해야 할 수 있습니다. AbstractFlowConfiguration은 이러한 Flow 설정을 쉽게 할 수 있도록 기본적인 설정 메서드와 유틸리티를 제공하는 클래스입니다.
주요 기능
- Flow Registry(Flow 등록) 설정
- 애플리케이션에서 사용할 여러 개의 Flow를 등록할 수 있습니다.
- Flow Executor(Flow 실행기) 설정
- Flow를 실행하고 관리하는 FlowExecutor를 생성하고 설정할 수 있습니다.
- Flow Builder Services 설정
- Flow를 정의할 때 사용할 FlowBuilderServices 객체를 설정할 수 있습니다.
- Flow 실행 시의 이벤트 및 트랜잭션 관리 지원
- Flow 실행 중 트랜잭션을 관리하거나, 특정 이벤트를 감지하는 기능을 포함할 수 있습니다.
2. AbstractFlowConfiguration 사용 방법
예제 1: 기본적인 Flow 설정
import org.springframework.context.annotation.Bean;
import org.springframework.webflow.config.AbstractFlowConfiguration;
import org.springframework.webflow.definition.registry.FlowDefinitionRegistry;
import org.springframework.webflow.engine.builder.support.FlowBuilderServices;
import org.springframework.webflow.executor.FlowExecutor;
public class WebFlowConfig extends AbstractFlowConfiguration {
@Bean
public FlowDefinitionRegistry flowRegistry() {
return getFlowDefinitionRegistryBuilder()
.setBasePath("/WEB-INF/flows")
.addFlowLocationPattern("/**/*-flow.xml")
.build();
}
@Bean
public FlowExecutor flowExecutor() {
return getFlowExecutorBuilder(flowRegistry()).build();
}
@Bean
public FlowBuilderServices flowBuilderServices() {
return getFlowBuilderServicesBuilder().build();
}
}
설명
- flowRegistry(): Flow 정의 파일을 /WEB-INF/flows 디렉터리에서 찾아 등록합니다.
- flowExecutor(): 등록된 Flow를 실행하는 FlowExecutor를 생성합니다.
- flowBuilderServices(): Flow 빌드를 위한 FlowBuilderServices를 설정합니다.
예제 2: 특정 Flow 실행기 설정
FlowExecutor를 커스텀 설정하여 트랜잭션 관리와 Flow 실행 중 예외 처리를 추가할 수도 있습니다.
@Bean
public FlowExecutor customFlowExecutor() {
return getFlowExecutorBuilder(flowRegistry())
.addFlowExecutionListener(new CustomFlowExecutionListener())
.setMaxFlowExecutions(5)
.setMaxFlowExecutionSnapshots(10)
.build();
}
설명
- addFlowExecutionListener(new CustomFlowExecutionListener()): Flow 실행 시 특정 이벤트를 감지하는 리스너를 추가합니다.
- setMaxFlowExecutions(5): 동시에 실행될 수 있는 최대 Flow 개수를 설정합니다.
- setMaxFlowExecutionSnapshots(10): 실행 중인 Flow의 스냅샷 개수를 제한하여 메모리 사용을 최적화합니다.
예제 3: 여러 개의 Flow 등록
@Bean
public FlowDefinitionRegistry multiFlowRegistry() {
return getFlowDefinitionRegistryBuilder()
.addFlowLocation("/WEB-INF/flows/order/order-flow.xml", "orderFlow")
.addFlowLocation("/WEB-INF/flows/user/user-flow.xml", "userFlow")
.build();
}
설명
- addFlowLocation()을 사용하여 여러 개의 Flow를 개별적으로 등록할 수 있습니다.
- orderFlow, userFlow 등의 ID를 설정하여 필요할 때 Flow를 찾아서 실행할 수 있습니다.
3. AbstractFlowConfiguration의 주요 메서드
메서드 설명
getFlowDefinitionRegistryBuilder() | Flow 정의를 등록할 때 사용하는 FlowDefinitionRegistryBuilder를 반환합니다. |
getFlowExecutorBuilder(FlowDefinitionRegistry registry) | Flow 실행기(FlowExecutor)를 설정하는 빌더를 반환합니다. |
getFlowBuilderServicesBuilder() | Flow를 빌드할 때 사용할 FlowBuilderServices를 설정하는 빌더를 반환합니다. |
4. AbstractFlowConfiguration 사용 시 주의할 점
- Flow 정의 파일 경로를 올바르게 설정해야 합니다.
- XML 기반 Flow 설정을 사용할 경우, flowRegistry()에서 올바른 경로를 지정해야 합니다.
- Flow 실행기(FlowExecutor) 설정을 적절히 구성해야 합니다.
- setMaxFlowExecutions()와 setMaxFlowExecutionSnapshots() 값을 적절히 설정하여 성능을 최적화하는 것이 중요합니다.
- Spring Web Flow와 Spring Security를 함께 사용할 경우, 보안 리스너를 추가해야 합니다.
- SecurityFlowExecutionListener와 같은 보안 리스너를 FlowExecutor에 등록할 수 있습니다.
5. 요약
- AbstractFlowConfiguration은 Spring Web Flow의 Flow 설정을 쉽게 하기 위한 추상 클래스입니다.
- FlowRegistry, FlowExecutor, FlowBuilderServices 등을 설정할 수 있습니다.
- 여러 개의 Flow를 등록할 수 있으며, Flow 실행기의 동작을 세부적으로 설정할 수 있습니다.
- Flow 실행 중 이벤트 감지 및 트랜잭션 관리도 가능하며, 성능 최적화를 위한 설정을 지원합니다.