참고 : http://static.springsource.org/spring-flex/docs/1.0.x/reference/html/index.html

선행조건



1. Remoting Service 설정하기
BlazeDS는 전통적으로 리모팅서비스를 remoting-config.xml 파일에 설정하고, services-config.xml 에 포함해 왔습니다. remoting-config.xml 파일에 설정되는 것들은 adapters, default-channels, destinations 가 있습니다. Spring BlazeDS Integration(이하 SBI)를 사용하면, 리모팅서비스 설정을 스프링에서 하기 때문에
remoting-config.xml 파일은 완벽하게 안중오브아웃 할 수 있습니다. 따라서, remoting-config.xml 파일이 필요 없어짐에 따라 services-config.xml 파일에 포함시키지 않아도 됩니다. 만약 레거시 destinations가 정의된 remoting-config.xml 파일이 있다면, SBI의 RemotingDestinationExporter에 의해 스프링에서 관리되는 destinations와 레거시 destinations의 통합을 이룰 것 입니다.

remoting-service 태그와 두개의 속성 default-channels, default-adapter-id를 설정할 수 있습니다.
<flex:message-broker>
    <flex:remoting-service default-channels="amf, secure-amf" />
</flex:message-broker>
default-channels 속성이 생략될 경우 services-config.xml에 정의된 첫번째 AMFEndpoint 채널이 설정 됩니다.
default-adapter-id 속성이 생략될 경우 JavaAdapter 가 설정 됩니다.
remoting-service 태그가 생략될 경우 두 가지 속성 모두 디폴트로 설정 됩니다.

만약 services-config.xml 파일에서 포함하는 remoting-config.xml 파일이 존재한다면, 스프링에서
remoting-service 태그의 역할은 무시 됩니다.

만약 services-config.xml 파일에서 포함하는 remoting-config.xml 파일이 존재하지 않는다면, Flex 프로젝트를 J2EE 서버모드로 설정했을 경우 컴파일 타임에 services-config.xml 파일과 포함되는 서비스 설정파일의 destinations과 그 것이 사용하는 channels을 바라보기 때문에, 채널 설정없이 단순히 <mx:RemoteObject /> 태그만 사용할 경우 채널을 찾을 수 없다는 예외가 발생 합니다. 따라서 리모팅 서비스의 설정을 SBI에서 한다면, Flex 프로젝트는 채널을 명시해야 할 것 입니다.

간혹, 웹 문서(다른 분들의 블로그)에 services-config.xml 파일에 default-channels을 설정하라는 내용이 있습니다. 그렇게 설정 했을 경우, Flex 프로젝트에서는 application level의 기본 채널을 바라볼 수 있기 때문에 별도의 채널설정 없이 사용가능 합니다. 하지만 SBI에서 리모팅 서비스를 설정하고, services-config.xml 파일에 default-channels이 설정 되었다면 이것은 설정의 이원화를 가져올 뿐만 아니라 SBI에서 관리되는 리모팅 객체들(채널이 명시되지 않은)에 설정되는 기본 채널은 SBI에서 설정(또는 기본값)되는 default-channels 입니다. 한마디로 services-config.xml 파일에 설정되는 default-channels은 가비지설정값 입니다. 단지 Flex 프로젝트에 힌트를 주는 용도로 사용될 뿐이고, 자칫 잘못하면 설정 이원화로 실제로 서비스 되는 리모팅 객체들의 채널과 맞지 않아서 에러를 유발할 수 있습니다.



2. remoting-destination tag
이제 스프링의 빈을 리모팅 객체로 노출시킬 차례 입니다.
먼저 서비스할 빈이 필요하고 remoting-destination 태그를 이용해 리모팅 객체로 만들 수 있습니다.
<bean id="productService" class="flex.samples.product.ProductServiceImpl" />

<flex:remoting-destination ref="productService" />

다음 설정은 위의 것과 동일 합니다.
<bean id="productService" class="flex.samples.product.ProductServiceImpl" >
    <flex:remoting-destination />
</bean>

remoting-destination 태그의 속성들은 다음과 같습니다.
ref
- 서비스할 스프링 빈의 id 입니다.

destination-id
- 서비스될 id 입니다.
- 생략할 경우 빈의 이름으로 설정됩니다.

include-methods, exclude-methods
- 각각 서비스할 메소드와 제외시킬 메소드 입니다.
- 둘다 생략시 모든 메소드를 서비스 합니다.
- include-methods 속성만 설정할 경우, 나머지 메소드는 자동으로 제외 됩니다.
- exclude-methods 속성만 설정할 경우, 나머지 메소드는 자동으로 서비스 됩니다.

channels
- 서비스할 채널 입니다.
- 생략할 경우 기본채널이 설정 됩니다.

message-broker
- MessageBroker의 id 입니다.
- 생략할 경우 _messageBroker로 설정 됩니다.



3. @RemotingDestination
이 애노테이션 하나로 remoting-destination 태그를 대체할 수 있습니다. 이 애노테이션을 해석할 RemotingAnnotationPostProcessor 빈은 message-broker 태그에 의해 자동으로 등록 됩니다.
스프링의 컴포넌트 스캔과 함께 사용하면 더욱 편리합니다.

@Service("productService")
@RemotingDestination
public class ProductServiceImpl implements ProductService {

    @RemotingInclude
    public Product read(String id) {
        ...
    }
   
    @RemotingExclude
    public Product create(Product product){
        ...
    }
   
    @RemotingInclude
    public Product update(Product product){
        ...
    }
   
    @RemotingExclude
    public void delete(Product product) {
        ...
    }
}

@RemotingDestination에 설정할 수 있는 속성은 다음 세 가지가 있는데(사실은 네 가지...)
value, channels ,messageBroker 이 중에서 value는 destination의 id이고 생략할 경우 빈의 이름으로 설정 됩니다. 나머지 속성들은 remoting-destination 태그의 속성들과 동일 합니다. 그리고 서비스하거나 제외시킬 메소드를 결정하기 위해 두 개의 애노테이션이 있는데, 이 또한 remoting-destination 태그의 속성과 동일한 기능을 합니다.




신고
Posted by 째코