본문 바로가기
Java . Spring . Web . SQL

스프링 JDBC

by heidish 2020. 10. 20.
반응형

 

 

 

 

 

 

 

스프링에서는 JDBC 기반의 DB 연동 프로그램을 쉽게 개발 가능하도록

JdbcTemplate 클래스를 지원한다.

 

 


 

JdbcTemplate 

 

 

JdbcTemplate 은 GoF 디자인 패턴 중, 템플릿 메소드 패턴이 적용된 클래스이다.

 

 

템플릿 메소드 패턴

:  복잡하고 반복되는 알고리즘을 캡슐화해서 재사용하는 패턴을 뜻함

 

 

템플릿 메소드 패턴을 이용하면 반복사용되는 알고리즘을 템플릿 메소드로 캡슐화할 수 있어서

JDBC 처럼 코딩 순서가 정형화 되어있는 기술에서 유용하게 쓰일 수 있다.

 

 

 

즉, 반복되는 DB 연동 로직의 경우

JdbcTemplate  클래스의 템플릿 메소드가 제공하고,

개발자는 달라지는 SQL문과 설정값만 신경쓰면 된다 !

 

또한 DAO 클래스에서는 JdbcTemplate 클래스가 제공하는 템플릿 메소드를 호출해서

DB 연동을 간단하게 처리 가능하다.

 

 

 

 


 

 

스프링 JDBC 설정

 

 

( pom.xml )

pom.xml 파일에 DBCP 관련 <dependency> 설정을 추가해야 한다.

		<!-- Connection Pool -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>

추가한 뒤 저장하면

이렇게 라이브러리가 추가된다.

 

 

 


 

DataSource 설정

 

 

1.  <bean> 태그로 직접 설정하기

 

JdbcTemplate 클래스가 내부적으로 JDBC API 를 이용해서 DB 연동을 처리하려면

꼭 DB로부터 커넥션을 얻어야 한다.

 

따라서 JdbcTemplate 객체가 사용할 DataSource 를 <bean> 태그로 등록해서 스프링 컨테이너가 생성하게 해주자.

 

 

 

( applicationContext.xml )

	<!-- DataSource Configuration -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"></property>
		<property name="username" value="heidi"></property>
		<property name="password" value="1234"></property>
	</bean>

아파치의 BasicDataSource 는 DataSource 인터페이스를 구현한 클래스이다.

또한 BasicDataSource 객체는 DB 연결에 필요한 property 들을 Setter 인젝션으로 설정해줬다.

그리고 BasicDataSource객체가 삭제되기 전에 연결을 해제하기 위해서 destroy-method 속성에 close 메소드를 넣었다.

 

 

 

2.  프로퍼티 파일을 활용한 DataSource 설정

 

PropertyPlaceholderConfigurer 를 이용하면 외부의 프로퍼티 파일을 참조해서 DataSource 를 설정해줄 수 있다.

 

 

src/main/resources 소스 폴더 내부에 config 폴더를 생성하고,

config 폴더에 database.properties 파일을 작성해보자.

 

config 파일을 먼저 생성하고,

파일에서 마우스 오른쪽 클릭 > New > File 선택하기

( Untitled Text File 로 만들어도 상관없음! )

 

위와 같이 확장자까지 입력해주고 Finish

( 난 이미 만들어놔서 Finish 버튼도 활성화 되어있지 않고, 창 상단에 이미 존재한다고 떠있음 )

 

 

이제 database.properties 파일 내에 아래처럼 써주자

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:XE
jdbc.username=heidi
jdbc.password=1234

 

( applicationContext.xml )

	<!-- DataSource Configuration -->
	<context:property-placeholder location="classpath:config/database.properties" />
	
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password"></property>
	</bean>

 

 

 



( p.216-219, BoardWeb_DI_AOP_anno 프로젝트 참고)

 

JdbcTemplate 메소드

 

 

update()

-   insert, update, delete 구문을 처리할 때 사용

-   두 가지 방법이 존재

-   1) ? 갯수만큼의 값들을 차례로 나열하는 방법

    2) Object 배열 객체에 ? 갯수만큼의 값들을 세팅해서, 배열 객체를 전달하는 방법

 

queryForInt()

-   select 구문으로 검색된 갯수를 정수 값으로 리턴받을 때 사용

 

queryForObject()

-   select 구문의 실행 결과를 특정 자바객체(VO: Value Object)로 매핑해서 리턴받을때 사용

-   즉, select문으로 객체 하나를 검색할 때 사용

-   검색결과가 없거나, 두개 이상일때 예외 발생!

 

query()

 select문의 실행 결과로 목록을 받을 때 사용

-   RowMapper 객체의 mapRow() 메소드에 의해 ROW 정보가 매핑된 VO 객체 여러개가 List 컬렉션에 저장되어 리턴됨

 

 

 


 

 

 

반응형

댓글