DataBase 접근하기
스트럿츠를 이용한 대부분의 개발은 데이터베이스에 대한 접근을 하게 됩니다. 가장 좋은 구성은 Action이 프리젠테이션 영역과 비즈니스 로직 영역을 연결하는 thin adapter 역할을 하도록 구성 하는 겁니다.
DAO approach인 경우 데이터에 대한 접근은 Business Interface의 뒤쪽에 숨어 있게 됩니다. 비즈니스 클래스에 대한 구현은 Connection Pool을 지원하는 DataSource를 통해 이루어 지므로 대부분의 데이터베이스에 대한 접근은 Connection Pool을 이용한다고 보면 됩니다.
Connection Pool이라는 것은 간단히 말해 DB에 연결을 맺은 Connection 객체를 미리 만들어 주어 사용자가 접속하면 할당을 하는 형태로 DB접속을 관리하는 것을 말합니다. 실제 테스트를 해보면 아시겠지만 데이터베이스에 대한 Connection을 수립하는데도 많은 비용이 드는 것은 사실이니까요… 생성과 삭제, 관리등을 Connection Pool에서 알아서 관리 해줍니다.
대부분의 컨테이너와 데이터베이스 시스템은 DataSource에 대한 구현을 번들로 제공 합니다. DataSource는 JNDI를 통해 접근이 가능하며 JNDI approach인 경우 별다른 고민 없이 DataSouce에 대한 비즈니스 클래스의 접근을 용이하게 해 줍니다.
-------------------------------
Struts DataSource Manager
-------------------------------
비즈니스 로직 계층에서는 데이터액세스에 대한 상세한 부분과 데이터베이스의 Conenction을 얻는 부분을 캡슐화 합니다. Struts에서는 DataSource Manager 라는 것이 있어 Action 클래스가 데이터 액세스 요구에 위해 리소스(DB Connection등)를 생산해 내는 것을 쉽게 만들어 줍니다.
가능하다면 데이터를 액세스 하는 경우 DAO(Data Access Object) 패턴을 사용하기를 권고 하며 그래서 Action 클래스는 내부의 메커니즘을 알 필요가 없게 되는 것입니다.
DataSource Manager는 1.X 버전과의 호환을 위해 존재하며 향후 2.x 버전에서는 사라질 예정 입니다.
DataSource Manager는 struts-config.xml 파일에서 설정하며 javax.sql.DataSource 인터페이스를 구현한 어떠한 Conenction Pool에서도 deploy해서 사용 할 수 있습니다.
만약 현재 사용하고 있는 DB or 컨테이너가 javax.sql.DataSouce 인터페이스를 구현한 클래스를 제공 하다면 있는 것을 사용하셔도 무방 합니다. 대부분의 엔터프라이즈 애플리케이션 개발에서 보다 나은 성능을 위해 다른 connection pool을 사용하고 있죠^^
이 강좌에서는 Jakarta Commons dbcp's BasicDataSource(org.apache.commons.dbcp.BasicDataSource)를 이용하여 DataSource를 사용해 보도록 하겠습니다.
DBCP는 다음 URL에서 다운 받으시기 바랍니다.
http://jakarta.apache.org/commons/dbcp/downloads.html
1. DBCP BasicDataSource를 사용하기 위한 설정은 아래와 같습니다…(struts-config.xml에 설정)
<!-- =============== for DataSource ======================= -->
<data-sources>
<!-- configuration for commons BasicDataSource -->
<data-source key="mysql" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
<set-property property="url" value="jdbc:mysql://localhost/test" />
<set-property property="username" value="root" />
<set-property property="password" value="pw" />
<set-property property="maxActive" value="10" />
<set-property property="maxWait" value="5000" />
<set-property property="defaultAutoCommit" value="true" />
<set-property property="defaultReadOnly" value="false" />
<set-property property="maxIdle" value="10000" />
</data-source>
<data-source key="oracle" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<set-property property="username" value="scott" />
<set-property property="password" value="tiger" />
<set-property property="url" value="jdbc:oracle:thin:@localhost:1521:WINK" />
<set-property property="maxActive" value="50" />
<set-property property="maxIdle" value="10000" />
<set-property property="maxWait" value="100" />
<set-property property="defaultAutoCommit" value="true" />
</data-source>
</data-sources>
2. 소스 코드에서는 아래와 같이 사용 합니다.
public ActionForward
execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception
{
javax.sql.DataSource dataSource;
java.sql.Connection myConnection;
try {
//for oracle
javax.sql.DataSource dataSource = getDataSource(request,"oracle");
myConnection = dataSource.getConnection();
} catch (SQLException sqle) {
getServlet().log("Connection.process", sqle);
} finally {
//enclose this in a finally block to make
//sure the connection is closed
try {
myConnection.close();
} catch (SQLException e) {
getServlet().log("Connection.close", e);
}
}
}
3. 다중 데이터 소스를 사용하는 경우에는 struts-config.xml에서 다음과 같이 선언 합니다.
<data-sources>
<data-source key="A" type="org.apache.commons.dbcp.BasicDataSource">
... properties as before ...
</data-source>
<data-source key="B" type="org.apache.commons.dbcp.BasicDataSource">
... properties as before ...
</data-source>
...
</data-sources>
4. 다중 데이터 소스인 경우 프로그램에서는 다음과 같이 사용 합니다.
...
try {
dataSourceA = getDataSource(request, "A");
dataSourceB = getDataSource(request, "B");
...
댓글 없음:
댓글 쓰기