Back-End

JDBC와 JPA

Minch13r 2025. 4. 7. 21:48

1. JDBC(Java Database Connectivity)란?

JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API다. 1997년에 출시된 이후 자바 애플리케이션에서 관계형 데이터베이스와 상호작용하는 표준 방식으로 사용되고 있다.

JDBC의 주요 특징

장점

  • 직접적인 데이터베이스 제어: SQL 쿼리를 직접 작성하고 실행할 수 있어 세밀한 제어가 가능하다.
  • 성능 최적화: 필요한 쿼리만 정확히 실행하여 성능을 최적화할 수 있다.
  • 낮은 추상화 수준: 데이터베이스와 가까운 레벨에서 작업하므로 데이터베이스의 특정 기능을 활용하기 쉽다.
  • 간단한 구조: 학습 곡선이 상대적으로 낮다.

단점

  • 반복적인 코드: 데이터베이스 연결, 쿼리 실행, 결과 처리 등의 코드가 반복된다.
  • SQL 의존성: 모든 SQL을 직접 작성해야 하므로 데이터베이스 변경 시 코드 수정이 필요하다.
  • 예외 처리의 번거로움: 연결, 쿼리 실행 등 각 단계마다 예외 처리가 필요하다.
  • 객체-관계 불일치: 객체지향 프로그래밍과 관계형 데이터베이스 간의 패러다임 차이를 개발자가 직접 해결해야 한다.

JDBC 사용 예시 흐름

  1. 드라이버 로드: 데이터베이스 드라이버를 로드한다.
  2. 연결 설정: 데이터베이스와의 연결을 설정한다.
  3. Statement 생성: SQL 문을 실행하기 위한 Statement 객체를 생성한다.
  4. 쿼리 실행: SQL 쿼리를 실행한다.
  5. 결과 처리: 쿼리 결과를 자바 객체로 변환하여 처리한다.
  6. 자원 해제: 사용한 자원을 해제한다.

2. JPA(Java Persistence API)란?

JPA는 자바 진영의 ORM(Object-Relational Mapping) 표준 기술이다. 객체와 관계형 데이터베이스 간의 매핑을 처리하여 개발자가 객체지향적으로 프로그래밍할 수 있게 해준다. JPA는 인터페이스이며, Hibernate, EclipseLink, OpenJPA 등이 이를 구현한다.

JPA의 주요 특징

장점

  • 객체지향적 개발: 테이블이 아닌 객체 중심으로 개발할 수 있다.
  • 생산성 향상: 반복적인 CRUD SQL을 자동으로 생성해주어 개발 시간을 단축한다.
  • 유지보수성 향상: 데이터베이스 스키마 변경 시 엔티티 클래스만 수정하면 된다.
  • 데이터베이스 독립성: 특정 데이터베이스에 종속되지 않는 개발이 가능하다.
  • 객체-관계 불일치 해소: 상속, 연관관계, 객체 그래프 탐색 등 객체지향적 특성을 지원한다.
  • 캐싱 기능: 1차, 2차 캐시를 통해 성능을 최적화한다.
  • 지연 로딩과 즉시 로딩: 데이터 로딩 전략을 선택할 수 있다.
  • 변경 감지(Dirty Checking): 엔티티 객체의 변경을 감지하여 자동으로 UPDATE 쿼리를 생성한다.

단점

  • 학습 곡선: 초기 학습에 시간이 필요하다.
  • 복잡한 쿼리 처리: 매우 복잡한 쿼리는 JPQL이나 네이티브 SQL을 사용해야 한다.
  • 성능 이슈 가능성: N+1 문제와 같은 성능 이슈가 발생할 수 있다.
  • 투명성 부족: 내부에서 생성되는 SQL을 직접 제어하기 어려울 수 있다.

JPA 주요 구성 요소

  1. 엔티티(Entity): 데이터베이스 테이블과 매핑되는 자바 클래스다.
  2. 엔티티 매니저(EntityManager): 엔티티를 관리하고 데이터베이스 연산을 수행하는 객체다.
  3. JPQL(Java Persistence Query Language): 객체 지향적인 쿼리 언어로, SQL과 유사하지만 테이블이 아닌 엔티티 객체를 대상으로 한다.
  4. 영속성 컨텍스트(Persistence Context): 엔티티를 영구 저장하는 환경으로, 엔티티의 생명주기를 관리한다.

3. JDBC와 JPA 비교

코드 복잡성

  • JDBC: 모든 데이터베이스 연동 코드를 직접 작성해야 한다.
  • JPA: 대부분의 CRUD 작업이 자동화되어 코드가 간결해진다.

생산성

  • JDBC: SQL 쿼리 작성, 파라미터 설정, 결과 매핑 등 반복 작업이 많다.
  • JPA: 기본적인 CRUD 작업은 메서드 호출만으로 가능하다.

유지보수성

  • JDBC: 데이터베이스 스키마 변경 시 관련 SQL을 모두 수정해야 한다.
  • JPA: 엔티티 클래스만 수정하면 된다.

성능

  • JDBC: 직접 최적화된 쿼리를 작성할 수 있어 세밀한 성능 제어가 가능하다.
  • JPA: 대부분의 경우 충분한 성능을 제공하며, 필요시 JPQL이나 네이티브 쿼리로 최적화할 수 있다.

학습 곡선

  • JDBC: 비교적 간단하고 직관적이다.
  • JPA: 초기 학습에 시간이 필요하며, 내부 동작 원리를 이해해야 효율적으로 사용할 수 있다.

4. 어떤 상황에서 무엇을 선택해야 할까?

JDBC가 적합한 경우

  • 간단한 애플리케이션이나 프로토타입
  • 특정 데이터베이스의 고유 기능을 많이 활용해야 하는 경우
  • 매우 복잡하고 성능이 중요한 쿼리가 많은 경우
  • 레거시 시스템과의 통합이 필요한 경우

JPA가 적합한 경우

  • 중대형 엔터프라이즈 애플리케이션
  • 객체지향적 설계가 중요한 도메인 모델이 있는 경우
  • 생산성과 유지보수성이 중요한 프로젝트
  • 데이터베이스에 독립적인 개발이 필요한 경우
  • 팀원들이 SQL보다 객체지향 프로그래밍에 더 익숙한 경우

5. Spring Data JPA

Spring Framework에서는 JPA를 더 쉽게 사용할 수 있도록 Spring Data JPA를 제공한다. 이는 JPA를 한 단계 더 추상화하여 Repository 인터페이스만 정의하면 구현체를 자동으로 생성해주는 기능을 제공한다.

Spring Data JPA의 장점

  • Repository 인터페이스만 정의하면 구현체는 자동 생성된다.
  • 메서드 이름으로 쿼리 생성이 가능하다.
  • 페이징, 정렬 등 공통 기능이 제공된다.
  • 다양한 쿼리 방식을 지원한다. (JPQL, 네이티브 SQL, QueryDSL 등)

'Back-End' 카테고리의 다른 글

[Spring] 기초 공부1  (1) 2025.04.19
[Spring] 기초 공부  (1) 2025.04.15
[JAVA] JSTL이란?  (2) 2025.03.19
[API] 자주 쓰는 API 정리  (4) 2025.03.11
[Kuberbetes] 쿠버네티스의 개념  (0) 2025.03.10