[ Spring ] DB

한대희·2023년 11월 29일

Spring

목록 보기
4/4

✅JDBC 이해

JDBC란?

  • JDBC는 Java Database Connectivity의 약자로 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API다.
  • JDBC는 데이터베이스에서 자료를 쿼리 하거나 업데이트 하는 방법을 제공한다.

JDBC 등장 이유

  • 애플리케이션을 개발할 때 중요한 데이터는 대부분 데이터베이스에 보관한다.
  • 클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면 애플리케이션 서버는 아래 과정을 통해서 데이터베이스를 사용하게 된다.

  • 하지만 여기에는 2가지 문제가 있다.
  • 첫째는 데이터베이스 종류를 변경할 경우 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 변경해야 한다.
  • 둘째는 각각의 데이터베이스마다 커넥션 연결, SQL전달, 응답 방법 등이 전부 다르기 때문에 데이터베이스 종류별로 사용법을 전부 숙지하고 있어야 한다.
  • 이 문제를 해결하기 위해 JDBC라는 자바 표준이 등장한 것.

JDBC 표준 인터페이스

  • 대표적으로 다음 3가지 기능을 표준 인터페이스로 정의해서 제공한다.
    java.sql.Connection - 연결
    java.sql.Statement - SQL을 담은 내용
    java.sql.ResultSet - SQL 요청 응답
  • 인터페이스만 있다고 해서 바로 사용할 수 있는 것이 아니고 각각의 데이터베이스에 해당하는 드라이버를 설치 해줘야 한다.
  • 드라이버란 JDBC 인터페이스를 각각의 DB 벤더(회사)에서 자신
    의 DB에 맞도록 구현해서 라이브러리로 제공한 것이다.
  • 예를 들어서 MySQL DB에 접근 할 수 있는 것은 MySQL JDBC 드라이버라 하고, Oracle DB에 접근할 수 있는 것은 Oracle JDBC 드라이버라 한다.

JDBC 사용 효과

  • JDBC를 활용한다면 개발자는 JDBC 표준 인터페이스에만 맞춰서 개발 하면 된다.
  • 만약 MySQL을 사용하고 싶다면 MySQL 드라이버를 JDBC 인터페이스를 따르는 구현체로 사용하면 되고, 중간에 Oracle로 변경하고 싶다면 기존의 MySQL 구현체를 Oracle로 변경하면 된다.
  • 정리하면 애플리케이션 로직은 이제 JDBC 표준 인터페이스에만 의존하게 되고 만약 데이터베이스를 다른 종류의 데이터베이스로 변경하고 싶으면 JDBC 구현 라이브러리만 변경하면 된다. 개발자는 JDBC표준 인터페이스 사용법만 학습하면 수십개의 데이터베이스에 동일하게 적용할 수 있는 것.

JDBC와 최신 데이터 접근 기술

  • 사실 JDBC는 오래된 기술이기 때문에 최근에는 JDBC를 편리하게 사용하는 다양한 기술이 존재한다. 대표적으로 SQL Mapper와 ORM 기술이 있다.

JDBC 직접 사용

  • JDBC를 직접 사용하는 경우에는 애플리케이션 로직에서 JDBC를 통해 SQL을 전달하면 된다.
  • 하지만 너무 로우 레벨로 제공하다 보니 기능이 하나하나 다 쪼개져 있어 사용하기가 굉장히 복잡하다.

SQL Mapper 사용

  • SQL Mapper는 사용하기 복잡한 JDBC를 편리하게 사용하도록 도와주는 기술이다.

  • 애플리케이션 로직에서 SQL Mapper로 SQL을 전달한 다음 SQL Mapper에서 제공하는 다양한 편의 기능을 사용하여 JDBC로 SQL을 전달하게 된다.

  • 대표적인 SQL Mapper로는 JDBC Template와 MyBatis가 있다.

  • SQL Mapper의 장점

    • SQL 응답 결과를 객체로 편리하게 변환 해 준다.
    • JDBC의 반복 코드를 제거해준다.
  • SQL Mapper의 단점

    • 개발자가 직접 SQL을 작성해야 한다.

ORM 기술

  • ORM은 객체를 관계형 데이터베이스 테이블과 매핑해주는 기술이다.
  • 애플리케이션 로직에서 SQL을 전달하지 않고, 객체를 JPA( 자바의 ORM 표준 인터페이스) 라는 곳에 전달한다. JPA에는 객체의 맵핑 정보가 들어 있고, 여기서 SQL을 알아서 생성하여 JDBC에게 전달한다.
  • 즉, 개발자는 SQL을 직접 작성하지 않고, ORM 기술이 개발자 대신에 SQL을 동적으로 만들어서 실행해 주는 것.

데이터베이스 연결

  • 먼저 데이터베이스와 연관된 값들을 모아 클래스 내부에 상수로 선언 하자.
// 다른 곳에서 해당 객체를 생성할 수 없게 abstract로 막는다.

public abstract class ConnectionConst {
    public static final String URL = "jdbc:h2:tcp://localhost/~/test";
    public static final String USERNAME = "sa";
    public static final String PASSWORD = "";
}
  • 데이터베이스에 연결하려면 JDBC가 제공하는 DriverManager.getConnection( )을 사용하면 된다.
  • 해당 메서드를 사용하면 현재 라이브러리에 설치된 데이터베이스 드라이버를 찾아서 해당 드라이버가 제공하는 커넥션을 반환 받을 수 있다.
  • 해당 프로젝트에서는 h2데이터베이스를 사용할 것이고, 현재 설치가 되어 있기 때문에 h2 데이터베이스가 작동해서 실제 데이터베이스와 커넥션을 맺고 그 결과를 반환할 것이다.
@Slf4j
public class DBConnectionUtil {
    public static Connection getConnection() {
        try {
            Connection connection = DriverManager.getConnection(URL, USERNAME,
                    PASSWORD);
            log.info("get connection={}, class={}", connection,
                    connection.getClass());
            return connection;
        } catch (SQLException e) {
            throw new IllegalStateException(e);
        }
    }
}
  • 결과를 잘 반환 받는지 테스트 코드로 확인해 보자.
// getConnection으로 가져온 connectin이 Null이 아닌지 확인

@Slf4j
public class DBConnectionUtilTest {
    
    @Test
    void connection () {
        Connection connection = DBConnectionUtil.getConnection();
        assertThat(connection).isNotNull();
    }
}

JDBC 개발

등록

  • JDBC를 사용해서 회원 데이터를 데이터베이스에 관리하는 기능을 개발해 보자.
profile
개발 블로그

0개의 댓글