> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/jpa-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/jpa-basic/4./undefined-1.md).

# 필드와 칼럼 매핑

요구사항

1. 회원은 일반 **회원과 관리자로 구분**해야한다.\
   Java : enum 타입\
   DB : @Enumerated
2. 회원가입일과 수정일이 있어야한다.\
   Java : Date 타입\
   DB : @Temporal
3. 회원을 설명할 수 있는 필드가 있어야한다.\
   이 필드는길이 제한이 없다.\
   Java : String 타입\
   DB : @Lob(String인 경우는 clob)

| 애노테이션       | 설명                                                                                                           |
| ----------- | ------------------------------------------------------------------------------------------------------------ |
| @Column     | 컬럼 매핑                                                                                                        |
| @Temporal   | 날짜 타입 매핑                                                                                                     |
| @Enumerated | enum 타입 매핑                                                                                                   |
| @Lob        | BLOB, CLOB 매핑                                                                                                |
| @Transient  | <p>특정 필드를 칼럼에 매핑하지 않을 때(매핑 무시)</p><p>주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때</p><p>ex)@Transient private int tmp;</p> |

1. **@Column**

**nullable** = false : not null 제약 조건(자주 쓰임)\
**unique** = true : 유일무이한 이름이 할당되는데 랜덤으로 이름이 정해지므로 실제 사용하기 어렵다.\
precision, scale(DDL) : 아주 큰 숫자(BigDecimal 타입 또는 BigInteger)나 소숫점에 사용한다.

&#x20; **2. @Enumerated**

* ORDINAL(기본값) : 사용❌
* STRING

&#x20; **3. @Temporal**

* LocalDate 타입 : 년,월. DB에서 date타입
* LocalDateTime 타입 : 년,월,일. DB에서 timestamp 타입\
  ex) **TemporalType.DATE** : 날짜. **DB의 date 타입과 매핑**. **2013-10-11**\
  **TemporalType.TIME** : 시간. **DB time 타입과 매핑**. **11:11:11**\
  **TemeporalType.TIMESTAMP** : 날짜&시간. DB Timestamp 타입과 매핑. **2013-10-11 11:11:11**

&#x20; **4. @Lob**

VarChar를 넘어서 더 큰 것을 쓰고 싶을 때.\
@Lob에는 지정할 수 있는 속성이 없다.\
매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑

* CLOB: String, char\[], java.sql.CLOB
* BLOB: byte\[], java.sql. BLOB

```java
package hellojpa;

import jdk.nashorn.internal.objects.annotations.Getter;
import jdk.nashorn.internal.objects.annotations.Setter;

import javax.persistence.*;
import java.util.Date;

@Entity//JPA가 로딩될 때 엔티티로 인식한다!
@Getter @Setter
//@Table(uniqueConstraints = )
public class Member {

    @Id//PK
    private Long id;
    @Column(name = "name",nullable = false)
    private String username;
    private Integer age;

    //DB에 자바의 enum을 쓰고 싶다면 @Enumerated를 쓰면 된다!
    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    //Date 타입 = 날짜, 시간, 타임스탬프(날짜+시간)
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;
    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob//VARCHAR를 넘어서는 큰 것을 쓰고 싶을 때 사용, String이면 DB에서 clob으로 타입 생성!
    private String description;
    //JPA는 리플렉션해야해서 동적으로 객체 생성해야하기 때문에 기본 생성자 있어야 한다!
    public Member() {
    }

}

```
