달력

3

« 2024/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'Spring JDBC'에 해당되는 글 1

  1. 2009.01.23 Spring JDBC 삽질기 - 1
2009. 1. 23. 00:23

Spring JDBC 삽질기 - 1 Computing에 관한 독백2009. 1. 23. 00:23

아아, 이 화면을 보기 위해 얼마나 삽질을 했던가....


그렇습니다, 바로 JUnit Test Case 수행하여 모든 JUnit Test를 통과한 것입니다. 덜렁 Class 한 개에 method 7개에 대한 test지만 이거 한다고 정말 갖은 삽질을.... 저번 주말부터 시작했는데 과문한 터라 오늘사 이 Test를 모두 통과했습니다. 흐~.

삽질의 시작

석사도 넘쳐나는 요사이에 비록 학부로 끝났지만 그래도 컴퓨터 과학을 전공하고 졸업 후 취직해서 Java 전문가 행세 및 Java EE 기반 Web System  구축 관련 S/W Architect라고 구라도 좀 치고, IBM MQ로 EAI도 하고 지금은 급기야 AnyLink 5라는 Solution으로 금융권 외부 기관 연계 일을 하며 별별 System(Mainframe은 물론 Tandem이란 것도 구경해 봄), 별별 Network(X.25라는 거 아세요?), 별별 인간들과 부딪히며 살아온 온 지도 어언 만 9년 지나 10년째로 접어들었습니다. 여하튼 별 걸 다 봤고, Python이나 Ruby 같은 떠오르는 태양도 탐내 하지만 아무래도 Java를 제일 편해 하고 회사 업무도 맨 Java 판이다 보니, 아무래도 Java쪽 기술이 눈에 잘 들어옵니다.

그간 Java 바닥의 super star인 Spring Framework(이하 Spring)란 탐스러운 S/W Framework에 대한 경험을 갈구하던 나머지, '스프링 프레임워크 워크북'이란 책도 사 보고, 내성적인 성격임에도 불구하고 이차저차 KSUG(Korea Spring User Group)에서 Spring Reference 3장도 번역하고 그랬지만(아직 손 많이 봐야하지만), 업무에서는 Spring 쓸 일이 전혀 없고 앞으로도 쓸 것 같지도 않아, 이래서는 실제로 아는 것 하나도 없고 탐스러워 하기만 하다 끝나겠다 싶어, Spring을 써서 간단한 Web Site라도 하나 만들어 보자고 뽐뿌 받아 시작하게 되었습니다(Sacred라는 game을 다 깨고, 이제 나이도 한국식으로는 36살인데 game 고만 하고 여가 시간에 생산적 일을 좀 하자는 취지도 있었습니다... 그런데.... 해야 할 game이 지금도 잔뜩 밀린 것도 사실이라 설치할까 말까 이러고 있습니다 ^---------------^).

Apache Derby = Sun JavaDB

Web site를 만들더래도 DB나 file system의 사용은 거의 필수입니다. DB를 쓰려면 생짜 JDBC로만 할 수도 있을 것이고, Apache Commons DbUtils를 써도 되고, 거창하게 iBatisHibernate, JPA를 쓸 수도 있을 겁니다(생짜 JDBC 빼고는 다 깨작거린 정도지 실 업무에서 쓴 건 하나도 없군요). File을 쓰는 것은 걍 생짜로 java.io package의 class 쓰는 거 이상은 생각이 안나네요. SQL만 던지면 결과 얻는 DB에 비해서도 엄청 불편하고요.

'File System의 간편함과 DB의 편리함을 동시에 누릴 수는 없을까?'하는 찰나 퍼뜩 생각난 것이 'Simple한 JavaDB'라는 글입니다. Java SE 6 SDK 깔면서 같이 깔려 하는 바로 그 놈이죠. 우리가 일반적으로 쓰는 DB 형태인 DB Server 형태 동작도 가능하고, Java Application의 일부로 작동도 가능한(Embedded DB라고 합니다) 가벼운 DB입니다. '이게 딱이네' 싶어 이걸 쓰기로 했습니다. Sun에서 JDK의 일부로 배포하긴 하지만 Java DB의 원조는 Apache Derby입니다(사실 둘 다 똑같습니다). 걍 Apache에서 내려받았습니다.

IBM이 Cloudscape란 경량 DBMS를 Apache에 기증하면서 생긴 DB다 보니 이거 참 DB2와 비슷한 구석이 많더군요. 이 DB에 관해서는 별도로 글을 올리겠습니다. 아무래도 익숙치 않은 DB다 보니 삽질 좀 했거든요.

SimpleJdbcTemplate?

