엔티티
실체, 객체
데이터베이스에서 한 건의 자료를 구성하는 레코드를 말함. 엔티티 사이의 관계를 relationship이라 하고, 도표로 나타낸 것을 ERD(Entity Relationship Diagram)이다.
객체와 테이블 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수
- 기본 생성자 필수
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final 사용 X
속성:name
- @Entity(name "Study")
- JPA에서 사용할 엔티티 이름 지정
- 기본값 : 클래스 이름을 그대로 사용
- 같은 클래스 이름이 없으면 가급적 기본값 사용
@Table
- 엔티티와 매핑할 테이블 지정
- @Table(name = "")
- 매핑할 테이블 이름을 지정
- 기본값 : 엔티티 이름 사용
필드와 컬럼 매핑 : @Column
기본 키 매핑 : @Id
연관관계 매핑 : @ManyToOne, @JoinColumn
데이터 베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성
- 테이블 중심 -> 객체 중심
- 데이터 베이스 방언을 활용해 데이터베이스에 맞는 적절한 DDL 생성
- 개발 장비에서만 사용하고 운영 서버에서는 사용하지 않는다.
운영 장비는 절대 create, create-drop, update 사용하면 안된다.
테스트 서버는 update 또는 validate를 사용한다.
웬만하면 validate나 none을 쓰는 것이 좋다. 데이터가 많은 상태에서 alter를 했을 때 자칫 시스템 중단의 위험성이 있다.
필드와 컬럼 매핑
💡EnumType.ORDINAL은 사용하지 않는다.
-> 요구 사항에 따라 새로운 TYPE이 추가될 수 있기 때문에 순서가 변경될 수 있다. 즉, 어떤 값을 제일 앞에 추가했을 때 원래 첫번째였던 값이 0이었다 추가된 값도 0이 되기 때문에 문제가 된다. 그래서 EnumType.String을 사용해야한다.
@Lob
DB에서 VARCHAR를 넘어서는 큰 내용을 넣고 싶을 경우 사용한다.
- CLOB: String, char[], java.sql.CLOB
- BLOB: byte[], java.sql.BLOB
기본 키 매핑
IDENTITY
- 트랜잭션 커밋 시점에 INSERT SQL 실행
- AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID 값을 알 수 있다.
- IDENTITY 전략은 persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회한다.
- 즉, 1차 캐시 안에 있는 @Id 값은 DB에 넣기전까지 세팅 할 수 없다. persist되어 있을 때 가져오려고 한다면 INSERT문이 실행되고 가져올 수 있다.
SEQUENCE
- 데이터베이스 시퀀스는 '유일한 값'을 '순서대로'생성하는 특별한 데이터베이스 오브젝트
- allocationSize : 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨) default 값은 50이다. 즉 호출할 때 일일히 DB에 가지않고 미리 DB에 50개를 한 번에 올려 놓고 메모리 상에서 1개씩 쓰는 것이다.
TABLE
- '키 생성 전용 테이블'을 하나 만들어서 '데이터베이스 시퀀스'를 흉내내는 전략
AUTO
- 기본 설정값이다. persist하고 @Id 값을 가져오려고 하면 insert문은 날아가지않고 seq값을 받아온다.