SQL쿼리는 MessageSource에서 관리할 것이다. 따라서 MessageSource에서 SQL쿼리를 관리하는 것이 원칙으로 한다.
[예제4-11]DBQuery.properties
board.sql.insert = INSERT INTO BOARD \
(boardno, title, name, email, password, \
createdate, content) \
VALUES(?, ?, ?, ?, ?, ?, ?)
board.sql.update = UPDATE BOARD SET \
title=?, name=?, email=?, content=? \
WHERE boardno=?
board.sql.update.hitcount = UPDATE BOARD SET \
hitcount = hitcount + 1 \
WHERE boardno=?
board.sql.delete = DELETE FROM BOARD WHERE boardno=?
board.sql.select.byboardno = SELECT \
title, name, email, password, \
createdate, content, hitcount \
FROM BOARD WHERE boardno=?
board.sql.select.list = SELECT \
boardno, title, name, email, createdate, hitcount \
FROM BOARD ORDER BY CREATEDATE DESC LIMIT ?, ?
board.sql.totalcount = SELECT count(*) FROM BOARD
boardfile.sql.insert = INSERT INTO BOARDFILE VALUES(?, ?, ?, ?, ?, ?)
boardfile.sql.delete.byboardno = DELETE FROM BOARDFILE WHERE boardno=?
boardfile.sql.delete.byboardfileno = DELETE FROM BOARDFILE WHERE fileno=?
boardfile.sql.select.byboardfileno = SELECT \
fileno, filesize, filename, \
contenttype, tempfilename \
FROM BOARDFILE WHERE fileno=?
boardfile.sql.select.byboardno = SELECT \
fileno, filesize, filename \
FROM BOARDFILE WHERE boardno=?
[예제4-12]applicationContext.xml
<beans>
... 중간 생략 ...
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>DBQuery</value>
<value>Messages</value>
</list>
</property>
</bean>
<bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">
<constructor-arg>
<ref local="messageSource" />
</constructor-arg>
</bean>
<bean id="myJdbcDaoSupport" abstract="true"
class="net.javajigi.common.dao.MyJdbcDaoSupport">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="messageSourceAccessor">
<ref bean="messageSourceAccessor"/>
</property>
</bean>
<bean id="boardDAOTarget" parent="myJdbcDaoSupport" class="net.javajigi.board.dao.SpringJDBCWithTemplateBoardDAO">
<property name="incrementer">
<ref local="boardIncrementer" />
</property>
</bean>
<bean id="boardFileDAOTarget" parent="myJdbcDaoSupport" class="net.javajigi.board.dao.SpringJDBCWithMSBoardFileDAO">
<property name="incrementer">
<ref local="boardFileIncrementer" />
</property>
</bean>
</beans>
[예제4-12]의 "myJdbcDaoSupport" 빈을 보면 지금까지 보지 못했던 abstract라는 속성을 사용하고 있는 것을 볼 수 있다. 이는 자바의 abstract 예약어와 비슷한 의미를 가지는 것으로 abstract속성이 true로 설정되어 있으면 빈을 직접 생성하여 사용할 수 없으면, 다른 빈들의 부모(parent)역할을 하는 빈으로 사용된다. 일반적으로 abstract예약어를 많이 사용하는 경우는 "myJdbcDaoSupport"빈과 같이 공통적인 설정 정보가 있는 경우에 유요하게 사용된다.
빈 설정 파일으 ㄹ작성할 때 이와 같이 공통적인 정보들을 반복적으로 정의하는 경우가 많다. 프로그램 개발에서도 중복 코드는 요구사항 변경 시에 모든 소스 코드를 수정해야 하는 것 처럼 설정 파일 또한 같다. 그러므로 빈 설정 파일을 작성할 때 중복적으로 발생하는 설정 정보들이 많다면[예제4-12]와 같이 abstract와 parent를 이용하여 구현하는 것이 바람직하다.
[출처] Spring JDBC - 3.쿼리관리|작성자 타이거
SSISO Community