16. JDBC란 무엇일까?

2026. 2. 11. 23:31·BackEnd/내일배움캠프

JDBC란 무엇일까?

애플리케이션 서버를 개발하다 보면 필수적으로 데이터베이스와 통신해야 한다.
Java 진영에서 이 역할을 담당하는 표준 기술이 바로 JDBC이다.

JDBC는 Java Database Connectivity의 약자로, 자바 애플리케이션과 관계형 데이터베이스(RDBMS)를 연결해주는 표준 API이다.


1. JDBC의 역할

JDBC는 자바 코드에서 SQL을 실행하고, 그 결과를 자바 객체로 받아올 수 있게 해준다.

동작 흐름은 다음과 같다.

  1. 자바 애플리케이션이 JDBC API를 호출한다.
  2. JDBC Driver가 실제 데이터베이스와 통신한다.
  3. SQL 실행 결과를 자바 객체(ResultSet) 형태로 반환한다.

즉, JDBC는 자바와 데이터베이스 사이의 다리 역할을 한다.


2. JDBC Driver란 무엇인가?

JDBC는 인터페이스(표준)일 뿐이고, 실제 데이터베이스와 통신하는 구현체는 각 DB 벤더가 제공하는 Driver이다.

예를 들어:

  • MySQL → mysql-connector-java
  • PostgreSQL → postgresql 드라이버
  • Oracle → ojdbc

데이터베이스를 MySQL에서 PostgreSQL로 변경하더라도,
애플리케이션 코드를 크게 수정할 필요 없이 Driver와 설정만 변경하면 된다.

Gradle 예시:

// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'

 

그리고 application.yml 또는 application.properties에 접속 정보만 변경하면 된다.

이것이 JDBC의 가장 큰 장점 중 하나이다.
자바 애플리케이션과 DB 사이에 표준 계층이 존재하기 때문에 DB 교체가 비교적 수월하다.


3. 순수 JDBC의 한계

JDBC를 직접 사용할 경우 다음과 같은 반복 작업이 발생한다.

  • Connection 생성
  • PreparedStatement 생성
  • SQL 실행
  • ResultSet 매핑
  • 자원 해제

코드가 길어지고, 예외 처리도 복잡해진다.
이러한 불편함을 줄이기 위해 등장한 것이 Spring의 JdbcTemplate이다.


4. JdbcTemplate이란?

JdbcTemplate은 Spring에서 제공하는 JDBC 추상화 클래스이다.

  • Connection 관리 자동 처리
  • 예외 처리 일관성 제공
  • 반복 코드 제거

개발자는 핵심 로직(SQL과 매핑)에만 집중할 수 있다.

주요 메서드:

  • update() → insert, update, delete
  • query() → select (다중 결과)
  • queryForObject() → select (단일 결과)

5. JdbcTemplate 예제 코드 분석

다음은 간단한 메모 CRUD 예제이다.

1) 메모 생성

@PostMapping("/memos")
public MemoResponseDto createMemo(@RequestBody MemoRequestDto requestDto) {

    Memo memo = new Memo(requestDto);

    KeyHolder keyHolder = new GeneratedKeyHolder();

    String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
    jdbcTemplate.update(con -> {
        PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        ps.setString(1, memo.getUsername());
        ps.setString(2, memo.getContents());
        return ps;
    }, keyHolder);

    Long id = keyHolder.getKey().longValue();
    memo.setId(id);

    return new MemoResponseDto(memo);
}

핵심 포인트:

  • ? 바인딩을 통해 SQL Injection 방지
  • GeneratedKeyHolder를 통해 auto increment PK 반환
  • DTO → Entity → ResponseDto 흐름 유지

2) 메모 조회

@GetMapping("/memos")
public List<MemoResponseDto> getMemos() {
    String sql = "SELECT id, username, contents FROM memo";

    return jdbcTemplate.query(sql, (rs, rowNum) ->
        new MemoResponseDto(
            rs.getLong("id"),
            rs.getString("username"),
            rs.getString("contents")
        )
    );
}
  • query()는 여러 행을 반환
  • RowMapper를 통해 ResultSet → DTO 변환
  • 람다식을 사용하면 코드가 훨씬 간결해진다

