[JPA] 엔티티 매핑(1) - @Entity @Table

JPA를 사용하는 데 있어 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있다. 

  1. 객체와 테이블 매핑 : @Entity, @Table
  2. 기본 키 매핑 : @Id
  3. 필드와 컬럼 매핑 : @Column
  4. 연관관계 매핑 : @ManyToOne, @JoinColumn

이번 포스트에서는 1, 2, 3번에 대해 알아보자. 


📂 @Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다. @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 부른다. 
속성은 다음과 같다. 

속성 기능 기본값
name JPA에서 사용할 엔티티 이름을 지정한다. 보통은 기본값인 클래스 이름을 사용한다.  설정하지 않으면 클래스 이름을 그대로 사용한다.

@Entity 적용 시 주의사항은 다음과 같다. 

  • 기본 생성자는 필수다(파라미터가 없는 public or protected 생성자).
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안된다.

JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용하기 때문에 이 생성자는 반드시 있어야 한다. 자바는 생성자가 없으면 기본 생성자를 자동으로 만들기 때문에 생략이 가능하다. 

public Member() {} // 직접 만든 기본 생성자

// 임의로 만든 생성자
public Member(String name) {
    this.name = name;
}

만약 위와 같이 생성자를 하나 이상 만들면 자바는 기본 생성자를 자동으로 만들지 않기 때문에, 이때는 기본 생성자를 직접 만들어야 한다. 

📂 @Table

@Table은 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

속성은 다음과 같다.

속성 기능 기본값
name 매핑할 테이블 이름 엔티티 이름을 사용한다.
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다.  
schema schema 기능이 있는 데이터베이스에서 schema를 매핑한다.  
uniqueConstraints
(DDL)
DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 
참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다. 
 

 

이들을 이용해 유니크 제약 조건이 추가된 예제 코드를 보면 다음과 같다.

- 유니크 제약조건이 추가된 엔티티 클래스

@Entity(name="Member")
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint(
    name = "NAME_AGE_UNIQUE",
    columnNames = {"NAME", "AGE"} )})
public class Member {
    
    @Id
    @Column(name = "id")
    private String id;
    
    @Column(name = "name")
    private String username;
    
    private Integer age;
    ...
}

참고

자바 ORM 표준 JPA 프로그래밍(김영한 저)