티스토리 뷰
1) Spring JDBC 소개
Spring JDBC
- JDBC 프로그래밍을 보면 반복되는 개발 요소가 있습니다.
이러한 반복적인 요소는 개발자를 지루하게 만듭니다.
개발하기 지루한 JDBC의 모든 저수준 세부사항을 스프링 프레임워크가 처리해줍니다.
개발자는 필요한 부분만 개발하면 됩니다.
Spring JDBC - 개발자가 해야 할 일은?
- 어떤 데이터베이스에 접속하게 할 건지, 어떤 테이블에 query 문을 보내고 싶은 건지와 같은 반드시 개발자가 알려줘야 되는 정보들만 애플리케이션 개발자들이 개발을 하면 됩니다.
- 실제 정보를 가지고 자동으로 만들어낼 수 있는 이런 부분들은 다 스프링 프레임워크가 대신해준다고 생각을 하시면 됩니다.
동작 |
설명 |
스프링 |
개발자 |
연결 파라미터 정의 |
어떤 데이터베이스에 접속할 건지 등의 정보 제공 |
|
O |
연결 오픈 |
|
O |
|
SQL문 지정 |
쿼리 설정 |
|
O |
파라미터 선언과 파라미터 값 제공 |
파라미터가 어떤 값들을 가지고 query 문을 수행할 건지에 대한 정보 제공 |
|
O |
statement 준비와 실행 |
|
O |
|
(존재한다면) 결과를 반복하는 루프 설정 |
|
O |
|
각 이터레이션에 대한 작업 수행 |
|
|
O |
모든 예외 처리 |
|
O |
|
트랜잭션 제어 |
|
O |
|
연결, statement, resultset 닫기 |
|
O |
|
Spring JDBC 패키지
org.springframework.jdbc.core |
JDBC 템플릿 클래스와 JDBC 템플릿의 다양한 콜백 인터페이스를 포함하고 있고 추가로 여러 가지 관련 클래스를 포함하고 있습니다. |
org.springframework.jdbc.datasource |
데이터 소스의 접근을 쉽게하는 유틸리티 클래스와 javaEE 컨테이너 외부에 수정되지 않고 운영되는 JDBC 코드와 테스트에서 사용할 수 있는 여러 가지 간단한 데이터 소스 구현체를 포함하고 있습니다. |
org.springframework.jdbc.object |
RDBMS의 조회, 갱신, 저장 프로시저를 스레드 세이프하고 재사용 가능한 객체로 나타내는 클래스를 포함하고 있습니다. |
org.springframework.jdbc.support |
SQL Exception 변환 기능과 약간의 유틸리티 클래스를 제공하고 있습니다. |
JDBC Template
- org.springframework.jdbc.core에서 가장 중요한 클래스입니다.
- 리소스 생성, 해지를 처리해서 연결을 닫는 것을 잊어 발생하는 문제 등을 피할 수 있도록 합니다.
- 스테이먼트(Statement)의 생성과 실행을 처리합니다.
- SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복호출 등을 실행합니다.
- JDBC 예외가 발생할 경우 org.springframework.dao패키지에 정의되어 있는 일반적인 예외로 변환시킵니다.
실습코드
JdbcTemplate select 예제1 - 열의 수 구하기(queryForInt)
int rowCount = this.jdbcTemplate.queryForInt("select count(*) from t_actor"); |
JdbcTemplate select 예제2 - 변수 바인딩 사용하기(queryForInt)
int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt("select count(*) from t_actor where first_name = ?", "Joe"); |
JdbcTemplate select 예제3 - String값으로 결과 받기(queryForObject)
- 세 번째 파라미터에 리턴받기 원하는 클래스를 적으면 됩니다.
String lastName = this.jdbcTemplate.queryForObject("select last_name from t_actor where id = ?", new Object[]{1212L}, String.class); |
JdbcTemplate select 예제4 - 한 건 조회하기(queryForObject)
- 한 행에는 여러 개의 컬럼이 존재하죠. 해당 컬럼들을 원하는 객체에 매핑을 해줘야 하는데요. 그때 사용하는 객체가 RowMapper라고 하는 객체입니다.
- RowMapper를 상속받은 이름 없는 객체를 이용해서 mapRow()라는 메서드를 오버라이딩 하고 있는 것을 볼 수 있습니다. 한 건의 결과가 ResultSet에 담겨있기 때문에 해당 ResultSet의 값을 Actor에 담아서 리턴을 하고 있는 모습을 볼 수 있습니다. 이렇게 실행하면 한 행의 데이터를 조회해서 이런 객체에 담아서 리턴을 해줄 수 있습니다.
Actor actor = this.jdbcTemplate.queryForObject( "select first_name, last_name from t_actor where id = ?", new Object[]{1212L}, new RowMapper<Actor>() { public Actor mapRow(ResultSet rs, int rowNum) throws SQLException { Actor actor = new Actor(); actor.setFirstName(rs.getString("first_name")); actor.setLastName(rs.getString("last_name")); return actor; } }); |
JdbcTemplate select 예제5 - 여러 건 조회하기(query)
List<Actor> actors = this.jdbcTemplate.query( "select first_name, last_name from t_actor", new RowMapper<Actor>() { public Actor mapRow(ResultSet rs, int rowNum) throws SQLException { Actor actor = new Actor(); actor.setFirstName(rs.getString("first_name")); actor.setLastName(rs.getString("last_name")); return actor; } }); |
JdbcTemplate select 예제6 - 중복 코드 제거 (1건 구하기와 여러 건 구하기가 같은 코드에 있을 경우)
- 한 건 select와 여러 건 select 모두 동일한 RowMapper를 사용하는데요. 그 부분을 별도의 메서드로 추출함으로써 코드의 중복을 막을 수 있습니다.
public List<Actor> findAllActors() { return this.jdbcTemplate.query( "select first_name, last_name from t_actor", new ActorMapper()); } private static final class ActorMapper implements RowMapper<Actor> { public Actor mapRow(ResultSet rs, int rowNum) throws SQLException { Actor actor = new Actor(); actor.setFirstName(rs.getString("first_name")); actor.setLastName(rs.getString("last_name")); return actor; } } |
JdbcTemplate insert 예제
- insert나, update나, delete는 모두 update()라는 메서드를 이용해서 실행합니다. ?의 개수만큼 SQL 문 뒤 파라미터에 ?에 들어갈 값을 넣어주면 됩니다.
this.jdbcTemplate.update("insert into t_actor (first_name, last_name) values (?, ?)", "Leonor", "Watling"); |
JdbcTemplate update 예제
this.jdbcTemplate.update("update t_actor set = ? where id = ?", "Banjo", 5276L); |
JdbcTemplate delete 예제
this.jdbcTemplate.update("delete from actor where id = ?", Long.valueOf(actorId)); |
JdbcTemplate외의 접근방법
- 아래의 클래스들을 이용한다면 좀 더 편하게 프로그래밍할 수 있습니다.
NamedParameterJdbcTemplate |
JdbcTemplate에서 JDBC statement 인자를 ?를 사용하는 대신 파라미터명을 사용하여 작성하는 것을 지원합니다.
|
SimpleJdbcTemplate |
JdbcTemplate과 NamedParameterJdbcTemplate 합쳐 놓은 템플릿 클래스로 이제 JdbcTemplate과 NamedParameterJdbcTemplate에 모든 기능을 제공하기 때문에 삭제 예정될 예정입니다.(deprecated) |
SimpleJdbcInsert |
이블에 쉽게 데이터 insert 기능을 제공합니다. |
생각해보기
- JDBC 프로그래밍이 불편해서 이를 해결하기 위해서 등장한 기술에는 Spring JDBC 외에도 다양한 기술들이 존재합니다. 대표적으로 JPA와 MyBatis가 그러한 기술입니다. 문제를 해결하는 방법이 왜 여러 가지가 존재할끼요?
참고 자료
[참고링크] Data Access
https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#jdbc
'부스트코스 웹 프로그래밍 > 3. 웹 앱 개발: 예약서비스 1' 카테고리의 다른 글
9. Spring MVC - BE (1) (0) | 2019.08.06 |
---|---|
8. Spring JDBC - BE (2) (0) | 2019.08.04 |
7. Spring Core - BE (4) (0) | 2019.08.04 |
7. Spring Core - BE (3) (0) | 2019.08.03 |
7. Spring Core - BE (2) (0) | 2019.08.03 |