[우아한테크코스] 6월 22일 TIL
[Spring] JPA
객체의 연관관계는 방향성이 있지만, 테이블의 연관관계는 없다.
jpa는 객체에 따라 스키마를 자동으로 생성한다.
- ORM vs JPA : 아마찌
spring.jpa.hibernate.ddl-auto=create
로 적용
repository extends JpaRepository 하면 자동 빈 등록
- create: 기존 테이블 삭제 후 다시 생성
- create-drop: create와 같지만 종료시점에 테이블 drop
- update: 변경된 부분만 반영
- validate: entity, table 매핑 확인
-
none: 사용하지 않음
- @Entity: 테이블과 매핑
- @Table: 매핑될 테이블 지정
- @id: 직접 매핑
- @GeneratedValue: pk 생성 규칙
-
@Column: 컬럼의 이름을 사용해 테이블 컬럼에 매핑, 안써도 됨
-
auto-increment id 검증 시 NotNull만 확인하고 실제 값은 확인하지 않는 것이 좋음
- jpa의 영속성 컨텍스트는 엔티티를 캐싱해 동등성(isEqualTo) 뿐만 아니라 동일성(isSameAs)도 보장해준다.
1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경 감지, 지연 로딩
insert 시 영속 컨텍스트 내에 쓰기 지연 sql 저장소에 저장해두었다가 하나의 transaction 마칠때 한꺼번에 flush하고 commit 해주는 일을 한다. 이 일은변경 감지(dirty checking: 객체 값이 바뀌면 테이블에도 변경)
에 효과적이다.
스냅샷: commit 시점(transaction 마치는 시점)에 jpa가 영속성 컨텍스트에 가지고 있던 id, table, 스냅샷을 가지고 스냅샷과 entity를 비교
jpa는 collection을 다루는 것처럼 객체를 다뤄준다. 하나의 컬렉션이나 다름 없다.
//이때 스냅샷은 객체 바뀔때마다 찍히나?
–락– 저장 -> 변경 –flush–> 조회(이름 조회는 1차 캐시 안보고 db 바로 봄) –커밋–
이름과 같은 조회, 즉 1차 캐시를 보지 않고 db를 바로 보는 것인 JPQL
이라고 하는 쿼리문이 실행되어 커밋이 두번 진행된다.
락이 걸리면 rollback을 위한 또다른 저장 공간이 존재한다. 모든 트랜잭션이 끝나야 언락이 진행된다.
그러므로 jpa 쓸꺼면 trancsational 필필수수
//@Transactional 공부도 필필수수
- 엔티티의 생명주기
트랜잭션 단위로 관리
비영속(new/transient): 영속성 컨텍스트와 무관
영속(managed): 영속성 컨텍스트에 저장된 상태
준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
삭제(removed): 삭제된 상태