22.1 스프링 jdbc로 데이터베이스와의 연동 설정하기
JDBC(Java Database Connectivity) 는 자바 데이터 접근 기술의 근간이라 할 정도로 대부분의 개발자가 쉽게 이해할수 있어 많이 사용하는 데이터 액세스 기술이다. 그러나 시간이 지남에 따라 SQL 문이 지나치게 복잡해지면서 개발이나 유지관리에 어려움이 생기기 시작했다. 특히 Connection 객체 같은 공유 리소스를 제대로 처리해 주지 않으면 버그를 발생시키는 원인이 되곤 했다.
스프링에서 제공하는 JDBC는 이러한 기존으로 JDBC의 장점과 단순함을 유지하면서 단점을 보완했다. 간결한 API 뿐만 아니라 확장된 JDBC의 기능도 제공한다.
NOTE_ 실제 개발을 진행할 때는 스프링 JDBC 기능보다는 마이바티스나 하일버네이트 같은 데이터베이스 연동 관련 프레임워크를 사용하지만 스프링 JDBC의 기본적인 기능을 알아두면 도움이 된다. 따라서 이번에는 기본적인 것만 짚고 넘어간다. 마이바티스에 관해서는 뒤에서 따로 다룬다.
1. 새 프로젝트 pro22 를 만들고 lib 폴더의 라이브러리와 web.xml, action-servlet.xml를 복사한 후 동일한 위치에 붙여넣는다.
2. 그리고 스프링 JDBC실습에 필요한 XML 파일들을 다음과 같이 만들어 준비한다.
각 XML 파일들에 대한 설명
스프링 JDBC 설정 파일들
파일 | 설명 |
web.xml | ContextLoaderListener를 이용해 빈 설정 XML 파일들을 읽어 들인다. |
action-servlet.xml | 스프링에서 필요한 여러가지 빈을 설정한다. |
action-dataSource.xml | 스프링JDBC 설정에 필요한 정보를 설정한다. |
jdbc.properties | 데이터베이스 연결 정보를 저장한다. |
action-service.xml | 서비스 빈 생성을 설정한다. |
3. action-servlet.xml 과 action-dataSource.xml 의 <beans> 태그는 앞에서 실습한 action-servlet.xml 의 것을 복사해서 붙여넣으면 된다.
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
</beans>
4. web.xml 을 다음과 같이 작성한다. 한개의 XMl 파일에서 모든 빈을 설정하면 복잡해서 관리하기 어려우므로 빈의 종류에 따라 XML 파일에 나누어 설정한다. 그러면 톰캣 실행시 web.xml에서 스프링의 ContextLoaderListener를 이용해 빈 설정 XML 파일들을 읽어들인다.
코드 22-1 pro22/WebContent/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<listener> <!--여러 설정 파일을 읽어 들이기 위해 스프링의 ContextLoaderListener를 설정한다. -->
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/action-service.xml <!--애플리케이션 실행 시 ContextLoaderListener로 해당 위치의 설정 파일을 읽어 들인다. -->
/WEB-INF/config/action-dataSource.xml
</param-value>
</context-param>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
5. action-servlet.xml 을 다음과 같이 작성한다. 여기서는 뷰 관련 빈과 요청을 처리할 빈 그리고 메서드를 설정한다. 이때 주의할 점은 빈 주입 시 주입 받는 클래스에서는 주입되는 빈에 대한 setter를 반드시 구현해야 한다는 것이다.
코드 22-2 pro22/WebContent/WEB-INF/action-servlet.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/><!--URL 요청명에 대해 /WEB-INF/views 폴더의 JSP를 선택한다. -->
<property name="suffix" value=".jsp"/>
</bean>
<bean id="memberController" class="com.spring.member.controller.MemberControllerImpl">
<property name="methodNameResolver"><!--memberController빈에 methodNameResolver빈과 memberService빈을 주입한다. -->
<ref local="methodResolver"/>
</property>
<property name="memberService" ref="memberService"/>
</bean>
<bean id="methodResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props><!--URL 요청명에 대해 동일한 이름의 메서드를 호출하도록 설정한다. -->
<prop key="/member/listMembers.do">listMembers</prop>
<prop key="/member/addMember.do">addMember</prop>
<prop key="/member/memberForm.do">memberForm</prop>
<prop key="/member/memberDetail.do">memberDetail</prop>
</props>
</property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/member/*.do">memberController</prop>
</props>
</property>
</bean>
</beans>
6. action-service.xml 에서 memberService 빈을 설정하도록 작성한다. 데이터베이스와 연동할때 필요한 memberDAO 빈을 주입하는 기능을 한다.
코드 22-3 pro22/WebContent/WEB-INF/config/action-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="memberService" class="com.spring.member.service.MemberServiceImpl">
<property name="memberDAO" ref="memberDAO"/><!--memberService 빈의 memberDAO 속성에 memberDAO 빈을 주입한다. -->
</bean>
</beans>
7. 다음으로 action-dataSource.xml 을 작성한다. 이 파일은 스프링에서 사용할 데이터베이스 연동 정보를 설정한다. 먼저 jdbc.properries 파일에서 데이터베이스 연결 정보를 가져온 후 이 연결 정보를 이용해 스프링에서 제공하는 SimpleDriverDataSource로 id가 dataSource인 빈을 생성한다. 그리고 dataSource 빈을 memberDAO 빈으로 주입한다.
코드 22-4 pro22/WebContent/WEB-INF/config/action-dataSource.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/config/jdbc.properties</value><!--jdbc.properties 파일에서 데이터베이스 연결에 필요한 4가지 설정 정보를 가져온다. -->
</list>
</property>
</bean>
<!--jdbc.properties 파일의 4가지 설정 정보로 스프링의 SimpleDriverDataSource 빈 생성 시 데이터베이스에 연결한다. -->
<bean id="dataSource" class="org.springframework.jdbc.dataSource.SimpleDriverDataSource">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="memberDAO" class="com.spring.member.dao.MemberDAOImpl">
<property name="dataSource" ref="dataSource"/><!--생성된 dataSource 빈을 memberDAO 빈에 주입한다. -->
</bean>
</beans>
8. config 폴더를 선택하고 마우스 오른쪽 버튼을 클릭한 후 NEW> File 을 선택하여 파일 이름을 jdbc.properties로 입력한다. 그리고 다음과 같이 데이터베이스 연결 정보를 작성한다.
코드 22-5 pro22/WebContent/WEB-INF/config/jdbc.properties
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:XE
jdbc.username=scott
jdbc.password=tiger
XML 설정 파일에 의해 생성된 각 빈의 주입과정은 다음과 같다.
22.2 Jdbc Template 클래스 이용해 회원 정보 조회하기
이제 자바 클래스와 JSP 를 이용해 회원 테이블에서 조회한 회원 정보를 JSP 에 출력해 보겠다.
1. 실습에 필요한 파일들을 다음과 같이 준비한다.
우선 이 파일들이 어떤 역할을 하는 지, 즉 스프링을 이용해 회원 정보 테이블에 접근하여 회원 정보를 조회하는 과정을 아래에 나타내었다.
DAO 클래스에서 실제 스프링의 JDBC 기능을 제공하는 클래스는 JDBCTemplate 이다.
아래 표는 이 클래스가 제공하는 여러가지 SQL 관련 메서드들을 정리한 것이다.
JDBC Template 클래스에서 제공하는 SQL 관련 메서드
기능 | 메서드 |
insert, update.delete 관련 메서드 |
int update(String query) |
int update(String query, Object[] args) | |
int update(String query, Object[] args, int[] argTypes) | |
select 기능 메서드 |
int quertForInt(String query) |
int queryForInt(String query, Object[] args) | |
long queryForLong(String query) | |
long queryForLong(String query, Object[] args) | |
Object queryForObject(String query, Class requiredType) | |
List queryForList(String query) | |
List queryForList(String query, Object[] args) |
이제 JdbcTemplate 클래스를 이용해 회원 정보 조회를 실습해봅니다.
1. MemberControllerImpl 클래스를 다음과 같이 구현한다. 자신의 속성 memberService 에 설정 파일에서 생성된 memberService 빈을 주입하기 위해 반드시 setter를 구현해야 한다.
코드 22-6 pro22/src/com/spring/member/controller/MemberControllerImpl.java
'Spring > 스프링 프레임워크' 카테고리의 다른 글
Spring Framework 스프링 MVC 기능 (2) (0) | 2024.04.05 |
---|---|
Spring Framework 스프링 MVC 기능 (0) | 2024.04.04 |
Spring Framework 스프링 AOP 기능 - 관점 지향 프로그래밍 (0) | 2024.04.01 |
스프링 프레임워크 Spring 의존성 주입 과 제어 역전 기능 2 (0) | 2024.04.01 |
스프링 프레임워크 Spring 의존성 주입 과 제어 역전 기능 (0) | 2024.03.26 |