2015년 12월 30일 수요일

프로야구구단 하이브리드 앱 개발에 참여하다. Finishing a project of S*** group S*** baseball team fan service mobile application

Finishing a project of S*** group S*** baseball team fan service mobile application

S그룹의 S야구단 하이브리드 앱을 만들었다.

이미지 참고

* server
- JAVA spring framework, MSSQL DB, JSON interface
- eclipse, heidi SQL

* client
- jQuery, jQuery template
- Morpheus framework (of 유라클)
- hybrid mobile application (for iOS, Android)




2014년 10월 30일 목요일

[Spring + iBatis + Oracle] select query with function call

How can I querying select list after Oracle function call

파주에서 개발중에 생전 첨 보는 문데에 맞딱뜨렸다.
오라클 함수를 호출해서 서버와 세션을 맺어야 리스트 조회가 가능한 것이다.
흐흠...

그냥 생각에
function call 먼저 한 번 날리고,
그다음에 list query  날리면 될 거라는 초딩 수준의 생각을 했다면 결과는 뻔하다.
조회 안된다!

오라클 세션도 세션인지라,
하나의 세션 안에서 쿼리를 해야 조회가 되는 것이다.

PL/SQL 클라이언트 프로그램이야 당연히 DB 오픈하면서 세션을 물고 가기 때문에
함수 호출과 쿼리를 두번에 조회해도 조회가 되는 거였다.


그래서 생각해낸 대안은 이랬다.
1. function 와 select query 를 하나로 묶어서 procedure 를 만든다... 이거는 일이 더 커지므로 비추!!
2. select query 바로 앞단에 function call 을 해볼까?

<select id="getList" parameterClass="java.util.Map"  resultClass="map">
                { call my_pkg.my_function(....
<![CDATA[
SELECT ....
해보면 아시겠거니와, 에러난다.

3. 마지막으로 At last!!!
하루동안 고민끝에 트랜잭션에 묶어보면 어떨까?
정말로 될까 긴가민가 했다. 결론은 됐다!!


<select id="getList" parameterClass="java.util.Map"  resultClass="map">
<![CDATA[
SELECT ....


<procedure id="myMkgFuncCall" parameterClass="java.util.Map">
<![CDATA[
call my_pkg.my_function(....


자바에서 호출할 때,

UserDefinedRowHandler rowHandler = new MyRowHandler();
try {
sqlMapClientTemplate.getSqlMapClient().startTransaction();
sqlMapClientTemplate.getSqlMapClient().queryForObject("myMkgFuncCall", map);
sqlMapClientTemplate.getSqlMapClient().queryWithRowHandler("getList", map, rowHandler);
sqlMapClientTemplate.getSqlMapClient().endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}



참고로 MyRowHandler 는 iBatis RowHandler 를 상속받아서 간단히 만들면 된다.
아마도 RowHandler 를 안쓰고 queryForList 로 해도 될 것 같다.