개발/java

[Spring - DB] 1. JDBC 이해

ebang 2024. 1. 7. 21:19
반응형

본 글은 Spring Database 관리에 관한 강의를 수강한 후 작성한 정리입니다. 

JDBC, Java Database Connectivity를 통해 다양한 Database 들을 사용함에도 불구하고 일관된 접근을 할 수 있게 되었다는 점이 인상적입니다. 

 

1. JDBC 이해

  • Java Database Connectivity
  • 클라이언트, 즉 브라우저는 보통 애플리케이션에 특정 작업이나 리소스를 요청하고, 애플리케이션 서버가 데이터베이스에 접근한다.
  • 애플리케이션 서버가 데이터베이스를 사용하기 위해서 진행하는 절차
    1. 커넥션 연결 : 주로 TCP/IP 사용
    2. SQL 전달 : 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 커넥션을 통해 DB 로 전달
    3. 결과 응답
  • 예전에는 데이터베이스마다 위의 방법의 구현 방식이 모두 달랐다.
    - 다른 종류의 데이터베이스로 변경 시 코드도 변경
  • JDBC 의 등장
    • Java Database Connectivity
    • Connection, statement, resultSet 이라는 표준 인터페이스를 통해, 각 DB 회사가 해당 인터페이스를 구현한다음 Mysql JDBC driver, Oracle JDBC Driver 등 드라이버의 형태로 제공하도록 했다.
    • 드라이버를 이용해 각 DB에 접근하되, 드라이버가 표준 인터페이스를 따르기 때문에 DB 들의 접근 방식을 통일한 것이다.
    • jdbc 가 해결한 문제
      • DB 연결 구현 방법: JDBC 인터페이스에 대해서만 코드를 작성하면 되므로, DB 가 달라져도 코드가 달라지지 않아도 된다.
      • DB 마다 연결, 요청 방식을 모두 학습하지 않아도 됨.
    • 표준화의 한계
      • 각각의 데이터베이스마다 SQL, 데이터 타입 등 사용법이 다르다.
      • ANSI SQL 이라는 표준이 있기는 하지만 일반적인 부분만 공통화했기 때문에 한계가 있다. (대표적 : 페이징 SQL 은 DB마다 다름)
      • 결국 데이터베이스를 변경하면 JDBC 코드는 변경하지 않아도 되지만 SQL은 해당 데이터베이스에 맞도록 변경해야 하는 것
      • 참고 : JPA (Java Persistent API)를 사용하면, 각각의 데이터베이스마다 다른 SQL을 정의해야하는 문제를 많이 해결할 수 있다.

2. JDBC와 최근 데이터 접근 기술

  • JDBC 를 편리하게 사용하는 다양한 기술이 존재한다.
    • SQL Mapper, ORM 기술
  • SQL Mapper
    • SQL 을 SQL Mapper에 전달(MyBatis, Jdbc Template)
    • SQL 응답 결과를 객체로 편리하게 변환해준다.
    • JDBC의 반복 코드를 제거해준다.
    • 단점 : 개발자가 직접 SQL을 작성해야 한다.
    • 대표 기술: 스프링 JdbcTemplate, MyBatis
  • ORM 기술
    • ORM: 객체와 관계형 데이터 베이스를 매핑해주는 기술. 객체를 JPA 에 전달하면, 맞는 SQL문을 동적으로 작성하여 JDBC에 SQL문을 전달한다.
    • JPA는 그러한 ORM 기술의 자바 진영에서의 인터페이스이며, 하이버네이트, 이클립스링크가 그 구현체로써 존재한다.
  • SQL Mapper VS ORM
  • SQL Mapper 는 SQL을 직접 작성하기만 하면, 나머지 번거로운 일은 모두 SQL Mapper가 해준다.
  • ORM 기술은 SQL 작성도 필요없기 떄문에 개발 생산성이 매우 높아진다. 그 대신 배우는데 난이도가 존재한다.
  • 중요한 것
  • 이러한 SQL Mapper, ORM 기술도 결국은 모두 JDBC 를 사용하기 떄문에, 직접 사용하는 것이 아니더라도 JDBC의 동작과정은 이해하고 있어야 한다.
  • (JDBC template 을 구체적으로 학습할 것이다. 나머지 기술에 대해서는 기본적인 CRUD 과정에 대해 학습하며 각 기술의 장단점을 파악할 수 있게 될 예정이다. )

실습

  • DriverManager.getConnection()
  • @Slf4j
    • https://livenow14.tistory.com/63
    • 사용자가 원하는 로깅 프레임워크를 선택한 뒤 사용할 수 있도록 하는 로깅 인터페이스 역할을 한다. (추상화 되어있음.)
  • Connection 자료형은 java.sql.Connection 으로, 인터페이스이다.
  • 실제 반환받은 구현체는 어떤 구현체일까?
  • class org.h2.jdbc.JdbcConnection
    • org.h2.jdbc.JdbcConnection 라이브러이에 구현된 구현체
    • java.sql.Connection 인터페이스를 구현하고 있다.
  • DriverManaer connection 요청 흐름

  • JDBC는 java.sql.Connection의 표준 커넥션 인터페이스를 정의한다.
  • H2 데이터베이스 드라이버는 JDBC Connnection 인터페이스를 구현한 org.h2.jdbc.JdbcConnection구현체를 제공한다.
  • 요청 흐름
    • DriverManager는 데이터베이스 드라이버들을 관리하고 연결해주는 역할을 한다.
    1. 애플리케이션 로직에서 드라이버 연결 요청을 보낸다.
    2. DriverManager에서 관리되는, 라이브러리에 등록된 드라이버들이 해당 요청을 처리할 수 있는지 확인한다.
      • 요청 인자로 들어온 URL 값을 보고, 자기가 처리할 수 있는 요청이라면 연결을 수행한 후 이를 반환하고, 처리할 수 없는 요청이라면 처리할 수 없다고 반환한다. 처리할 수 없는 요청이라고 반환될 경우, 다음 드라이버가 본인이 처리할 수 있는 요청인지 확인한다.
        (h2 가 jdbc:h2 로 시작하는 요청을 먼저 확인할 경우, 자신이 처리가능하므로 연결 후 그 연결을 반환. : JDBC가 제공하는 java.sql.Connection 을 구현하는 구현체)
        (만약 등록되었던 다른 드라이버, 예를 들어 Mysql 드라이버가 먼저 요청을 확인할 경우, 'jdbc:h2’로 시작하는 연결 url을 본인이 처리할 수 없으므로, 처리할 수 없다고 반환한다. 그리고 다음 드라이버로 순서가 넘어가게 된다. )
    3. 이렇게 찾은 커넥션 구현체가 클라이언트에게 반환된다.
    • 여기서는 JDBC 를 따르는 java.sql.Connection 을 구현한 org.h2.jdbc.JdbcConnection 이 반환된 것이다.
반응형

'개발 > java' 카테고리의 다른 글

[Spring - JPA] 2. JPA 개요  (1) 2024.02.18
[Spring - JPA] 1. JPA 소개  (1) 2024.02.03
[Spring 기본] 6. 의존관계 자동 주입  (1) 2024.01.06
[Spring 기본] 5. 컴포넌트 스캔  (0) 2024.01.06
[Spring 기본] 4. 싱글톤 컨테이너  (0) 2024.01.06