SPRING

SPRING Database 연동과 Jdbc 지원

Adev 2022. 11. 18. 00:01

1. SPRING의 Database 연동 지원

: JDBC, Hibernate, iBatis 등을 이용해 DAO Class를 구현할 수 있도록 한다.

 

 

1.1 Template Class

:  데이터에 접근하는 Code는 거의 동일한 구성을 갖는데, spring은 Template Class를 제공해 중복된 Code를 줄인다.
ex) Jdbc Template Class

 

 

1.2 예외 지원

: Spring에서는 Database 처리과정에서 발생한 예외를 구체적으로 확인할 수 있는 예외 Class를 제공한다.

(JDBC Database 처리 과정에서 발생하는 SQLException은 예외 발생 원인을 찾기 위해 SQLException의 실제 타입과 에러 Code를 확인해야 하는 번거로움이 있다.)
Template Class는 발생하는 예외 Class를 spring이 제공하는 예외 Class로 변환한다.

+ spring이 제공하는 Database 관련 예외 Class는 RuntimeException인 DataAccesException Class를 상속받는다. (필요시 try-catch블럭 사용)

 


 

2. DataSource설정

: spring은 DataSource를 통해 Connection을 제공할 수 있다.

 

 

2.1 커넥션 풀을 이용한 DataSource 설정

: 커넥션 풀 Library(ex. DBCP, c3p0 등)를 이용해 커넥션풀 기반 DataSource를 설정한다. 

ex) DBCP가 제공하는 BasicDataSource Class를 이용하는 방법

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
         p:driverClassName="oracle.jdbc.driver.OracleDriver"
         p:url="jdbc:oracle:thin:@192.168.107.100:1521:ORCL"
         p:username="spring"
         p:password="spring"/>

 

 

2.2 JNDI를 이용한 DataSource 설정

1) <jee:jndi-lookup> 태그를 이용해 JNDI에 등록된 객체의 이름을 명시한다.

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/guestbook" resource-ref="true"/>
<bean id="messageDao" class="kame.spring.guestbook.dao.jdbc.JdbcMessageDao" p:dataSource-ref="dataSource"/>



2) JndiObjectFactoryBean Class를 이용한다.

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/guestbook"/>
<property name="resourceRef" value="true"/>
</bean>

 



2.3 DriverManager를 이용한 DataSource 설정

: DriverManager를 이용해 커넥션을 제공하는 DriverManagerDataSource Class를 사용한다. (커넥션풀이나 JNDI를 사용할 수 없을 시)

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="oracle.jdbc.driver.OracleDriver"
         p:url="jdbc:oracle:thin:@localhost:1521:ORCL"
         p:username="nals"
         p:password="dkagh1234." />

 

 

2.4 DataSource로부터 Connection 직접 구하기

: 외부에서 제공한 Module이 Connection을 파라미터로 전달 받는 경우에는 DataSource에서 직접 Connection 구해서 Module에 제공해야한다.

(DataSourceUtiles Class를 이용해 Connection을 반환해야 spring의 Transaction기능을 적용할 수 있다.)

 

 

 

3. spring JDBC 지원

:  데이터에 접근하는 Code는 거의 동일한 구성을 갖는데, spring은 Template Class를 제공해 중복된 Code를 줄인다.

 

  • JDBC 지원을 위한 Class

- JdbcTemplate 

   : 인덱스 기반 파라미터를 사용한다. (물음표 사용)
- NamedParameterJdbcTemplate 

   : PreparedStatememt에서 이름을 가진 파라미터를 사용한다.
- SimpleJdbcTemplate

   : Java5의 가변 인자를 이용해 쿼리를 실행할 때 데이터를 전달한다.
- simpleJdbcInsert
- SimpleJdbcCall

 

3.1 JdbcTemplate Class를 이용한 JDBC 프로그래밍

: JdbcTemplate Class는 SQL 실행을 위한 메소드를 제공한다. 데이터 조회, 삽입, 수정, 삭제를 위한 SQL쿼리를 실행할 수 있다.

 

  • 사용법

- JdbcTemplate 객체를 생성 시 DataSouce를 전달한다.

private JdbcTemplate jdbcTemplate;

public JdbcTemplateGuestMessageDao(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}

 

