[Spring] JDBC(Java Database Connectivity)

2025. 12. 20. 21:57·Spring

JDBC(Java Database Connectivity)

JDBC는 Java Database Connectivity로 Java 애플리케이션이 데이터베이스와 통신할 수 있도록 도와주는 표준 API이다. DB마다 사용하는 프로토콜과 방식이 다르기 때문에 Java 프로그램이 DB와 직접 대화가 불가능하다. 그래서 자바에서는 공통된 규칙을 만들어 두고 DB마다 그 규칙을 구현한 드라이버를 사용한다. 그리고 그 공통 규칙이 JDBC이다. 

https://hudi.blog/java-db-connection-pooling/

구조는 위 사진과 같다. 여기서 핵심 포인트는 

⭐ JDBC는 인터페이스이다. 실제 DB와 통신하는 코드는 JDBC Driver가 담당한다. DB가 달라도 JDBC API는 동일하게 사용한다. 
-> 그래서 DB를 MySQL에서 PostgreSQL로 바꿔도 자바 코드의 큰 구조는 거의 바뀌지 않는다. 

JDBC 동작 흐름 

JDBC로 DB 작업을 할 때는 항상 비슷한 흐름을 따른다. 

 

1) JDBC 드라이버 로딩 

2) DB 연결 

3) SQL 실행 

4) 결과 처리 

5) 자원 해제 


예시 코드 

1) DB 연결

  • Connection은 DB와의 연결 통로 
  • 연결에 성공하면 이후 SQL을 실행할 수 있다. 
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "1234";

Connection connection = DriverManager.getConnection(url, user, password);

2) SQL 실행 

`PreparedStatement`을 사용하는 이유 

  • SQL Injection 방지 
  • 가독성 및 성능 측면에서 유리 
String sql = "SELECT id, name FROM member WHERE id = ?";

PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 1);

 

3) 결과 조회

  • ResultSet은 쿼리 결과 집합 
  • `rs.next()`로 한 행씩 조회 
ResultSet rs = pstmt.executeQuery();

while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");

    System.out.println(id + " " + name);
}

 

4) 자원 해제 

자원 해제는 반드시 필요한 작업이다. 

rs.close();
pstmt.close();
connection.close();

JDBC의 단점 

일단 반복되는 코드가 너무 많다. 그리고 SQL과 자바 코드가 섞여 복잡해진다. 그리고 객체와 테이블 매핑이 불편하다. 

그래서, 순수 JDBC는 거의 직접 쓰지 않는다. JPA나 Spring JDBC (JdbcTemplate)을 사용한다. 하지만 중요한 점은 Spring JDBC도, JPA도 내부적으로는 JDBC를 사용한다.


Spring JdbcTemplate란? 

반복되는 JDBC 코드를 없애준 도구이다. 

JDBC를 사용하면 항상 반복되는 코드가 있다. (Connection 생성, PreparedStatement 생성, ResultSet 처리, 예외 처리, 자원 해제 ...) 하지만 매번 다른 부분은 사실 SQL과 결과 처리 부분이다. 그래서 Spring JdbcTemplate은 이런 반복되는 것들 대신 핵심 로직에만 집중하게끔 도와주는 템플릿 클래스이다. 

-> Spring에서 JDBC 사용을 단순화해주는 템플릿 클래스 

Spring JdbcTemplate의 동작 구조 

JdbcTempalte도 결국 JDBC를 사용한다. 차이점은 '누가 관리하는가' 이며, JDBC는 개발자가 JdbcTemplate은 Spring이 관리한다. 


예시 코드

1) 의존성 주입

@Autowired
private JdbcTemplate jdbcTemplate;

 

2) 조회 쿼리 

String sql = "SELECT id, name FROM member";

`RowMapper` 사용 

  • ResultSet 한 줄을 객체로 변환하는 역할 
  • 객체 매핑 책임을 분리할 수 있음 
List<Member> members = jdbcTemplate.query(sql, (rs, rowNum) ->
    new Member(
        rs.getLong("id"),
        rs.getString("name")
    )
);

 

3) 단건조회 

String sql = "SELECT id, name FROM member WHERE id = ?";

Member member = jdbcTemplate.queryForObject(
    sql,
    (rs, rowNum) -> new Member(
        rs.getLong("id"),
        rs.getString("name")
    ),
    1
);

JdbcTemplate의 장점 및 한계 

장점은 개발자는 SQL만 짜면 되고 다른 것들은 다 스프링에서 하게끔 지원하는 것이다. 그러나, 이 JdbcTemplate도 완벽하지는 않다. SQL을 직접 작성해야 하며 테이블과 객체 매핑은 수동으로 해야한다.

-> 이런 테이블과 객체 매핑을 자동으로 해주는 것은 JPA가 있다. 

'Spring' 카테고리의 다른 글

[Spring] 액츄에이터 (Actuator)  (0) 2025.12.18
[Spring] @RequestBody JSON 바인딩 원리  (0) 2025.11.28
[Spring] Spring AI와 LangChain4j 비교  (0) 2025.11.24
[Spring] 임베디드 타입 (@Embeddable, @Embedded)  (0) 2025.11.10
[Spring] Lombok 이해하기 - @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor  (0) 2025.11.04
'Spring' 카테고리의 다른 글
  • [Spring] 액츄에이터 (Actuator)
  • [Spring] @RequestBody JSON 바인딩 원리
  • [Spring] Spring AI와 LangChain4j 비교
  • [Spring] 임베디드 타입 (@Embeddable, @Embedded)
erika0915
erika0915
백엔드 개발자가 되고 싶어요 .
  • erika0915
    erikoding
    erika0915
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • 프로젝트 (13)
        • 끼니콩 (3)
        • 덕메랑 (3)
        • handDoc (7)
        • Haeil (0)
      • Java (9)
        • 클린코더스 (0)
      • Spring (30)
      • Redis (3)
      • CS (7)
        • 운영체제 (3)
        • 컴퓨터구조 (0)
        • 네트워크 (4)
      • DevOps (2)
      • 코딩테스트 (0)
      • Tech (14)
        • TDD (1)
        • 정리 (5)
        • 우테코 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    몽고디비
    docker
    자바
    MongoDB
    AI
    CoolSMS
    지라
    git
    스프링부트
    Spring
    네트워크
    깃
    java
    깃허브
    springboot
    jira
    TDD
    코드레빗
    도커
    Network
    promtail
    github
    레디스
    redis
    파인튜닝
    스프링
    OS
    STT
    운영체제
    coderabbit
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
erika0915
[Spring] JDBC(Java Database Connectivity)

티스토리툴바