JPA 기본 4
엔티티 매핑
객체와 테이블
@Entity
@Entity
가 붙은 클래스는 JPA가 관리한다.- JPA를 사용해 테이블과 매핑할 클래스는
@Entity
애너테이션을 필수로 붙여야 한다. - 기본 생성자를 필수로 생성해야 한다. (public or protected)
- final 필드는 사용 불가하다.
@Table
@Table
은 엔티티와 매핑할 테이블을 지정할 때 사용하는 애너테이션이다.
데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성한다.
- 객체 중심으로 데이터베이스 방언을 활용해 적절한 DDL을 구성해 사용한다.
- 생성된 DDL은 개발 장비에서만 사용해야 한다.
- 운영 서버에 적용 시에는 자동 생성된 DDL을 조금 다듬어서 사용해야 한다.
- 옵션
- create : 기존 테이블 삭제 후 새로 생성
- create-drop : 어플리케이션 종료 시 drop
- update : 변경분만 반영함
- validate : 엔티티, 테이블의 정상 매핑 여부를 확인
- none : 사용하지 않음
- 운영 장비에서는 절대로 create, create-drop, update를 사용하면 안된다!!!
- 권장 사항
- 개발 초기 : create, update
- 테스트 서버 : update, validate
- 스테이징, 운영 서버 : validate, none
필드와 컬럼
@Column
: 컬럼 매핑- name : 필드와 매핑할 테이블 컬럼
- insertable, updatable : 삽입, 변경 가능 여부 (default : TRUE)
- nullable : null 값 허용 여부 (false => NOT NULL 효과)
- unique : 유니크 제약 조건을 걸 때 사용
- 필드에서 잘 사용하지는 않는다.
- 테이블 애너테이션의 옵션으로 유니크를 지정해야 이름을 지정해 사용하는 것이 가능하기 때문이다.
- 필드에서 잘 사용하지는 않는다.
- length : 문자 길이 제약조건
- columnDefinition : 컬럼 정보를 직접 줄 수 있음
- ex) varchar(10) default ‘hello’
- precision, scale : BigDecimal 타입처럼 범위가 아주 크거나 소수점 값에 사용
@Temporal
: 날짜 타입 매핑- 날짜 타입 때문에 사용한다.
- Java8로 넘어오면서 LocalDate, LocalDateTime 타입이 추가되었기에 @Temporal의 사용 필요가 줄어들었다.
- DATE, TIME, TIMESTAMP 옵션이 있다.
@Enumerated
: enum 타입 매핑- value : ORDINAL(순서), STRING(이름) (default : ORDINAL)
- ORDINAL을 사용하면 enum의 순서(integer)를 저장하기에 enum 값 변경에 따른 오류가 생길 수 있다. 치명적이다.
- STRING 옵션을 사용하도록 하자!!
- value : ORDINAL(순서), STRING(이름) (default : ORDINAL)
@Lob
: BLOB, CLOB 매핑- 지정할 수 있는 속성이 없다.
- 문자면 CLOB으로 설정되고, 나머지는 BLOB으로 매핑된다.
@Transient
: 특정 필드를 메모리에서만 사용하고 DB에는 추가하고 싶지 않을 때 사용함
기본 키 매핑
@Id
- 키로 사용할 값을 설정한다.
@GeneratedValue
- 전략을 설정한다.
- AUTO : 알아서 아래 3개 중 하나로 설정된다.
- IDENTITY : ID 애너테이션이 붙은 값을 AUTO_INCREMENT(MySQL 기준)
- SEQUENCE : 주로 Oracle 같은 DB에서 많이 사용한다.
- TABLE : 키 생성 전용 테이블을 하나 만들어서 DB 시퀀스를 흉내내는 전략 (모든 DB에 적용가능하나 성능이 떨어짐)
- 전략을 설정한다.
@SequenceGenerator
: 시퀀스에 관한 더 자세한 설정을 위해 사용한다.@TableGenerator
: 운영에서 테이블 전략을 사용하기는 부담스러울 것이다.
권장하는 식별자 전략
- 기본 키 제약 조건 : null이 아니어야 한다, 유일해야 한다, 변하면 안된다.
- 미래까지 변하지 않는다는 조건을 만족하는 자연키는 찾기 어렵다. 대체키를 사용하자.
- 주민등록번호도 기본 키로 적절하지 않다.
- 미래까지 변하지 않는다는 조건을 만족하는 자연키는 찾기 어렵다. 대체키를 사용하자.
- 타입을 Long 형으로 사용하고, 대체키를 사용하며, 키 생성전략을 조합하여 사용해야 한다.
IDENTITY 전략의 특징
- 영속 컨텍스트 사용을 위해서는 기본 키가 있어야 한다.
- IDENTITY 전략은 DB에 넣어야 PK를 알 수 있기 때문에 persist 호출 시 바로 INSERT 쿼리가 날라간다.
- 원래는 commit 시 INSERT 쿼리가 날라간다.
- 이는 영속성 컨텍스트에서 PK 값을 사용하기 위함이다.
SEQUENCE 전략의 특징
- Allocation size를 통해 앞으로 사용할 size 만큼을 미리 call 한다.
- size 만큼을 메모리로 사용하게 된다.
- 약 50 ~ 100 정도의 size를 주는 것이 좋을 것이다.
- 호출을 줄일 수 있어 효율적이다.
Comments powered by Disqus.