엔티티 매핑

hyemin·2022년 1월 25일
0

JPA

목록 보기
3/7

엔티티 매핑

JPA에서 실제 테이블에 연결하는 객체를 엔티티라고 부른다.
엔티티와 테이블을 정확하게 매핑해서 사용해야하기 때문에 매핑을 위한 여러 Annotation이 존재한다.

엔티티 매핑 소개

  1. 객체와 테이블 매핑 : @Entity, @Table
  2. 필드와 컬럼 매핑 : @Column
  3. 기본 키 매핑 : @Id
  4. 연관관계 매핑 : @ManyToOne, @JoinColumn

객체와 테이블 매핑

@Entity

  • @Entity가 붙은 클래스는 JPA가 관리하며, 엔티티라고 한다.(@Entity가 붙어야만 JPA가 관리하는 엔티티가 된다.)
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이다.

속성

  • name
    • JPA에서 사용할 엔티티 이름을 지정한다.
    • 기본값은 클래스 이름을 그대로 사용한다.
    • Entity 이름과 Table 이름은 다른 개념이다.
    • 같은 클래스 이름이 없으면 가급적으로 기본값을 사용하도록 하자.

주의사항

  • 기본 생성자는 필수이며, public 또는 protected 생성자를 가져야한다.
  • final 클래스, enum, interface, inner 클래스에는 사용이 불가능하다.
  • 저장할 필드에는 final 사용 불가능하다.

@Table

  • @Table은 엔티티와 매핑할 테이블을 지정한다.

속성

  • name
    • 매핑할 테이블이름이며, 기본값은 엔티티 이름을 사용한다.
  • catalog
    • 데이터베이스의 catalog 매핑
  • schema
    • 데이터베이스의 schema 매핑
  • uniqueConstraints
    • DDL 생성시에 유니크 제약 조건을 생성한다.
    • 복합 제약조건 생성이 가능하다.
    • JPA의 스키마 자동생성 기능을 사용하며 DDL을 만들 때에만 적용된다.

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

JPA는 엔티티와 테이블을 매핑하고, 데이터베이스 스키마를 자동으로 생성한다.

  • ddl-auto 속성은 DDL을 애플리케이션 실행시점에 자동으로 생성한다.
  • ddl-auto 속성은 엔티티를 읽어 테이블을 자동으로 생성한다.
  • 테이블 중심의 개발에서 객체 중심의 개발을 할 수 있도록 해준다.
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL을 생성한다.
  • 이렇게 생성된 DDL은 개발장비에서만 사용하도록 한다.

ddl-auto 옵션

  1. create
    • 기존테이블을 삭제 후 다시 생성한다.
    • DROP + CREATE
  2. create-drop
    • create와 같으나 종료 시점에 테이블을 한 번 더 drop 한다.
    • DROP + CREATE + DROP
    • 생성한 DDL도 삭제하며, testcase를 실행시키고 마지막에 깔끔하게 모두 삭제하고 싶을 때 사용한다.
  3. update
    • 변경 사항만 수정한다.
    • 운영 DB에는 사용해서는 안된다.
  4. validate
    • DB 테이블과 엔티티가 정상적으로 매핑되었는지 확인한다.
    • 변경사항이 있는 경우 경고를 발생시켜 애플리케이션을 실행시키지 않는다.
  5. none
    • ddl-auto 기능을 사용하지 않겠다는 것이다.

운영 장비에는 절대로 create, create-drop, update를 사용하면 안된다.

필드와 컬럼 매핑

hibernate.hbm2ddl.auto
1. @Column : 컬럼 매핑
2. @Temporal : 날짜 타입 매핑
3. @Enumerated : enum 타입 매핑
4. @Lob : BLOB, CLOB 매핑
5. @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시)

@Column

name : 필드와 매핑할 테이블의 컬럼 이름(기본값은 객체의 필드이름)
insertable : 엔티티 저장 시 이 컬럼도 함께 등록 (기본값 TRUE, FALSE 설정 시 이 필드를 등록하지 않음)
updatable : 엔티티 수정 시 이 컬럼도 함께 수정(기본값 TRUE, FALSE 설정 시 이 필드를 수정하지 않음)
nullable(DDL) : null 값의 허용여부를 물으며, false로 설정하면 DDL 생성시에 not null 제약조건이 붙는다.
unique(DDL) : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용한다. (하지만 이름을 줄 수 없어 선호하진 않는다.)
columnDefinition(DDL) : 데이터 베이스에 컬럼 정보를 직접 줄 수 있다.
length(DDL) : 문자 길이 제약조건이며, String 타입에만 사용한다.
precision, scale(DDL) : BigDecimal,BigInteger 등에서 사용하며 precision은 소수점을 포함한 전체 자리수를 명시하고, scale은 소수의 자리수를 명시한다.

@Enumerated

자바 enum 타입을 매핑할 때 사용한다.

  • EnumType.ORDINAL : enum 순서를 DB에 저장한다.
  • EnumType.STRING : enum 이름을 데이터베이스에 저장한다.

    기본값은 ORDINAL인데 요구 사항이 늘어나 enum에 데이터를 추가한 경우 순서가 바뀌면 데이터가 엉망이 되므로 항상 STRING을 사용하도록 하자.

