컴포넌트 클래스
업무를 구현하는 클래스이다.
비즈니스 컴포넌트의 물리적인 형태이다.
1. 컴포넌트작성
1. 컴포넌트 클래스를 생성한다. 패키지 익스플로러에서 우클릭 → New →컴포넌트를 선택한다.
2. 새로운 컴포넌트 위자드에서 타입 이름과 논리 이름을 입력한다.
3. 생성된 컴포넌트 클래스의 형식은 다음과 같다.
package bxcm.online.sample.component;
import bxm.common.annotaion.BxmCategory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 직원정보를 조회하는 샘플 컴포넌트이다.
*
* @author sysadmin
*/
@Component
@BxmCategory(logicalName="샘플 Component", description="직원정보를 조회하는 샘플 컴포넌트이다.")
public class EmployeeComponent {
private Logger logger= LoggerFactory.getLogger(getClass());
}
@Component 어노테이션이 표기되어 있어야 한다. @BxmCategory의 logicalName은 개발도구의 패키지 탐색기에서 보이며, 플로우 뷰어에서 확인되는 정보이다. |
4. 컴퍼넌트 클래스 public 메소드의 형식은 다음과 같다. 자세한 개발표준은 개발자가이드 - 개발표준 문서를 참고한다.
/**
* 사원 조회
*
* @param empNo 사원번호
* @return EmployeeIO
*/
@BxmCategory(logicalName="사원 조회", description="")
public EmployeeIO getEmployee(int empNo){
}
컴포넌트 클래스 내부에서만 사용하는 메소드는 private으로 그렇지 않으면 public 으로 선언한다. @BxmCategory의 logicalName은 간략한 기능명을 기술한다. 컴퍼넌트 클래스 메소드의 시작은 표준으로 정의된 동사를 사용한다. |
5. 업무 로직을 구현한다.
-
getBean을 사용 할 경우
private EmployeeDbio employeeDbio;
/**
* 사원 조회
*
* @param empNo 사원번호
* @return EmployeeIO
*/
@BxmCategory(logicalName="사원 조회", description="")
public EmployeeIO getEmployee(int empNo){
employeeDbio = DefaultApplicationContext.getBean(employeeDbio, EmployeeDbio.class);
EmployeeIO employeeIn = new EmployeeIO();
employeeIn.setEmpNo(empNo);
EmployeeIO employeeIO = employeeDbio.selectEmployee(employeeIn);
if(employeeIO == null) {
throw new ApplicationException("sample.project.not.found", new Object[] {empNo});
}
return employeeIO;
}
-
Autowired Annotation을 사용 할 경우
@Autowired
private EmployeeDbio employeeDbio;
/**
* 사원 조회
*
* @param empNo 사원번호
* @return EmployeeIO
*/
@BxmCategory(logicalName="사원 조회", description="")
public EmployeeIO getEmployee(int empNo){
EmployeeIO employeeIn = new EmployeeIO();
employeeIn.setEmpNo(empNo);
EmployeeIO employeeIO = employeeDbio.selectEmployee(employeeIn);
if(employeeIO == null) {
throw new ApplicationException("sample.project.not.found", new Object[] {empNo});
}
return employeeIO;
}
DBIO를 멤버 변수로 선언한다. getBean을 호출하면 DBIO bean을 가져오거나, @Autowired Annotation을 이용하여 해당 dbio interface를 주입받는다. 컴퍼넌트 클래스에서는 DBIO 또는 다른 컴퍼넌트 객체를 얻어와 호출하여 업무 로직을 구현한다 |
온라인 거래가 호출될 때 마다 관련 업무 클래스가 JVM에서 새로운 객체로 생성된다면 생성시 발생하는 부하와 객체를 담을 메모리 용량이 커저야 한다. 그래서 업무 클래스의 객체는 JVM내에 하나만 생성하고 동시에 처리되는 업무 서비스에서 그 객체를 공유할 수 있도록 한다. (Singletone Pattern)
업무 클래스의 객체를 얻을 때에는 직접 생성하지 않고 getBean 호출이나 @Autowired Annotation을 사용한다. 대상은 Bean 클래스(서비스, 컴퍼넌트)와 DBIO이고, IO는 Bean 타입이 아닌 일반 자바 클래스이므로 new로 생성한다.
프레임워크 Bean 타입 객체(컨트롤러, 서비스, 컴퍼넌트, DBIO)들이 Singleton으로 동작하기 때문에 멤버 변수 사용에 주의해야 한다.
온라인에서는 하나의 Service/Bean 객체가 동시에 여러 쓰레드에서 실행되고 있으므로 데이터를 멤버 변수에 저장하고 사용하는 방식의 처리를 하면 안된다. 상수와 Bean 타입 클래스만 멤버 변수로 선언한다.
배치 컴포넌트도 Bean 타입이기는 하지만 하나의 배치가 하나의 Process 이므로 멤버 변수 사용에 제한이 없다.
단. 병렬 처리로 개발된 컴포넌트에서는 멀티 쓰레드에서 동일한 변수를 참조하고 있다는 것을 고려하여 로직을 구현해야 한다.