Programming/JPA & Spring Data JPA 기초

04. 엔티티 매핑 설정

JKROH 2023. 2. 22. 14:26
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* 엔티티 매핑

- 기본 애노테이션

  • @Entity : 엔티티 클래스에 설정한다, 필수로 사용해야한다.
  • @Table : 매핑할 테이블을 지정한다.
  • @Id : 식별자와 매핑하기 위해 사용한다. 필수로 사용해야한다.
  • @Column : 매핑할 칼럼명을 지정하기 위해 사용한다.
    • 지정하지 않으면 필드명 / 프로퍼티명을 사용한다
  • @Enumerated : enum타입을 매핑할 때 사용한다.
  • @Temporal : java.util.Date, java.util.Calender를 매핑할 때 사용한다.
    • 자바8 시간 / 날짜 타입 등장 이후 거의 쓰지 않는다.
  • @Basic : 기본 지원 타입을 매핑하기 위해 사용한다. 생략을 해도 무방하기 때문에 거의 사용하지 않는다.

 

* @Table 애노테이션

  • 애노테이션을 생략하면 클래스 이름과 동일한 이름에 매핑된다

- 속성

  • name : 테이블 이름 (생략하면 클래스 이름과 동일한 테이블 이름에 매핑된다)
  • catalog : 카탈로그 이름 (MySQL, mongoDB 등 DB 이름을 명시적으로 지정하고 싶을 때 사용한다)
  • schema : 스키마 이름 (오라클 등 schema이름을 명시적으로 지정하고 싶을 때 사용한다)
  • 예시
    • @Table
    • @Table(name = "hotel_info")
    • @Table(catalog = "point", name = "point_history")
    • @Table(schema = "crm", name = "cust_stat")

 

* @Enumerated 애노테이션

- 설정 값

  • EnumType.STRING : enum 타입 값 이름을 저장
    • 문자열 타입 칼럼에 매핑
  • EnumType.ORDINAL : enum 타입의 값의 순서를 저장
    • 숫자 타입 칼럼에 매핑
    • 값의 순서는 코드 상에서의 사용 위치에 따라 달라지기 때문에 사용하지 않는다.

 

* 매핑 설정 예

@Entity   // 매핑 대상 엔티티
@Table(name = "hotel_info")  // hotel_info 테이블에 매핑
public class Hotel {
    @Id // 식별자로 매핑
    @Column(name = "hotel_id") // hotel_id 칼럼에 매핑
    private String id;

    @Column(name = "nm")	// nm 칼럼에 매핑
    private String name;

    private int year;	// year 칼럼에 매핑

    @Enumerated(EnumType.STRING)	// 열거 타입 이름을 값으로 저장
    private Grade grade;	// grade 칼럼에 매핑

    private LocalDateTime created;	//created 칼럼에 매핑

    @Column(name = "modified")	//modified 칼럼에 매핑
    private LocalDateTime lastModified;

 

* 엔티티 클래스 제약 조건 (스펙 기준)

  • @Entity를 적용해야 한다.
  • @Id를 적용해야 한다.
  • 인자가 없는 기본 생성자가 필요하다.
  • 기본 생성자는 public 이나 protected 여야 한다.
  • 최상위 클래스여야 한다.
  • final이면 안된다.

 

* 접근 타입

- 두 가지 접근 타입

  • 필드 접근 : 필드 값을 사용해서 DB와 매핑
  • 프로퍼티 접근 : getter/setter 메서드를 사용해서 DB와 매핑

- 설정 방법

  • @Id 애노테이션을 필드에 붙이면 필드에 접근한다.
  • @Id 애노테이션을 getter 메서드에 붙이면 프로퍼티에 접근한다.
  • @Access 애노테이션을 사용해서 명시적으로 지정
    • 클래스 / 개별 필드에 적용 가능
    • @Access(AccessType.PROPERTY) / @Access(AccessType.FIELD)

- 필드 접근을 선호

  • 불필요한 setter 메서드를 만들 필요가 없다.

 

* 정리

-주요 매핑 애노테이션

  • @Entity, @Table, @Id, @Column, @Enumerated

- 엔티티 클래스 제약

  • 기본 생성자 필요 등 몇 가지 제약이 있다.

- 접근 타입

  • 필드 접근(*), 프로퍼티 접근
반응형