본문 바로가기

Back-End/JPA

JPA - Entity 만들기

@Entity

클래스에 @Entity가 있다면 JPA가 관리하는 Entity로 만들어진다.

@Entity
@Table(name = "tutor")
public class Tutor {

    // PK
    @Id
    private Long id;

    // 필드
    private String name;

    // 기본 생성자
    public Tutor() {
    }

    // 쉽게 사용하기 위해 생성자 추가
    public Tutor(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}

필수 규칙!!

  • JPA를 사용하여 객체를 테이블과 매핑할 때 사용한다.
  • PK 값이 필수이다.(@Id 사용)
  • 기본 생성자는 필수이다.
  • final, enum, interface, inner 클래스에는 사용할 수 없다.
  • 필드에 final 키워드를 사용할 수 없다.

@Table

@Entity
@Table(name = "tutor")
public class Tutor {
}
  • 속성
    • name
      • Entity와 매핑할 테이블 이름을 지정
      • 기본 값은 Entity 이름(Tutor)을 사용 (하지만 DB는 기본적으로 소문자를 사용하기 때문에)
      • catalog
        • 데이터베이스 catalog 매핑
      • schema
        • 데이터베이스 schema 매핑
      • uniqueConstraints
        • DDL 생성 시 유니크 제약 조건 설정

제약 조건 설정

JPA를 사용하면 DDL 생성 시 제약조건을 설정할 수 있다. 실행 로직과는 별개로 DDL 생성시에만 활용된다.

1. @Column

  • unique : 유니크, 기본값 false
  • nullable : 필수 여부, 기본값 true
  • length : 길이
@Column(unique = true, length = 20, nullable = false)
  •  DDL 자동 생성 시 제약 조건이 설정된다.

2. @Table

  • uniqueConstraints : 유니크, 이름을 직접 설정할 수 있다.

필드 매핑

JPA로 관리되는 클래스인 Entity의 필드는 테이블의 컬럼과 매핑된다.

@Entity
@Table(name = "board")
public class Board {
    @Id
    private Long id;

    // @Column을 사용하지 않아도 자동으로 매핑된다.
    private Integer view;

    // 객체 필드 이름과 DB 이름을 다르게 설정할 수 있다.
    @Column(name = "title")
    private String bigTitle;

    // DB에는 기본적으로 enum이 없다.
    @Enumerated(EnumType.STRING)
    private BoardType boardType;

    // VARCHAR()를 넘어서는 큰 용량의 문자열을 저장할 수 있다.
    @Column(columnDefinition = "longtext")
    private String contents;

    // 날짜 타입 DATE, TIME, TIMESTAMP를 사용할 수 있다.
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;
    
    @Transient
    private int count;

    public Board() {
    }

}
  • 실행결과

  • 사용되는 Annotation
종류 설명
@Column DB 컬럼 매핑에 사용
@Temporal(최신 버전 생략O) 날짜 타입
@Enumerated enum 타입
@Transient DB 컬럼과 매핑하지 않을 때
@Lob tinytext
  • @Enumerated
속성 설명 Default
value EnumType.ORDINAL
EnumType.STRING
enum 순서 저장
enum 이름 저장
EnumType.ORDINARY

EnumType.ORDINARY를 사용하면 Enum 값이 추가될 때 마다 순서가 바뀌기 때문에 실제로 사용X!!


기본키

JPA Entity를 생성할 때 기본키는 필수로 생성해야 한다.

1. @Id

  • 수동생성
Tutor tutor = new Tutor(1L, "병천");

2. @GeneratedValue

  • 자동 생성
@Id
@GeneratedValue(strategy = GenerationTye.IDENTITY)
private Long id;
  • IDENTITY 전략을 사용하면 persist() 이후 PK를 바로 조회할 수 있다.