DEV ℧ Developer Diary

[JPA] @Entity

해당 포스트는 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 듣고 정리한 글입니다.

@Entity

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/* JPA가 사용하는 Entity 설정 */
@Entity
/* entity의 테이블 명명 */
//@Table(name = "USER")
/* JPA(영속성 컨텍스트)가 접근하기 위해서는 빈 생성자가 필요하다
* 접근제어자는 public 외에 아무거나 줘도 상관이없지만, 캡슐화를 위해 PROTECTED를 권장 */
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {

    /* 테이블의 ID 컬럼 설정 */
    @Id
    private Long id;

    /* 해당 변수의 컬럼명 매칭 */
//    @Column(name = "username")
    private String name;

    public Member(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

엔티티 매핑 소개

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

@Entity

  • @Entity가 붙은 크래스는 JPA가 관리, 엔티티라 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스 @Entity 필수
  • 주의
    • 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) 그래서 @NoArgsConstructor(access = AccessLevel.PROTECTED)를 사용한다.
    • final 클래스, enum, interface, inner 클래스 사용X
    • 저장할 필드에 final 사용하지 않는다.

@Entity 속성 정리

  • 속성 : name
    • JPA에서 사용할 엔티티 이름을 지정한다.
    • 기본값 : 클래스 이름을 그대로 사용(예 : Member)
    • 같은 클래스 이름이 없으면 가급적 기본값을 사용한다.

@Table

  • @Table은 엔티티와 매핑할 테이블 지정

  • name : 매핑할 테이블 이름 (기본값으로 엔티티 이름을 사용)
  • catalog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건 생성