Skip to content

[JPA study 1주차 이지은]

ljinny edited this page Mar 27, 2024 · 1 revision

1. Id, GeneratedValue

Annotation : 사전적 의미 - 주석, 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술. 프로그램에게 추가적인 정보를 제공해주는 메타 데이터

  • JPA Annotation

    JPA를 사용하면 DB 데이터에 작업할 경우 실제 쿼리를 사용하지 않고 Entity 클래스의 수정을 통해 작업

    @Id

    • 엔티티 클래스의 필드를 테이블의 기본키(PK)에 매핑
    • @Id가 사용된 필드를 식별자 필드라고 함
    • 주로 @GeneratedValue와 같이 이용해서 식별자를 어떤 전략으로 생성하는지 명시

    @GeneratedValue

    • 데이터베이스에 의해 자동으로 생성될 값에 대한 전략을 지정
    • 보통 식별키 생성 전략으로 많이 사용
    • strategy : 식별키 전략 지정 (default:AUTO)
      • AUTO : 특정 데이터베이스에 맞게 자동으로 생성되는 방식
      • IDENTITY : 기본키 생성 방식 자체를 데이터베이스에 위임하는 방식, 데이터베이스에 의존 방식 (MySQL, MariaDB 등 auto_increment 이용)
      • SEQUENCE : 데이터베이스의 시퀀스를 이용해서 식별키 생성 (Oracle, PostgreSQL 등 시퀀스 제공 데이터베이스)
      • TABLE : 데이터베이스 종류에 상관없이 별도의 키를 생성해 주는 채번 테이블을 이용하는 방식
    • generator
      • @TableGenerator
      • @SequenceGenerator

2. PersistenceContext, EntityManager

PersistenceContext

영속성 컨텍스트

  • 엔티티를 영구 저장하는 환경이라는 뜻
  • 어플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 같은 역할을 함
  • 서비스 별로 하나의 EntityManager Factory가 존재하며 EntityManager Factory에서 DB에 접근하는 트랜잭션이 생길 때마다 쓰레드 별로 EntityManager를 생성하여 영속성 컨텍스트에 접근
  • EntityManager에 엔티티를 저장하거나 조회하면 EntityManager는 영속성 컨텍스트에 엔티티를 보관하고 관리
  • 영속성 컨텍스트는 EntityManager를 생성할 때 만들어지며 EntityManager를 통해 영속성 컨텍스트에 접근, 관리

entityManager.persist(entity);

  • N:1 관계

Untitled

EntityManager

  • 영속성 컨텍스트 내에서 Entity들을 관리

  • JPA에서 제공하는 인터페이스로 spring bean으로 등록되어 있어 Autowired로 사용 가능

    @Autowired
    private EntityManager entityManager;
  • Query Method, Simple JPA repository는 직접적으로 entityManager를 사용하지 않도록 한번 더 감싸준 것

3. Transactional

Transaction

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 작업들을 쪼갤 수 없는 단위의 작업으로 나누고, 그 작업들을 논리적으로 최소 단위로 묶은 것
  • Transctional 어노테이션을 붙이면 보통 트랜잭션이 보장된 메서드가 실행
  • spring-data-jpa와 함께 사용할 경우 데이터베이스의 트랜잭션 시작과 커밋(또는 롤백)이 알아서 된다
  • ACID 특징을 가지고 있음
    • 원자성(Atomicity)

      트랙잭션의 연산은 DB에 모두 반영되던지, 모두 반영되지 않아야 한다. 하나라도 실패한다면 앞서 성공한 것들을 원상 복구 시켜야한다.

    • 일관성(Consistency)

      트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.

    • 독립성(Isolation)

      어떤 트랜잭션도 다른 트랜잭션의 작업에 끼어들 수 없다.

    • 지속성(Durability)

      트랜잭션이 완료된다면, 결과는 영구적이어야 한다.

@Transactional

데이터베이스 작업에서 트랜잭션을 관리하는 데 사용되는 어노테이션

  • 동작 원리
    • @Transactioanl을 메소드 또는 클래스에 명시
    • AOP를 통해 Target이 상속하고 있는 인터페이스 또는 Target 객체를 상속한 proxy 객체 생성
    • Proxy 객체의 메소드 호출
    • Target 메소드 전 후로 트랜잭션 처리 수행
  • JPA를 통한 모든 데이터 변경을 트랜잭션 안에서 실행해야 한다
  • 테스트 케이스에 이 어노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백
    • DB에 데이터가 남지 않으므로 다음 테스트에 영향 X

[https://velog.io/@seongwon97/Spring-Boot-영속성-컨텍스트Persistence-Context](https://velog.io/@seongwon97/Spring-Boot-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8Persistence-Context)

https://m.blog.naver.com/hj_kim97/222831780994

[https://velog.io/@devlyny/Transactional-어노테이션-정리](https://velog.io/@devlyny/Transactional-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EC%A0%95%EB%A6%AC)

Clone this wiki locally