Lee's Grow up

[JAVA/JPA] Entity Mapping 방법 본문

PROGRAMMING/JAVA

[JAVA/JPA] Entity Mapping 방법

효기로그 2019. 12. 9. 15:42
반응형

해당 내용은 인프런의 자바 ORM 표준 JPA 프로그래밍 - 기본편, 김영한 의 내용을 기반으로 정리해서 작성한 글입니다.
자세한 내용은 해당 강의 또는 책을 구매하셔서 알아보시는걸 추천합니다.

 

사용 어노테이션


  • 객체와 테이블 매핑 : @Entity , @Table
  • 필드와 컬럼 매핑 : @Column, @Enumerated, @Temporal, @Lob, @Treansient
  • 기본 키 패킹 : @Id
  • 연관관계 매핑 : @ManyToOne, @JoinColumn

 

객체와 테이블 매핑


@Entity

정의 : JPA가 관리하는 객체라고 선언하는 어노테이션
  • 기본 생성자 ( public, protected ) 가 필수로 있어야 ( 리플렉션이나 여러 기술을 사용할 때 필요 )
  • final, enum, interface, inner 클래스는 사용 불가능
  • 필드에도 final 키워드 사용 불가능
속성

name라는 속성이 사용가능하며. Default로 클래스 이름으로 지정, 다른 패키지내 같은 클래스이름이 있을 경우 둘을 구분하기 위해 사용한다.

import javax.persistence.Entity;
@Entity( name = "Member" )
public class Member {
    public Member() { }
}

@Table

정의 : Entity와 매핑될 DB 테이블에 대한 설정
속성
속성 기능 기본값
name 매핑할 테이블 이름 Entity 의 name 
catalog 데이터베이스 catalog 매핑  
schema 데이터베이스 schema 매핑  
uniqueConstraints(DDL) DDL 생성 시에 유니크 제약 조건 생성  

 

필드와 컬럼 매핑



어노테이션 설명
@Column 컬럼과 매핑
@Temporal 날짜 타입 컬럼과 매핑
@Enumerated enum 타입과 컬럼 매핑
@Lob BLOB, CLOB 매핑
@Transient 필드와 컬럼 매핑 제외

@Column

속성
  • name : 테이블에 매칭시킬 컬럼 이름 ( default : 필드명 )
  • insertable, updateable : 등록, 변경 여부 ( default : true )
  • nullable : null 값의 허용 여부, false로 설정시 DDL 생성 시에 not null 제약 조건이 자동 생성
  • unique : @Table의 unique 속성과 같지만 컬럼에도 선언 가능
    • 단 실무에서는 Unique 제약조건명이 자동으로 생성되기 때문에 사용을 안함
  • columnDefinition : 데이터베이스에 컬럼 정보를 직접 생성
  • length : 문자 컬럼의 길이 제약조건, String 타입에서만 사용가능 (default : 255 )
  • precision,scale : BigDecimal 타입이나 BigInteger에서 사용, double, float불가, 큰숫자나 정밀한 소수점 계산시 사용
    • percision : 소수점을 포함한 전체 자릿수
    • scale : 소수의 자릿수
public class Member {
    @Column( name ="MEM_NAME", insertable = true, nullable = false
             ,columnDefinition = "varchar2(200) default 'NONE'", length = 255)
    private String name;
    @Column(percision = 19 )
    private BigDecimal age;
}

@Enumerated

  • Enum 타입을 매핑할 때 사용 속성으로는 ORDINALSTRING를 사용하지만, STRING만 사용할 것 enum 순서에 변화가 생겼을 때, 순서로 저장할 경우 데이터 불일치 발생
    • ORDINAL : enum 순서를 저장
    • STRING : enum 이름을 저장

@Temporal

정의 : 날짜 타입 Date, Calendar 을 매핑, LocalDate, LocalDateTime을 사용할 경우 생략 가능
속성
  • TemporalType.DATE : 날짜, DB의 date 타입과 매핑
  • TemporalType.TIME : 시간, DB의 time 타입과 매핑
  • TemporalType.TIMESTAMP : 날짜와 시간, DB의 timestamp와 매핑
public class Member {
   @Temporal(TemporalType.TIMESTAMP)
   private Date;

   private LocalDate localDate;
   pirvate LocalDateTime localDateTime;
}

@Lob

  • DB의 BLOB, CLOB 와 매핑, 지정할 수 있는 속성이 없으며 문자타입이면 CLOB, 나머지는 BLOB로 자동 매핑

@Transient

  • 필드에서 매핑시 제외시키고 싶은 필드에 선언, 메모라상에서만 쓰고 싶은 경우

 

기본키 매핑


해당 필드를 DB에 사용할 기본키로 선언시 사용, 직접 할당시 @Id만 선언해주면 되지만, 보통 sequence나 autoincrement 등으로 자동 관리하는 경우가 많은데 그럴 경우 @GeneratedValue를 같이 사용해줘야 한다.

@GeneratedValue의 속성
  • IDENTITY : DB에 위임, autoincrement ( mySQL )
  • SEQUECNE : 데이터베이스 시퀀스 sequence 사용 , ORACLE , 추가로 @SequenceGenerator 필요public class Member {}
  • @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR") private Long id; // 값을 주면 안된다.
  • @Entity @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR" // sequenceGenerator 이름 지정 squenceName = "MEMBER_SEQ" // 매핑할 시퀀스 이름 initialValue = 1, allocationSize = 1 ) // 시작하는 숫자, 증가값 기본으로 50
  • TABLE : 키 테이블 사용, 모든 DB에서 사용 가능하지만, 성능 이슈 발생
  • AUTO : 방언에 따라 자동 지정, 기본 값
기본키 전략 strategy 의 특징
  • IDENTITY 전략의 특징
    • 키값이 자동으로 생성되기 때문에 영속성 컨텍스트는 해당 Entity의 키값을 모른다. ( 영속컨테이너 메커니즘에 의해 ) 그렇기 때문에 commit()flush()시점이아닌, persist() 시점에 insert가 발생하고 return 으로 키 값을 받아오기 때문에 별도의 select문은 없음, ( JDBC를 이용 )
  • SEQUENCE 전략의 특징
    • IDENTITY전략과 마찬가지로 DB에 들어가야 키 값을 알 수 있음, 마찬가지로 persist()시점에 동작하며. SEQUENCE.nextVal() 호출로 키 값을 가져오며, insert는 기존의 메커니즘과 같이 commit(), flush()에 동작, 그래서 allocationSize가 default로 50으로 잡혀 있는것!, 불필요하게 DB에 접근해서 sequence값을 가져오지 않고, 버퍼 기능도 사용가능하고, 동시성도 제어 가능

 

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


객체를 Entity로 매핑을 설정해놓으면 컴파일 단계에서 자동으로 DB에 테이블 생성 ( DDL ) 문을 동작, 개발 환경에서만 사용할 것을 권장

옵션 설명
create 기존테이블 삭제 후 다시 생성 
create-drop create와 같고 종료 시점에 drop
update 변경된 부분만 반영
validate 엔티티와 테이블 정상 매핑 확인
none 사용 x
반응형
Comments