JDBC를 이용해서 프로그래밍을 하게 되면 반복적인 코드가 많이 발생합니다. 이러한 반복적인 코드는 개발자의 생산성을 떨어트리는 주된 원인이 됩니다. 이러한 문제를 해결하기 위해 등장한 것이 Spring JDBC입니다. 이번 시간에는 Spring JDBC에 대해 알아보도록 하겠습니다.
- Spring JDBC에 대한 개념을 이해합니다 - Spring JDBC의 핵심 클래스와 인터페이스에 대해 이해합니다
Spring JDBC 등장배경
항상 JDBC를 사용하기 위해서는 드라이버를 로딩하고 접속도 해야하고 Statement 객체도 얻어내야하고, 쿼리 문을 만들고 실행하고, 결과가 있다면 ResultSet 객체도 생성해서 저장한 다음 값을 꺼내야 했습니다. 그리고 객체를 열었던 순서의 반대로 모든 객체들을 닫아주는 작업들을 해야 했습니다. 이런 코드들이 한 번만 나오는 것이 아니라 매번 나오는 코드였습니다. 이런 반복적인 요소들을 개발자가 굉장히 지루해하고 생산성을 떨어뜨렸습니다.
개발하기 지루한 JDBC의 모든 저수준 세부사항을 스프링 프레임워크가 처리해줍니다. 다시 이야기하자면 반복적으로 나오는 코드는 프로그래머가 만들지 않고 Spring JDBC가 대신 만들어주는 것이죠. 그렇다면 개발자가 해야하는 일은 구체적으로 어떤 것들이 있을까요?
Spring JDBC 가 대신 해주는 일 vs 개발자가 해야 하는 일
실제 개발자들이 해야하는 일은 어떤 것인지 확인해보겠습니다.
어렵게 생각할 것이 없는게, 스프링 프레임워크는 클라이언트가 어떤 데이터베이스에 접속하게 할 것인지, 어떤 테이블에 쿼리문을 보내고 싶은 건지 이런 부분들은 알 수가 없습니다. 반드시 개발자가 알려줘야 하는 부분들만 개발하면 됩니다. 실제 정보를 가지고 자동으로 만들어낼 수 있는 부분들은 스프링 프레임워크가 대신 해주고 있습니다. 개발자가 하는 일들만 살펴보죠. 첫 번째, 연결 파라미터 정의는 '어떤 데이터베이스'에 접속할 것인지 등등의 정보들을 주게 됩니다. 두 번째, SQL 문은 스프링 프레임워크가 알아낼 수는 없습니다. 세 번째, 파라미터가 어떤 값들을 가지고 쿼리문을 수행할 것인지 스프링 프레임워크는 알 수 없습니다. 네 번째, 이터레이션에 대한 작업을 수행하는 부분은 스프링 프레임워크가 처리할 수 없습니다. 나머지 작업들은 스프링 프레임워크가 알아서 해주게 됩니다.
Spring JDBC 패키지 란?
이번에는 Spring Framework jdbc가 가지고 있는 패키지에 대해서 살펴보도록 하겠습니다.
첫 번째, core 패키지는 jdbc 템플릿과 다양한 콜백 인터페이스들을 포함하고 있고 추가로 여러가지 관련 클래스들을 포함하고 있습니다. 두 번째, datasource 패키지는 데이터소스의 접근을 쉽게 하는 utility 클래스와 자바 ee 컨테이너 외부에서 수정되지 않고 운영되는 jdbc 코드와 테스트에서 사용할 수 있는 간단한 데이터들을 가지고 있습니다. 세 번째, object 패키지는 rdbms 의 CRUD 프로시저를 스레드 세이프하고 재사용 가능한 객체로 나타내는 클래스를 포함하고 있습니다. 네 번째, support 패키지는 exception 변환 기능과 약간의 utility 기능들을 제공하고 있습니다. 이런 패키지들은 잘 알고 있으면 필요한 부분들을 찾아서 사용할 수 있습니다.
JdbcTemplate 란?
JdbcTemplate 은 core 패키지에서 가장 중요한 클래스입니다. 리소스 생성, 해지를 처리해서 연결을 닫는 것을 잊어버려서 발생하는 문제 등을 피할 수 있도록 합니다. 스테이트먼트(Statement)의 생성과 실행을 처리해줍니다. SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복호출 등을 실행할 수 있습니다. JDBC가 예외를 발생했을 경우에 org.springframework.dao 패키지에 정의되어 있는 일반적인 예외로 변환시켜 줍니다.
JdbcTemplate 예제 1
JdbcTemplate 첫 번째 예제는 Select 예제입니다.
위 쿼리문을 보면 테이블에서 모든 데이터의 개수를 세어주는 것임을 알 수 있습니다. JDBC에서 이런 과정을 처리하려면 굉장히 많은 코드들이 필요했었습니다. 그런데 이런 부분들이 jdbcTemplate 를 사용하면서 한 줄로 처리할 수 있는 것을 볼 수 있습니다.
JdbcTemplate 예제 2
JdbcTemplate 두 번째 예제는 Select 예제입니다.
위 쿼리문을 보면 Select 를 하는데 변수를 바인딩 하는 부분이 있습니다. (? 물음표를 활용하는 부분) 쿼리문을 항상 정해진 값으로 수행하는 것이 아니라 동적으로 동작하게 만들기 위해서는 where 조건문에 들어가는 값이 수행될 때마다 달라질 수 있는데요. 이럴 때 처리해주는 방법입니다. ? 물음표에 들어가는 값은 두 번째 파라미터에 넣어줍니다. 기존 JDBC 보다 훨씬 간단하게 실행할 수 있는 것을 볼 수 있습니다.
JdbcTemplate 예제 3
JdbcTemplate 세 번째 예제는 여러 건 Select 하기입니다. 한 건을 select 할 때는 queryForInt 를 사용했었는데요. 여러 건을 select 할 때는 queryForObject 를 사용합니다.
세 번째 매개변수로 들어간 값에 리턴 받을 타입을 적어주면 원하는 타입으로 리턴을 받을 수 있습니다.
JdbcTemplate 예제 4
JdbcTemplate 네 번째 예제는 한 행(한 건)을 select 하기 입니다.
한 행에는 여러 컬럼이 존재합니다. 해당 컬럼들을 원하는 객체에 매핑을 해주어야 하는데요. 이때 사용하는 객체가 RowMapper 라는 객체입니다. RowMapper 를 상속받는 이름 없는 객체를 이용해서 mapRow 라는 메서드를 오버라이딩 하는 것을 볼 수 있구요. 한 건의 결과가 ResultSet에 담겨 있기 때문에 해당 ResultSet 의 값을 actor 에 담아서 return 을 하고 있는 것을 볼 수 있습니다. 이렇게 실행하면 한 행의 데이터를 모아서 리턴을 시켜주게 됩니다.
JdbcTemplate 예제 5
JdbcTemplate 다섯 번째 예제는 여러 행(여러 건)을 select 하기 입니다.
한 건을 셀렉트 할 때랑 다른 점은 이때 실행되는 메서드는 query 라는 메서드를 실행하게 됩니다.
JdbcTemplate 예제 6
JdbcTemplate 여섯 번째 예제는 중복 코드 제거(1건 구하기와 여러 건 구하기가 같은 코드에 있을 경우) 하기입니다.
한 건 셀레트와 여러 건 셀럭트 모두 동일한 RowMapper 를 사용하는데요. 그 부분을 별도의 메서드로 추출함으로써 코드의 충돌을 막을 수 있습니다.
JdbcTemplate 예제 7
JdbcTemplate 일곱 번째 예제는 INSERT 예제입니다.
update 메서드를 사용하여 insert 와 update, delete 를 수행할 수 있습니다. 물음 표의 개수만큼 매개변수로 넣어주면 됩니다.
JdbcTemplate 예제 8
JdbcTemplate 여덟 번째 예제는 Update 예제입니다.
Insert 예제와 크게 다르지 않게 사용되고 있는 것을 확인할 수 있습니다.
JdbcTemplate 예제 9
JdbcTemplate 아홉 번째 예제는 Delete 예제입니다.
Insert 예제와 마찬가지로 크게 다르지 않게 사용되고 있습니다.
JdbcTemplate 외의 접근방법
JdbcTemplate 만 활용하더라도 기존의 JDBC 보다 훨씬 간편하게 JDBC를 작성할 수 있습니다. 하지만 위의 클래스들을 이용하면 조금 더 편안하게 프로그래밍할 수 있습니다.
NamedParameterJdbcTemplate 은 물음표 대신에 이름을 사용해서 바인딩할 수 있도록 해줍니다. 물음표가 여러개가 나오면 문자열로 된 이름이 혼돈을 줄여주는데, 이런 것을 구현한 클래스입니다.
SimpleJdbcTemplate 은 JdbcTemplate 과 NamedParameterJdbcTemplate 에서 가장 빈번하게 사용되는 작업을 합쳐 놓은 객체입니다.
SimpleJdbcInsert 는 좀 더 쉽게 Insert 작업을 수행할 수 있게 도와줍니다.
Spring JDBC 를 사용하는 이유
위에서 본 것처럼 Spring JDBC를 사용하면 기존 JDBC 보다 훨씬 더 간편하게 JDBC를 사용할 수 있게 됩니다.
수업을 마치며
다음 수업에서는 Spring JDBC의 장점들과 객체들에 대해서 실습을 통해서 알아보도록 하겠습니다.