[스프링 부트의 정석] Part4. JPA

박소은·2024년 7월 21일
1
post-custom-banner

JPA의 개요와 설정

JPA(Java Persistence API)란?

ORM을 위한 Java 표준 API

  • ORM: 객체, 관계형 데이터베이스를 맵핑
  • 인터페이스 집합(JDBC)

JPA 구현체: HIBRNATE, OpenJpa, EclipseLink, DataNucleus, ...

Persistence(영속성): 애플리케이션 종료 후에도 객체(데이터)가 유지되는 것

ORM(Object/Relation Mapping) Framework - HIBERNATE

  • JPA API 구현
  • 객체와 DB 테이블 간의 연결을 해주는 프레임워크
  • 객체 모델(object model)과 관계형 모델(relational model)의 차이를 해소
  • 객체는 참조로 연결된 형태

  • RDB는 고정되어 있는 2차원 테이블

  • 이 두 모델 간의 변환을 HIBERNATE(Orm Framework)이다.

객체 모델과 관계형 모델의 비교

JPA의 개요와 설정
SQL Mapper(MyBatis) vs ORM framework(HIBERNATE)

  1. SQL Mapper
    DB 중심 개발
  • SQL 직접 작성
  • 데이터 저장할 클래스 작성
  • MyBatis
  • 큰 회사들이 많다.

DB에 변경 사항 발생 시 고쳐야 할 것이 많다.

  1. ORM framework(HIBERNATE)
  • 자바 클래스 작성
    • 변경 사항 발생 시 Entity만 변경하면 HIBERNATE ORM이 자동 반영
  • HIBERNATE ORM이 테이블 자동 생성
    • SQL문 자동 생성
    • 유지보수에 유리
    • 복잡한 일처리, 성능 면에서 문제

둘 다 장단점이 존재한다. 오래된 기업들은 RDB가 중요하고 실무에서 복잡한 일처리하기 위해서는 JPA로 하기 어렵다. DB 중심 개발을 바꾸기가 쉽지 않다.

Spring Data
저장소 종류가 달라도 일관된 데이터 처리 방법을 제공


엔터티 매니저 팩토리와 엔터티 메니저

EntityManager와 EntityManagerFactory

EntityManagerFactory: EntityManager를 생성. 애플리케이션에 하나
EntityManager: Entity를 관리하는 객체. Entity를 저장 관리. 사용자당 하나. 공유 불가

사용자는 직접 DB에 명령내리는 대신, EntityManager로만 작업

저장은 persist(), 조회는 find(), 삭제는 remove(), 변경은 Entity의 setter를 이용

Entity 클래스의 작성

Entity 클래스: DB 테이블의 한 행(row)을 정의한 것.

  • 클래스에 @Entity를 붙인다.
  • 키(PK)로 사용할 속성에 @Id를 붙인다.

*** 순서는 보장되지 않는다.

database에서는 대소문자 구분하지 않는다.

Entity 클래스의 작성을 위한 애너테이션

@Generated
자동 번호 생성을 적용할 속성에 사용

GenerationType.TABLE
GenerationType.SEQUENCE
GenerationType.IDENTITY
GenerationType.AUTO

EntityTransaction

EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction tx = entityManager.getTransaction(); //트랜잭션 얻기

User user = new User(); // User 객체를 생성하고 초기화
user.setId("aaa");
user.setPassword("1234");

tx.begin(); // 트랜잭션을 시작
entityManager.persist(user); // User 객체를 저장
tx.commit(); // 트랜잭션을 종료(작업 내용을 DB에 반영)

Hibernate가 SQL을 자동 생성한다.

PreparedStatement

  1. 성능
  2. 보안

Transaction이란?
더 이상 나눌 수 없는 작업의 단위

  • 모두 성공하지 않으면 실패
  • 하나 이상의 작업을 묶은 것이 Transaction이다.

Commit과 Rollback

  1. 커밋: 작업 내용을 DB에 영구적으로 저장
  2. 롤백: 최근 변경사항을 취소(마지막 커밋으로 복귀)

PersistenceContext = PC = Entity 저장공간

*** AC = Application Context = 빈(bean) 저장소

  • entity를 저장하는 공간
  • EntityManager마다 PersistenceContext를 하나씩 가지고 있다.

비영속 상태와 영속 상태

  • 처음 entity를 생성 시 비영속 상태이다.
    • PersistenctContext에 저장되지 않았다.
  • em.persist(entity) : 비영속 상태의 entity가 PersistenceContext에 저장되고 엔터티를 영속 상태로 바꾸고, SQL 저장소에 INSERT문을 저장한다.
  • em.remove(entity) : Entity Manager가 PersistenceContext에서 해당 Entity를 제거
  • em.flush() : db에 sql이 전송된다. SQL 저장소에 누적된 SQL문을 DB로 전달. tx.rollback() 가능

PersistenceContext의 캐시

  • 실제 Entity가 저장되는 공간(Map). Entity의 @Id컬럼을 Key로 사용
  • key와 value
  • em.find(User.class, "a") : 캐시에서 Entity를 먼저 조회. 캐시에 없을 때만 DB에서 조회한다.
  • em.clear()를 통해 캐시를 비운다.
profile
Backend Developer
post-custom-banner

0개의 댓글