필자는 오라클 데이터베이스를 사용하여 개발을 주로 한다. 오늘 고객에게 프로시져를 배치로 돌릴수 있는 프로그램을 만들어 달라는 요청이 들어왔다. 그래서 그에 해당하는 로직(프로시저)를 만들고 그것을 자바에서 실행하기 위해 사용했던 방법을 공개 하고자 한다.
1. 언제 어디서나 @Autowired를 사용하여 개발을 하기 때문에 DAO에 해당하는 인터페이스를 만들었다. 이것을 잘 모른다면 인터넷에 찾아 보길 바란다.
public interface ProcCallDAO {
public int getMProcedure();
}
2. 인터페이스에 해당하는 부분을 구현하기 위해 ProcCallDAOExProc라는 클래스를 만들고 ProcCallDAO를 구현하였다.
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class ProcCallDAOExProc extends JdbcDaoSupport implements ProcCallDAO{
public int getMegamartProcedure() {
int status = -1;
try {
String spName = “P_VOC_INPUT”;
ProcCallDAOImpl sp = new ProcCallDAOImpl(getJdbcTemplate().getDataSource(), spName);
sp.execute();
status = 1;
} catch (Exception e) {
logger.error(“SQL Exception occurred at runStoreProc.”, e);
}
return status;
}
}
JdbcDAOSupport를 사용하여 구현하였으며, jdbcTemplate또한 만들어 주어야 한다.
3. dbcontext.xml 등록
<bean class=”xxx.xxxxx.xxx.xxxxx.partner.ProcCallDAOExProc” id=”procCallDAOExProc”>
<property name=”dataSource” ref=”dataSource”/>
</bean>
4. StoredProcedure 상속
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.jdbc.object.StoredProcedure;
public class ProcCallDAOImpl extends StoredProcedure{
public ProcCallDAOImpl(DataSource ds, String spName) {
super(ds, spName);
super.compile();
}
public Map execute() {
return super.execute(new HashMap());
}
}
5. 함수 호출
@Autowired
ProcCallDAOExProc procCallDAOExProc;
logger.debug(“before excute Proc”);
procCallDAOExProc.getMProcedure();
logger.debug(“end excute Proc”);
이것이 끝이다. 의외로 간단하다. 다시한버 설명하자면 5번 함수호출에서 getMProcedure()라는 메소드를 호출하게 되고, 1번의 인터페이스를 통해 2번의 ProcCallDAOImpl 가 실행된다. 실행된는 중간 DataSource 와 프로시져 이름을 StoredProcedure의 클래스에 등록을 하게 되고 execute()를통해 실행을 하는 구조 이다.
이상!