JDBC란?
JDBC (Java DataBase Connectivity)
Java 표준 API로 , SQL 쿼리를 실행하고 결과를 가져오는 등의 데이터베이스 관련 작업을 수행하도록 하는 인터페이스와 클래스들의 집합
Java를 사용하여 DB와 상호작용하기 위해 가장 오래 & 널리 사용된 Java의 표준 API이다.
JDBC만 사용하여 데이터베이스와 상호작용하는 것은 가능하지만, 다음과 같은 문제점이 생긴다.
- 예외처리가 번거롭다. SQLException 예외 처리를 위해 Try-Catch 블록을 여러 곳에 작성해야 한다.
- Connection, Statement, ResultSet 객체를 사용한 뒤 반드시 close() 메서드를 호출하여야 한다. 이처럼 자원 누수를 방지하기 위해 많은 자원 관리 코드를 작성해야 한다.
- 쿼리 작성의 반복성. SQL쿼리를 직접 작성해야 하기 때문에 같은 유형의 SQL 쿼리나 DB 작업을 여러번 수행할 경우 반복적인 코드가 많아진다.
Spring JDBC란?
Spring JDBC는 JDBC 작업을 더 쉽게 도와준다.
JDBC 작업을 추상화한 계층을 제공하여 기본적인 JDBC 템플릿을 통해 반복적인 코드나 예외 처리, 자원 관리와 같은 기본 작업들을 대신 처리해준다.
- `JdbcTemplate`클래스를 기반으로 다양한 클래스들을 제공한다.
주요 클래스 (Core Classes)
JdbcTemplate
central & lowest-level 클래스로, 다른 데이터베이스 접근 클래스들은 모두 JdbcTemplate을 내부적으로 사용한다.
Connection 생성과 종료, statement 생성과 실행과 같은 기본적인 JDBC 작업들을 수행한다.
- SQL 쿼리를 실행한다. 결과를 ResultSet 형태로 받아온다. (ex. query() 메서드)
- UPDATE, INSERT, DELETE와 같은 DML문을 실행한다. (ex. update() 메서드)
- 저장 프로시저를 호출한다. (ex. call() 메서드)
- ResultSet을 순회하면서 쿼리 결과를 처리하는 작업을 할 수 있다. (ex. RowMapper 인터페이스 사용)
private final RowMapper<Actor> actorRowMapper = (resultSet, rowNum) -> {
Actor actor = new Actor();
actor.setFirstName(resultSet.getString("first_name"));
actor.setLastName(resultSet.getString("last_name"));
return actor;
};
public List<Actor> findAllActors() {
return this.jdbcTemplate.query("select first_name, last_name from t_actor", actorRowMapper);
}
- SQLException과 같은 JDBC 예외를 처리하고 더 구체적인 Spring Exception으로 변환한다.
(+) 유사하지만 파라미터에 `?` 대신 이름을 정해 삽입할 수 있는 기능을 제공하는 클래스로 `NamedParameterJdbcTemplate`이 존재한다.
사용 방법
@Repository
public class JdbcTemplateTodoRepository implements TodoRepository {
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateTodoRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// 기타 메서드 ...
}
- JdbcTemplate을 사용하는 클래스에 `@Repository` 어노테이션을 단다.
- Srping 빈으로 등록된다.
- 의존성 주입을 위한 컴포넌트 스캔 대상이 된다.
- JdbcTemplate을 생성할 때, `DataSource`를 주입받도록 한다. (생성자 파라미터로 명시 / 혹은 @Autowired)
- Spring Boot는 `applicaiton.properties` 또는 `application.yml`에 데이터베이스 관련 설정이 존재하면 해당 설정을 기반으로 DataSource 빈을 자동 생성한다.
- 수동으로 생성하고싶을 경우, `@Configuration` 클래스에서 `@Bean`을 사용하여 직접 정의할 수 있다.
* 기타 내용은 공부 후 차후 추가 예정
'Back-End > Spring' 카테고리의 다른 글
[Spring] ResponseBody와 ResponseEntity (0) | 2022.03.28 |
---|---|
[Spring] 싱글톤객체 / 자동 의존 주입 / 컴포넌트 스캔 (0) | 2022.03.25 |
[Spring] 의존 주입 (0) | 2022.03.25 |