-
Notifications
You must be signed in to change notification settings - Fork 4
[JPA study 1주차 이지은]
Annotation : 사전적 의미 - 주석, 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술. 프로그램에게 추가적인 정보를 제공해주는 메타 데이터
-
JPA Annotation
JPA를 사용하면 DB 데이터에 작업할 경우 실제 쿼리를 사용하지 않고 Entity 클래스의 수정을 통해 작업
- 엔티티 클래스의 필드를 테이블의 기본키(PK)에 매핑
- @Id가 사용된 필드를 식별자 필드라고 함
- 주로 @GeneratedValue와 같이 이용해서 식별자를 어떤 전략으로 생성하는지 명시
- 데이터베이스에 의해 자동으로 생성될 값에 대한 전략을 지정
- 보통 식별키 생성 전략으로 많이 사용
- strategy : 식별키 전략 지정 (default:AUTO)
- AUTO : 특정 데이터베이스에 맞게 자동으로 생성되는 방식
- IDENTITY : 기본키 생성 방식 자체를 데이터베이스에 위임하는 방식, 데이터베이스에 의존 방식 (MySQL, MariaDB 등 auto_increment 이용)
- SEQUENCE : 데이터베이스의 시퀀스를 이용해서 식별키 생성 (Oracle, PostgreSQL 등 시퀀스 제공 데이터베이스)
- TABLE : 데이터베이스 종류에 상관없이 별도의 키를 생성해 주는 채번 테이블을 이용하는 방식
- generator
- @TableGenerator
- @SequenceGenerator
영속성 컨텍스트
- 엔티티를 영구 저장하는 환경이라는 뜻
- 어플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 같은 역할을 함
- 서비스 별로 하나의 EntityManager Factory가 존재하며 EntityManager Factory에서 DB에 접근하는 트랜잭션이 생길 때마다 쓰레드 별로 EntityManager를 생성하여 영속성 컨텍스트에 접근
- EntityManager에 엔티티를 저장하거나 조회하면 EntityManager는 영속성 컨텍스트에 엔티티를 보관하고 관리
- 영속성 컨텍스트는 EntityManager를 생성할 때 만들어지며 EntityManager를 통해 영속성 컨텍스트에 접근, 관리
entityManager.persist(entity);
- N:1 관계
-
영속성 컨텍스트 내에서 Entity들을 관리
-
JPA에서 제공하는 인터페이스로 spring bean으로 등록되어 있어 Autowired로 사용 가능
@Autowired private EntityManager entityManager;
-
Query Method, Simple JPA repository는 직접적으로 entityManager를 사용하지 않도록 한번 더 감싸준 것
- 데이터베이스의 상태를 변화시키기 위해 수행하는 작업들을 쪼갤 수 없는 단위의 작업으로 나누고, 그 작업들을 논리적으로 최소 단위로 묶은 것
- Transctional 어노테이션을 붙이면 보통 트랜잭션이 보장된 메서드가 실행
- spring-data-jpa와 함께 사용할 경우 데이터베이스의 트랜잭션 시작과 커밋(또는 롤백)이 알아서 된다
- ACID 특징을 가지고 있음
-
원자성(Atomicity)
트랙잭션의 연산은 DB에 모두 반영되던지, 모두 반영되지 않아야 한다. 하나라도 실패한다면 앞서 성공한 것들을 원상 복구 시켜야한다.
-
일관성(Consistency)
트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.
-
독립성(Isolation)
어떤 트랜잭션도 다른 트랜잭션의 작업에 끼어들 수 없다.
-
지속성(Durability)
트랜잭션이 완료된다면, 결과는 영구적이어야 한다.
-
데이터베이스 작업에서 트랜잭션을 관리하는 데 사용되는 어노테이션
- 동작 원리
- @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)
Welcome to the 2024-1-JPA-Study wiki!