서버 API

본 부록에서는 AnyLink 사용자 API에 대해서 설명한다. 사용자 코드를 사용하는 표준 API들 중 서비스 플로우와 멀티바인딩 라우터에 관련된 API들 중심으로 기술한다.

설명된 인터페이스들은 대부분 Default로 시작하는 기본 구현 사용자 클래스와 함께 정의되어 있다. 인터페이스를 직접 구현하기보다는 Default 추상 클래스를 상속하여 구현할 것을 권장한다.

여러 패키지에서 공통으로 사용하는 MessageContext 인터페이스가 정의되어 있다.

<MessageContext>

package com.tmax.anylink.api;

/**
 * 메시지를 나타내는 표준 인터페이스
 */
public interface MessageContext {
    /**
     * @return 메시지의 내용 데이터를 리턴한다
     */
    Object getContent();

    /**
     * @return 메시지의 속성 값을 리턴한다
     */
    Object getProperty(String propertyName);

    /**
     * 메시지의 속성 값을 지정한다.
     *
     * @param propertyName 속성 이름
     * @param propertyValue 속성 값
     */
    void setProperty(String propertyName, Object propertyValue);
}

서비스 플로우의 프로세스나 액티비티에서 사용하는 사용자 클래스, 핸들러 등에 해당하는 인터페이스와 기본 구현 클래스가 정의되어 있다. 예를 들어 사용자 액티비티에 해당하는 인터페이스는 UserActivity 인터페이스에 정의되어 있고, 이를 구현하는 기본 클래스는 DefaultUserActivity 추상 클래스로 정의되어 있다.

인터페이스 설명

ActivityContext

액티비티의 실행 문맥을 나타낸다.

ActivityErrorHandler

액티비티에서 에러가 발생할 때 이를 처리할 수 있는 핸들러 인터페이스이다.

ActivityHandler

AnyLink 액티비티 핸들러 인터페이스이다.

BlockContext

현재 수행되는 액티비티를 둘러싸고 있는 블록 액티비티의 실행 문맥을 나타낸다.

ErrorCodeMapper

내부적으로 발생한 에러를 AnyLink 서비스 플로우가 이해하는 에러 코드로 변환해준다.

UserMapping

AnyLink 서비스 플로우 내에서 사용자가 직접 데이터 변환 코드를 작성할 수 있게 해주는 인터페이스이다.

ProcessContext

현재 실행되는 서비스 플로우의 실행 문맥을 나타낸다.

ProcessHandler

AnyLink 프로세스 핸들러 인터페이스이다.

ServiceActivityHandler

AnyLink 서비스 액티비티 핸들러 인터페이스이다.

UserActivity

사용자 액티비티를 표현하는 인터페이스이다.

VariableContext

서비스 플로우의 변수에 해당하는 인터페이스를 정의한다.

사용자들은 기본 추상 클래스를 상속하여 클래스를 작성할 것을 권고한다.

2.1. ActivityContext

액티비티의 실행 문맥을 나타낸다.

package com.tmax.anylink.api.serviceflow;

/**
 * 액티비티의 실행 문맥을 나타내는 인터페이스
 */

public interface ActivityContext {
    /**
     * @return 액티비티 ID를 리턴한다.
     */
    String getActivityId();

    /**
     * @return 이 액티비티 scope에서 보이는 지정된 이름의 변수 문맥을 리턴한다.
     */
    VariableContext getVariable(String variableName);

    /**
     * @return 이 액티비티가 포함된 서비스 플로우의 문맥을 리턴한다.
     */
    ProcessContext getProcessContext();

    /**
     * @return 이 액티비티를 둘러싼 블록 액티비티의 문맥을 리턴한다.
     * 블록 액티비티가 둘러싸고 있지 않다면 null을 리턴한다.
     */
    BlockContext getBlockContext();
}

2.2. ActivityErrorHandler

액티비티에서 에러가 발생할 때 이를 처리할 수 있는 핸들러 인터페이스이다.

package com.tmax.anylink.api.serviceflow;

import com.tmax.anylink.common.AnyLinkException;

/**
 * 액티비티에서 에러가 발생할 때 이를 처리할 수 있는 핸들러 인터페이스
 */

public interface ActivityErrorHandler {
    /**
     * 핸들러가 정의된 액티비티 실행 도중 어떤 에러가 발생하면 호출되는 메소드
     */
    void handle(ActivityContext context, Throwable error) throws AnyLinkException;
}

2.3. ActivityHandler

AnyLink 액티비티 핸들러 인터페이스이다.

package com.tmax.anylink.api.serviceflow;

import com.tmax.anylink.common.AnyLinkException;

/**
 * AnyLink 액티비티 핸들러 인터페이스.
 * 이 인터페이스를 구현한 객체를 해당 액티비티의 핸들러로 등록하면
 * 액티비티 인스턴스의 라이프사이클 시점에 맞추어 대응하는 메소드들이 각각 호출된다.
 */

public interface ActivityHandler {
    /**
     * 액티비티 시작 시점에서 호출되는 메소드
     */
    void started(ActivityContext ctx) throws AnyLinkException;

