[Java] JPA

하윤철·2024년 7월 25일
post-thumbnail

왜 Java객체를 DB에 바로 저장하지 못하고 JDBC? JPA?를 사용하는걸까?

Java와 DB의 관점 차이(패러다임 불일치)

Java와 DB가 데이터를 바라보는 관점이 다르기에 변환을 해서 저장해줘야한다.

데이터를 바라보는 관점의 차이는 [객체 vs 테이블 간의 관계] 라고 생각한다.

  • Java : 객체
class Item
int id;
String name;
  • RDB : 컬럼→레코드→테이블 및 테이블간의 관계

차이로 인한 문제점

  • Java는 객체간 상속 관계를 지니며 이로인해 계층 관계를 나타낸다.
    -> 객체 지향적
  • DB에서는 모든 관계가 동등하며, 연관된 테이블끼리 외래 키를 통해 연관 관계를 맺는다.
    -> 관계 지향적

이러한 관점차이, JAVA는 객체 주소의 관계로, DB는 테이블 레코드의 키를 통해서 데이터를 연결하기에 바로 연결을 할 수 없는 것이다.
이러한 관점을 무시하고 서로를 연결하기 위해 조금 더 유연성 있는 JAVA가 DB에 맞추고자 키로 데이터에 접근하면서 객체 지향적이지 않게 되는 문제가 발생한다.

그럼 어떻게 해결할까?

이러한 문제점을 해결하기 위해 ORM이 등장하게 되었다.
ORM은 객체와 관계형 데이터베이스 간의 데이터를 매핑해주는 기술로

ORM(Object Relataion Mapping)

ORM은 객체(Object)와 DB의 테이블을 자동으로 연결(Mapping)시켜 RDB 테이블을 객체 지향적으로 사용하게 해주는 기술이다.

즉, JDBC를 통해 DB에 접속하여 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면 된다.

💡영속성 & JDBC란?

영속성: 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence)이라고 한다.

JDBC: Java에서 데이터베이스에 접속할 수 있도록 하는 Java API이다.

이전에 언급했듯이, 객체 모델과 관계형 모델 간에는 불일치가 존재하는데, ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.

그럼이제 JPA 대해 알아보자.

JPA

JPA란?
Java에서 객체를 DB에 저장하고 관리하기 위한 인터페이스와 기능을 제공하는 API으로 Java의 ORM기술 표준이다.

JPA는 API, 즉 인터페이스이므로 구현체가 필요하다. 그 중 가장 유명한 것이 "Hibernate"가 있으며 Hibernate는 JDBC를 기반으로 작동한다.

JPA의 장점

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
  • 유지보수
  • 패러다임의 불일치 해결
    • 객체 지향적인 자바와 데이터 중심인 DB의 관점 차이로 인한 패러다임의 불일치 해결
  • 성능
  • 데이터 접근 추상화와 벤더 독립성
    - JPA는 인터페이스이므로 다른 회사의 데이터베이스를 끼워 넣어도 코드 변경 없이 알아서 매핑해준다.

-JPA가 코드 바꿔준다-

-JPA 동작방식-

💡Spring JPA?
JPA != SpringJPA이다. 일반적인 Java app에서도 JPA 사용 가능하다.

[Spring Data JPA -> JPA -> JDBC API] <-> MySQL 로 데이터가 흘러간다.


참고: DB API들의 구현체 내 주요 객체

JDBC

  • 구현체: Hikari (패키지)
    • 주요객체: DataSource

JPA

  • 구현체: Hibernate (패키지)
    • 주요객체: EntityManager

EntityManager

  • @Entitiy: @Component와 유사(EntityContext등록 vs 빈등록), 객체와 테이블 매핑
  • persist(): EntityContext에 추가하고 DB에 저장도 해줘(영속화)
  • @Transactional: 트랜잭션 기능이 적용된 프록시 객체가 생성
  • @Id: 기본 키 매핑

JPA는 어떻게 영속화를 하는걸까?

  • Entity: 영속화가 되고 싶은/ 이미 된 자바 객체
    • @Entity 를 클래스 위에 달아 놓으면, 영속성 컨텍스트에 들어가게 처리한다.
  • EntityContext: 영속화가 될/된 객체 공간[Java ↔ EntityContext ↔ DB]
  • EntityManager: 영속성 컨텍스트 ”안에” 있는 객체들을 영속화 시킬 수 있다.
    • persist(): 영속성 컨텍스트 Entity들을 모아둔다. + 테이블에 저장

@Id

@Id 는 DB에 넣기 위해 필요한 것이 아니라 영속성 컨텍스트에 존재하는 수많은 객체들을 구분하기 위해 필요한 것이다.

  • Room class가 있다면 수많은 Room(room1,room2….)이 존재한다.

@Transactional

DB에 저장을 위해 레코드를 만들고 그 다음 객체를 넣는 작업의 순서를 보장

profile
선순환을 만드는 개발자

0개의 댓글