[JPA]엔티티 매핑

김용현·2023년 12월 18일
0

JPA

목록 보기
2/12

본 포스트는 김영한 님의 자바 ORM 표준 JPA 프로그래밍 강의를 토대로 작성하였습니다.

엔티티 매핑

JPA에서 관리할 클래스를 만드는 방법은 @Entity를 붙여주면 된다.

요런 식이다.

주의할 점❗️
기본 생성자 필수
final 클래스, enum, interface, inner 클래스 사용 X
저장할 필드에 final 사용 X

@Table


클래스와 데이터베이스 테이블 간 다른 이름을 가진 테이블에 매핑하는 경우 @Table 어노테이션을 이용하면 된다. 속성은 다음 그림을 참고하자.

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

-> DDL을 애플리케이션 실행 시점에 자동 생성
적용 방법은 persistence.xml 파일에

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

요거를 적어두고 value 값을 아래의 값들로 변경하면 된다.

DDL 생성 기능

JPA에서는 객체 멤벼 변수에 어노테이션으로 데이터 정의어를 생성할 수 있다.

데이터 베이스 매핑과 관련된 어노테이션들 중 주요한 것들을 정리해보자.

@Column

굳이 외우기 보다는 필요할 때 찾아보는 것도 좋을 것 같다.

@Enumerated

이런 식으로 쓰는건데 주의할 점❗️ 웬만하면(거진 무조건) EnumType.STRING으로 쓰자.
default가 Ordinal인데, Ordina로 사용 시 이후에 Enum 클래스에 값이 추가될 경우 순서 정보가 꼬이게 되어 데이터베이스에 중복된 값이 들어갈 수 있다.

기본 키 매핑

기본 키 매핑 방법에는 크게 2가지가 있다.

  • @Id로 직접 할당
  • @GeneratedValue로 자동 생성

@Id

pk로 쓸 변수 위에 위 어노테이션을 적고 그냥 직접 넣어주면 된다.

@GeneratedValue

  • IDENTITY
    기본 키 생성을 데이터베이스에 위임한다.

    ❗️주의할 점
    IDENTITY 전략을 사용할 경우 쿼리를 쌓아놓고 보내는 버퍼 기능을 사용할 수 없다!
    이유는,
    pk 값을 Null로 두고 데이터베이스로 보내면 데이터베이스가 알아서 pk값을 채우는 방식이기 때문에 객체를 생성하고 이를 DB에 보내기 전까지는 pk 값을 알 수가 없다.(메모리 상에서는 null이니까) 그런데 영속 컨텍스트에는 pk 값이 없으면 그 객체를 넣을 수가 없다. 따라서 persist하자마자 insert 쿼리를 날리고 해당 객체의 pk 값을 취한다.

사용은 요렇게.

  • SEQUENCE
    유일한 값을 순서대로 생성하는 데이터베이스 오브젝트를 이용하는 전략

    allocationSize의 경우 성능 최적화를 위해 사용되는 값이다.

    성능 최적화 방법
    allocationSize의 값이 50이라면
    //member 객체가 존재한다고 가정

    1. em.persist(member) 실행
    2. pk 전략이 SEQUENCE 임을 확인하고 데이터 베이스에서 현재 시퀀스 값(1)을 가져옴. allocationSize 값만큼 다음 sequence 값을 증가시켜 세팅(여기서는 1 -> 51)
    3. 이후로는 pk 값이 51이 될 때까지 쿼리를 날리지 않고 메모리 상에서 pk 할당 (이미 51까지 증가시켜놨으니까)
    4. 단 persist를 호출했다고 insert 쿼리가 날아가지는 않음, 다음 sequence 값을 알기 위한 쿼리만 날아감 (영속 컨텍스트를 이용한 버퍼 기능 활용 가능)

사용은 요렇게

헷갈리지 말 것❗️

@GeneratedValue 어노테이션의 strategy 값은 디폴트가 auto 이다.
auto는 사용 db에 따라 전략을 알아서 선택해주는 것이고,
@GeneratedValue가 붙어있으면 db 전략에 맞추어 무조건 id 값을 보장해준다는 것이다. 즉 strategy 옵션 값은 그냥 전략 선택이고 @GeneratedValue가 있기만 한다면 선택한 전략에 따라 Id 값을 알아서 넣어준다는 것이다.

  • TABLE
    pk용 데이터 베이스 테이블을 따로 만들어놓고 pk값을 가져오는 전략

요거는 나중에 필요할 때 공부해보자

  • AUTO
    방언에 따라 자동 지정, 기본값이다. (@GeneratedValue(strategy=Auto)가 디폴트)
profile
평생 여행 다니는게 꿈 💭 👊 😁 🏋️‍♀️ 🦦 🔥

0개의 댓글