티스토리 뷰
@Entity
public class Member {
@Id
private Long id;
private String name;
}
위와 같이 작성을 할 경우 JPA에서 자동으로 DDL을 애플리케이션 실행 시점에 생성해준다.
이렇게 만들 경우 4가지 옵션으로 사용이 가능하다.
ddl-auto : create, update, validate, none
옵션 | 설명 |
create | 기존 테이블 삭제 후 다시 생성 |
update | 변경분만 반영 |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음 |
개발 환경(로컬)에서는 create나 update를 사용해도 되나, 스테이징과 운영에서는 절대 사용해선 안된다.
스테이징과 운영은 validate, none을 권장
왜냐하면 create는 데이터 자체를 날릴 수 있으며,
update는 많은 alter문을 실행하다가 DB락이 걸려서 운영 장애가 날 수 있다.
기본키 매핑
기본키 매핑 방법에는 2가지 방식이 있습니다.
직접할당 : @Id만 사용
자동생성 : @GeneratedValue
- IDENTITY : 데이터베이스에 위임, MYSQL
- SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, 오라클
- TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용(@TableGenerator 필요)
- AUTO : 방언에 따라 자동 지정, 기본값
IDENTITY
IDENTITY 전략의 경우 DB에 insert될 때 알아서 시퀀스를 넣고 실행되기 때문에 insert문 자체에도 id 값은 null로 실행된다. 그래서 pk를 알 수 있는건 막상 DB에 데이터가 들어가봐야 알 수 있다.
하지만 그러면 영속성 컨텍스트는 pk를 모르기 때문에 관리를 할 수 없으므로 이 전략일 경우에만 예외적으로 persist 작업때 insert문을 날리게 된다.
SEQUENCE
아이덴티티 전략과는 다르게 시퀀스는 persist 시점에
call next value for MEMBER_SEQ
라는 구문이 실행되어 pk를 불러와서 기본키 매핑이되므로 원래의 매커니즘대로 움직이게 된다.
그러나 결국 DB의 조회를 해오는 것이므로 성능적인 개선이 필요하다.
그래서 사용하게되는 옵션이 allocationSize이다.
한 번의 호출로 얼만큼의 시퀀스를 불러올지 정하는 옵션인데 권장 옵션은 50개씩이다.
1번의 호출로 50개의 시퀀스를 불러와서 서버에서는 1개씩 쭉 쓰다 50개를 다 쓰게 되면 다시 호출해서 새로운 50개를 받아오는 방식이다. 이렇게 설정할 경우 네트웍 비용을 아낄 수 있다.
'Back-end > JPA' 카테고리의 다른 글
JPA @MappedSuperclass (0) | 2023.05.28 |
---|---|
자바 ORM 표준 JPA 연관관계 (0) | 2023.05.27 |
자바 ORM 표준 JPA 플러시, 준영속 (0) | 2023.05.24 |
자바 ORM 표준 JPA 영속성 컨텍스트 (0) | 2023.05.23 |
Spring JPA @Modifying - clearAutomatically (0) | 2022.10.29 |