[TIL 64일차] JDBC, ORM, SQL Mapper

이건·2024년 8월 22일

JDBC(Java Database Connectivity)

JDBC(Java Database Connectivity)는 Java 애플리케이션이 데이터베이스와 상호작용할 수 있도록 해주는 Java API다. JDBC를 사용하면 SQL 쿼리를 통해 데이터베이스에 연결하고, 데이터를 조회하거나 수정할 수 있다. JDBC의 주요 특징과 구성 요소는 다음과 같다.

주요 특징

  1. 데이터베이스 독립성: JDBC는 다양한 데이터베이스에 대해 동일한 방식으로 접근할 수 있도록 해준다. 데이터베이스에 따라 드라이버만 교체하면 된다.
  2. SQL 쿼리 실행: SQL 쿼리를 직접 작성하여 데이터베이스에 명령을 보낼 수 있다.
  3. 트랜잭션 관리: JDBC는 데이터베이스 트랜잭션을 시작하고 커밋하거나 롤백할 수 있는 기능을 제공한다.

구성 요소

  1. JDBC 드라이버: 데이터베이스와의 연결을 위한 드라이버다. 각 데이터베이스에 맞는 드라이버가 필요하며, 일반적으로 JDBC 드라이버는 데이터베이스 벤더에서 제공한다.

    • Type 1: JDBC-ODBC 브리지 드라이버
    • Type 2: 네이티브 API 드라이버
    • Type 3: 네트워크 프로토콜 드라이버
    • Type 4: 순수 Java 드라이버
  2. Connection: 데이터베이스와의 연결을 나타내는 객체다. DriverManager.getConnection() 메서드를 통해 생성할 수 있다.

  3. Statement: SQL 쿼리를 데이터베이스에 전달하는 객체다. Statement, PreparedStatement, CallableStatement와 같은 다양한 타입이 있다.

    • Statement: 간단한 SQL 쿼리를 실행할 때 사용한다.
    • PreparedStatement: 파라미터화된 쿼리를 실행할 때 사용하며, 성능 향상과 SQL 인젝션 방어에 유리하다.
    • CallableStatement: 저장 프로시저를 호출할 때 사용한다.
  4. ResultSet: 쿼리 실행 결과를 저장하는 객체다. 데이터를 행 단위로 읽을 수 있게 해준다.

간단한 예제

JDBC를 사용하여 MySQL 데이터베이스에 연결하고, 데이터를 조회하는 간단한 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "username";
        String password = "password";

        try {
            // 데이터베이스 연결
            Connection connection = DriverManager.getConnection(url, user, password);
            Statement statement = connection.createStatement();
            
            // SQL 쿼리 실행
            String sql = "SELECT id, name FROM users";
            ResultSet resultSet = statement.executeQuery(sql);
            
            // 결과 처리
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }

            // 자원 정리
            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

이 예제에서는 MySQL 데이터베이스에 연결하고, users 테이블에서 데이터를 조회하여 출력한다. JDBC는 데이터베이스와의 상호작용을 위한 강력한 도구이며, Java 애플리케이션에서 데이터베이스를 다루는 데 필수적인 기술이다.

ORM(Object-Relational Mapping)과 SQL Mapper

ORM(Object-Relational Mapping)과 SQL Mapper는 데이터베이스와 애플리케이션 간의 상호작용을 보다 간편하게 해주는 기술이다.

ORM (Object-Relational Mapping)

ORM은 객체 지향 프로그래밍 언어에서 데이터베이스의 데이터를 객체로 매핑하여, SQL 쿼리를 직접 작성하지 않고도 데이터베이스를 조작할 수 있게 해주는 기술이다. ORM을 사용하면 다음과 같은 이점이 있다:

  1. 생산성 증가: SQL 쿼리를 직접 작성하지 않아도 되므로 개발 속도가 빨라진다.
  2. 유지보수 용이: 객체 지향의 특성 덕분에 코드가 더 이해하기 쉽고, 유지보수가 용이하다.
  3. 데이터베이스 독립성: ORM을 사용하면 특정 데이터베이스에 종속되지 않고, 다양한 데이터베이스를 쉽게 전환할 수 있다.

대표적인 ORM 프레임워크로는 Java의 Hibernate, Python의 SQLAlchemy, PHP의 Doctrine 등이 있다.

SQL Mapper

SQL Mapper는 SQL 쿼리를 매핑하여 객체로 변환하는 경량화된 라이브러리다. ORM과 유사하지만, SQL Mapper는 보통 ORM보다 더 낮은 수준의 추상화를 제공하며, 개발자가 직접 SQL 쿼리를 작성해야 한다. SQL Mapper의 장점은 다음과 같다:

  1. 유연성: 복잡한 쿼리를 직접 작성할 수 있어 보다 세밀한 제어가 가능하다.
  2. 경량화: ORM보다 가벼워 성능이 더 좋을 수 있다.
  3. 단순성: ORM보다 더 간단한 구조로, 필요한 기능만을 선택적으로 사용할 수 있다.

대표적인 SQL Mapper로는 Java의 MyBatis, Python의 Dataset 등이 있다.

ORM과 SQL Mapper 비교

ORM (Object-Relational Mapping)

  • 쿼리 작성: 자동 생성 (ORM이 객체 모델에 따라 생성)
  • 매핑 방식: 객체와 테이블 간의 매핑을 자동으로 처리
  • 트랜잭션 관리: 자동으로 관리 (ORM이 처리)
  • 데이터베이스 독립성: 상대적으로 독립적 (설정 변경으로 다른 DB 지원)
  • 유연성: 제한적 (자동 생성된 쿼리 사용)
  • 비즈니스 로직 중심: 비즈니스 로직에 집중 가능
  • 복잡한 쿼리 처리: ORM의 쿼리 언어 사용 (JPQL, HQL 등)

SQL Mapper

  • 쿼리 작성: 직접 작성 (개발자가 SQL 작성)
  • 매핑 방식: SQL 결과를 객체에 자동으로 매핑
  • 트랜잭션 관리: 직접 관리하거나 프레임워크에 의존
  • 데이터베이스 독립성: 종속적 (SQL에 따라 변경 필요)
  • 유연성: 높음 (직접 작성한 SQL 사용)
  • 비즈니스 로직 중심: SQL 쿼리에 집중
  • 복잡한 쿼리 처리: 복잡한 쿼리를 직접 작성하여 처리 가능

요약

  • ORM은 비즈니스 로직에 집중할 수 있도록 자동화된 기능을 제공하며, 데이터베이스 독립성이 높고, 객체를 기반으로 한 접근 방식을 지원한다. 그러나 유연성은 제한적이며, 복잡한 쿼리를 처리하기 위해서는 ORM의 쿼리 언어를 사용해야 한다.

  • SQL Mapper는 개발자가 SQL을 직접 작성하므로 유연성이 높고 복잡한 쿼리를 자유롭게 다룰 수 있다. 하지만 데이터베이스에 종속적이며, 트랜잭션 관리를 직접 관리해야 할 수 있다.

이러한 차이점을 고려하여, 프로젝트의 요구사항과 팀의 기술 스택에 따라 적절한 선택을 하는 것이 중요하다.

0개의 댓글