데이터베이스와 JDBC

Lilac-_-P·2023년 4월 27일
0

스프링 DB

목록 보기
1/9

애플리케이션을 개발할 때 중요한 데이터는 대부분 데이터베이스에 보관한다.

데이터베이스는 그 자체로도 하나의 시스템이기 때문에 보통 애플리케이션과 분리되어있는데, 만약 클라이언트가 애플리케이션을 통해 데이터를 저장하거나 조회하는 경우, 애플리케이션 서버는 다음 과정을 통해 데이터베이스를 사용한다.

  1. 애플리케이션 서버와 DB가 TCP/IP를 사용하여 커넥션을 연결한다.
  2. 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다.
  3. DB는 전달된 SQL을 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다.

과정만 보면 생각보다 그렇게 복잡하진 않다. 그런데 문제는 데이터베이스의 종류가 매우 많다는 점이다.

각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 그리고 결과를 응답받는 방법이 모두 다르다.
결과적으로 크게 2가지 문제가 생긴다.

  1. DB를 다른 종류로 변경하면 애플리케이션 서버에 개발된 DB 사용코드도 함께 변경해야한다.
  2. 개발자가 각 DB별 커넥션을 연결하는 방법, SQL을 전달하는 방법, 그리고 결과를 응답받는 방법을 새로 학습 해야한다.

애플리케이션을 개발하는데, DB를 더 많이 학습해야하는 배보다 배꼽이 큰 상황이 와버렸다.

이런 문제를 해결하기 위해서 JDBC라는 자바 표준이 등장한다.

JDBC의 등장

JDBC는 Java Database Connectivity로, 자바에서 데이터베이스에 접속할 때 사용할 수 있도록 제공되는 API이다. JDBC를 통해 자바 코드로 데이터베이스를 사용할 수 있다.

JDBC가 제공하는 대표적인 3가지 기능은 다음과 같다.

  1. Connection - DB 커넥션 연결
  2. Statement - SQL을 담은 내용
  3. ResultSet - SQL 요청 응답

위의 기능들은 JDBC가 표준 인터페이스로 정의해서 제공하기 때문에, 개발자는 표준 인터페이스만 사용해서 개발하면 된다. 인터페이스만 있다고 해서 기능이 동작하는 것은 아니기 때문에, 위의 JDBC 인터페이스를 각각의 DB 벤더에서 본인의 DB에 맞도록 구현해서 라이브러리로 제공하는데, 이를 JDBC 드라이버라고 한다. 예를 들어 MySQL DB에 접근할 수 있는 드라이버는 MySQL JDBC 드라이버라 하고, Oracle DB에 접근할 수 있는 드라이버는 Oracle JDBC 드라이버라 한다.

JDBC의 등장으로 위에서 언급했던 2가지 문제가 해결되었다. 애플리케이션 로직은 DB를 사용할 때 JDBC 표준 인터페이스에만 의존하고, DB 변경시에 JDBC 구현 라이브러리만 변경하면 된다. 또, 개발자는 각 DB의 사용법을 학습할 필요 없이 JDBC의 사용법만 학습하면 된다.

참고.
JDBC의 등장으로 해결되지 않은 문제도 있다. 각각의 데이터베이스마다 SQL, 데이터타입 등 일부 사용법이 다르다. 자바를 통해 DB를 사용할 때 JDBC를 사용하면 DB를 사용하는 API는 변경할 필요가 없지만, SQL은 해당 데이터베이스에 맞도록 변경해야한다.

SQL Mapper와 ORM

JDBC는 출시된지 상당히 오래된 기술이고, 사용하는 방법이 매우 복잡하다. 그래서 최근에는 JDBC를 직접 사용하기보다는 JDBC르 편리하게 사용하는 다양한 기술들이 개발되었다. 대표적으로 SQL Mapper와 ORM이 있다.

SQL Mapper는 JDBC의 반복 코드(커넥션 연결 및 연결된 커넥션 갖고오기, DB Commit/Rollback 날리기)를 제거해주고, SQL 응답 결과를 객체로 편리하게 변환해준다.
하지만, 개발자가 직접 SQL을 작성해야하는 단점이 있다.

