본문 바로가기
UMC 발자국

JdbcTemplate 사용법

by 의정부핵꿀밤 2021. 11. 17.
728x90

https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

[Spring JDBC] JdbcTemplate의 기본 사용법 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

하고 있는 웹프로젝트에서는 jpa를 사용했는데, umc 서버 실습에서는 jdbc를 사용해서 데이터베이스를 관리한다.

웹플젝할 떄도 jpa 부랴부랴 따라가느라 힘들었는데(아직도 못끝냄;;) 여기서는 jdbc를 해서 너무 어려웠다,,,

확실히 nodejs가 쉽긴 한 것 같다.. 그래도 스프링은 혼자 하긴 힘드니까 이런식으로 공부해두는게 좋을듯!

암튼 api 추가하는데 jdbc때문에 어려움을 겪어서 정리 좀 해보려고 한다..! 뿌엥

 


[ 스프링부트의 Data Access Layer 구조 ]

 

[ Spring JDBC 사용 과정 ]

 

1. DataSource 설정

1) DB와의 연결을 위해 DB Server에 대한 정보(property)를 설정한다

-> 나는 application.xml에 설정함

-> mysql의 url,, driver, username, password 설정

 

2) 해당 property file에 있는 값을 place holer을 통해 DataSource의 속서응로 설정한 후 해당 BasicDataSource(DataSource interface 중 하나)를 bean으로 등록한다

-> Spring JDBC를 사용하려면 먼저, DB connection을 가져오는 DataSource를 Spring IoC 컨테이너의 공유 가능한 Bean으로 등록해야 한다

 

3) 생성된 BasicDataSource Bean을 Spring JDBC에 주입한다

 

 

2. DAO에서의 처리 과정

1) DataSource 설정 (1번 - DataSource 설정 과정)

2) 위에서 bean으로 등록한 DataSource를 setter parameter를 통해 주입한다

-> @Autowired에 의해 DataSource Type에 해당하는 bean을 찾아서 주입한다

-> 여기서는 DataSource interface 중 하나인 BasicDataSource를 찾아서 주입한다 (위에서 등록한 bean)

3) Spring JDBC 접근 방법 중 하나인 JdbcTemplate 객체를 생성하여 dataSource를 주입한다

4) CRUD API를 제공한다

-> SQL문 작성

-> RowMapper interface 구현을 통해 SQL의 결과(record type)를 객체(object type)에 매핑하여 결과를 리턴

  • mapRow()라는 interface method를 정의하여 결과를 처리한다
  • 한번만 사용하는 기능의 경우 RowMapper를 익명 클래스로 작성하여 사용한다

@Component("offersDao")와 @Autowired의 기능

-> 해당 annotation이 없다면 xml을 통해 직접 bean으로 등록하고 setter에 주입해야한다!

-> 번거로운 과정을 한 번에 해결 가능하다!

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

<!-- @Component: OffersDAO 클래스를 id를 offersDao로 하는 bean으로 직접 등록 -->
<bean id="offersDao" class="com.spring.OffersDAO">
    <!-- @Autowired: id가 dataSource(ref 값)인 bean을 찾아 OffersDao의 setDataSource에 주입 -->
    <property name="dataSource" ref="dataSource" />
</bean>
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

-> 사전에 annotation을 찾아서 bean으로 등록하기 위한 설정이 필요하다 (Spring Annotation 활성화)

-> 해당 annotation을 사용하면 framework이 자동으로 bean으로 등록하고 setter에 주입해준다

<!-- Component 패키지 지정: 해당 패키지를 스캔하여 Annotation이 붙은 클래스를 bean으로 등록 -->
<context:component-scan base-package="com.spring"></context:component-scan>

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

<!-- 아래와 같은 설정 필요 없음 -->
<bean id="offersDao" class="com.spring.OffersDAO">
    <property name="dataSource" ref="dataSource" />
</bean>
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

[ JDBC Template 사용법 ]

 

1. queryForObject 

: 하나의 객체만 조회할 때 사용

 

- Querying for an Integer

/* 모든 학생의 수 */
String SQL = "select count(*) from Student"; 
int rowCount = jdbcTemplateObject.queryForObject(SQL, Integer.class);
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

- Querying for an String

/* 해당 학번(10)에 해당하는 학생의 이름 */
String SQL = "select name from Student where id = ?"; 
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);
// 위와 동일. hard coding
String name = jdbcTemplateObject.queryForObject(SQL, 10, String.class);
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

- Querying and returning an object(하나의 객체)

/* 해당 학번(10)에 해당하는 학생 객체 */
String SQL = "select * from Student where id = ?"; 
Student student = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, new StudentMapper()); 
// RowMapper interface의 구현 클래스 정의 
public class StudentMapper implements RowMapper<Student> { 
  // interface method
  public Student mapRow(ResultSet rs, int rowNum) throws SQLException { 
      Student student = new Student(); 

      student.setID(rs.getInt("id")); 
      student.setName(rs.getString("name")); 
      student.setAge(rs.getInt("age")); 

      return student; 
  }
}
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

2. query

: 여러 개의 객체를 조회할 떄 사용

 

- Querying and returning multiple objects(여러 개 객체)

/* 모든 학생 객체 */
String SQL = "select * from Student"; 
List<Student> students = jdbcTemplateObject.query(SQL, new StudentMapper()); 
// RowMapper interface의 구현 클래스 정의 
public class StudentMapper implements RowMapper<Student> {
  // interface method
  public Student mapRow(ResultSet rs, int rowNum) throws SQLException { 
      Student student = new Student(); 

      student.setID(rs.getInt("id")); 
      student.setName(rs.getString("name")); 
      student.setAge(rs.getInt("age")); 

      return student; 
  } 
}
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

3. update

: 객체 수정할 때 사용

 

- Inserting a row into the table

/* 이름이 Zara, 학번이 11인 학생을 삽입 */
String SQL = "insert into Student (name, age) values (?, ?)"; 
jdbcTemplateObject.update(SQL, new Object[]{"Zara", 11});
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

- Updating a row into the table

/* 학번이 10인 학생의 이름은 Zara로 수정 */
String SQL = "update Student set name = ? where id = ?"; 
jdbcTemplateObject.update(SQL, new Object[]{"Zara", 10});
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

- Deleting a row into the table

/* 학번이 20인 학생을 삭제 */
String SQL = "delete from Student where id = ?"; 
jdbcTemplateObject.update(SQL, new Object[]{20});
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html
728x90

댓글