개발 도서 읽기/자바 ORM 표준 JPA 프로그래밍

[4장]4.1~4.6 엔티티 매핑

nnhhmm 2024. 11. 9. 18:09

4.1 @Entity

JPA를 사용해서 테이블과 매필할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다. 

@Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라 부른다.

 

적용시 주의사항

  • 기본생성자는 필수다(파라미터가 없는 public 또는 protected 생성자)
  • final 클래스, enum, interface, inner클래스에는 사용할 수 없다,
  • 지정할 필드에 final을 사용하면 안된다
속성 기능 기본값
name JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 설정하지않으면 클래스 이름을 그대로 사용한다

 

4.2 @Table

엔티티와 매핑할 테이블을 지정한다. 

속성 기능 기본값
name 매핑할 테이블이름  엔티티 이름을 사용한다.
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑  
schema schema 기능이 있는 데이터베이스에서 schema를 매핑  
uniqueConstraints(DDL) DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다.   


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

JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다. 클래스의 매핑정보를 보면 어떤 테이블에 어떤 컬럼을 사용하는지 알 수 있다. 

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

이 속성을 추가하면 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다. 

 

hibernate.hbm2ddl.auto 속성

create 기존 테이블을 삭제하고 새로 생성한다.
create-drop create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다.
update 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다.
validate 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지않는다. 이 설정은 DDL을 수정하지 않는다
none 자동 생성 기능을 사용하지 않으려면 hibernate.hbm2ddl.auto 속성 자체를 삭제하거나 유효하지 않은 옵션 none을 주면 된다.

 

4.5 DDL 생성 기능

public class Member{
...
	@Column(name="NAME",nullable = false, length = 10) // 추가
	private String username;
...
}
  • @Column 매핑정보의 nullable 속성 값을 false로 지정하면 자동 생성되는 DDL에 not null 제약조건을 추가할 수 있다. 그리고 length 속성 값을 사용하면 자동 생성되는 DDL에 문자의 크기를 지정할 수있다.
  • 이런 기능들은 단지 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.
  • 개발자가 엔티티만 보고도 손쉽게 다양한 제약 조건을 파악할 수 있는 장점이 있다. 

4.6 기본 키 매핑

JPA가 제공하는 데이터베이스 기본 키 생성 전략

  • 직접할당
  • 자동생성: 대리 키 사용방식
    - IDENTITY: 기본 키 생성을 데이터베이스에 위임한다.
    - SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
    - TABLE: 키 생성 테이블을 사용한다. 

1) 기본 키 직접 할당 전략

  • em.persist()로 엔티티를 지정하기 전에 애플리케이션에서 키본 키를 직접 할당하는 방법이다.
  • 만약 식별자 값이 없으면 예외가 발생한다.
@Id
@Column(name="id")
private String id;
Board board = new Board();
board.setId("id1") // 기본 키 직접 할당
em.persist(board);

 

2) IDENTITY 전략

  • 기본 키 생성을 데이터 베이스에 위임하는 전략이다. 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
  • 데이터베이스에 엔티티를 저장해서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다. (IDENTITY 전략은 테이블에 데이터를 저장해야 식별자 값을 획득할 수 있다)
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

 

2) SEQUENCE 전략

  • 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다.
  • SEQUENCE 전략은 이 시퀀스를 사용해서 기본 키를 생성한다. 이 전략은 시퀀스를 지원하는 오라클, PostegreSQL, DB2, H2 데이터베이스에서 사용할 수 있다.
  • 데이터 베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.
@Entity
@SequenceGenerator(
	name = "BOARD_SEQ_GENERATOR",
    sequenceName= "BOARD_SEQ", // 매핑할 데이터베이스 시퀀스 이름
	initialValue =1, allocationSize =1)
public class Board{
	
    @Id
    @GeneratedValue(starategy = GenerationType.SEQUENCE,
    				generator = "BOARD_SEQ_GENERATOR")
    private Long id;
    ...
}

@SequenceGenerator를 사용해서 BOARD_SEQ_GENERATOR라는 시퀀스 생성기를 등록했다.

그리고 sequenceName 속서으이 이름으로 BOARD_SEQ를 지정했는데 JPA는 이 시퀀스 생성기를 실제 데이터베이스의 BOARD_SEQ시퀀스와 매핑한다. 

다음으로 키 생성 전략을 GenerationType.SEQUENCE로 설정하고 generator = "BOARD_SEQ_GENERATOR"로 방금 등록한 시퀀스 생성기를 선택했다. 이제부터 id 식별자 값은 BOARD_SEQ_GENERATOR 시퀀스 생성기가 할당한다. 

 

4) TABLE 전략

  • TABLE 전략은 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다.
  • 데이터 베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.
@Entity
@TableGenerator(
	name = "BOARD_SEQ_GENERATOR",
    table = "MY_SEQUENCES",
	pkColumnBalue = "BOARD_SEQ", allocationSize =1)
public class Board{
	
    @Id
    @GeneratedValue(starategy = GenerationType.TABLE,
    				generator = "BOARD_SEQ_GENERATOR")
    private Long id;
    ...
}

@TableGenertor를 사용해서 테이블 키 생성기를 등록한다. 여기서는 BOARD_SEQ_GENERATOR라는 이름의 테이블 키 생성기를 등록하고 방금 생성한 MY_SEQUENCES 테이블 키 생성용 테이블로 매핑했다. 다음으로 TABLE 전략을 사용하기 위해 GenerationType.TABLE을 선택했다. 그리고 @GeneratedVlaue.generator에 방금 만든 테이블 키 생성기를 지정했다. 이제부터 id 식별자 값은 BOARD_SEQ_GENERATOR 테이블 키 생성기가 할당한다. 

 

5)  AUTO 전략

데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다. 

예를 들어 오라클을 선택하면 SEQUENCE를, MySQL을 선택하면 IDENTITY를 사용한다.