ORM은 객체를 관계형 DB 테이블과 매핑해주는 기술이다. ORM을 사용하면 개발자는 SQL을 직접 작성하지 않고, ORM 기술이 개발자 대신 SQL을 동적으로 만들어 실행해준다. 또, DB마다 다른 SQL을 사용하는 문제도 중간에서 해결해준다는 파격적인 장점이 있다.

참고.
위의 내용들만보면 무조건 SQL Mapper보다 ORM을 사용해야할 것만 같은 기분이 든다. 하지만, ORM은 그 자체로 하나의 기술이기 때문에 ORM을 사용하는 방법을 추가적으로 공부해야하고, 그 양이 상당하다. 반면에 SQL Mapper은 DB SQL을 작성할 줄만 알면 크게 추가적으로 학습할게 없다. 또, ORM의 경우 동적 쿼리와 같은 상황 및 조건에 따라 SQL 쿼리문이 변경되어야하는 케이스에 대처하기 어렵다.

SQL Mapper 와 ORM 기술 둘다 각각 장단점이 있다. 상황에 맞게 사용하면 된다. 다만, SQL Mapper와 ORM 모두 기반에는 JDBC를 갖고 있는 '좀 더 JDBC를 편리하게 사용할 수 있도록 편의 기능을 제공' 하는 기술이다. 근본은 JDBC에 있다는 것을 까먹지 말자.

JDBC만을 이용한 DB 사용법

순수하게 JDBC을 사용해서 DB를 사용하는 경우, JDBC에서 제공하는 DriverManager를 통해 커넥션을 얻을 수 있다.
아래의 코드를 보자. 코드가 매우 생략된 부분이 많으니 그 점을 감안해야한다.

public class DBExClass {

	public static Connection getConnection(){
    	
        Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		return connection; 
        
    }
}

DriverManager의 getConnection() 메서드를 사용하면, DriverManager는 라이브러리에 등록된 드라이버 목록을 자동으로 인식하기 때문에, URL, USERNAME, PASSWORD를 라이브러리에 있는 DB 드라이버에게 전달하면서 커넥션을 획득할 수 있는지 확인한다. 각 드라이버는 전달받은 정보로 본인이 처리할 수 있는 요청인지를 확인하고, 처리할 수 있는 요청이라면 실제 DB에 연결해서 커넥션을 획득하고 이 커넥션을 반환한다. 만약 처리할 수 없는 요청이라면 본인이 처리할 수 없다는 결과를 반환하게 되고, 다음 드라이버에게 순서가 넘어간다.

참고.
커넥션 요청을 처리할 수 있는 JDBC 드라이버가 라이브러리에 등록된 드라이버 목록에 없다면 예외를 던진다.

실제 JDBC를 사용해서 DB를 사용하는 과정은 자세하게 설명하지 않는다. 거의 쓸일이 없기 때문이다.
반복되는 코드도 너무 많고, 애플리케이션의 비즈니스 로직이 아닌 DB를 사용할 때 부가적으로 필요한 코드(리소스 생성, 정리 등)들이 너무 많다.

간단한 순서만 짚고 넘어가자.

  1. 커넥션 획득 (Ex. DriverManager.getConnection())
  2. SQL 준비 (String 타입의 SQL 직접 작성 + PreparedStatement를 이용한 SQL 생성)
  3. SQL 실행 (PreparedStatement를 executeUpdate(), executeQuery()로 실행)
  4. SQL 결과값을 애플리케이션에서 사용할 수 있는 형태로 변환 (ResultSet에서 getString(), getInt() 사용)

위의 반복적이고, DB를 사용하기 때문에 생기는 부가적인 코드들을 개발자들이 신경쓰지 않고 개발할 수 있게 하기 위해서 SQL Mapper, ORM 기술이 등장하게 된 것이다.

profile
열심히 하자

0개의 댓글