본문 바로가기
Back-End/Spring Data

4.엔티티 매핑

by 두두리안 2021. 1. 7.
728x90

4.엔티티 매핑

  • 목차
    • 1.객체와 테이블 매핑
    • 2.데이터베이스 스키마 자동생성
    • 3.필드와 컬럼 매핑
    • 4.기본키 매핑

1.객체와 테이블 매핑

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

@Entity

  • JPA 가 관리하는 엔티티
  • 기본생성자는 필수 (public , protected)
  • final 클래스 , enum,interface,inner 클래스 사용 x
  • 저장할 필드에 final 사용 x

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

  • DDL 을 애플리케이션 실행시점에 자동 생성
  • 테이블 - > 객체 중심
  • 데이터 베이스 방언에따라 적절한 DDL 을 생성
  • 운영서버에서는 생성된 DDL 을 쓰지 않는다
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
  • h2 데이터베이스 SQL 문 나간다
<property name="hibernate.hbm2ddl.auto" value="create" />
  • 자동으로 기존 테이블 삭제후 생성
  • Update : 변경 쪽만 바꾸어준다
  • validate : 엔티티와 테이블이 정상 매핑되는지 확인
  • 운영장비 -> 절대로 create , create-drop , update 사용하면 안된다

정리

  • 개발초기 : create , update
  • 테스트 서버 : validate
  • 스테이징 ,운영서버 : validate , none

3.필드와 컬럼 매핑

GMember

@Entity
public class GMember {

    @Id
    private Long id;

    @Column(name = "name")
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob
    private String description;
    //Getter, Setter…
}
  • @Column(name = "name") : DB name 으로 들어간다
  • @Enumerated(EnumType.STRING) : enum 타입을 쓸때 쓴다
  • @Temporal(TemporalType.TIMESTAMP) : date , time , timestamp 가 있다
    • date : 날짜
    • time : 시간
    • timestamp : 날짜,시간
  • @Lob : 큰데이터를 쓸때 사용

image

@Column

  • name : 필드와 매핑할 테이블의 컬럼이름
  • insertable,updatable : 등록,변경 기능여부
  • nullable : null 값의 허용여부를 설정
  • unique : 유니크 제약조건을 걸때 쓴다 (잘안쓴다 , 쿼리나가는 문이 운영에 반영하기 어렵다)
    • @Table(uniqueConstrains) 를 주로 선호한다
  • length : 문자 길이 제약조건 (String 타입만)

@Enumerated

  • STRING : enum 타입을 매핑할때는 무조건 쓰기
  • ORDINAL : 중간에 enum 값을 넣을수 없다

@Temporal

  • LocalDate , LocalDateTime 이 자바8 부터 등장해서 생략 가능하다
  • LocalDate : 년 , 월
  • LocalDateTime : 년 , 월 , 일 , 시간

@Lob

  • 지정할수 있는 속성이 없다
  • 문자 : CLOB
  • 나머지 : BLOB

4.기본키 매핑

  • 직접할당 : @Id
  • 자동생성 : @GeneratedValue
  • 자동할당
    • IDENTITY : 데이터베이스에 위임
    • SEQUENCE : 데이터베이스 시퀸스 오브젝트 사용 (@SequenceGenerator)
    • TABLE : 키 생성용 테이블 사용 (@TableGenerator)
    • AUTO : 방언에따라 지정

IDENTITY

@Entity
public class IMember {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}
  • 기본키 생성을 DB 에 위임
  • MySQL 경우 AUTO_INCREMENT
  • h2 데이터베이스 경우

image

IDENTITY 주의

  • IDENTITY 는 id 값을 넣지않고 DB 에 Insert 한다
  • DB 에서 값이 날아오면 영속성 컨텍스트에 값을 셋팅한다
  • id 값을 DB 에 들어가야 알수 있다..?
  • 영속성 컨텍스트는 pk 값이 무조건 있어야 한다
  • IDENTITY 는 em.persist 할때 DB 에 Insert 문이 나간다
System.out.println("================");
IMember iMember = new IMember();
em.persist(iMember);
System.out.println("================");

image

  • 모아서 Insert 문 못쓰는게 단점

SEQUENCE

@Entity
@SequenceGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        sequenceName = "MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
        initialValue = 1, allocationSize = 1)
public class TMember {

    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE,
            generator = "MEMBER_SEQ_GENERATOR")
    private Long id;

    @Column(name = "name")
    private String username;

    public TMember(){

    }
}
  • sequenceName : 매핑할 시퀸스 이름
  • initialValue = 1 : 1부터 1씩증가
  • allocationSize = 1 : 한번에 50개씩 가져옴
  • generator : 기본키에 매핑할 시퀸스 이름을 적용

image

  • 위에는 하이버 네이스가 기본으로 제공해주는 시퀸스
  • MEMBER_SEQ 생성된것을 볼수있다

image

SEQUENCE 특징

  • MEMBER_SEQ 는 트랜잭션 커밋하기 전에 DB 에서 가져온다
  • 가져온 MEMBER_SEQ 을 PK 넣는다
System.out.println("================");
SMember sMember = new SMember();
em.persist(sMember);
System.out.println("================");

image

  • 트랜잭션 커밋하기전에 MEMBER_SEQ 를 call 하는것을 볼수 있다
  • SEQUENCE 는 모아서 Insert 할수 있다
  • allocationSize = 1 을 이용해서 성능을 최적화 한다

TABLE 전략

  • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀸스를 흉내내는 전략
  • 장점 : 모든데이터베이스 적용
  • 단점 : 성능..
@Entity
@TableGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        table = "MY_SEQUENCES",
        pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class TMember {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
            generator = "MEMBER_SEQ_GENERATOR")
    private Long id;
}
  • @TableGenerator : 테이블전략
  • pkColumnValue : 기본키명

image

  • MY_SEQUENCES 테이블이 새로 생성되었다
  • 운영에서는 쓰기 어려운편

권장하는 식별자 전략

  • 기본키는 null 이 되면 안된다 , 유일 , 불변
  • ex) 주민등록번호는 기본키로 적절하지 않다 (대리키 , 대체키)
  • Long 형 + 대체키 + 키 생성전략 사용하기

참고

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

image

728x90

'Back-End > Spring Data' 카테고리의 다른 글

3.영속성관리 - 내부동작방식  (0) 2021.01.05
2.JPA 시작하기  (0) 2021.01.04
1.JPA 소개  (0) 2021.01.04
9.웹 계층 개발 2(주문)  (0) 2021.01.01
8.변경감지 와 병합  (0) 2021.01.01