3) 수정

 
@PutMapping("/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {

    String sql = "UPDATE memo SET username = ?, contents = ? WHERE id = ?";
    int updated = jdbcTemplate.update(sql,
            requestDto.getUsername(),
            requestDto.getContents(),
            id);

    if (updated == 0) {
        throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
    }

    return id;
}

기존 코드에서는 먼저 select로 존재 여부를 확인했지만,
실제로는 update 결과 행 개수로 판단하는 것이 더 효율적이다.


4) 삭제

@PutMapping("/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {

    String sql = "UPDATE memo SET username = ?, contents = ? WHERE id = ?";
    int updated = jdbcTemplate.update(sql,
            requestDto.getUsername(),
            requestDto.getContents(),
            id);

    if (updated == 0) {
        throw new IllegalArgumentException("선택한 메모는 존재하지 않습니다.");
    }

    return id;
}

update()는 영향을 받은 행 개수를 반환한다는 점이 중요하다.


6. 객체와 테이블 매핑 개념

RDBMS와 자바 객체의 관계는 다음과 같다.

  • 테이블 1개 ↔ 클래스 1개
  • 행(row) 1개 ↔ 객체 1개
  • 컬럼(column) 1개 ↔ 필드 1개

하지만 JDBC는 단순히 데이터를 옮겨줄 뿐, 객체 매핑을 자동으로 해주지는 않는다.
개발자가 직접 RowMapper로 변환해야 한다.

이러한 불편함을 해결하기 위해 등장한 기술이 ORM이다.


7. JDBC와 ORM의 차이

JDBC (또는 JdbcTemplate)

  • SQL을 직접 작성
  • 명확하고 제어가 쉬움
  • 세밀한 튜닝 가능
  • 코드량이 많아질 수 있음

ORM (JPA, Hibernate)

  • 객체 중심 개발
  • SQL 자동 생성
  • 생산성 높음
  • 내부 동작 이해 없으면 성능 문제 발생 가능

결론적으로:

  • 단순 조회나 복잡한 쿼리 → JDBC가 유리할 수 있음
  • 도메인 중심 설계, 생산성 중요 → ORM이 유리

실무에서는 두 방식을 함께 사용하는 경우도 많다.


8. 정리

JDBC는 자바와 관계형 데이터베이스를 연결해주는 표준 API이다.

  • JDBC는 인터페이스이고, 실제 통신은 Driver가 담당한다.
  • DB를 변경하더라도 Driver와 설정만 교체하면 된다.
  • 순수 JDBC는 반복 코드가 많다.
  • Spring의 JdbcTemplate은 이를 간결하게 만들어준다.
  • JDBC는 SQL 중심 개발 방식이다.
  • ORM은 객체 중심 개발 방식이다.

JDBC를 이해하면 ORM의 동작 원리도 더 깊이 이해할 수 있다.
데이터 접근 기술의 기본은 결국 JDBC이기 때문이다.

'BackEnd > 내일배움캠프' 카테고리의 다른 글

글을 올리지 않은 이유  (0) 2026.03.13
17. 숙제 및 해설  (0) 2026.02.11
15. SQL  (0) 2026.02.11
14. Database  (0) 2026.02.10
13-2. Update, Delete 구현하기  (0) 2026.02.10
'BackEnd/내일배움캠프' 카테고리의 다른 글
  • 글을 올리지 않은 이유
  • 17. 숙제 및 해설
  • 15. SQL
  • 14. Database
JK-LEE98
JK-LEE98
백엔드 개발자
  • JK-LEE98
    JK-LEE98
    JK-LEE98
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 나의 지식 공유 (4)
      • SQL (4)
      • PS (10)
      • BackEnd (32)
        • Java (3)
        • Spring (4)
        • 내일배움캠프 (20)
        • 프로그래머스 데브코스 (5)
      • 건강한 나 되기🍀 (10)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
JK-LEE98
16. JDBC란 무엇일까?
상단으로

티스토리툴바