심화/Spring

[Spring] JDBC란 무엇일까?

annovation 2025. 9. 30. 09:08

JDBC(Java Database Connectivity)

 

💡등장배경

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

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

JDBC

  • 이러한 문제를 해결하기위해 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