본문 바로가기

Spring Framework

[Spring] JdbcTemplate

반응형

이번글은 Spring 프레임워크의 JdbcTemplate에 대해 알아 보려고 합니다. JdbcTemplate를 사용하는 목적과 사용방법에 대해 자세히 알아보겠습니다. 

 

JDBC 도식화(출처 : https://www.geeksforgeeks.org/spring-jdbc-template)

 

1. 변하는 것과 변하지 않는것

이전에 다뤘던 IoC/DI는 모듈간의 의존관계가 있을 때 스프링 컨테이너가 의존관계를 주입하는 방식이었습니다. 모듈간의 응집도는 높이고 다른 모듈간의 결합도는 낮추면서, 변화가 발생했을 때 하나의 모듈 내에서 집중되도록 하는 것이 중요한 목적이었습니다. 아래의 글은 IoC/DI에 대해 정리한 글이니 참고부탁드립니다!

 

[Spring] IoC/DI 컨테이너

이번 글은 스프링의 IoC/DI 개념에 대해 학습하고 정리하는 글을 적어보려고 합니다. 글의 전개 방향은 간단한 예제를 반복적인 리팩터링을 거치면서 IoC/DI의 의미와 중요성을 체감할 수 있도

jminc00.tistory.com

여기서 중요한 점은 "변화"에 대응하기 위한 조치에 대해 생각했다는 점입니다. 즉, 변화가 발생했을 때 모듈간의 결합도를 낮추면서 다른 모듈에 영향을 미치지 않도록 코드를 설계하는 것의 중요성을 알 수 있었습니다. 

 

템플릿은 그 와 반대되는 개념입니다. 템플릿은 "변하지 않는것" 을 따로 모듈로 분리해서 재사용 가능하도록 하도록 코드를 설계하는 기술을 의미합니다. 

 

 

예를 들어 Dao에서 특정 사용자 정보를 조회하는 간단한 코드를 작성하는 상황이 있습니다. 사용자 정보를 조회하는 로직 이외에 꼭 필요한 선/후행 작업들이 존재하는 데 다음과 같습니다.

 

1. Connection, PreparedStatement, ResultSet 객체를 생성한다.
2. datasource로 DB 커넥션을 가져온다. 
3. 쿼리를 실행하고 DB 조회 결과를 ResultSet객체에 저장한다.
4. 예외가 발생할 수 있으므로 예외 처리 로직을 작성한다.
5. 사용한 리소스(Connection, PreparedStatement, ResultSet)를 돌려준다.

 

사용자의 정보를 조회하기 위해서 5가지의 선/후행 작업들이 필요하고 DAO가 요구하는 비즈니스 로직이 늘어날 수록 해당 작업은 중복해서 발생하게 될 것입니다. (100개의 비즈니스 로직이 존재할때 현재의 코드를 그대로 사용한다고 가정하면 500개의 중복된 코드가 존재할 것입니다. 만약 DB connection을 위한 로직이 수정된다면? 수정해야할 양이 매우 많아 지겠네요?)

 

해당 코드의 특징은 고정되어 있고 변하지 않으려는 성질이 있다는 것입니다. 때문에 이런 코드는 독립적으로 분리해서 사용하는 것이 더 깔끔하고 효율적으로 사용할 수 있습니다. 이런 코드의 모듈화 결과를 템플릿(template)이라고 합니다.

이 문제에서 핵심은 변하지 않는, 그러나 많은 곳에서 중복 되는 코드와 로직에 따라 자꾸 확장되고 자주 변하는 코드를 잘 분리하는 작업입니다.(템플릿 부분과 사용자 정보 조회 쿼리를 분리)

 

2. JdbcTemplate

이제는 스프링에서 제공하는 템플릿 기능에 대해 정리해보려고합니다.  스프링의 JdbcTemplate은 자바의 JDBC를 위한 기능을 제공합니다. JdbcTemplate의 기능을 정리하자면 다음과 같습니다.

 

1. SQL 쿼리 실행
2. 명령문 및 저장 프로시저 호출을 업데이트
3. ResultSet으로 반환된 매개변수 값을 추출
4. JDBC 예외를 포착하여 org.springframework.dao 패키지에 정의된 예외처리 담당

 

2-1. 조회(select)

JdbcTemplate가 제공하는 첫번째 기능은 "조회"입니다. 

 

 

queryForObject() 메서드를 사용함으로써 조회하고자하는 정보를 가져와서 select가 반환하는 데이터 타입에 맞게 자동으로 Object 타입 변수를 반환해 줍니다. 파라미터는 쿼리에 들어가는 "?"의 순서에 맞게 작성합니다. 

 

 

리스트 형태로 데이터를 반환하는 경우도 위의 코드에서 사용한 람다 표현식을 사용해서 조회할 수 있습니다. 

 

2-2. 생성, 수정, 삭제 (insert, update, delete)

JdbcTemplate가 제공하는 두번째 기능은 "생성, 수정, 삭제" 입니다. 

 

 

생성, 수정, 삭제를 위한 함수는 모두 update() 메서드를 사용합니다. 파라미터는 마찬가지로 수행할 쿼리와 쿼리에 전달할 파라미터를 순서대로 대입합니다. 

 

2-3. 기타 JdbcTemplate 작업

 

 

CRUD 기능외의 쿼리를 수행하기 위해서는 execute() 내에 쿼리를 파라미터로 전달 함으로써 쿼리를 실행할 수 있습니다. 

 

JdbcTemplate의 장점은 JDBC를 위한 템플릿을 위해 따로 클래스를 작성하지 않아도 된다는 점입니다.(스프링이 제공하는 템플릿 기능이 잘 되어 있다면 안정성, 호환성, 성능의 측면에서 모두 우수한 JdbcTemplate 을 쓰지 않을 이유가 없겠죠?)

 

때문에 저희는 안전하고 간결한 코드로 템플릿과 관련된 로직을 설계할 수 있습니다. 이번 글에서는 템플릿을 작성하는 이유와 스프링에서 제공하는 JdbcTemplate에 대해 간단히 알아봤습니다. 수정할 부분이 있다면 댓글로 남겨주세요!

반응형

'Spring Framework' 카테고리의 다른 글

[Spring] PSA(Portable Service Abstraction)  (1) 2022.11.05
[Spring] 예외를 처리하는 방법  (0) 2022.11.01
[Spring] TDD란?  (0) 2022.10.14
[Spring] IoC/DI 컨테이너  (0) 2022.10.12
[Spring] Gradle vs Maven  (2) 2022.09.25