JPA 엔티티 매핑

JPA는 ORM으로서 객체와 테이블 매핑을 위해 다양한 에노테이션을 지원한다.

객체와 테이블 매핑

@Entity

클래스에 @Entity가 붙으면 테이블과 매핑이되며 JPA에서 관리되어진다.
@Entity가 붙은 클래스를 엔티티라 한다.

주의
JPA내부적으로 리플랙션 기능을 이용하기 위해 기본 생성자가 필수로 들어가야 된다.(public or protected)
final 클래스, enum, interface, inner 클래스에는 사용 불가.
저장할 필드에 final을 사용하면 안된다.

@Entity 속성

@Table

@Table은 엔티티와 매핑할 테이블을 명시적으로 지정할때 사용한다.

속성

DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA 실행 로직에는 영향을 주지 않는다.

필드와 컬럼 매핑

@Column

@Column(
    name = "name", //필드와 매핑할 테이블의 컬럼 이름 (기본값 : 객체의 필드 이름)
    insertable = true,    //등록 가능 여부 (기본값 : true)
    updatable = true,    //변경 가능 여부 (기본값 : true)
    nullable = true,     //(DDL용) false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다. (기본값 : true)
    uinque = false,       //(DDL용) true로 설정하면 DDL 생성 시에 unique 제약 조건이 추가됨 (기본값 : false)
    lenght = 255,         //(DDL용) 문자 길이 제약조건, String 타입에만 사용한다. (기본값 : 255)
    columnDefinition = "varchar(100) default 'EMPTY'", //데이터베이스 컬럼 정보를 직접 줄 수 있다.
    
    precision = 19,     //BigDecimal or BigInterger 타입에서 사용한다. 정밀한 소수를 다루어야 할 때 사용.
    sacale = 2,         //precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수를 의미한다.
    )
private String username;

@Column으로 유니크 제약조건을 걸게 되면 제약조건 이름을 사용자가 지정할 수 없다.
그러므로 왠만하면 @Table의 유니크 제약조건을 사용하도록 하자.

@Enumerated

자바 enum 타입을 매핑할 때 사용한다.

@Temporal

날짜 타입을 매핑할 때 사용한다.
자바 8이상 부터는 LocalDate지원하기 때문에 사용하지 않아도 된다.

@Lob

데이터베이스 BLOB, CLOB 타입과 매핑한다.
필드 타입이 문자면 CLOB, 그 이외에는 BLOB으로 자동 매핑된다.

@Transient

데이터베이스와 매핑하지 않고 메모리상에서만 임시로 사용할 때 사용한다.
JPA는 기본적으로 자동 매핑이기 때문에 원하지 않는 매핑 필드가 있으면 사용한다.

기본키 매핑

기본키 매핑을 위해서 @Id와 @GeneratedValue 두개의 에노테이션 존재한다.

@Id

원하는 필드에 붙이면 PK로 설정된다.
이후에 @GerneratedValue를 사용하지 않으면 엔티티 저장시 직접 id를 할당해야한다.

@GeneratedValue

PK 생성 전략을 설정할 수 있다.