JDBC(Java Database Connectivity)
💡등장배경

- 애플리케이션 서버에서 DB에 접근하려면 기본적으로 다음 과정이 필요하다
- 우선 DB에 연결하기 위해 커넥션을 연결해야한다.
- SQL을 작성한 후 커넥션을 통해 SQL을 요청한다.
- 요청한 SQL에 대한 결과를 응답 받는다.

- 여기서 기존에 사용하던 MySQL 서버를 PostgresSQL로 변경하고자할 때, 문제가 발생한다.
- MySQL과 PostgreSQL은 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법 모두 다를 수 있기 때문에, 애플리케이션 서버에서 작성했던 DB 연결 로직들을 전부 수정해야한다.

- 이러한 문제를 해결하기위해 JDBC 표준 인터페이스가 등장했다.
💡JDBC란?
- JDBC(Java Database Connectivity)는 Java Database Connectivity로 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
- 개발자는 공통 API만 사용 → DB별 차이는 JDBC 드라이버가 처리
- DB 회사들은 자신들의 DB에 맞도록 JDBC 인터페이스를 구현한 후 라이브러리로 제공하는데 이를 JDBC 드라이버라 부른다.
👉 따라서 MySQL 드라이버 대신 PostgreSQL 드라이버만 교체하면, 애플리케이션 코드를 크게 수정하지 않고 DB 변경이 가능하다.
JDBC Template
💡등장배경

- JDBC의 등장으로 손쉽게 DB교체가 가능해졌지만 아직도 DB에 연결하기 위해 여러가지 작업 로직들을 직접 작성해야한다.
- 이러한 불편함을 해결하기 위해 커넥션 연결, statement 준비 및 실행, 커넥션 종료 등의 반복적이고 중복되는 작업들을 대신 처리해주는 JdbcTemplate이 등장했다.
💡JdbcTemplate이란?
- JDBC의 반복적인 코드(커넥션 열기/닫기, Statement 준비, 예외 처리)를 자동으로 처리
JDBC Template 사용방법
💡JdbcTemplate 주입
1️⃣ application.properties에 DB에 접근하기 위한 정보를 작성한다.
- application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/memo
spring.datasource.username=root
spring.datasource.password={비밀번호}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2️⃣ build.gradle에 JDBC 라이브러리와 MySQL을 등록한다.
- build.gradle -> dependencies

// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
3️⃣ DB연결이 필요한 곳에서 JdbcTemplate을 주입받아와 사용한다.
private final JdbcTemplate jdbctemplate;
public MemoRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
- 생성자의 파라미터를 통해 JdbcTemplate 객체가 자동으로 넘어와 jdbctemplate 변수에 저장됩니다. (뒤에서 배울 Spring Bean에 관한 내용)
💡JdbcTemplate 사용 방법
1️⃣ INSERT
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");
- INSERT SQL을 작성해 String 변수에 저장
- 이때, 넣고자 하는 데이터 부분에 ?를 사용하면 유동적으로 데이터를 넣어줄 수 있다.
- jdbcTemplate.update()
- INSERT, UPDATE, DELETE 와 같이 생성, 수정, 삭제에 사용될 수 있는데 첫 번째 파라미터로 SQL을 받고 그 이후에는 ?에 들어갈 값을 받는다.
2️⃣ UPDATE
String sql = "UPDATE memo SET username = ? WHERE id = ?";
jdbcTemplate.update(sql, "Robbert", 1);
- UPDATE SQL을 작성해 String 변수에 저장한 후 update() 메서드 첫 번째 파라미터에 넣어준다.
- 이때, 넣고자 하는 데이터 부분에 ?를 사용하면 유동적으로 데이터를 넣어줄 수 있다.
3️⃣ DELETE
String sql = "DELETE FROM memo WHERE id = ?";
jdbcTemplate.update(sql, 1);
- DELETE SQL을 작성해 String 변수에 저장한 후 update() 메서드 첫 번째 파라미터에 넣어준다.
- 이때, 넣고자 하는 데이터 부분에 ?를 사용하면 유동적으로 데이터를 넣어줄 수 있다.
4️⃣ SELECT
String sql = "SELECT * FROM memo";
return jdbcTemplate.query(sql, new RowMapper<MemoResponseDto>() {
@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
Long id = rs.getLong("id");
String username = rs.getString("username");
String contents = rs.getString("contents");
return new MemoResponseDto(id, username, contents);
}
});
- SELECT SQL을 작성해 String 변수에 저장한 후 query() 메서드 첫 번째 파라미터에 넣어준다.
- SELECT의 경우 결과가 여러 줄로 넘어오기 때문에 RowMapper를 사용하여 한 줄씩 처리 할 수 있다.
- RowMapper는 인터페이스 이기 때문에 익명 클래스를 구현하여 처리한다.
- 오버라이딩 된 mapRow 메서드는 제네릭스에 선언한 MemoResponseDto 타입으로 데이터 한 줄을 변환하는 작업을 수행한다.
- 이렇게 한 줄씩 변환된 내용이 Java의 객체로 변환된다.
- DB의 1행(row) 을 꺼내서
- 그 값들을 이용해 MemoResponseDto 객체 하나를 만들어 반환
출처
https://teamsparta.notion.site/1-22-JDBC-2252dc3ef51481919eddfe46b0ad1c7c
챕터1-22 : JDBC란 무엇일까? | Notion
애플리케이션 서버와 데이터베이스는 어떻게 소통해야 할까요?
teamsparta.notion.site
'심화 > Spring' 카테고리의 다른 글
| [Spring] IoC Container와 Bean (0) | 2025.10.02 |
|---|---|
| [Spring] IoC(제어의 역전), DI(의존성 주입) (0) | 2025.10.01 |
| [Spring] MySQL과 IntelliJ 연동하기 (Mac) (0) | 2025.09.29 |
| [Spring] DTO란? (0) | 2025.09.26 |
| [Spring] HTTP 데이터를 객체로 처리하는 방법 (0) | 2025.09.25 |