[JPA] Chapter 4. 엔티티 매핑 1 - 객체-테이블

joyful·2021년 7월 9일
0

JPA

목록 보기
4/18

들어가기 앞서

이 글은 김영한 님의 저서 「자바 ORM 표준 JPA 프로그래밍」을 학습한 내용을 정리한 글입니다. 모든 출처는 해당 저서에 있습니다.


  • JPA 사용의 핵심 = 엔티티와 테이블정확매핑하는 것

  • 매핑 정보 기술 방법으로는 XML어노테이션이 존재

    어노테이션을 사용하는 쪽이 좀 더 쉽고 직관적이므로, 이번 챕터에서 XML을 이용한 방법은 따로 다루지 않음
    XML을 이용한 매핑 보러 가기

  • JPA의 대표적인 매핑 어노테이션

    매핑어노테이션
    객체-테이블@Entity, @Table
    기본키@Id
    필드-컬럼@Column
    연관관계@ManyToOne, @JoinColumn

    => 이번 챕터에서는 객체-테이블, 기본키, 필드-컬럼 매핑만 설명한다.



4.1 @Entity

✅ 개요

  • 테이블과 매핑할 클래스 지정 → 필수
  • 적용한 클래스 → 엔티티

✅ 속성

속성기능기본값
name◾ JPA에서 사용할 엔티티 이름 지정
◾ 보통 기본값인 클래스 이름 사용
◾ 다른 패키지에 동명의 엔티티 클래스 존재
   → 이름 지정하여 충돌 방지
미설정 시 클래스 이름 그대로 사용
ex) Member

✅ 주의사항

  • 기본 생성자 필수(파라미터 없는 public 또는 protected)
    → JPA가 엔티티 객체 생성시 기본 생성자 사용하기 때문
    • java에서의 생성자 생성
      • 생성자가 존재하지 않는 경우 → 기본 생성자 자동 생성
      • 생성자가 존재하는 경우 → 직접 생성 필요
  • final, enum, interface, inner 클래스에 사용 불가
  • 저장할 필드에 final 사용 금지


4.2 @Table

✅ 개요

  • 엔티티와 매핑할 테이블 지정
  • 생략시 매핑한 엔티티 이름을 테이블 이름으로 사용

✅ 속성

속성기능기본값
name매핑할 테이블 이름엔티티 이름 사용
catalogcatalog 기능이 있는 데이터베이스에서
catalog 매핑
schemaschema 기능이 있는 데이터베이스에서
schema 매핑
uniqueConstraints
(DDL)
◾ DDL 생성 시 유니크 제약조건 생성
◾ 2개 이상의 복합 유니크 제약조건 생성 가능
◾ 스키마 자동 생성 기능을 사용하여
   DDL 생성할 때만 사용


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

JPA는 매핑정보(사용 중인 테이블 및 컬럼)와 데이터베이스 방언을 사용하여 데이터베이스 스키마를 자동 생성함

✅ 사용

📝 persistence.xml에 속성 추가

<!-- 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성 -->
<property name="hibernate.hbm2ddl.auto" value="create" />

<!-- 속성 'true' → 콘솔에 실행되는 테이블 생성 DDL 출력 -->
<property name="hibernate.show_sql" value="true" />
  • hibernate.hbm2ddl.auto

    • 속성

      옵션설명
      create기존 테이블을 삭제 후 새로 생성
      → DROP + CREATE
      create-dropcreate + 애플리케이션 종료시 생성한 DDL 제거
      → DROP + CREATE + DROP
      update데이터베이스 테이블과 매핑정보 비교하여 변경 사항만 수정
      validate◾ 데이터베이스 테이블과 엔티티 매핑정보 비교하여
         차이 존재시 경고 남기고 애플리케이션 실행 x
      ◾ DDL 수정 x
      none◾ 유효하지 않은 옵션 값
      ◾ 자동 생성 기능 사용 원하지 않는 경우
         → hibernate.hbm2.ddl.auto 속성 삭제로도 가능
    • 운영 중인 데이터베이스의 테이블이나 컬럼 삭제 가능
      개발 서버개발 단계에서만 사용할 것

      💡 개발 환경에 따른 추천 전략

      • 개발 초기 단계 → create 또는 update
      • (초기화 상태 + 테스트 자동화) 개발자 환경 및 CI 서버
        create 또는 create-drop
      • 테스트 서버 → update 또는 validate
      • 스테이징 및 운영 서버 → validate 또는 none
  • javax.persistence.schema-generation.database.action

    • JPA 2.1부터 스키마 자동 생성 기능 표준 지원
    • 지원 옵션
      • none
      • create
      • drop-and-create
      • drop
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />

📝 애플리케이션 실행 및 결과

  • DDL 콘솔 출력
    • 기존 테이블 삭제 후 다시 생성
    • 클래스에 추가한 필드들의 타입을 테이블에서 사용할 타입으로 자동 변환
  • 데이터 베이스 방언에 따라 달라짐
    ex) 오라클


✅ 장점

  • 엔티티와 테이블의 매핑 방식 이해 용이
  • 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성
    → 개발자가 테이블 직접 생성시 소요 비용 절감

✅ 주의사항

완벽하지 않으므로 개발 환경에서 사용하거나 매핑 방식 참고 용도로 사용



📚 이름 매핑 전략 변경

✅ 단어-단어 구분 표기법

자바 : 카멜(Camel) 표기법 ex) roleType
데이터베이스 : 언더스코어(_) ex) role_type

  • 관례를 따르기 위해서는 name 속성을 명시적으로 사용해야 함
@Column(name="role_type")  //언더스코어로 구분
String roleType		   //카멜 표기법으로 구분

hibernate.ejb.naming_strategy 속성

<property name="hibernate.ejb.naming_strategy"
    value="org.hibernate.cfg.ImprovedNamingStrategy" />
  • 이름 매핑 전략 변경 가능
  • org.hibernate.cfg.ImprovedNamingStrategy 클래스
    • 하이버네이트에서 제공하는 클래스
    • 테이블 명 및 컬럼 명 생략시 자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑
  • 적용 예시
    • 변경 전
    • 변경 후
profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글