오늘은 어디로 갈까...

백수 1일째 본문

白手日誌

백수 1일째

剛宇 2009. 7. 1. 05:30

 오늘부터 본격적인 백수의 길로 접어들었다. 생존하기 위해서는 하루 빨리 이 길을 벗어나야하겠지만, 뭐 가끔 쉬어가는것도 좋은 일이니, 열심히 놀아보도록 하자.
 
 DAMO에 EL을 추가한것은 무덤을 파는 일이었다. 너무 자유로운 표현이 가능해서 제어가 불가능한 사태에 빠져버린것이다. 할 수 없이, 여러 제약 조건을둬서 어찌 돌아가게는 했지만, 영 아니올시다. ^^; 그중에서 가장 큰 문제는 반복문이었다.
    <select id="getEmpListWithForEach">
        SELECT 
        	EMPNO, ENAME, JOB, MGR, HIREDATE, SAL,
        	COMM, DEPTNO
        FROM EMP
		<dynamic prepend=" WHERE " >
			<forEach 
				var='empNo' items='${empNoList}' 
				prepend="EMPNO IN " open="(" close=")" 
				conjunction=", ">${empNo}</forEach>
		</dynamic>
    </select>

 EL 도입후 forEach 문으로 사용을 하려 했는데, 문제는 var='empNo' 였다. 즉 forEach문 안에서만 유효한 변수가 필요하게 된것이다. 기존에는 파라메터 객체에서만 값을 가져와도 충분했는데, 이렇게 선언하므로해서 지역 변수를 처리할 필요가 생긴것이다. EL이 아니었다면 편법으로 empNoList[]로 파라메터 이름을 바꾸어서 사용할수 있지만, 자유분방한 EL 이기에 저 안에 뭐가 들어갈지 알수가 없다. --; 현재 DAMO의 구조는 쿼리를 실행할때 해당 파라메터 정보를 가지고 파라메터 객체에서 값을 읽어와서 바인딩하고 있는데, 마땅히 처리할 방법이 없다. 쿼리 실행시 StatementContext를 만든 다음, 바인딩할 파라메터 값들을 넣고 사용할까도 해봤지만, 이것도 현 구조에서는 별로 바람직한 방법은 아닌거 같다. 구조를 전면 개편해야하나 ==;
 현재는 Minor Update 중이라고 본인을 세뇌시키면서, 다행히 전면 개편은 피할 수 있었지만, 영 찜찜하다. 단일 forEach만 허용하는 한도에서 파라메터 객체를 랩핑해서 사용함으로서 어떻게든 돌아가게는 만들었지만, 이건 아닌거겠지. 현실과의 타협으로 이상한 코드가 만들어지는것을 보면 가슴이 아프다.... ㅠㅠ
 아래는 다행히(?) 돌아가는 코드이다.
		Map param = new HashMap();
		Short[] empNoList = {7369, 7521, 7782}; 
		param.put("empNoList", empNoList);
		
		Query query = queryLoader.getQuery("getEmpListWithForEach");
		PersistenceManager pm = PersistenceManager.getPersistenceManager();
		List<LinkedHashMap> list = pm.getList(query, param, LinkedHashMap.class);
		for (Map m : list) {
			System.out.println(m);
		}

* 실행결과
[17:13:01.312] DEBUG PreparedStatementLogProxy.invoke(PreparedStatementLogProxy.java:87) -  Executing oracle.jdbc.driver.T4CPreparedStatement@a31e1b
/* getEmpListWithForEach */

        SELECT 
        	EMPNO, ENAME, JOB, MGR, HIREDATE, SAL,
        	COMM, DEPTNO
        FROM EMP
		 WHERE EMPNO IN (?, ?, ?)
[1] 7369
[2] 7521
[3] 7782
{empno=7369, ename=SMITH, job=CLERK, mgr=7902, hiredate=Wed Dec 17 00:00:00 KST 1980, sal=800, comm=null, deptno=20}
{empno=7521, ename=WARD, job=SALESMAN, mgr=7698, hiredate=Sun Feb 22 00:00:00 KST 1981, sal=1250, comm=500, deptno=30}
{empno=7782, ename=CLARK, job=MANAGER, mgr=7839, hiredate=Thu Jul 09 00:00:00 KST 1981, sal=2450, comm=null, deptno=10}

 forEach문을 저런 용도가 아닌 다른 용도로 사용할 일이 있을까...?