[JPA] 엔티티 매핑

Seongho·2023년 5월 9일
1

JPA

목록 보기
2/3

객체와 테이블 매핑

@Entity

@Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. JPA를 통해서 DB 테이블과 매핑할 클래스는 @Entity를 붙여줘야 한다.
규칙

  • 파라미터가 없는 public 또는 protected 기본 생성자가 있어야 한다.
  • final 클래스, final 멤버 변수는 사용할 수 없다. (JPA 표준 스펙에서 막아둠)

@Entity name 속성

@Entity(name="엔티티 이름")
기본값은 클래스 이름이다. 종종, 다른 패키지에 같은 이름을 가진 클래스가 있는데, 엔티티로써 JPA에 의해 관리될 때, 사용하고, 그렇지 않을 경우에는 기본 값을 사용한다.

@Table

@Table(name="DB테이블 이름")
매핑할 데이터베이스 테이블 이름을 설정할 수 있다. DB 테이블명에 대한 정해진 전략이 있을 때, 사용한다.

필드와 컬럼 매핑

@Column

  • 데이터베이스 스키마 컬럼과 엔티티 매핑
@Column
private String username; 

@Column 속성

@Enumerated

  • Enum타입을 데이터베이스에 적용시키고 싶을 때 사용
@Enumerated(EnumType.STRING)
private RoleType roleType; 

EnumType.ORDINAL도 있지만, 순서를 저장하는 것이기 때문에, 자칫 코드에서 Enum 순서를 변경하면 꼬여버리기 때문에 사용하면 안된다.

@Temporal

  • java.util.Date, java.util.Calender의 날짜 타입을 매핑할 때 사용한다.
@Temporal(TemporalType.TIMESTAMP)		//DATE, TIME, TIMESTAMP 이렇게 세 개 있다. (Enum)
private Date lastModifiedDate;


LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)

@Lob

  • 데이터베이스 BLOB, CLOB 컬럼과 매핑한다.
@Lob
private String description;

@Transient

  • 데이터베이스와 매핑하지 않고 클래스 내의 어떤 변수를 메모리 내에서만 사용하고 싶을 때
@Transient
private Integer temp; 

Primary Key 매핑

직접 할당

  • PK 값을 자동으로 생성하지 않고, 특정한 규칙에 의해 직접 할당할 때 사용한다.
  • @Id만 사용
  • 직접 엔티티 객체에 @Id가 붙은 멤버변수 값을 세팅해줘야 한다.

자동 생성 (책 참고)

  • 정해진 전략에 따라 PK 값을 자동 생성한다.
  • @Id @GeneratedValue 사용

@GeneratedValue(strategy = GenerationType.IDENTITY)

  • mysql의 auto_increment처럼 null을 넣으면 자동으로 데이터베이스가 값을 넣음.

@GeneratedValue(strategy = GenerationType.SEQUENCE)

  • Oracle에서 주로 사용.
  • allocationSize만큼씩 DB에서 이

@GeneratedValue(strategy = GenerationType.TABLE)

  • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
  • 데이터베이스에 관계 없이 모두 사용할 수 있지만, 성능에 문제가 있음.

@GeneratedValue(strategy = GenerationType.AUTO)

데이터베이스 방언에 맞게 IDENTITY, SEQUENCE, TABLE 중에 자동 선택

JPA DB 스키마 자동 생성

JPA는 데이터베이스 방언에 맞는 DDL을 애플리케이션 실행 시점에 자동 생성해준다.

@Column(nullable = false, length = 10)

위와 같이 제약 조건을 추가하면 JPA가 이를 고려하여 자동으로 DDL을 생성한다.
그 중 스키마 자동 생성 옵션은 운영할 때는 사용하면 안되고, 혼자 개발할 때, 계속 테이블 새로 생성하고, 수정하고, 힘드니까 이 옵션을 사용하면 좋다.

<property name="hibernate.hbm2ddl.auto" value="create" />


보통,
개발 초기 단계에서는 create 또는 update,
테스트 서버에서는 update 또는 validate,
운영 서버에서는 validate 또는 none
을 사용한다.

profile
Record What I Learned

0개의 댓글