inblog logo
|
백엔드블로그-dohyeong
    JPA

    [JPA] 04. 엔티티 매핑

    Aug 18, 2023
    [JPA] 04. 엔티티 매핑
    Contents
    엔티티 매핑@Entity데이터베이스 스키마 자동 생성DDL 생성 기능필드와 컬럼 매핑기본 키 매핑

    엔티티 매핑

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

    @Entity

    불은 클래스는 JPA 가 관리함 → 엔티티라 함
    JPA를 사용해서 테이블과 매핑할 클래스는 @Entity필수
     
    🚨 주의
    • 기본 생성자 필수( 파라미터 없는 public or protected 생성자 )
    • final 클래스, enum, interface, inner 클래스는 사용 X
    • 저장할 필드에 final 사용 X
     
    속성 정리
    • name
      • JPA에서 사용할 엔티티 이름을 지정한다
      • 기본값 → 클래스 이름을 그대로 사용

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

    • DDL 을 애플리케이션 실행 시점에 자동 생성
    • 객체 중심
    • 데이터베이스 방언을 활용 → DDL 생성
    • 생성된 DDL 은 개발 장비에서만 사용, 운영서버에서는 가급적 사용하지 않음
     
    📍 속성
    notion image
    🚨 주의
    • 운영 장비에서 절대 create, create-drop, update 사용하면 안됨
    • 개발 초기에는 create or update
    • 테스트 서버는 update or validate
    • 스테이징과 운영 서버는 validate or none

    DDL 생성 기능

    • 제약조건 추가
    • 유니크 제약 조건 추가
    • DDL 생성기능은 DDL 을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.
     

    필드와 컬럼 매핑

    @Column
    notion image
     
    @Eunmerated
    자바 enum 타입을 매핑할 때 사용함
    📍EnumType.ORDINAL은 순서를 데이터베이스에 저장하는데 수정시 문제가 생길 수 있다
     
    @Temporal
    날짜 타입 java.util.Date, java.util.Calendar)을 매핑할 때 사용
    → LocalDate, LocalDateTime 을 사용할 때는 생략이 가능함
     
    @Lob
    매핑하는 필드타입이 문자면 CLOB매핑, 나머지는 BLOB매핑
     
    @Transient
    필드 매핑X, 데이터베이스 저장X, 조회X
    주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
     

    기본 키 매핑

    @Id 직접 할당
    @GeneratedValue 자동 생성
    IDENTITY 데이터베이스에 위임 , MYSQL
    • JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
    • AUTO_INCREEMENT는 데이터베이스에 insert sql를 실행한 이후 id 값을 알 수 있다
    • IDENTITY 전략은 em.persist() 시점에 즉시 insert sql 실행하고 DB 에서 조회한다.
     
    SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE
    • @SequenceGenerator 필요
    • 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
    • @SequenceGenerator 애노테이션 사용
      • allocationSize는 기본값이 50 ( 성능 최적화를 위해서)
    @Entity @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ", initialValue = 1, allocationSize = 50) public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR") private Long id;
    • TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용
      • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략 ( 성능이 안좋음)
      • @TableGenerator 필요
    • AUTO: 방언에 따라 자동 지정, 기본값
    Share article

    백엔드블로그-dohyeong

    RSS·Powered by Inblog