@Temporal

  • 날짜 타입을 매핑할 때 사용한다.
  • 생략 시 timestamp 형식으로 자동 저장된다.옵션으로 형식을 정해주어야 한다.
  • 참고로 LocalDate, LocalDateTime을 사용할 때는 생략 가능하다.
  1. TemporalType.DATE
    • 날짜 (2020-02-22) 저장
    • DB의 date 타입과 매핑
  2. TemporalType.TIME
    • 시간 (16:50:30) 저장
    • DB의 time 형식에 매핑
  3. TemporalType.TIMESTAMP
    • 날짜와 시간 (2020-02-22 16:50:30) 저장
    • DB의 timestamp에 매핑

@Lob

  • 데이터베스 BLOB, CLOB 타입과 매핑한다.
  • @Lob에는 지정할 수 있는 속성이 없다.
  • 매핑하는 타입이 문자면 CLOB, 나머지는 BLOB를 매핑하면 된다.

기본 키 매핑

기본 키 매핑 어노테이션

  1. @Id
  2. @GeneratedValue

기본 키 매핑 방법

직접 할당 : @Id만 사용한다.

  • 애플리케이션에서 직접 할당한다.
Member member = new Member();
member.setId(1); //직접 할당
memberRepository.save(member);

자동 생성 : @GeneratedValue 사용

  • strategy 옵션을 사용하여 자동 생성 전략을 정의할 수 있다.

1. IDENTITY 전략

  • 데이터 베이스에 위임하는 방법
    • MYSQL의 auto_increment와 같은 기능을 한다.
    • auto_increment는 데이터베이스에 INSERT SQL을 실행한 후에 ID 값을 알 수 있다.
    • 그렇기 때문에 IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL을 실행하고 DB에서 식별자를 조회한다.

2. SEQUENCE 전략

  • 유일한 값을 순서대로 생성하는 전략으로, DB에서 지원을 해야 가능한 방법이다.
    • @SequenceGenerator가 필요하다.
    • Oracle, PostgreSQL, DB2, H2 데이터베이스에서 사용한다.
@Entity 
@SequenceGenerator( 
    name = "MEMBER_SEQ_GENERATOR", 
    sequenceName = "MEMBER_SEQ", 
    initialValue = 1, allocationSize = 1) 
public class Member { 
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, 
		generator = "MEMBER_SEQ_GENERATOR") 
private Long id; 
}

name : 식별자 생성기 이름 (필수)
sequenceName : DB에 등록되어 있는 시퀀스 이름
initialValue : DDL 생성 시에만 사용되며, 시퀀스 DDL을 처음 생성할 때 시작할 수를 정한다. (기본값은 1)
allocationSize : 시퀀스 한 번 호출에 증가하는 수이다.(기본값이 50이기 때문에 DB에 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야한다.)
catalog, schema : DB의 catalog와 schema이름

3. TABLE 전략

  • 키 생성 전용 테이블을 하나 만들어서 데이터 베이스 시퀀스를 흉내내는 전략이다.
    • 위의 두 전략과 다르게 모든 데이터베이스에 적용이 가능하다.
    • 하지만 성능 저하의 우려가 있다.
create table MY_SEQUENCES ( 
 sequence_name varchar(255) not null, 
 next_val bigint, 
 primary key ( sequence_name ) 
)
@Entity 
@TableGenerator( 
 name = "MEMBER_SEQ_GENERATOR", 
 table = "MY_SEQUENCES", 
 pkColumnValue = “MEMBER_SEQ", allocationSize = 1) 
public class Member { 
 @Id 
 @GeneratedValue(strategy = GenerationType.TABLE, 
 generator = "MEMBER_SEQ_GENERATOR") 
 private Long id;
}

name : 식별자 생성기 이름 (필수)
table : 키 생성 테이블명
pkColumnName : 시퀀스 컬럼명
valueColumnName : 시퀀스 값 컬럼명
pkColumnValue : 키로 사용할 값 이름
initialValue : 초기 값 (기본값 0)
allocatoinSize : 시퀀스 한 번 호출에 증가하는 수 (기본값 50)
catalog, schema : DB의 catalog와 schema이름
uniqueConstraints : 유니크 제약조건을 지정할 수 있다.

4. AUTO 전략

  • 선택한 데이터베이스의 방언에 따라 위의 3가지 전략 중 하나를 선택한다.
  • 오라클일 경우 SEQUENCE, MySQL인 경우 IDENTITY를 선택한다.
  • 데이터베이스를 변경해도 코드 수정이 필요없다는 장점이 있다.



참고 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard 김영한 님의 JPA 프로그래밍 강의
https://book.naver.com/bookdb/book_detail.nhn?bid=9252528 자바 ORM 표준 JPA 프로그래밍
위의 책을 참고하고, 강의를 수강하면서 작성한 글입니다.
틀린 부분 등 다양한 피드백 환영합니다.

profile
열심히 성장 중 :)

0개의 댓글