Spring/Spring Data JPA

[자바 ORM 표준 JPA 프로그래밍] 1. JPA 소개

noahkim_ 2023. 11. 28. 00:05

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.

 

1. SQL을 직접 다룰 때 발생하는 문제점

문제점 내용
SQL 의존 개발
- 강한 의존 관계 (SQL 쿼리 ↔️ Java 객체)
- 유지 보수 어려움 (쿼리 결과 ↔️ 엔티티 필드 일치 필수)
- 계층 분리 어려움
SQL Mapper 개발
- 개발 효율성 저하 (반복되는 보일러플레이트 코드: JDBC API)

 

예제) SQL Mapper 개발

더보기
// JDBC 연결 정보
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";

// 데이터베이스 연결 및 쿼리 실행
try (Connection connection = DriverManager.getConnection(url, username, password)) {
    String sql = "SELECT id, name, email FROM users WHERE id = ?";
    try (PreparedStatement statement = connection.prepareStatement(sql)) {
        statement.setInt(1, 1); // 예시로 id가 1인 사용자 조회
        try (ResultSet resultSet = statement.executeQuery()) {
            if (resultSet.next()) {
                // 결과를 DTO로 매핑
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String email = resultSet.getString("email");

                // DTO 객체 생성
                UserDTO user = new UserDTO(id, name, email); 
                
                // ...
            }
        }
    }
} catch (SQLException e) {
    e.printStackTrace();
}

 

2. 패러다임 불일치

  • 객체지향 프로그래밍과 관계형 데이터베이스이 각각 데이터를 바라보는 방식이 근본적으로 다르기 때문에 발생하는 문제
개념 데이터베이스 관점 OOP 관점
데이터 단위 - 행
- 객체
Identity - 기본 키(PK)로 행(row)을 구분
- equals() 메서드로 인스턴스를 구분함
Inheritance - 존재하지 않음
- 슈퍼타입-서브타입 형태로 표현 가능
- 상속으로 표현 (쿼리를 자동 생성해 처리 가능)
Association - 조인(Join) 쿼리로 구현
- 참조 무결성 유지
- 연관 객체 간 메시지를 주고받으며 상호작용
- 객체 그래프 탐색을 통해 접근
Entity Graph - 조인 쿼리로 관계를 조회
- 참조 무결성 유지
- 특정 엔티티를 시작점으로 연관 객체 로딩

 

3. JPA란 무엇인가?

  • Java ORM Standard Specification

 

ORM

  • Object Relation Mapping
  • 애플리케이션에서 데이터베이스 관련 객체를 어떻게 관리할 지 도와주는 모듈

 

장점

구분 내용
가독성 & 유지보수성
- 객체-테이블 매핑을 통해 패러다임 불일치(paradigm mismatch) 문제 해결
- 패러다임에 따른 작업을 JPA가 자동 처리
자동화된 DB 작업
- JpaRepository를 통한 자동 CRUD 메서드 제공
- 객체 생명주기 관리: @PreUpdate, @PrePersist 등의 표준 콜백 제공
데이터 접근 계층 관리
- 추상화 덕분에 DB 벤더 및 기술 의존성 제거 가능
- 데이터 접근 계층을 쉽게 관리하고 변경 가능
성능 향상
- 1차 캐시(First-Level Cache) 제공으로 동일 트랜잭션 내에서 불필요한 DB 접근 최소화

 

Vendor

  • Hibernate, EclipseLink, DataNucleus