[JPA] 엔티티 매핑🖇

Umji You·2021년 10월 27일
0

JPA기본

목록 보기
3/6

4 엔티티와 매핑

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

4.1 Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션이 필수로 붙는다.

  • @Entity가 붙는 클래스는 JPA가 자동으로 관리하게 된다.
  • @Entity 적용시 주의사항
    • 기본 생성자 필수 생성
      • JPA가 Entity 객체 생성시 기본 생성자를 사용하기 때문!
    • final 클래스, enum, interface, inner class 에는 사용이 불가하다.
    • 저장할 필드final 사용 불가

특징

  • 생성자가 하나도 없으면 -> 기본 생성자를 자동적으로 만들어 준다.
  • 별도로 생성자를 하나 이상 만들게 되면 JAVA는 기본 생성자를 자동으로 만들지 않는다
    • 이때는 직접 기본 생성자를 만들어 주어야 한다!

4.2 Table

Entity와 매핑할 테이블을 지정한다. (이름 생략시 mapping한 entity 이름을 테이블로 사용!)

  • Name : 매핑할 테이블 이름 설정
  • Catalog : catalog 기능이 있는 DB에서 catalog를 매핑
    • default 값으로 DB 명
  • Schema : schema 기능이 있응 DB에서 schema를 매핑한다.
  • uniqueConstraints : DDL생성시 유니크 제약조건을 만들어준다.
    • 스키마 자동 생성 기능을 사용해서 DDL을 만들 떄만 사용

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

JPA는 데이터베이스 Schema를 자동으로 생성하는 기능을 지원해준다.
어플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성!!

  • hibername.hbm2ddl.auto 속성
    • create : 기존 테이블을 삭제하고 생성한다. (drop + create)
    • create-drop : create 속성에 추가로 Application 종료할 때 DDL을 제거해 준다. (drop + create + drop)
    • update : DB 테이블과 엔티티 매핑 정보를 비교하여 변경 사항만 수정해준다.
    • validate : DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 해준다. (단순 비교만 한다.)
    • none : 자동 생성 기능을 제공하지 않음!

주의 사항

  1. 개발 초기 단계 : create , update
  2. 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버 : create, create-drop
  3. 테스트 서버 : update , validate
  4. staging과 운영 서버 : validate , none

4.4 기본 키(PK) 매핑

영속성 컨텍스트는 엔티티 식별자를 값으로 구분하므로 영속 상태로 만들기 위해 반드시 필요하다

기본키 생성 전략

  • 직접 할당 : 기본 키를 어플리케이션이 직접 할당
  • 자동 생성 : 대리 키 사용 방식
    • IDENTITY : 기본 키 생성을 DB에 위임
    • SEQUENCE : DB Sequence를 사용해서 기본 키를 할당
    • TABLE : 키 생성 테이블을 사용한다.
    • AUTO : 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(DEFAULT 값이다)

기본키 생성 방법

  • 기본 키를 직접 할당 : @Id만 사용
  • 자동 생성 전략 사용 : @GeneratedValue 추가 및 키 생성 전략 선택.
  • 자연 키
    • 비지니스에 의미가 있는 키
    • 주민번호, 이메일, 전화번호
  • 대리 키
    • 비지니스와 관련 없는 임의로 마들어진 키, 대체 키
    • 오라클 시퀀스, auto_increment, 키 생성 테이블

JPA는 모든 Entity에 일관된 방식으로 대리 키 사용을 권장한다.

4.5 필드와 컬럼 매핑 : 레퍼런스

Column : 객체 필드를 테이블 컬럼에 매핑

  • name : 맵핑할 테이블의 컬럼 이름을 지정합니다;
  • insertable : 엔티티 저장시 선언된 필드도 같이 저장합니다.
  • updateable : 엔티티 수정시 이 필드를 함께 수정합니다.
  • table : 지정한 필드를 다른 테이블에 맵핑할 수 있도록 합니다.
  • nullable(DDL) : NULL을 허용할지, 허용하지 않을지 결정합니다.
  • unique(DDL) : 제약조건을 걸 때 사용합니다.
  • columnDefinition(DDL) : DB 컬럼 정보를 직접적으로 지정할 때 사용합니다.
  • length(DDL) : varchar의 길이를 조정합니다.(String 타입만 가능) 기본값으로 255가 입력됩니다.
  • precsion, scale(DDL) : BigInteger, BigDecimal 타입에서 사용합니다. 각각 소수점 포함 자리수, 소수의 자리수를 의미힌다.

Enumerated : JAVA의 ENUM 타입을 매핑할때 사용

  • value(속성)
    • EnumType.ORDINAL : ENUM 순서를 DB에 저장한다(Default 값)
    • EnumType.STRING : ENUM의 이름을 DB에 저장한다.
      • 웬만하면 이거 쓰도록 하자!

Temporal : 날짜 타입을 매핑할때 사용

  • 사용법 : @Temporal( 아래 값 )
  • TemporalType.DATE : 날짜, 데이터베이스, date 타입과 매핑(예 : 2013-10-11)
  • TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑(예 : 11:11:11)
  • TemporalType.TIMESTAMP : 날짜와 시간, 뎅터베이스 timestamp 타입과 매핑(예 : 2013-10-11 11:11:11)
  • TemporalType은 필수로 지정해야 한다.

LOB : DB의 BLOB, CLOB 타입과 매핑할때 사용

  • value(속성)
    • 지정된 속성이 없다. 대신에 매핑하는 필드 값이 문자CLOB으로 매핑하고 나머지는 BLOB으로 매핑된다.
    • CLOB : String, char[]
    • BLOB : byte[]

Transient : 객체에 임시로 어떤 값을 보관하고 싶을때 사용

  • 필드에 매핑되지 않는다.
  • DB에 저장되지도 않고 조회하지도 않는다.

Access : JPA가 엔티티 데이터에 접근하는 방식을 지정

  • field 접근 : AccessType.FIELD 로 지정
    • 필드에 직접 접근 -> private도 접근 가능
  • property 접근 : AccessType.PROPERTY로 지정
    • Getter를 사용하여 접근 가능
profile
꾸준한 기록을 하자

0개의 댓글