JdbcTemplate
이 문서에서는 Spring에서 제공하는 JDBC 기능을 사용하는 방법에 대해서 다룬다.
Spring JDBC란
Spring에서 제공하는 JDBC(Java DataBase Connectivity)를 위한 도구들이다.
DriverManagerDataSource - 데이터베이스 연결 담당 객체
JdbcTemplate - 구문 실행 객체
필요 라이브러리
프로그램을 구현하기에 앞서 다음과 같은 라이브러리를 준비해야 한다.
오라클
ojdbc8
Spring
spring-beans
spring-core
spring-tx
spring-jdbc
기타
commons-logging-1.2
해당 라이브러리들은 Maven Central Repository에서 검색하여 다운로드 가능하다.
도구 준비
JDBC를 위한 도구를 준비하는 코드는 다음과 같다.
DriverManagerDataSource
JdbcTemplate
테이블 준비
테이블은 Database에 생성되어 있어야 한다.
이 문서에서는 다음 테이블(table)을 생성하여 사용한다.
번호 등록을 위한 시퀀스(sequence)도 생성한다.
등록(INSERT)
등록을 하기 위한 SQL 구문은 다음과 같다.
구문에서 변할 수 있는 정보는 이름, 국어점수, 영어점수, 수학점수이다. 따라서 해당하는 정보들을 자바에서 입력 받고 구문을 완성하여 DBMS에 전송해야 한다.
DriverManagerDataSource와 JdbcTemplate을 먼저 준비한다.
이후 추가할 데이터를 다음과 같이 준비한다.
데이터는 Scanner 클래스 등을 이용하여 사용자에게 입력 받는 것도 가능하다.
준비된 데이터를 추가할 수 있는 SQL 구문과 배열을 준비한다.
JdbcTemplate을 실행하며 작성한 SQL 구문과 데이터를 전달한다.
완성 코드
수정(UPDATE)
STUDENT 테이블에서 할 수 있는 수정은 다음과 같은 것들이 있다.
특정 번호 학생에 대한 모든 정보를 변경한다
특정 번호 학생에 대한 이름을 변경한다
특정 번호 학생에 대한 점수 정보를 변경한다
번호가 PRIMARY KEY이기 때문에 특정 대상을 수정할 때는 반드시 번호가 필요하다. 여러 학생을 동시에 고치는 행위는 일반적이지 않으므로 번호를 수정하는 경우가 없도록 해야 한다.
특정 번호 학생에 대한 모든 정보를 변경하는 SQL 구문은 다음과 같다.
구문에서 변할 수 있는 정보는 이름, 국어점수, 영어점수, 수학점수, 번호이다. 해당 정보들은 자바에서 입력받고 구문에 합성하여 DBMS에서 처리할 수 있도록 프로그램을 구성해야 한다.
DriverManagerDataSource와 JdbcTemplate을 먼저 준비하고 수정을 위한 데이터를 준비한다.
Scanner를 이용하여 입력 받을 경우의 코드는 다음과 같다.
준비한 데이터를 설정할 수 있도록 구문과 배열을 준비한다. 주의할 점은 구문에 작성된 홀더(?)와 동일한 순서로 배열의 데이터가 존재해야 한다는 것이다.
구문과 데이터를 JdbcTemplate에게 전달하여 실행을 지시한다. 단, 조건에 따라 수정된 데이터가 없을 수도 있으므로 결과를 받아서 확인해야한다.
결과에 따라 성공/실패 여부를 사용자에게 출력한다.
완성 코드
삭제(DELETE)
삭제는 PRIMARY KEY를 이용하여 한 개의 데이터를 삭제하는 것이 일반적이다.
DriverManagerDataSource와 JdbcTemplate을 먼저 준비하고 삭제를 위한 데이터를 준비한다.
다음과 같이 Scanner로 입력 처리할 수 있다.
데이터를 설정할 구문과 배열을 준비한다.
JdbcTemplate에게 구문과 배열을 전달하며 실행을 명령한다. 실행 후 실제로 삭제된 개수를 알아야 사용자에게 성공과 실패를 알려줄 수 있으므로 반환값을 int 형태의 변수에 저장한다.
결과에 따라 사용자에게 성공/실패 여부를 출력한다.
완성 코드
조회(SELECT)
조회는 등록, 수정, 삭제와 구문의 목적과 명령이 다르다. 조회의 목적은 데이터베이스 테이블의 데이터를 프로그램으로 가져오는 것이다. 하지만 데이터베이스 테이블은 표 형태를 가지고 있고, 자바에서는 객체 형태로 표현해야 하기 때문에 변환이 필요하다. 예를 들어서 다음과 같은 테이블이 있을 경우 자바에서는 다섯 개의 객체가 있다고 본다.
데이터베이스 테이블
1
피카츄
73
79
78
2
라이츄
57
69
80
3
파이리
93
82
80
4
꼬부기
99
51
74
5
버터플
85
98
67
자바(객체 지향) 관점
1번 학생(no=1,name=피카츄,korean=73,english=79,math=78)
2번 학생(no=2,name=라이츄,korean=57,english=69,math=80)
3번 학생(no=3,name=파이리,korean=93,english=82,math=80)
4번 학생(no=4,name=꼬부기,korean=99,english=51,math=74)
5번 학생(no=5,name=버터플,korean=85,english=98,math=67)
따라서 데이터베이스를 객체로 변환하고 List에 저장하여 순서를 유지하도록 관리하는 것이 자바에서 의미 있는 데이터로 사용하는 방법이라고 볼 수 있다.
이를 위해서 데이터베이스의 한 줄을 저장하기 위한 클래스를 설계한다. 이를 DTO(Data Transfer Object)라 부른다.
그리고 조회 결과를 StudentDto에 어떻게 복사할 것인지 알려주기 위한 클래스가 필요하며 이를 RowMapper<T> 라고 부른다.
RowMapper<T>는 함수형 인터페이스이기 때문에 Lambda 표현이 가능하다.
위 두 가지가 준비되었다면 동일하게 DriverManagerDataSource와 JdbcTemplate을 준비하여 query 메소드를 실행하도록 코드를 구성한다. 반환형은 List<StudentDto> 형태이다.
반복문을 통해 출력을 수행한다.
완성 코드

Last updated