# 필드와 칼럼 매핑

아래와 같은 요구 사항이 추가되었다고 해보자.

* 회원은 일반 회원과 관리자로 구분해야 한다.
* 회원 가입일과 수정일이 있어야 한다.
* 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제한이 없다.

```java
@Entity
public class Member {

    @Id
    private Long id;

    // DB의 칼럼 명을 따로 명시할 수 있다.
    @Column(name = "name")
    private String username;

    private Integer age;

    // DB에는 enum 타입이 없어서 이 애너테이션을 달아줘야 한다.
    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    // 날짜 타입은 @Temporal을 달아준다.
    // DB는 DATE, TIME, TIMESTAMP로 나뉘기 때문에 정보를 줘야 한다.
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    // varchar를 넘어서는 큰 컨텐츠를 넣고 싶을 때 사용한다.
    // String 타입이면 DB에서 clob으로 생성된다.
    @Lob
    private String description;

    // getter, setter
}
```

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Fbe1602e6f28222b003ee48bd128ff65410a5f4b8.png?generation=1615779919086324\&alt=media)

## @Column

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Fdbe2f5faa0f026edb1dda102ad47f715b74d99ea.png?generation=1615779919182434\&alt=media)

* insertable, updatable
  * 해당 column이 수정됐을 때 DB에 insert, update를 할 건지 결정한다.
  * 즉 insert, update 문이 나갈 때 해당 칼럼을 반영할 것인지를 의미한다.
    * false면 메모리 상에만 존재하게 된다.
  * 기본값이 true로 되어있다.

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2F07abcfc0fae64a31012b94529294d629a90c3ef1.png?generation=1615854866439483\&alt=media)

* unique
  * 잘 안 쓴다. unique 키가 랜덤한 이름으로 나와서 알아보기 힘들다.
  * `@Table`에 uniqueConstrains 옵션을 주면 이름을 설정할 수 있어서 이 방법을 더 많이 사용한다.

## @Enumerated

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2F400553e1ce34a44185fc4f362c685f70a9630627.png?generation=1615779918508698\&alt=media)

* 자바 enum 타입을 매핑할 때 사용한다.
* `ORDINAL`은 사용하면 안된다.
  * 요구 사항이 추가되어 맨 앞에 다른 enum이 추가되면 새로운 값이 0이 되는 등 문제가 많아서 사용하지 않는다.

## @Temporal

![](https://389280719-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LxjHkZu4T9MzJ5fEMNe%2Fsync%2Fb14044d4729dc9f067effbf52aba7756b08fb6ee.png?generation=1615779918851858\&alt=media)

* 날짜 타입 `java.util.Date`, `java.util.Calendar`를 매핑할 때 사용한다.
* `LocalDate`, `LocalDateTime`을 사용할 때는 생략 가능하다.
  * 최신 하이버네이트를 쓴다면 생략할 수 있게 지원하고 있다.

## @Lob

* 데이터베이스 blob과 clob 타입을 매핑한다.
* 지정할 수 있는 속성은 없으며 문자면 clob, 나머지는 blob으로 매핑된다.
* clob
  * String, char\[], java.sql.CLOB
* blob
  * byte\[], java.sql.BLOB

## @Transient

* 필드 매핑을 하지 않을 때 사용한다.
* 데이터베이스에 저장이나 조회가 되지 않는다.
* 주로 메모리 상에서만 임시로 어떤 값을 보관하고 싶을 때 사용한다.
