notepad

[JPA-BASIC] 엔티티 매핑 본문

JPA

[JPA-BASIC] 엔티티 매핑

likewise_ 2020. 7. 17. 19:25

인프런 김영한 강사님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 내용 정리

객체와 테이블 매핑 @Entity, @Table
컬럼 매핑 @Column
기본키 매핑 @Id
연관관계 매핑 @ManyToOne, @JoinColumn

@Entity

  • 엔티티가 붙은 클래스는 JPA가 관리. 엔티티라고한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 엔티티 어노테이션이 필수이다
  • 주의 : 기본 생성자는 필수(파라미터가 없는 public, protected 생성자)
  • final클래스, enum, interface, inner class에는 사용 불가
  • 저장할 필드에 final 사용 금지

@Table 엔티티와 매핑할 테이블 지정

  • name, catalog, schema, uniqueConstraints (DDL생성시 유니크 제약조건 생성)
  • 속성 사용 가능

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

  • DDL을 애플리케이션 실행 시점에 자동 생성
  • 테이블 중심 -> 객체 중심
  • 데이터베이스 방언을 활용하여 데이터베이스에 맞는 적절한 DDL사용
  • 자동 생성된 DDL은 개발 장비에서만 사용
  • 운영 서버에서는 적절히 다듬은 후 사용

META-INF/persistence.xml
hibernate.hbm2ddl.auto 옵션

  • create / create-drop / update / validate / none
  • 로컬 환경이 아니면 되도록 쓰지말자 + 주의하자

매핑 어노테이션 정리

@Column 컬럼 매핑
@Tempral 날짜 타입 매핑 -> java8 이후 어노테이션 없이 LocalDateTime 사용
@Eunmerated enum타입 매핑
@Lob blob, clob 매핑
@Transient 매핑 무시 : 특정 필드를 컬럼에 매핑하지 않음

필드와 컬럼 매핑

@Column

  • name / insertable, updatable 등록 변경 가능 여부 / nullable/ unique (제약조건명이 지정을 위해 @Table의 uniqueConstranints 을 더 많이 사용한다) / length, columnDefinition /precision, scale
    BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자 릿수를, scale은 소수의 자릿수 다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정 밀한 소수를 다루어야 할 때만 사용한다.
@Table(name = “Member”,
        uniqueConstraints = {@UniqueConstraint(name = “NAME_UNIQUE”, columnNames = “name”)})
class Member{
//
}

기본 키 매핑

@Id, @GeneratedValue

```
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
```

@Id만 사용 -> 직접 ID 할당
@GeneratedValue 사용 -> 자동 생성 / 전략 지정 가능

IDENTITY : 데이터베이스에 위임, MySQL

  • Auto increment -> 1차 캐시 사용을 위해 엔티티 영속시점(em.persist()) 에 Insert 쿼리를 실행시켜 키 값을 가져온다.
    @GeneratedValue(strategy = GenerationType.IDENTITY)

SEQUENCE : DB 시퀀스 사용, ORACLE / @SequenceGenerator 필요

@Entity
@SequenceGenerator(
    name = "MEMBER_SEQ_GENERATOR"
    sequenceName = "MEMBER_SEQ" //DB
    initialValue = 1
    allocationSize = 50
)
class Member {

    @Id @GeneratedValue(strategy = GenerationType.Sequence, generator = "MEMBER_SEQ_GENERATOR"
    private Long id;

TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 가능 @TableGenerator필요

  • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉 내내는 전략
  • 장점: 모든 데이터베이스에 적용 가능
  • 단점: 성능
  • AUTO : 방언에 따라 자동 지정, 기본값
    시퀀스 전략에서의 성능 최적화

allocationSize 값 조정을 통해 네트워크 통신 횟수를 줄인다. (미리 allocationSize 만큼 시퀀스를 가져와 메모리에 저장 후 시퀀스를 부여한다)
allocationSize : 시퀀스 한번 호출에 증가하는 수 (성능 최적화에 사용)
키 범위를 미리 확보해 놓는 것이기 때문에 서버 여러대(동시성 문제) 를 걱정하지 않아도 된다.

권장하는 식별자 전략

  • 기본키 제약 조건 : not null, unique, 변하면 안된다.
  • 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 이용하자
  • 권장 : Long형 + 대체키(랜덤값) + 키 생성 전략
    시퀀스, UUID & 랜덤값
    그냥 sequence 나 autoIncrement를 사용

궁금한 점
: 여러대의 서버에서 시퀀스를 가져다 쓰고 insert하면 1 다음에 51이 들어가거나 할 수 도 있는건가?

서버가 2대 이상이라면 DB상에는 시퀀스 순서가 다르게 들어갈 수 있습니다. (중복이 되지는 않습니다.)
그런데 가급적 시퀀스는 순서를 보장하는데 쓰시지 말고 순서에 대한 부분은 별도의 날짜 컬럼을 사용하시는 것을 권장합니다.

** reflection 과 proxy, jvm

** catalog / schema

'JPA' 카테고리의 다른 글

[JPA 활용1] 요약  (0) 2020.08.07
[JPA 활용2] 기본~ 고급 요약  (0) 2020.08.07
[JPA 활용2] 고급 - 지연 로딩과 조회 성능 최적화  (0) 2020.08.05
[JPA 활용2] API 개발 기본  (0) 2020.08.03
[JPA-BASIC] 영속성 관리  (0) 2020.07.16
Comments