엔티티 매핑

유동우·2023년 7월 27일
0
post-thumbnail

객체와 테이블 매핑

엔티티 매핑

  • 객체와 테이블 매핑 : @Entity, @Table
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이고, 이 클래스는 JPA가 관리한다
기본 생성자는 필수
final 클래스, enum, interface, inner 클래스 사용 X
저장할 필드에 final 사용 X

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

객체를 매핑해놓으면 애플리케이션 실행 시점에 DDL을 자동으로 생성해준다.
(데이터베이스 방언도 포함)

생성된 DDL은 불안할수도 있기 때문에 개발 장비에서만 사용하고,
가다듬은 후에 운영서버에서 사용한다.

hibernate.hbm2ddl.auto

주의
운영 장비에는 절대 create, create-drop, update를 사용하면 안된다.

개발 초기 단계 : create OR update
테스트 서버 : update OR validate
스테이징과 운영서버 : validate OR none

필드와 컬럼 매핑

@Entity
@Table(name = "MBR") //테이블명 변경은 런타임에 영향을 준다
public class Member {
	
    @Id
    private Long id;
    
    @Colume(unique = true, lenghth = 10) //런타임에는 영향을 주지 않고, DDL 생성에 영향을 준다
    private String name;
    
    public Member(){
    }
    ....

매핑 어노테이션 정리

기본 키 매핑

@Id -> 직접 할당
@GeneratedValue -> "난 모르겠고 DB 너가 알아서 해라" = 자동생성-

  • IDENTITY: 데이터베이스에 위임, MYSQL
  • SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE
    • @SequenceGenerator 필요
  • TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용
    • @TableGenerator 필요
  • AUTO: 방언에 따라 자동 지정, 기본값

권장하는 식별자 전략

  • 기본 키 제약 조건 : null이 아니다, 값이 변하면 안된다
  • 추후에도 꾸준히 만족하는 자연키는 찾기 어려우므로 대리키(대체키)를 사용하자
  • ex) 주민등록번도 기본키로 적절하지 않다
  • 권장 : Long 형 + 대체키 + 키 생성전략 사용

Identity 전략의 특징

  • 기본키 생성을 DB에 위임한다
  • JPA는 보통 commit 시점에 INSERT SQL을 실행하지만, em.persist() 시점에 실행

Sequence 전략의 특징

  • 버퍼링으로 모았다가 한 번에 write 하는게 가능하다
    (Identity는 Insert 쿼리를 넣어야 알 수 있기 때문에 불가능하다)
  • 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트
em.persist(member)
// 어? sequence 전략이네 -> DB에서 값 얻어오자 -> member의 id값을 넣어줌
// -> 이후 영속성 컨텍스트에 저장
// DB에 있었던 쿼리는 날라가지 않는다 (PK값만 얻었기 때문)
// tx 커밋 시점에 insert 쿼리 실행 
@SequenceGenerator(
        name = "MEMBER_SEQ_GENERATOR",
        sequenceName = "MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
        initialValue = 1, allocationSize = 50)
// allocationSize에 도달하게 되면, 저장공간을 미리 더 늘린다
// 1 -> 51 -> (도달) -> 101 ...

**

실전 예제 1 - 요구사항 분석과 기본 매핑

스프링부트로 hibernate jpa를 걸어서 올리면 camel 표기법을 _ 표기 (DB 통상 방식)으로 바꾸는게 기본 설정이다.
(스프링부트처럼 언더바로 바꿔주는 형식을 선호)

관계형 데이터베이스 맞춤형 설계

  • 테이블의 외래키를 객체에 그대로 가져온다
  • 객체 그래프 탐색이 불가능하다
  • 참조가 없으므로 UML도 잘못되었다.
public class Order {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ORDER_ID")
    private Long id;
    
    @Column(name = "MEMBER_ID")
    private Long memberId;
 	...

위 코드처럼 Order 객체에 외래키인 memberId가 그대로 표기되었다.
-> 추후에 member를 사용할 때 4번처럼 member를 바로 가져와서 사용하는 것이 이상적

하지만 지금은 2+3 번처럼 엮어서 사용해야함

Order order = em.find(Order.class, 1L); //1
Long memberId = order.getMemberId(); //2

Member member = em.find(Member.class, memberId); //3

Long findMember = order.getMember(); //4

따라서 Order 클래스에

private Member member; 

이것을 처리하는 것이 앞으로 배울 연관관계 매핑 이다.

Reference
김영한 님 - 자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
효율적이고 꾸준하게

1개의 댓글

comment-user-thumbnail
2023년 7월 27일

많은 도움이 되었습니다, 감사합니다.

답글 달기