JPA 엔티티 설계시 노하우

MinSeong Kang·2022년 8월 13일
0

spring

목록 보기
14/18

JPA의 @Entity 및 다양한 어노테이션을 통해 데이터 베이스 테이블 및 각 속성들의 설정을 자바 코드르 생성할 수 있다. 겉으로 보기에는 테이블을 직접 만들지 않아도 되고, DDL SQL을 사용하지 않아도 되는 편의성이 있지만 그만큼 고민해야할 점과 알아야 할게 많다. 따라서 김영한님의 JPA 강의를 들으면서 엔티티를 설계 노하우나 주의해야할 점을 정리하려고 한다.

영속성 컨텍스트 이해하기

JPA에서 중요한 개념인 영속성 컨텍스트를 이해하는 것이 중요하다. 이 전에 영속성 컨텍스트에 대해서 정리한 내용을 참고하면 좋을 것 같다.

@Entity

  • JPA에서 테이블과 매핑할 클래스에 @Entity는 필수!
  • 기본 생성자 필수 (하지만 기본 생성자가 없을 경우도 코드가 잘 돌아가는 경우가 있다. 이는 하이버네이트 같은 구현체들은 좀 더 유연하게 바이트코드를 조작하는 라이브러리 등을 통해서 이러한 문제를 회피한다. 하지만 완벽하지 않기 때문에 꼭 넣어주는 것이 중요하다.)
  • final 클래스, enum, interface, inner 클래스, final 필드 사용 금지!

hibernate.hbm2ddl.auto

데이터 베이스 스키마 자동 생성 속성으로는 create, create-drop, update, validate, none가 있다.

  • 운영 장비에서는 절대 create, create-drop, update를 사용하지 않는다!
  • 개발 초기 단계 : create, update
  • 테스트 서버 : update, validate
  • 스테이징, 운영 서버 : validate, none

@Enumerated

자바 enum 타입을 테이블 필드와 매핑할 때 사용한다. 속성으로는

  • EnumType.ORDINAL : enum 순서를 저장
  • EnumType.STRING : enum 이름을 저장

이때 꼭 EnumType.STRING만을 사용한다!!

연관관계의 주인

두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야하는 데, 이를 연관관계 주인이라고 한다.

  • 연관관계 주인만이 데이터베이스 연관관계와 매핑된다.
  • 연관관계 주인만이 외래키를 관리하여 등록, 수정, 삭제할 수 있다.
  • 주인이 아닌 쪽은 읽기만 가능하다.

연관관계 주인

  • 실제 테이블에서 외래키를 가지고 있는 테이블이 된다.
  • 다(N)가 외래키를 가진다.
  • 외래 키의 주인이지, 비즈니스 로직을 기준으로 연관관계 주인을 선택해서는 안된다.
  • @ManyToOne, @JoinColumn 사용

주인 아닌 객체

  • @OneToMany(mappedBy ="") 사용

순수 객체 상태를 고려해서 항상 양쪽에 값을 설정.!!

  • 연관관계 편의 메소드를 생성 : 양쪽에 값을 설정하는 메서드를 하나를 빼먹을 수 있기 때문에 한 클래스 내에 메서드를 정의하여 실수를 방지 하자!
// 예시
public void addOrderItem(OrderItem orderItem) {
	orderItems.add(orderItem);
	orderItem.setOrder(this);
}

설계

  • 처음 엔티티 설계시, 단방향 매핑만으로도 연관관계를 매핑할 수 있기 때문에, 단방향 매핑만 고려하자
  • 양방향 매핑은 역 방향으로 조회하는 기능을 추가하는 것 뿐이다. 따라서 역방향으로 탐색할 일이 많을 경우 양방향 매핑을 하자!
  • 양방향 매핑은 실제 테이블에 영향을 주지 않는다.

참고문헌

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
https://ultrakain.gitbooks.io/jpa/content/chapter5/chapter5.5.html

0개의 댓글