책을 읽고 배운 내용을 정리한다.
GenerationType.IDENTITY
- 엔티티가 영속 상태가 되려면 식별자가 반드시 필요하다.
- 그런데 이 생성 전략은 엔티티가 데이터베이스에 저장이 되어야 식별자가 생긴다.
- 그래서 em.persist()를 직접 호출하거나 내부에서 호출하는 즉시 삽입 SQL 작업이 수행된다.
- 즉 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.
- 생각해보면 당연한 게 영속 상태에 있으려면 식별자가 있어야 하는데 데이터베이스에 삽입하기 전에는 식별자가 존재하지 않는다.
- 그러니깐 식별자를 만들어주기 위해서 삽입 SQL이 지연되지 않고 바로 수행되어 식별자를 얻은 엔티티가 영속 상태가 되는 것 같다.
대리 키를 권장한다.
- PK에는 대리 키를 권장한다.
- 대리 키는 비즈니스 적으로 의미가 없는 그냥 생성하는 키를 의미한다. AUTO_INCREMENT가 대표적이다.
- PK는 절대로 변하면 안 된다. 그런데 그 데이터가 변하지 않으리라는 보장을 그 누구도 할 수 없다.
- 주민등록번호도 언젠간 바뀔 수 있고, 우편번호도 최근 5자리로 바뀌었다.
- 그렇기 때문에 일관적으로 대리 키를 사용해서 JPA를 사용하는 것을 권장한다.
@Column(nullable =...)
- 기본적으로 사용해도 되고 사용하지 않아도 작동은 하지만 변수 타입에 따라 다르다.
- primitive 타입의 경우는 변수에 null을 담을 수 없다.
- 그런데 이 어노테이션을 사용하면 default로 nullable=true라는 설정이 들어가게 되고 문제가 생길 수 있다.
- 반면에 Wrapper 클래스의 경우 null 값을 할당할 수 있기 때문에 특별히 문제가 발생하지 않는다.
- 그러므로 Wrapper 클래스를 사용하거나, 스펙에 따라서 primitive 타입을 사용해야 하는 경우는 반드시 nullable=false를 선언해야 한다.
@Transient
- 매핑하지 않는 필드
- 데이터베이스에 저장하지 않고 조회하지도 않지만 객체에는 값을 할당할 수 있다.
- 특정 용도로 어떤 값을 보관하고 싶을 때 사용한다.
'Programming' 카테고리의 다른 글
JPA Study 03 (0) | 2021.05.16 |
---|---|
JPA Study 02 (0) | 2021.05.15 |
DB 예약어(MySQL, MariaDB) (0) | 2021.05.14 |
Spring Study 04 (0) | 2021.05.05 |
Spring Study 03 (0) | 2021.05.05 |