반응형
JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.
필드와 컬럼 매핑
@Column
- 컬럼을 매핑할 때 사용한다.
- name 속성
필드의 이름과 DB 테이블 컬럼의 이름이 다를 시 사용된다. 필드와 매핑할 테이블의 컬럼 이름을 적어주면 된다. 만약 필드의 이름과 매핑 할 DB 컬럼의 이름이 같으면 생략하면 된다.
@Column(name = "name")
private String username;
- insertable, updatable 속성
해당 필드에 변경이 생겼을 때 이 컬럼의 변경된 내용을 INSERT 혹은 UPDATE 할거냐는 속성이다. 즉 등록, 변경 가능 여부를 설정하며 기본값은 TRUE이다.
@Column(name = "name", insertable = false, updatable = false)
private String username;
- nullable(DDL) 속성
null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약 조건이 붙는다. 기본값은 TRUE이다.
@Column(name = "name", nullable = false)
private String username;
// 출력 로그
create table Member (
...생략
name varchar(255) not null,
...생략
- unique(DDL) 속성
@Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용한다. 기본값은 FALSE이다.
@Column(name = "name", unique = true)
private String username;
// 출력 로그
alter table Member
add constraint UK_ektea7vp6e3low620iewuxhlq unique (name)
유니크 제약 조건은 잘 사용하지 않는다. 유니크 제약 조건의 이름이 위에서 보이는 로그와 같이 랜덤 값으로 아무렇게나 지정되기 때문에 운영에서 사용할 수 없기 때문이다. 대신 @Table 속성으로 주는 방식을 대부분 사용한다.
@Entity
@Table(uniqueConstraints = {@UniqueConstraint(
name = "uniqueTest",
columnNames = {"username"})})
public class Member {
... 생략
//@Column(name = "name")
@NotNull
private String username;
... 생략
}
// 출력 로그
alter table Member
add constraint uniqueTest unique (username)
- columnDefinition(DDL) 속성
데이터베이스 컬럼 정보를 직접 줄 수 있다. ex) varchar(100) default 'EMPTY'
@Column(name = "name", columnDefinition = "varchar(100) default 'EMPTY'")
private String username;
// 출력 로그
...생략
name varchar(100) default 'EMPTY',
...생략
- length(DDL) 속성
문자 길이 제약조건, String 타입에만 사용한다. - precision, scale(DDL) 속성
BigDecimal(BigInteger) 타입에서 사용한다. precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수이다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다. 참고로 double, float 타입에는 적용되지 않는다.
@Enumerated
- enum 타입을 매핑할 때 사용한다.
- enum은 두 가지 타입이 있다.
- ORDINAL : enum의 순서를 데이터베이스에 저장 (기본값이다.)
- STRING : enum 이름을 데이터베이스에 저장
- 주의! ORDINAL 사용 금지!
ENUM에 데이터가 추가되거나 제거 되는 등, 데이터의 순서가 변경되면 변경되기 전 데이터에 수정을 하는 게 아니라 그대로 유지가 되면서 변경된 이후의 데이터에만 변경된 순서가 저장된다.
ex) USER, ADMIN --> (DB에 저장된 순서 값)0, 1 ---추가---- GUEST, USER, ADMIN --> (DB에 저장된 순서 값)0 1 0 - STRING 타입을 사용하면 순서 값이 들어가는게 아니고 이름이 직접적으로 저장되기 때문에 ORDINAL의 문제점을 해결해준다.
@Temporal
- 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다.
- LocalDate, LocalDateTime을 사용할 때는 생략이 가능하다.
private LocalDate testLocalDate;
private LocalDateTime testLocalDateTime;
// 출력 로그
...생략
testLocalDate date,
testLocalDateTime timestamp,
...생략
LocalDate의 경우에는 DB 타입의 date 타입으로, LocalDateTime의 경우에는 DB 타입의 timestamp로 매핑된다. 자바 8버전을 사용하는 사람들은 그냥 위와같이 사용하면 된다. 자바 옛날 버전을 사용하는 사람들은 아래와 같이 지정해주어야 한다.
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
//출력 로그
createdDate timestamp,
- TemporalType.DATE : 날짜, 데이터베이스 date 타입과 매핑
- TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑
- TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑
@Lob
- DB의 BLOB, CLOB 데이터 타입을 매핑할 때 사용한다.
- @Lob에는 지정할 수 있는 속성이 따로 없고, 매핑하는 필드 타입이 문자면 CLOB, 나머지는 BLOB과 매핑된다.
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
@Transient
- 특정 필드를 컬럼에 매핑하지 않는다. 즉 필드 매핑이 되지 않는다. 그러므로 데이터베이스에 저장 또는 조회가 불가능하고 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Transient
private Integer temp;
반응형