[JPA] Entity 매핑 - 객체와 테이블 매핑

PURPLE·2022년 3월 21일
2

JPA

목록 보기
5/8

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


@Entity

JPA로 관리할 클래스는 @Entity 를 필수로 붙여야 하며, Entity 라 부른다.

속성기능Default
name- JPA에서 사용할 엔티티 이름 지정
- 다른 패키지에 같은 이름의 엔티티 클래스가 있다면 name 설정을 통해 충돌을 피한다.
클래스명
(ex.Member)

🚨 @Entity 주의사항

  • 기본 생성자를 필수로 가져야 한다.
  • final, enum, interface, inner 클래스에는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안 된다.

    JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용하므로, 반드시 있어야 한다.

@Table

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

속성기능Default
name매핑할 테이블 이름엔티티 이름
calalogcatalog 기능이 있는 DB에서 catalog를 매핑
schemaschema 기능이 있는 DB에서 schema를 매핑
uniqueConstraints
DDL
- DDL 생성시 유니크 제약조건 설정
- DDL 자동 생성 기능을 활성화 했을때만 사용

@Entity
@Table(name="member", //테이블명과 엔티티 클래스명이 같다면 생략 가능
	   uniqueConstraints = {@UniqueConstraint(
       name = "name_age_unique",
       columnNames = {"name", "age"} )})
public class Member {

  @Id
  private String id;

  private String name;
  
  private Integer age;
  
}

데이터베이스 스키마 자동 생성

JPA는 매핑 정보와 데이터베이스 방언을 사용해서 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.
이 기능을 사용하기 위해선 🔗persistence.xml 파일에 다음 속성을 추가해야 한다.

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

위 속성을 추가하고 애플리케이션을 실행하면, 매핑 정보를 읽고 자동으로 테이블을 생성한다.
생성된 DDL은 각 데이터베이스 방언에 맞춰 타입과 제약사항이 설정되어 있다.

옵션설명
create- 기존 테이블을 삭제하고 새로 생성
- DROP + CREATE
create-drop- create 속성 기능에 추가로 애플리케이션을 종료할 때 생성한 테이블을 제거
- DROP + CREATE (애플리케이션 시작)+ DROP (애플리케이션 종료)
update데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정
validate- 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션 실행 안 함
-DDL을 수정하지 않음
none- 스키마 자동 생성 기능 비활성화
- hibernate.hbm2ddl.auto 속성을 삭제하거나, 유효하지 않는 옵션 값 부여

@Entity
@Table (name="Member", uniqueConstraints = {@UniqueConstraint(
		name="name_age_unique",
        columnNames={"name", "age"})}) // 스키마 자동 생성 기능을 사용하면 이러한 매핑정보를 다 읽기 때문에 
        							   // 해당하는 제약조건 DDL을 생성한다.
public class Member {

  @Id
  @Column
  private String id;

  @Coulmn
  private String userName;
  
}

🚨 HBM2DDL 주의사항
스키마 자동 생성은 데이터베이스의 테이블이나 컬럼을 삭제할 수 있기 때문에 운영 서버에서는 절대 사용해서는 안 된다.

자동 생성으로 만들어진 DDL을 재가공 없이 운영 서버에서 사용하는 것도 조심해야 한다. 운영에서 사용하기 전, 세세한 조건들을 다시 확인하고 재수정하여 DDL을 다듬어야 한다.

개발환경에 따른 추천 전략은 다음과 같다.

  • 개발 초기 단계 : create 또는 update
  • 초기화 상태로 자동화된 테스트를 진행하는 환경, CI 서버 : create 또는 create-drop
  • 테스트 서버 : update 또는 validate
  • 스테이징 서버와 운영서버 : validate 또는 none

    🤔 개발 환경과, 개발 단계에 따른 추천 옵션이 있긴 하지만
    개인적으로는 맨 처음 개발 초기에 러프하게 테이블 생성 DDL을 얻기 위한 경우를 제외하고는 사용하지 않는게 맘이 편할 것 같다.



참고

강의_자바 ORM 표준 JPA 프로그래밍 - 기본편
교재_자바 ORM 표준 JPA 프로그래밍(김영한)

다정한 피드백 환영해요 🤗

profile
방향과 방법을 찾아가는 여정

0개의 댓글