본문 바로가기
Spring-boot

JPA에 대한 모든 것

by 조민욱 2024. 3. 26.

참조 문서 : https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#query-by-example

 

Spring Data JPA - Reference Documentation

Example 11. Repository definitions using Domain Classes with mixed Annotations interface JpaPersonRepository extends Repository { … } interface MongoDBPersonRepository extends Repository { … } @Entity @Document public class Person { … } This example

docs.spring.io

 

JPA

  • Java Persistence API ( JPA )는 Java 어플리케이션에서 관계형 데이터베이스를 다루기 위한 API
  • JPA는 객체-관계 매핑( ORM )을 지원하여 객체 지향 프로그래밍과 관계형 데이터베이스 간의 매핑을 단순화 하고 표준화

 

주요 기능

  1. 객체-관계 매핑 (ORM)
    1. JPA는 관계형 데이터 베이스의 테이블과 Java 객체 간의 매핑을 단순화 하는 ORM 프레임워크
    2. 이를 통해 객체 모델과 DB 스키마 간의 간격을 줄여 개발자가 더 직관적으로 개발할 수 있게 함
  2. Entity
    1. JPA에서는 DB의 테이블을 대표하는 객체를 엔티티라고 합니다. 엔티티는 ' @Entity ' 어노테이션으로 표시하며, 일반적으로 DB의 각 레코드와 매핑
  3. EntityManager
    1. 엔티티의 영속성 관리를 위해 사용되는 인터페이스
    2. EntityManager는 엔티티의 생명주기를 관리하고 DB와의 트랜잭션을 처리
  4. JPQL( Java Persistence Query Language )
    1. JPA는 객체 지향 쿼리 언어인 JPQL을 제공, JPQL은 엔티티 객체를 대상으로 쿼리를 작성할 수 있도록 한다. SQL과 비슷하지만 엔티티와 속성을 대상으로 쿼리를 작성
  5. Entity Lifecycle(생명주기)
    1. Transient, Managed, Detached, Removed 등의 상태로 나뉜다.
    2. EntityManager를 통해 엔티티의 상태를 관리할 수 있습니다.
  6. 페치 전략(Fetch Strategy)
    1. 엔티티의 연관된 객체를 가져오는 전략을 결정하는데 사용
    2. 지연로딩과 즉시로딩이 있으며, 이를 통해 성능 최적화를 할 수 있음
  7. 트랜잭션 관리
    1. JPA는 DB 트랜잭션을 지원하여 DB작업을 안전하게 처리
    2. 엔티티 매니저를 사용하여 트랜잭션을 시작하고 커밋 또는 롤백하여 데이터의 일관성을 보장
더보기

Entity Lifecycle

  • 엔티티는 다음과 같은 상태로 나뉜다.
    • Transient(임시 상태) : 엔티티 객체가 생성되었지만, 영속성 컨텍스트에 저장하지 않은 상태를 말함, 일반적으로 ' new ' 키워드로 객체를 생성한 후에 해당 상태에 있음
    • Managed(관리 상태) : 엔티티 객체가 영속성 컨텍스트에 관리되고 있는 상태, EntityManager를 사용하여 엔티티를 저장하거나 조회하면 해당 엔티티는 관리 상태가 됨
    • Detached(분리 상태) : 영속성 컨텍스트에서 관리되지 않는 상태를 말함, 이는 트랜잭션을 종료하거나, EntityManager의 detach( ) 메서드를 호출하여 엔티티를 분리한 경우에 해당
    • Removed(삭제 상태) : 엔티티가 영속성 컨텍스트에서 삭제되었지만, DB에는 아직 삭제되지 않은 상태, EntityManager의 remove( ) 메서드를 호출하여 엔티티를 삭제하면 해당 상태가 됨
  • 엔티티의 생명주기
    • 생성(Transient) : 엔티티 객체 생성
    • 영속화(Managed) : EntityManager를 통해 엔티티를 저장하면 영속성 컨텍스트에 해당 엔티티가 관리되는 상태가 됨
    • 변경 : 엔티티의 상태가 변경, 이 때 영속성 컨텍스트는 변경을 감지하고, 변경된 내용을 DB에 자동으로 반영
    • 분리(Detached) : 영속성 컨텍스트에서 분리되거나, 트랜잭션이 종료도히면 엔티티가 분리 상태가 됨
    • 삭제(Removed) : 엔티티가 영속성 컨텍스트에서 삭제되어 DB에서 삭제될 준비가 되면 삭제 상태가 됨

 

Transaction

  • DB에서 한번에 수행되어야 하는 연산들의 논리적인 단위 
  1. 트랜잭션이란 무엇인가?
    1. DB에서 여러 작업을 하나의 묶음으로 처리하는 것
    2. 예를 들어, 은행에서 돈을 이체할 때, 계좌에서 돈을 빼고 다른 계좌에 넣는 작업은 한 번에 처리되어야 한다. 이러한 작업들을 트랜잭션으로 묶어서 한 번에 실행하는 것이 트랜잭션의 개념 
  2. 트랜잭션의 특징은 무엇인가?
    1. 트랜잭션은 ACID라는 특성을 가지고 있다.
      1. 원자성(Atomicity) : 트랜잭션은 하나의 단위로 처리되어야 하며, 모든 작업이 성공하거나 모든 작업이 롤백되어야 한다.
      2. 일관성(Consistency) : 트랜잭션 이전의 상태와 이후의 상태는 항상 일관되어야 한다.
      3. 격리성(Isolation) : 동시에 실행되는 다른 트랜잭션의 영향을 받지 않고, 각각 독립적으로 처리되어야 한다.
      4. 지속성(Durability) : 트랜잭션이 성공적으로 완료되면 결과는 영구적으로 저장되어야 한다.

 

엔티티 매니저

EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

// 엔티티 저장
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();

// 엔티티 조회
User user = em.find(User.class, userId);

// 엔티티 업데이트
em.getTransaction().begin();
user.setUsername("newUsername");
em.getTransaction().commit();

// 엔티티 삭제
em.getTransaction().begin();
em.remove(user);
em.getTransaction().commit();

em.close();
emf.close();

 

 

JPQL

TypedQuery<User> query = em.createQuery("SELECT u FROM User u WHERE u.username = :username", User.class);
query.setParameter("username", "someUsername");
List<User> users = query.getResultList();

'Spring-boot' 카테고리의 다른 글

aws 키 페어 생성하기  (0) 2024.04.19
Spring-Boot Docker 배포. window  (1) 2024.04.19
@ManyToOne 관계 유형  (0) 2024.03.15
Spring-boot URL 미리보기  (0) 2024.03.12
Next.js와 Spring-boot 로컬 서버 통신하기  (0) 2024.03.12