JPA

웰시고기·2021년 2월 15일
0

  • 사람이 단어로 다른 사람에게 생각을 전달하듯 Object를 Database table에 전달하기 위해서는 Entity를 사용한다. 이 과정에서 JPA가 해석하는데 도움을 준다.
  • Java Persistence API(JPA)는 어떻게 관계형 데이터를 관리할지를 설명한 명세서이다.
  • Hibernate는 JPA 명세서를 구현한 구현체이다.

Entity

  • 데이터베이스의 테이블을 표현한 클래스이다.
  • @Entity annotation을 추가해야한다.
  • 반드시 public 혹은 protected의 인자가 없는 생성자가 있어야한다. 단 아무 생성자도 없을 경우 자동으로 생성해 준다.
  • 어떤 java 타입이 데이터베이스의 타입으로 변환되는지는 다음 링크에 정의되어 있다. 예를 들어 boolean은 CHAR, INTEGER, BOOLEAN으로 변환될 수 있다.
    https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#basic

Composite Identifier

  • Composite Identifier는 단순히 하나의 int인 id가 아닌 여러 attribute의 집합체이다. 예시는 다음과 같다.
@Embeddable
public class PersonPK implements Serializable {
   private int heightCm;
   private String sockColor;

   @Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;
       PersonPK personPK = (PersonPK) o;
       return heightCm == personPK.heightCm &&
               sockColor.equals(personPK.sockColor);
   }

   @Override
   public int hashCode() {
       return Objects.hash(heightCm, sockColor);
   }

  /*  getters and setters */
}
  • @Embeddable annotation을 추가하고 equals와 hashCode 메소드를 override 해야한다.
  • Composite Identifier를 쓰는 Entity에서는 @EmbeddedID annotation을 사용한다.
  • @Embeddable 대신 @IdClass를 사용하는 방법도 있다.

Relationship

  • DB에서 테이블의 관계는 모두 양방향이다. 하지만 Entity는 단방향으로 할지 양방향으로 할지 결정해야한다.
  • 관계에 따라 @OneToOne, @OneToMany, @ManyToOne, @ManyToMany가 존재한다.
  • 양방향일 경우 외래키를 수정할 수 있는 주인과 아닌 쪽을 구별해야한다.
  • 자세한 내용은 https://siyoon210.tistory.com/27 에 잘 설명되어 있다.

Inheritance

  • 객체지향인 Java에서 관계형 DB에서 지원하지 않는 상속을 ORM이 지원해준다.
  • Single table, Joined table, Table Per Class, Mapped Suplerclass 방식이 있으며 각각 장단점이 존재한다.
  • 자세한 내용은 https://dingue.tistory.com/27 참조

Data Conversion

  • Data Layer에서 데이터를 가져오고 Front-End에 데이터를 전달하는 방식이 두가지 있다.
  • Data Transfer Object(DTO)
    - Front-End와 Controller의 상호작용을 단순하고 쉽게 한다.
    • 데이터베이스 구조를 숨길 수 있다.
    • 교환되는 데이터 양을 제한한다.
    • Front-End가 원하는 형식의 데이터를 만들 수 있다.
  • JSONView
    - Entity의 어떤 부분을 전달할지 빠르게 정의할 수 있다.
    - DTO보다 간단하다.
    - 많은 Entity에 사용해야할 땐 불편한다.

0개의 댓글