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