Internet 검색을 해 보니 맨 처음 걸린 것이 'SimpleJdbcTemplate'라는 글이었습니다. 살펴보니 JdbcTemplate 구현체가 몇 개 되더군요. 그런데 이 글에서 'Java 5의 새로운 기능들을 추가한 JdbcTemplate의 wrapper 클래스이다. varargs나 autoboxing등을 활용하여 기존의 방식들에 비해서 cast하는 일들이 줄어들게 된다'는 문구를 보고, JDK 6으로 진행중이겠다, '그래, 이 놈이야!'하고 일단 SimpleJdbcTemplate로 하기로 합니다(참 단순하죠? 최신 기술이라고 무턱대도 도입하려는 고객 욕할 수 없다니까요 ㅋㅋㅋ). 그럼 이제부터SimpleJdbcTemplate를 보겠습니다.

SimpleJdbcTemplate 객체 생성부터 난관

일단 SimpleJdbcTemplate 객체를 생성해야 하겠지요? SimpleJdbcTemplate Javadoc을 보면 생성자(constructor)가 세 개 있는데 두 개는 다른 Spring JDBC 객체를 감싸는 역할이고 실제로 DB에 붙이는 것은 DataSource를 인자로 받는 생성자입니다.

DriverManager.getConnection() method로 Connection 객체를 얻거나 WAS 등에서 관리하는 Connection Pool을 가진 DataSource를 JNDI로 집어왔는데... 이거 초장부터 막힙니다. 이 Web application의 web.xml에 DataSource를 등록하고 JNDI로 lookup할까요? 나쁘진 않군요.

제가 선택한 방법은 그냥 JDBC Driver에 있는 DataSource 구현체를 이용하는 것이었습니다. 다행히 Derby는 Derby를 구성하는 class들에 대한 Javadoc을 제공하고 있어서 그걸 볼 수 있었습니다(옆 link를 눌러보시면 jdbc3, jdbc4라는 directory가 나오는데 이들은 뭘까요? Derby는 JDBC 4.0 명세도 준수하는데, 바로 jdbc4란 directory 안의 Javadoc들은 이 JDBC 4.0에 대응하는 Derby class들에 대한 Javadoc입니다. jdbc3은 설명 따로 안드려도 감 잡겠죠?). org.apache.derby.jdbc package에 있는 class 중 이름이 *DataSource, 또는 *DataSource40으로 끝나는 것들이 바로 Derby의 DataSource 구현체입니다. 이 중 하나를 골라 SimpleJdbcTemplate 생성자의 인자로 쓰면 됩니다.

그래서 일단은 모든 DAO의 부모 역할을 하는 추상 class를 하나 선언하고 그 class의 member 변수로 이 SimpleJdbcTemplate 객체를 하나 잡기로 했습니다.

...
public abstract class AbstractDao {
    private SimpleJdbcTemplate jdbcTemplate = null;
    ...
}

이 SimpleJdbcTemplate가 필요로 하는 DataSource는 따로 member 변수로는 안 잡았습니다. 필요하면 jdbcTemplate의 getDataSource()로 얻음 되니까요. 그럼 SimpleJdbcTemplate 객체 생성에 필요한 DataSource는 어떻게 얻을까요?

...
public abstract class AbstractDao {
    private SimpleJdbcTemplate jdbcTemplate = null;
    ...
    public final void setDataSource(DataSource ds) {
        this.jdbcTemplate = new SimpleJdbcTemplate(ds);
        ...
    }
}

네, 바로 setDataSource()에서 인자로 받는 DataSource를 가지고 바로 SimpleJdbcTemplate로 만들었습니다. 그럼 이 DataSource는 어떻게 만들지? 네... 바로 Spring의 XML 설정에서 이 부분을 정의하였습니다. 아래와 같이요.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
   
    <!-- DataSource Setup for Derby Network DB -->
    <bean id="derbyNetworkDS"
        class="org.apache.derby.jdbc.ClientConnectionPoolDataSource40">
              <!-- DB IP나 hostname -->
        <property name="serverName" value="127.0.0.1" />
        <!-- DB port -->
        <property name="portNumber" value="1527" />
              <!-- DB 이름 -->
        <property name="databaseName" value="scientia"/>
        <!-- DB id -->
        <property name="user" value="scientia" />
              <!-- DB password -->
        <property name="password" value="scientia" />
        <property name="description" value="Apache Derby Network DataSource" />
        <property name="dataSourceName" value="derbyNetworkDS"/>
    </bean>
...
</beans>

Apache Derby에 있는 derby.jar나 derbyclient.jar를 보시면 실제로 org.apache.derby.jdbc.ClientConnectionPoolDataSource40이라는 class가 있습니다. 이 class가 바로 Derby에 대한 DataSource의 실 구현체이고, Javadoc 보시면 아시겠지만 DataSource 구현체는 이것 말고도 몇 개 더 있으니 입맛이나 요건에 맞게 용도별로 골라 쓰시면 됩니다. 어쨌든 이들 객체에 대한 property를 설정하면 DB에 접속하여 필요한 연산을 할 수 있습니다. 그 class에 대한 Javadoc 중 이름이 set*으로 시작하는 method들이 바로 이 XML의 property로 설정할 후보들이죠.

(다음에 계속)
:
Posted by 하얀 말