[JPA] JPA 프로그래밍 기본기 다지기 3강 - 필드와 컬럼매핑
업데이트:
여기서부터 실습은 인텔리제이로 시작…
💡필드와 컬럼매핑
✔데이터베이스 스키마 자동으로 생성하기
- 애플리케이션 실행 시 DDL을 자동으로 생성할 수 있다(테이블 자동 생성)
- 테이블 중심 -> 객체 중심으로 이동한 것
- 데이터베이스 방언을 활용해 데이터베이스에 맞는 적절한 DDL 생성
- 이렇게 생성한 DDL은 개발에서만 사용한다(운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용)
hibernate.hbm2ddl.auto
아래와 같은 여러가지 옵션 설정
- create : 기존 테이블 삭제 후 다시 생성(DROP + CREATE)
- create-drop : create와 같으나 종료시점에 테이블 DROP(테스트코드에서 도움됨)
- update : 변경분만 반영(
alter
로 추가, 운영 DB에는 사용하면 안됨)- validate : 엔티티와 테이블이 정상매핑 되었는지만 확인
- none : 자동 생성을 사용하지 않음
✔데이터베이스 스키마 자동 생성하기 주의!!!
- 운영장비에서는 절대
create, create-drop, update
사용하면 안된다!! - 개발 초기 단계:
create
또는update
- 테스트 서버 :
update
또는validate
- 스테이징과 운영서버 :
validate
또는none
✔매핑 어노테이션
철저하게 데이터베이스에 어떤식으로 매핑할지를 결정하는 매핑정보에 관련된 어노테이션들(Java코드에 영향을 주지 않음)
@Entity
public class Member {
@Id
private Lond id;
@Column(name = "USERNAME")
private String name;
private int age;
@Temporal(TemporalType.TIMESTAMP)
private Date regDate;
@Enumerated(EnumType.STRING)
private MemberType memberType;
...
}
@Column
class의 필드명과 DB의 컬럼명이 일치하지 않을 경우 사용
- @Column(name = “USERNAME”)
- name: 필드와 매핑할 테이블의 컬럼 이름
- insertable, updatable: TRUE/FALSE 설정. 읽기 전용
- nullable: null 허용여부 결정, DDL 생성시 사용(not null 추가)
- unique: 유니크 제약 조건, DDL 생성시 사용
- columnDefinition, length, precision, scale(DDL)
@Temporal
날짜와 관련된 매핑
@Temporal(TemporalType.DATE)
//날짜@Temporal(TemporalType.TIMESTAMP)
//시간@Temporal(TemporalType.TIMESTAMP)
//날짜와 시간- Date 뿐만아니라 자바8에서 지원하는 LocalDatetime도 지원한다.
@Enumerates
열거형 매핑, Enum 타입을 매핑을 지원
@Enumerated(EnumType.ORDINAL)
: 순서를 저장(기본값)@Enumerated(EnumType.STRING)
: 열거형 이름을 그대로 저장, 가급적 이것을 사용- 현업에서는
EnumType
을 무조건STRING
으로 지정 해야한다. - 기본 값인
ORDINAL
로 설정하면Enum
순서로 숫자가 매핑되는데,Enum
중간에 필드가 하나 추가 되면 다 꼬이게 된다.
@Lob
컨텐츠의 길이가 너무 길 경우 바이너리 파일로 DB에 바로 밀어 넣어야 하는데, 보통 이런 경우에 사용한다.
- 공통적으로
@Lob
으로 사용하면 된다. - CLOB, BLOB 매핑
- CLOB(Character LOB) : String, char[], java.sql.CLOB
- BLOB(Byte LOB) : byte[], java.sql.BLOB
- @Transient: 이 필드는 매핑하지 않는다.
- 애플리케이션에서 DB에 저장하지 않는 필드(객체에서만 들고 있음)
- 웬만하면 쓰지 말자!!
✔식별자 매핑 어노테이션
식별자 매핑 방법
@Id(직접 매핑)
@GenerateValue(strategy = Generation Type[타입])
- IDENTITY : 데이터베이스에 위임, MySQL
- SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE
@SequenceGenerator
필요
- TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용
@TableGenerator
필요
- AUTO: 방언에 따라 자동 지정, 기본값
- IDENTITY, SEQUENCE, TABLE 중 Dialect에 맞는 방식으로 자동 적용
권장하는 식별자 전략
- 기본 키 제약조건: Not Null, Unique(유일성), 변하면 안된다(불변)
- 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다.
대체키(대리키)
를 사용하자!- ex) 주민등록번호도 기본키로 사용하기에 적절하지 않다.
- ex) 주민등록번호를
PK
로 설정하고 다른 테이블과FK
참조시 그대로 주민번호가 넘어감. 갑자기 나라에서 개인정보 목적으로DB에 주민번호 저장하지 마라
고 하면 끝남…
- 권장 : Long + 대체키 + 키 생성전략 사용
- 대체키는 전혀 비즈니스랑 관계없는 키 권장
*AUTO_INCREMENT
로 PK사용 시Int type
사용X! INT는 최대 10~20억까지이므로 생각보다 빨리 끝나기 때문! →Long type
사용하자! - 또는 UUID 사용! -> But, 성능 문제는 확인해보고 사용
- 대체키는 전혀 비즈니스랑 관계없는 키 권장