- JdbcTemplate 객체를 생성 시 JdbcTemplate Class를 전달한다.

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}

 

  • 조회를 위한 메서드 

- query() 

   : 쿼리 실행 결과를 객체 목록으로 가져올 때 사용
- queryForList()

   : 읽어온 컬럼 개수가 1개
- queryForObject()

   : 쿼리 실행 결과 행의 개수가 1개
- queryForInt()

   : Int 타입 결과
- queryForLong()

   : Long 타입 결과

1) query()

   : 쿼리 실행 결과를 객체 목록으로 가져올 때 사용한다.


- query(String sql, RowMapper<?> rowMapper)
- List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)
- List<T> query(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper)


- sql 파라미터 : 실행할 쿼리
- rowMapper : 실행 결과를 Java 객체로 변환해주는 Mapper
- args 파라미터 : PreparedStatement를 실행할 때 사용할 파라미터 바인딩 값 목록
- argTypes : 파라미터 바인딩을 할 때 사용할 SQL 타입 목록

- RowMapper는 ResultSet에서 값을 가져와 원하는 타입으로 Mapping할 때 사용한다. 

public interface RowMapper<T>{
          T mapRow(ResultSet rs, int rowNum) throws SQLException;
          }


- RowMapper의 mapRow() 

    : ResultSet에서 가져온 값을 이용해 원하는 타입의 객체를 생성한 뒤 리턴한다.

@Override
public GuestMessage mapRow(ResultSet rs, int rowNum) throws SQLException {
GuestMessage message = new GuestMessage();
message.setId(rs.getInt("MESSAGE_ID"));
message.setGuestName(rs.getString("GUEST_NAME"));
message.setMessage(rs.getString("MESSAGE"));
message.setRegistryDate(rs.getDate("REGISTRY_DATE"));
return message;
}});
}

 

2) queryForObject() 

     : 쿼리 실행 결과 행의 개수가 1개

- T queryForObject(String sql, RowMapper<T> rowMapper)
- T queryForObject(String sql, Object[] args, RowMapper<T> rowMapper)
- T queryForObject(String sql, Object[] args, int[] argTypes, RowMapper<T> rowMapper)
- T queryForObject(String sql, Class<T> requiredType)
- T queryForObject(String sql, Object[] args, Class<T> requiredType)
- T queryForObject(String sql, Object[] args, int[] argTypes, Class<T> requiredType)

  • 삽입/수정/삭제를 위한 메서드 update()

: 쿼리 실행 결과 변경된 행의 개수(Int) 를 리턴한다. 
 - int update(String sql)
 - int update(String sql, Object ... args)
 - int update(String sql, Object[] args, int[] argTypes)

 

 

3.2 NamedParameterJdbcTemplate Class 를 이용한 JDBC 프로그래밍 

: JdbcTemplate(인덱스 기반 파라미터, Object 배열을 전달)와 비슷한 기능을 제공하지만, 이름 기반의 파라미터를 설정하기 위해 Map이나 SqlParameterSource를 전달받는다.


1) Map을 이용한 파라미터 값 설정 메서드

: Map을 이용해 이름을 가진 파라미터 값을 설정한다.

@Override
public int delete(int id) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("id", id);
return template.update(
"delete from GUESTBOOK_MESSAGE where MESSAGE_ID = :id",
paramMap);
}


2) SqlParameterSource를 이용한 파라미터 값 설정 메서드

  • 구현 클래스

- org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource - org.springframework.jdbc.core.namedparam.MapSqlParameterSource

 

 

3.3 SimpleJdbcTemplate Class를 이용한 JDBC 프로그래밍

: JdbcTemplate과 NamedParameterJdbcTemplate를 합쳐 놓은 템플릿 Class이다.


+ 3.4 SimpleJdbcInsert Class를 이용한 데이터 삽입 

         : 쿼리를 사용하지 않고 데이터를 삽입하도록 해주는 Class. (Oracle 시퀀스 설정시 사용x)

'SPRING' 카테고리의 다른 글

SPRING 로딩 구조, 어노테이션  (0) 2022.11.25
SPRING 기본설정 (XML, JAVA 공통부분)  (0) 2022.11.24
HTML 이외의 View 구현  (0) 2022.11.17
SPRING tiles2  (0) 2022.11.16
SPRING View 영역 구현  (0) 2022.11.14