[JPA 긴급 학습 (3)] 필드와 칼럼 매핑

3128 단어 JPAJPA
    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Double latitude;

    @Column(nullable = false)
    private Double longitude;

클래스 내부에서 이런 식

1. @Column

@Column은 객체 필드를 테이블 칼럼에 매핑한다.
이제 테이블 전체가 아니라 진짜 어트리뷰트에 매핑하는.

어노테이션 뒤에 추가로 지정할 수 있는 속성은
(1) name
(2) nullable
(3) unique
(4) columnDefinition
(5) length
(6) precision, scale

(2)~(6)은 DDL에서 제약조건의 의미.

(2) 디폴트는 null 허용.
not null로 지정할 경우에는

@Column(nullable = false)

이렇게.

(3) unique는
uniqueConstraints와 같지만 한 칼럼에 간단히 유니크 제약 조건을 걸 때 사용.

만약 2개 이상의 칼럼이 unique키가 되는 경우라면 클레스 레벨에서 @Table.uniqueConstraints를 사용.

(4) columnDefinition은
칼럼 도메인을 직접 지정해주는거.

@Column(columnDefinition = "varchar(100) default 'EMPTY'") 
private String data;

라고 하면

이제 DDL 쿼리문은 data varchar(100) default 'EMPTY'가 됨.

(5) length는
문자 길이 제약조건. 디폴트는 255
(★★★★★책에는 이렇게만 써있는데, 이거뭐 그냥 255바이트인지, 2byte가 255개라는건지 확인필요★★★★★)
String 타입에서만 사용

@column(length=400)
private String data;

하면 DDL은 data varchar(400)이 된다.

2. @Enumerated

이건 자바에서 enum타입을 매핑할 때 사용한다.

지정할 수 있는 속성에 ORDINAL, STRING이 있다.

여기서는 일단 STRING

@Enumerated(EnumType.STRING)
private RoleType roleType;

해놓고

member.setRoleType(RoleType.ADMIN)

하면 DB에 문자 ADMIN이 저장된다.

즉, 정리하면 EnumType.STRING은 enum이름 그대로 문자가 저장된다. 대신 ORDINAL에 비해서 DB에 저장되는 데이터 크기가 크다.

3. @Temporal

날짜 타입을 매핑할 때 사용한다.

@Temporal(TemporalType.DATE)
private Date data;

아니면

@Temporal(TemporalType.TIME)
private Date time;

아니면

@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;

그러면 실제로 DDL은
date date,
time time,
timestamp timestamp가 된다.

자바의 Date타입에는 년월일 시분초가 있지만, DB에는 date(날짜), time(시간), timestamp(날짜와 시간)의 3가지 타입이 별도로 존재한다.

4. @Transient

이건 필드를 매핑하지 않을 때 사용한다.
그래서 DB에 저장하지도 않고, 조회하지도 않는다.
객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.

@Transient
private Integer temp;

5. @Access

이건 JPA가 엔티티 데이터에 접근하는 방식을 지정한다.
클래스레벨에 붙는다.

@Entity
@Access(AccessType.FIELD)
public class Member {
   
   @Id
   private String id;
   
   ...

(1) 필드 접근

AccessType.FIELD 이렇게 지정.

필드에 직접 접근하는 방식.
필드가 private이어도 접근할 수 있다.

(2) 프로퍼티 접근

AccessType.PROPERTY 이렇게 지정.

접근자(게터)를 사용하는 방식.

@Access를 사용하지 않으면 @Id의 위치를 기준으로 접근방식이 결정됨

@Id가 필드에 붙어있으면 AccessType.FIELD가 되고, 게터에 붙어있으면 AccessType.PROPERTY가 된다.

좋은 웹페이지 즐겨찾기