SPRING/JPA

05. 엔티티 매핑(1)

이번에는 객체를 생성하고 매핑 차례입니다!

 

엔티티 생성과 매핑

 

JPA는 JDBC와 데이터베이스를 매핑하는 역할이 핵심입니다. 그렇기 때문에 엔티티와 테이블을 정확히 매핑하는 것이 가장 중요합니다.

 

@Getter   				// Lombok Annotation
@Entity
@Table(name="MEMBER")
public class Member {
    @Id
    @Column(name = "ID")
    private long id;
    private String name;
    
    @Enumerated(EnumType.STRING)
    private Level level;
    
    // 자바8부터 다음으로 대체
    // private LocalDateTime createdAt;
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdAt;
    
    
}

다음 코드를 하나하나 살펴보겠습니다.

객체와 테이블 매핑

1. '@Entity'

JPA는 '@Entity'가 붙은 클래스들을 찾아내 관리합니다. 이러한 클래스들을 엔티티라 합니다!

 

속성

- name : JPA에서 사용할 엔티티 이름 지정. (기본값 : 클래스 명)

 

주의사항

Proxy 패턴과 Reflection에서의 제약조건들과 유사점을 가지고 있습니다.

 

1. 기본 생성자(파라미터가 없는 public or protected)가 필수로 존재해야 한다.

JPA를 구현하는 Hibernate에서는 Java Reflection API를 활용하여 많은 기능을 제공하고 있기 때문에, 기본 생성자가 필요합니다. 웬만하면 더 작은 scope를 가진 protected 기본 생성자를 주로 사용하는 게 좋습니다.

 

2. final, enum, interface, inner클래스에서는 사용이 불가능하다.

 

3. 저장할 필드에 final 사용해서는 안된다.

 

2. '@Table'

엔티티와 매핑할 테이블을 지정할때 사용됩니다.

 

속성

속성 설명
name 매핑할 테이블 이름 지정. (기본값 : 엔티티명)
catalog catalog 기능이 있는 DB에서 catalog 매핑
schema schema 기능이 있는 DB에서 schema 매핑
uniqueConstraints(DDL) DDL 생성 시 유니크 제약 조건을 만듬. (DDL을 만들때만 사용)
2개 이상의 복합 유니크 제약조건도 만들 수 있다.

필드와 칼럼 매핑

1. @Column

속성 설명
name 필드와 매핑할 테이블의 컬럼 이름 (default : 객체 필드명)
insertable
updatable
등록, 변경 가능 여부를 설정(default : TRUE)
nullable(DDL) null값의 허용 여부 설정.
columnDefinition(DDL) DB 컬럼 정보를 직접 SQL문을 입력해 줄 수 있습니다.
length String 타입에만 사용되는 문자 길이 제약조건.
precision, scale(DDL) BigDecimal(BigInteger) 타입에만 사용되며 정밀한 소수를 다룰때 사용합니다.
    - precision : 소수점을 포함한 전체 자릿수
    - scale : 소수의 자리수

2. @Temporal : 날짜 타입 매핑

JAVA8부터 LocalDate, LocalDateTime이 지원되면서 생략이 가능해졌습니다.

 

3. @Enumerated : enum 타입 매핑

웬만하면  
   
   

'STRING' 속성을 사용하고 'ORDINAL'은 사용하면 위험합니다.

'ORDINAL'의 경우 순서가 저장되기 때문에, Enum을 수정할 때 모든 DB도 다 같이 수정을 해 주어야 합니다.

0 1 2 3
GUEST BRONZE SILVER DIAMOND

고객등급표에서 실버 등급과 다이아몬드 등급 사이에 골드 등급을 새로 생성을 해봅시다.

0 1 2 3 4
GUEST BRONZE SILVER GOLD DIAMOND

이렇게 되면 일어나는 문제는 다음과 같습니다.

     - 기존의 다이아몬드 등급 고객의 순서 : 3

     - 새로 생성된 골드 등급의 고객 순서 : 3

다이아몬드 등급의 고객들은 한순간에 골드 등급으로 떨어지게 됩니다. 이를 방지하기 위해서는 Enum을 수정할 때 DB 역시 다 같이 업데이트를 실시하던가, 아니면, 'STRING' 속성을 사용해야 합니다.

4. @Lob : BLOB, CLOB 매핑

DB의 Varchar 이상의 큰 데이터를 넣을 때 사용됩니다.

속성 종류
BLOB 'byte[ ]', 'java.sql.BLOB'
CLOB 'String', 'char[]', 'java.sql.CLOB'

 

5. @Transient

매핑을 하고싶지 않을 때 사용하는 속성입니다. 주로 메모리상에서 임시로 값을 보관하고 싶을 때 사용합니다.