    /**
     * 액티비티 정상 종료 시점에서 호출되는 메소드
     */
    void finished(ActivityContext ctx) throws AnyLinkException;

    /**
     * 액티비티가 종료되지 않고 취소될 때 호출되는 메소드.
     * 액티비티는 몇 가지 이유로 취소될 수 있는데 주로 서비스 플로우 내의
     * 다른 액티비티나 이벤트에 의해 취소된다.
     */
    void cancelled(ActivityContext ctx, String cause) throws AnyLinkException;

    /**
     * 액티비티가 어떤 에러에 의해 종료될 때 호출되는 메소드
     */
    void errorOccurred(ActivityContext ctx, Throwable t) throws AnyLinkException;
}

2.4. BlockContext

현재 수행되는 액티비티를 둘러싸고 있는 블록 액티비티의 실행 문맥을 나타 낸다.

package com.tmax.anylink.api.serviceflow;

/**
 * 현재 수행되는 액티비티를 둘러싸고 있는 블록 액티비티의 실행 문맥을 나타내는 인터페이스
 */

public interface BlockContext {
    /**
     * @return 이 블록 scope에서 보이는 지정된 이름의 변수 문맥을 리턴한다.
     */
    VariableContext getVariable(String variableName);

    /**
     * @return 이 블록 액티비티를 둘러싸고 있는 부모 블록 액티비티의 실행 문맥을 리턴한다.
     * 둘러싸고 있는 부모 블록 액티비티가 없다면 null을 리턴한다.
     */
    BlockContext getParentBlockContext();

    /**
     * @return 이 블록 액티비티가 포함된 서비스 플로우의 문맥을 리턴한다.
     */
    ProcessContext getProcessContext();
}

2.5. ErrorCodeMapper

내부적으로 발생한 에러를 AnyLink 서비스 플로우가 이해하는 에러 코드로 변환해준다.

package com.tmax.anylink.api.serviceflow;

/**
 * 내부적으로 발생한 에러를 AnyLink 서비스 플로우가 이해하는
 * 에러 코드로 변환해주기 위한 인터페이스이다.
 * AnyLink 서비스 플로우는 모든 예외를 잡으려고 하지 않을 경우에는
 * 에러를 처리하기 위해 에러 코드를 알 필요가 있다.
 * 이 인터페이스는 발생한 자바 객체를 서비스 플로우의 에러 이벤트가 잡을 수 있도록
 * 에러 코드로 변환해주는 역할을 한다.
 */

public interface ErrorCodeMapper {
    /**
     * @param throwable 발생한 자바 예외 객체
     * @return 서비스 플로우의 에러 이벤트가 처리할 에러 코드값
     */
    String getErrorCode(Throwable throwable);
}

2.6. UserMapping

AnyLink 서비스 플로우 내에서 사용자가 직접 데이터 변환 코드를 작성할 수 있게 해주는 인터페이스이다.

package com.tmax.anylink.api.serviceflow;

/**
 * AnyLink 서비스 플로우 내에서 사용자가 직접 데이터 값을
 * 변환하는 코드를 작성할 수 있게 해주는 인터페이스이다.
 * 요청 매핑, 응답 매핑, 비정상 응답 매핑, 커스텀 로그 매핑 등에서
 * 사용자가 직접 작성한 코드를 사용하여 매핑하고자 할 때 사용한다.
 */

public interface UserMapping {
    /**
     * 사용자 작성 매핑 메소드
     *
     * @param ctx 현재 액티비티 컨텍스트
     * @param inputParams 입력 파라미터들이 이 변수를 통해 전달된다
     * @return 매핑한 결과 데이터. 결과 파라미터 목록 갯수와 배열 크기가 같아야 한다.
     */
    Object[] mapping(ActivityContext ctx, Object[] inputParams) throws AnyLinkException;
}

2.7. ProcessContext

현재 실행되는 서비스 플로우의 실행 문맥을 나타낸다.

package com.tmax.anylink.api.serviceflow;

import com.tmax.anylink.logging.Logger;

/**
 * 현재 실행되는 서비스 플로우의 실행 문맥을 나타내는 인터페이스
 */

public interface ProcessContext {
    /**
     * @return 서비스 플로우 ID를 리턴한다.
     */
    String getProcessId();

    /**
     * @return 서비스 플로우의 인스턴스 ID를 리턴한다.
     */
    String getProcessInstanceId();

    /**
     * @return 시스템 로거 객체를 리턴한다.
     */
    Logger getUserLogger();

    /**
     * @return 이 서비스 플로우의 scope에서 지정된 이름의 변수 정보를 리턴한다.
     */
    VariableContext getVariable(String variableName);

    /**
     * AnyLink 실행 환경 변수 값을 리턴한다.
     * server.name, cluster.name, bizsystem.id 등이 현재 지원되는 환경 변수 키이다.
     *
     * @param key 환경변수 키
     * @return 키에 해당하는 환경변수 값
     */
    String getenv(String key);
}

2.8. ProcessHandler

