JPA

[JPA] JPA에 대하여(+Spring Data JPA)

Young_Han 2024. 11. 21. 23:00

 

JPA (Java Persistence API)

 

JPA(Java Persistence API)는 자바 진영의 ORM(Object Relational Mapping/객체-관계 매핑) 기술 표준 명세로 JAVA에서 제공하는 API이다. 스프링에서 제공하는 것이 아니다. 데이터베이스와 객체 사이의 패러다임 불일치를 해소하고, 객체지향적으로 데이터를 관리할 수 있게 돕는다.

 

JPA는 단순히 인터페이스 모음이며, 이를 구현한 대표적인 구현체로 Hibernate, EclipseLink 등이 있다. 단순히 인터페이스라는 점이라 JPA는 특정 기능을 하는 라이브러리가 아니다. 

 

 

ORM이란? SQL Mapper와 ORM

 

ORM은 DB 테이블을 자바 객체로 매핑하므로써 객체간의 관계를 바탕으로 SQL을 자동으로 생성하지만 Mapper는 SQL을 명시해주어야 한다. 따라서 ORM은 RDM의 관계를 Object에 반영하는 것이 목적이라면, Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 지향하는 부분의 차이가 있다.

 

SQL Mapper

  • SQL -  Object 필드 매핑
  • SQL문으로 직접 DB를 조작한다.
  • Mybatis, jdbcTemplate

ORM

  • DB 데이터 - Object 필드 매핑 : 객체를 통해 간접적으로 디비 데이터를 다룬다.
  •  객체와 디비의 데이터를 자동으로 매핑해준다.
    • SQL 쿼리가 아니라 메서드로 데이터를 조작할 수 있다.
    • 객체간 관계를 바탕으로 sql을 자동으로 생성한다.
    • Persistant API라고 할 수 있다.
    • JPA, Hibernate

 

JDBC

 

JDBC (Java Database Connectivity)

JDBC는 DB에 접근할 수 있도록 자바에서 제공하는 API이다. 모든 JAVA Data Access 기술의 근원이며 모든 Persistance Framework는 내부적으로 JDBC API를 이용한다.

 

 

 


Spring Data JPA

 

 

Spring Data JPA는 JPA를 쉽게 사용하기 위해 스프링에서 제공하고 있는 프레임워크이다.

 

추상화 정도는 Spring-Data-JPA -> Hibernate -> JPA 이다.

 

Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것 사이에는 큰 차이가 없지만

  • 구현체 교체의 용이성
  • 저장소 교체의 용이성

이라는 이유에서 Spring Data JPA를 사용하는것이 더 좋다.

 

1. 구현체 교체의 용이성
Spring Data JPA는 JPA(Java Persistence API)라는 표준 인터페이스 위에서 동작한다. Hibernate는 JPA의 구현체 중 하나이며, Spring Data JPA는 기본적으로 Hibernate를 사용하지만, 필요에 따라 다른 JPA 구현체로 쉽게 교체할 수 있다. Spring Data JPA를 사용함으로써 구현체를 교체하기 쉬운 이유는 다음과 같다.
1) 구현체의 의존성 제거
Spring Data JPA는 애플리케이션 코드가 특정 JPA 구현체(Hibernate 등)에 종속되지 않도록 한다. 따라서 Hibernate 외에 EclipseLink, OpenJPA와 같은 다른 JPA 구현체를 사용할 경우, 코드 수정 없이 구현체 교체가 가능하다.구현체 교체 시에는 단순히 application.properties(yml)에서 JPA 공급자와 관련된 설정이나 의존성을 변경하면 된다.
2) 표준화된 API 사용
Spring Data JPA는 JPA 표준 API를 활용하므로 개발자가 Hibernate 고유의 API나 기능을 직접 다루지 않아도 된다. 이는 특정 구현체에 의존하는 기능을 피하게 하여 교체 과정을 간소화한다.
2. 저장소 교체의 용이성
저장소 교체는 데이터베이스 유형(MySQL, PostgreSQL, Oracle 등) 또는 영속성 기술(관계형 DB → NoSQL 등)을 전환하는 것을 의미한다. Spring Data JPA는 저장소 교체 시에도 유리한 구조를 제공한다.
1) JPA 표준 기반으로 다양한 데이터베이스 지원
Spring Data JPA는 JPA 표준을 따르는 구현체를 사용하므로 데이터베이스 벤더를 교체하더라도 큰 코드 변경이 필요하지 않는다. 예를 들어 MySQL에서 PostgreSQL로 변경 시, 대부분 데이터베이스 드라이버와 Dialect 설정만 변경하면 동작한다.
2) Spring Data 프로젝트의 확장성
Spring Data JPA는 관계형 데이터베이스에 초점을 맞추지만, 같은 Spring Data 패밀리의 다른 모듈(Sprint Data MongoDB, Spring Data Redis 등)을 사용하면 관계형 데이터베이스가 아닌 NoSQL 저장소로도 손쉽게 전환할 수 있다. 저장소를 전환할 때 기존의 리포지토리 인터페이스 구조를 재사용할 수 있어 코드 변경을 최소화한다. 리포지토리 인터페이스로 추상화Spring Data JPA는 리포지토리 인터페이스(Repository Interface)로 데이터 액세스를 추상화한다. 이로 인해 특정 저장소 기술에 종속되지 않으며, 저장소 기술을 교체할 경우 리포지토리의 구현체만 변경하면 된다.

Spring Data JPA의 장점 요약

  1. 구현체 교체: Hibernate 외의 다른 JPA 구현체(EclipseLink 등)로 쉽게 전환 가능하다.
  2. 저장소 교체: MySQL, PostgreSQL 등의 관계형 데이터베이스에서 NoSQL 저장소로도 유연하게 전환 가능하다.
  3. 코드 의존성 최소화: JPA 표준 API를 사용하여 특정 구현체나 저장소 기술에 종속되지 않는다.
  4. 유지보수성과 확장성 향상: 표준화된 구조로 코드 변경을 최소화하고 확장에 유리하다.

 

