파란하늘의 지식창고
article thumbnail
Published 2010. 3. 28. 00:07
[Java]Apache Commons Chain Study/Java
반응형
Apache Commons Chain 은 여러개의 command를 줄줄이 이어 사용하는 것을 쉽게 하도록 구현해 놓은 라이브러리이다.

chain 라이브러리 홈페이지는 아래와 같다.

사용법은 cookbook이라는 메뉴를 보면 알수 있다.

한글로 번역된 곳도 있다.


구성은 크게 5가지로 되어있다.
  1. Context
  2. Command
  3. Chain
  4. Filter
  5. Catalog


Command

command는 실제 명령을 수행하는 객체이며 이 Command객체들을 연달아 호출하여 Chain을 구성하게 된다.

위에서 보면 Chain과 Filter도 Command 객체의 한 종류인 것을 알 수 있다.

Context
Context는 Command에 넘겨주는 매개변수 객체이다.


org.apache.commons.chain.impl.ContextBase 를 상속받아 쓰면 되며 Context에 지정한 값은 Object이므로 형식에 구애받지 않는다.

ContextBase를 상속하여 아래와 같은 Context객체를 만들었다면

public class TestContext extends ContextBase {
	private String value1 = "테스트 value";

	public String getValue1() {
		return value1;
	}
	
}

Command 객체에서는 매개변수로 넘겨받은 Context를 Map을 쓰는 것처럼 사용하면 된다.
public class TestCommand implements Command{

	@Override
	public boolean execute(Context context) throws Exception {
		System.out.println("context value1 : " + context.get("value1"));;
		
		System.out.println("command1 execute");
		return false;
	}

}

호출할 Context의 getter메소드가 있어야한다.

만약 put으로 Context에 값을 설정했다면 getter 메소드를 선언하는 불편한 절차는 생략이 된다. (ContextBase의 get 메소드에 이런 설정이 되어 있다.)


Catalog
catalog는 command가 다른 layer와 의존관계가 없도록 하기 위해 중계자 역할을 해주는 객체이다.

catalog는 command를 map 형태로 담고 있다.
다른 레이어에서는 catalog를 호출하여 catalog에 있는 command를 사용하면 되므로
결국 catalog가 map에 담고 있는 command 객체에 대한  key만 알고 있으면 된다.

command에 이름을 직접 지정해도 되고 혹은 chain을 만들어 이름을 지정하고 그 안에 사용할 command를 설정해도 된다.


cookbook에 있는 것처럼 웹에서 사용할 카탈로그를 리스너에 등록하면 호출이 되지 않을 것이다.
디버깅을 하고 따라가다 보면 servletContext에 설정할 attribute이름을 설정하지 않으면 catalog를 서블릿에 설정하지 않기 때문이다.
다음처럼 리스너를 등록해주면 된다.
public class TestContext extends ContextBase {
	
		org.apache.commons.chain.CONFIG_CLASS_RESOURCE
		chain/catalog.xml
	
	
		org.apache.commons.chain.CONFIG_ATTR
		catalog
	
	
		org.apache.commons.chain.web.ChainListener
	
반응형
profile

파란하늘의 지식창고

@Bluesky_

내용이 유익했다면 광고 배너를 클릭 해주세요