본 포스트는 김영한 님의 자바 ORM 표준 JPA 프로그래밍 강의를 토대로 작성하였습니다.
JPA에서 관리할 클래스를 만드는 방법은 @Entity를 붙여주면 된다.
요런 식이다.
주의할 점❗️
기본 생성자 필수
final 클래스, enum, interface, inner 클래스 사용 X
저장할 필드에 final 사용 X
클래스와 데이터베이스 테이블 간 다른 이름을 가진 테이블에 매핑하는 경우 @Table 어노테이션을 이용하면 된다. 속성은 다음 그림을 참고하자.
-> DDL을 애플리케이션 실행 시점에 자동 생성
적용 방법은 persistence.xml 파일에
<property name="hibernate.hbm2ddl.auto" value="create" />
요거를 적어두고 value 값을 아래의 값들로 변경하면 된다.
JPA에서는 객체 멤벼 변수에 어노테이션으로 데이터 정의어를 생성할 수 있다.
데이터 베이스 매핑과 관련된 어노테이션들 중 주요한 것들을 정리해보자.
굳이 외우기 보다는 필요할 때 찾아보는 것도 좋을 것 같다.
이런 식으로 쓰는건데 주의할 점❗️ 웬만하면(거진 무조건) EnumType.STRING으로 쓰자.
default가 Ordinal인데, Ordina로 사용 시 이후에 Enum 클래스에 값이 추가될 경우 순서 정보가 꼬이게 되어 데이터베이스에 중복된 값이 들어갈 수 있다.
기본 키 매핑 방법에는 크게 2가지가 있다.
pk로 쓸 변수 위에 위 어노테이션을 적고 그냥 직접 넣어주면 된다.
❗️주의할 점
IDENTITY 전략을 사용할 경우 쿼리를 쌓아놓고 보내는 버퍼 기능을 사용할 수 없다!
이유는,
pk 값을 Null로 두고 데이터베이스로 보내면 데이터베이스가 알아서 pk값을 채우는 방식이기 때문에 객체를 생성하고 이를 DB에 보내기 전까지는 pk 값을 알 수가 없다.(메모리 상에서는 null이니까) 그런데 영속 컨텍스트에는 pk 값이 없으면 그 객체를 넣을 수가 없다. 따라서 persist하자마자 insert 쿼리를 날리고 해당 객체의 pk 값을 취한다.
사용은 요렇게.
SEQUENCE
유일한 값을 순서대로 생성하는 데이터베이스 오브젝트를 이용하는 전략
allocationSize의 경우 성능 최적화를 위해 사용되는 값이다.
성능 최적화 방법
allocationSize의 값이 50이라면
//member 객체가 존재한다고 가정
- em.persist(member) 실행
- pk 전략이 SEQUENCE 임을 확인하고 데이터 베이스에서 현재 시퀀스 값(1)을 가져옴. allocationSize 값만큼 다음 sequence 값을 증가시켜 세팅(여기서는 1 -> 51)
- 이후로는 pk 값이 51이 될 때까지 쿼리를 날리지 않고 메모리 상에서 pk 할당 (이미 51까지 증가시켜놨으니까)
- 단 persist를 호출했다고 insert 쿼리가 날아가지는 않음, 다음 sequence 값을 알기 위한 쿼리만 날아감 (영속 컨텍스트를 이용한 버퍼 기능 활용 가능)
사용은 요렇게
@GeneratedValue 어노테이션의 strategy 값은 디폴트가 auto 이다.
auto는 사용 db에 따라 전략을 알아서 선택해주는 것이고,
@GeneratedValue가 붙어있으면 db 전략에 맞추어 무조건 id 값을 보장해준다는 것이다. 즉 strategy 옵션 값은 그냥 전략 선택이고 @GeneratedValue가 있기만 한다면 선택한 전략에 따라 Id 값을 알아서 넣어준다는 것이다.
요거는 나중에 필요할 때 공부해보자