JPA 동작과정

JPA는 애플리케이션과 JDBC 사이에서 동작하는데 개발자가 JPA를 사용하면 JPA 내부에서 JDBC API를 사용하여 SQL를 호출하여 DB와 통신한다. 따라서 개발자가 직접 JDBC API를 쓰는 것이 아니다.

 

INSERT

 

MemberDAO에서 객체를 저장하고 싶을 때 개발자는 JPA에 Member 객체를 넘긴다.

 

JPA에서는 Memberm 엔티티를 분석하고 INSERT SQL을 생성한다. 그리고 JDBC API를 사용하여 SQL을 DB에 보낸다.

  1.  Member 엔티티를 분석
  2. INSERT SQL 생성
  3. JDBC API 사용하여 DB에 SQL를 보냄

 

find

 

개발자는 member의 pk 값을 JPA에 넘긴다. 그러면 JPA는 엔티티의 매핑 정보를 바탕으로 적절한 SELECT SQL을 생성한다. 생성된 JDBC  API를 사용하여 SQL을 DB에 보낸다. 그럼 DB로부터 결과가 나오는데 이 결과(ResultSet)를 객체에 모두 매핑한다. 퀴리를 JPA가 만들어 주기 때문에 Object와 RDB간의 패러다임 불일치를 해결할 수 있다.

 

  1. 엔티티의 매핑 정보를 바탕으로 SELCET SQL 생성
  2. JDBC API를 사용하여 DB에 전송
  3. DB로 부터 도출된 결과를 객체에 모두 매핑

 

JPA의 특징

1. 데이터를 객체지향적으로 관리 → 개발자는 비즈니스 로직에 집중할 수 있어 객체지향 개발이 가능

2. 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL를 생성

3. 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원

 

JPA 하이버네이트(Hibernate)

자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 프레임워크로써, Hibernate 기반으로 만들어진 ORM 기술 표준이 바로 JPA이다.

 

다시 말하면, JPA라는 ORM기술 표준을 구현한 것이 Hibernate이므로, JPA를 사용하려면 Hibernate를 사용하면 된다.

 

Hibernate 외에도 EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.

 

하이버네이트의 장점

생산성

  • Hibernate는 SQL을 직접 사용하지 않고, 메서드 호출만으로 쿼리가 수행된다. 즉, SQL 반복 작업을 하지 않음으로 생산성이 높아진다.

유지보수

  • 테이블 컬럼이 변경되었을 때, 테이블과 관련된 DAO의 파라미터, 결과, SQL 등을 대신 수행해준다.. 이로 인해 유지보수 측면에서 높아진다.

특정 벤더에 종속적이지 않음

  • JPA는 데이터 접근 계층을 추상화하기 때문에 애플리케이션 코드가 특정 데이터베이스 벤더(예: MySQL, PostgreSQL)에 종속되지 않는다.
  • 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지를 알려주기만 하면 얼마든지 DB를 바꿀 수 있다.
벤더(Vendor)는 소프트웨어나 하드웨어를 제공하는제조사 또는 공급업체를 의미한다.
예)
MySQL → Oracle Corporation (벤더: Oracle)
PostgreSQL → PostgreSQL Global Development Group (오픈소스 커뮤니티)
Oracle Database → Oracle Corporation
Microsoft SQL Server → Microsoft
MongoDB → MongoDB Inc.

 

패러다임 불일치 해결

  • 상속, 연관 관계, 객체 그래프 탐색, 비교 등 객체와 관계형 데이터베이스와의 패러다임 불일치를 해결할 수 있다.

 

하이버네이트의 단점

성능

  • 메서드 호출만으로 쿼리를 수행하는 것은 직접 SQL을 작성하는 것보다는 좋지 않다.

세밀함

  • 메서드 호출만으로 DB 데이터를 조작하기에는 한계가 있다. 이를 보완하기 위해 JPQL을 지원한다.

 


 

마치며

오늘은 JPA에 대해 간략하게 알아봤다. 하지만 JPA 하면 중요한 부분이 있는데 그건 바로 영속성이다. 영속성은 데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성을 말한다.

 

영속성을 갖지 않으면 데이터는 메모리에서만 존재하게 되고 프로그램이 종료되면 해당 데이터는 모두 사라지게 된다.

그래서 우리는 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여한다. 영속성에 관한 글은 이후에 따로 정리하겠다.

 

[출처]

https://velog.io/@adam2/JPA%EB%8A%94-%EB%8F%84%EB%8D%B0%EC%B2%B4-%EB%AD%98%EA%B9%8C-orm-%EC%98%81%EC%86%8D%EC%84%B1-hibernate-spring-data-jpa

 

JPA는 도대체 뭘까? (orm, 영속성, hibernate, spring-data-jpa)

JPA는 도대체 무엇일까요? orm, jdbc, 영속성, hibernate, ... 관련 지식까지 모두 파해쳐봅니다.

velog.io

https://ittrue.tistory.com/250

 

[Java] JDBC란 무엇인가? - Java Database Connectivity

JDBC란? JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API이다. JDB

ittrue.tistory.com

 

https://livenow14.tistory.com/70

 

[DB] 하이버네이트(Hibernate)란?

ORM 기술에 대한 명세인 JPA(Java Persistence API)의 구현체의 한 종류 JPA의 구현체이므로 JPA의 특징을 함께 정리했어요. Hibernate란? 하이버네이트는 자바 언어를 위한 ORM 프레임워크에요. JPA의 구현체

livenow14.tistory.com