AnyLink 프로세스 핸들러 인터페이스이다.

package com.tmax.anylink.api.serviceflow;

import com.tmax.anylink.common.AnyLinkException;

/**
 * AnyLink 프로세스 핸들러 인터페이스.
 * 이 인터페이스를 구현한 객체를 해당 서비스 플로우의 핸들러로 등록하면
 * 서비스 플로우의 각 라이프사이클 시점에 맞추어 대응하는 메소드들이 각각 호출된다.
 */

public interface ProcessHandler {
    /**
     * 서비스 플로우가 시작할 때 호출되는 메소드
     */
    void started(ProcessContext ctx) throws AnyLinkException;

    /**
     * 서비스 플로우가 종료할 때 호출되는 메소드
     */
    void finished(ProcessContext ctx) throws AnyLinkException;

    /**
     * 서비스 플로우가 일시 중지될 때 호출되는 메소드. 이 메소드는 현재 사용되지 않는다.
     */
    void paused(ProcessContext ctx) throws AnyLinkException;

    /**
     * 일시 중지된 서비스 플로우가 재개될 때 호출되는 메소드. 이 메소드는 현재 사용되지 않는다.
     */
    void resumed(ProcessContext ctx) throws AnyLinkException;
}

2.9. ServiceActivityHandler

AnyLink 서비스 액티비티 핸들러 인터페이스이다.

package com.tmax.anylink.api.serviceflow;

import com.tmax.anylink.api.MessageContext;
import com.tmax.anylink.common.AnyLinkException;

/**
 * AnyLink 서비스 액티비티 핸들러 인터페이스.
 * 이 인터페이스는 ActivityHandler 인터페이스에 더하여
 * 서비스 호출의 각 시점에 해당하는 추가적인 메소드들을 정의한다.
 */

public interface ServiceActivityHandler extends ActivityHandler {
    /**
     * 해당 서비스를 호출하기 직전에 호출되는 메소드
     */
    void beforeServiceCall(ActivityContext ctx, MessageContext context) throws AnyLinkException;

    /**
     * 해당 서비스가 호출된 직후에 호출되는 메소드
     */
    void afterServiceCall(ActivityContext ctx, MessageContext context) throws AnyLinkException;
}

2.10. UserActivity

사용자 액티비티를 표현하는 인터페이스이다.

package com.tmax.anylink.api.serviceflow;

import com.tmax.anylink.common.AnyLinkException;

/**
 * 사용자 액티비티를 표현하는 인터페이스.
 * 사용자 클래스 액티비티를 만들려면 사용자들은 이 인터페이스를 구현한
 * DefaultUserActivity 추상 클래스를 상속하는 클래스를 작성하여 지정하면 된다.
 */

public interface UserActivity {
    /**
     * 사용자 액티비티 클래스가 구현해야 할 주 메소드
     */
    void action(ActivityContext ctx) throws AnyLinkException;
}

2.11. VariableContext

서비스 플로우의 변수에 해당하는 인터페이스를 정의한다.

package com.tmax.anylink.api.serviceflow;

import com.tmax.anylink.api.MessageContext;

/**
 * 서비스 플로우의 변수에 해당하는 인터페이스를 정의한다.
 */

public interface VariableContext extends MessageContext {
    /**
     * 변수 데이터를 지정한다
     *
     * @param content 변수에 지정할 데이터
     */
    void setContent(Object content);
}

멀티바인딩 라우터에서 사용하는 핸들러 인터페이스들이 정의되어 있다.

RoutingHandler

package com.tmax.anylink.api.multibinding;

import com.tmax.anylink.api.MessageContext;
import com.tmax.anylink.common.AnyLinkException;

/**
 * 멀티바인딩 라우터의 핸들러 인터페이스.
 * 이 핸들러 클래스는 멀티바인딩 룰의 라우팅 메소드를 "Handler"로 지정했을 때 사용할 수 있다.
 */

public interface RoutingHandler {
    /**
     * @return 라우팅 엔트리 이름을 리턴한다. 엔트리 이름은 라우터 룰의
     * 각 엔트리 값들 중 적어도 하나와 일치해야 처리가 가능하다
     */
    String route(MessageContext ctx) throws AnyLinkException;
}

4. Default 추상 클래스 목록

앞의 각 인터페이스들을 구현하고 있는 추상 클래스 목록이다.

  • com.tmax.anylink.api.serviceflow.DefaultUserActivity

  • com.tmax.anylink.api.serviceflow.DefaultActivityHandler

  • com.tmax.anylink.api.serviceflow.DefaultProcessHandler

  • com.tmax.anylink.api.serviceflow.DefaultActivityErrorHandler

  • com.tmax.anylink.api.serviceflow.DefaultProcessErrorHandler

  • com.tmax.anylink.api.serviceflow.DefaultErrorCodeMapper

  • com.tmax.anylink.api.multibinding.DefaultRoutingHandler

가능하면 인터페이스를 직접 구현하기보다는 추후 확장성 등을 감안하여 기본 추상 클래스를 상속하여 구현할 것을 권고한다.