Service Framework (SVC)
Index top  
  1. Introduction
  2. Documentation
Introduction top  
  • 개발 목적 - Service Framework는 비즈니스 로직을 처리하기 위한 구조를 제공해주는 Framework이며, 이렇게 비즈니스 로직 처리 구조를 Framework화 하여 제공함으로써 개발시 편의를 제공한다.
  • 주요 기능 - MVC 모델 기반 - 비즈니스 로직을 처리를 정의하는 인터페이스(Service) 제공 - 내부적으로 Service를 캐싱할 수 있는 Factory 클래스 제공 - Properties를 사용해 Service를 선언하는 방식 - 플러그인 기능
  • Documentation top  
  • User Guide
  • 1. Class 구성
    - Service : 비즈니스 로직 단위 서비스 인터페이스
    - ServiceParameter : 서비스 input/output 파라미터
    - ServiceFactory : Service 객체 생성/관리 Factory
    - ServiceFactoryManager : ServiceFactory 생성/관리
    - ServiceConfig : 환경 설정 정보
    - ServiceProcessor : 서비스 실행자 (서비스 수행 대리자)
    - PluginService : 플러그인 서비스 정의
    
    2. Service Framework의 처리
    1) Service Framework의 처리 흐름은 매우 간단하다. Service Framework는 다음과 같은 순서로 처리된다.
    
    1. ServiceFactoryManager의 instance를 얻는다.
    2. 설정 파일로부터 설정 파일에 정의된 ServiceFactory 객체를 얻는다.
    3. ServiceFactory로부터 특정 id의 정의된 Service 객체를 얻는다.
    4. Service를 수행한다.
    
    
    2) ServiceFactory와 Service는 설정파일에 정의되며, 설정 파일의 내용은 다음과 같다.
    
    (설정파일 : XXX.properties)
    
    # 서비스 프레임워크 - 서비스 property 파일
    # service.factory.type : 서비스 팩토리 클래스
    # service.[serviceid] : 서비스 이름
    # service.[serviceid].type : 서비스에 해당하는 클래스
    
    # 서비스를 관리할 ServiceFactory 클래스
    service.factory.type=이곳에 서비스 팩토리 클래스 full path
    
    # Services 
    service.service1=이곳에 이름
    service.service1.type=이곳에 클래스 full path
    service.service1.invoke.key=type이 AdvancedService일 경우 수행할 메소드 이름을 넘겨줄 파라미터 이름
    
    service.service2=이곳에 이름
    service.service2.type=이곳에 클래스 full path
    
    
    3. Service Framework를 사용하여 비즈니스 로직 처리하기
    1) 가장 먼저 해야 할 일은 우리가 원하는 비즈니스 로직을 구현하는 일이다. 간단한 테스트를 위해 input 파라미터를 그대로 내보내는 (echo) 서비스를 만들어보자.
    
    package justfun.framework.svc.test;
    
    public class EchoService extends AbstractService {
    	/**
    	 * @param serviceID
    	 * @param serviceName
    	 */
    	public BaseService(String serviceID, String serviceName, ServiceConfig config) {
    		super(serviceID, serviceName, config);
    	}
    
    	/* 
    	 * 이 메소드를 오버라이드 해야 한다. 이 메소드는 Service 인터페이스에 정의된 메소드이다.
    	 */
    	public ServiceParameter execute(ServiceParameter inputData) throws ServiceException {
    		return inputData;
    	}
    }
    
    
    우리가 구현하는 EchoService는 Service 인터페이스를 구현해야 한다. 하지만 Service 인터페이스의 추상 구현인 AbstractService를 상속받아도 된다. (실제로 위의 EchoService는 BaseService라는 이름으로 Service Framework안에 구현되어 있다. 따라서 Service 구현시 BaseService를 상속받아 execute 메소드를 재정의하여 사용해도 무방하다.)
    2) 이제 EchoService를 환경 설정 파일인 properties 파일에 등록해야 한다. test.properties라는 파일을 다음과 같이 생성한다.
    
    # 서비스를 관리할 ServiceFactory 클래스
    service.factory.type=justfun.framework.svc.factories.ServiceFactory
    
    # Services 
    service.echo=Echo Service Test
    service.echo.type=justfun.framework.svc.test.EchoService
    
    
    test.properties 설정 파일에 EchoService를 등록했다. service.factory.type은 사용할 ServiceFactory를 지정하는 것으로 Service Framework에 ServiceFactory와 내부적으로 Service 객체를 캐싱하는 CachedServiceFactory를 제공한다.
    CachedServiceFactory가 Service 객체를 캐싱하기 때문에 CachedServiceFactory가 관리하는 Service 객체는 Thread 안전성을 고려하여 작성되어야 할 것이다.
    3) 이제 EchoService를 수행하기 위한 예제 클래스를 작성해보도록 하자.
    
    class ServiceExample {
    	public ServiceExample() throws Exception {
    		/* 1. ServiceFactoryManager의 instance를 얻는다. */
    		ServiceFactoryManager sfm = ServiceFactoryManager.getInstance();
    
    		/* 2. 설정파일로부터 ServiceFactory 객체를 얻는다. (설정 파일이 CLASSPATH에 test.properties로 존재하는 경우) */
    		ServiceFactory factory = sfm.findFactory( "test" );
    
    		/* 3. 특정 id의 Service 객체를 얻는다. */
    		Service service = factory.findService( "echo" );
    
    		/* 4. Service를 수행한다. */
    		ServiceParameter param = new ServiceParameter();
    		param.put("test", "value");
    		ServiceParameter returnParam = service.execute( param );
    	}
    	
    	public static void main(String[] args){
    		try{
    			new ServiceExample();
    		}catch(Exception ex){
    			ex.printStackTrace();
    		}
    	}
    }
    
    
    실제로 구현될 Service Framework의 컨트롤러는 위의 코드와 크게 다르지 않으며, 위의 코드 대신 다음과 같이 ServiceProcessor를 사용할 수도 있다.
    
    ServiceParameter param = new ServiceParameter();
    param.put("test", "value");
    
    ServiceProcessor processor = new ServiceProcessor();
    ServiceParameter returnParam = processor.process( "test", "echo", param );