woowacourse-study / 2022-jpa-study

🔥 우아한테크코스 4기 JPA 스터디 (22.06.13~22.07.02) 🔥
5 stars 1 forks source link

[섹션 4, 섹션 5] 어썸오 제출합니다 #12

Closed awesomeo184 closed 2 years ago

awesomeo184 commented 2 years ago

객체와 테이블, 필드와 칼럼 매핑

김영한님은 객체에 메타 데이터를 모두 작성하는 것을 선호한다고 한다. 자바 코드만 보고도 DB 테이블 제약을 바로 파악할 수 있기 때문

기본 키 생성 전략

IDENTITY

SEQUENCE

TABLE

AUTO


엔티티 매핑

연관관계 설정에서 고려해야할 객체와 테이블의 차이점은, 객체는 참조를 통해 연관관계를 맺고, 테이블은 외래키를 통해 연관관계를 맺는다는 것이다. 객체의 참조와 테이블의 외래키를 매핑하는 것이 이 챕터의 목표.

단방향 연관관계

단방향 일대다 연관관계를 생각해보자. 객체와 테이블의 가장 큰 차이는 테이블은 외래 키 하나로 양방향 연관관계가 가능하지만 객체는 그렇지 않다는 점이다.

테이블은 A JOIN B가 가능하면 B JOIN A도 가능하다. 객체는 양방향으로 설정하려면 필드를 하나 더 추가해줘야한다. 즉 참조는 단방향이고, 조인은 양방향이다.

객체를 양방향으로 참조하려면 단방향 연관관계 2개를 만들어야한다.

@Entity
public class Member {

  @Id
  @Column(name = "MEMBER_ID")
  private String id;

  private String username;

  @ManyToOne
  @JoinColumn(name = "TEAM_ID")
  private Team team;

  public void setTeam(Team team) {
    this.team = team;
  }
  ...
}
@Entity
public class Team {
  @Id
  @Column(name = "TEAM_ID")
  private String id;

  private String name;

  ...
}

연관관계 주인

만약 Team 객체에서 Member 객체를 참조하고 싶다면 팀->멤버 연관관계를 추가해주어야 한다.

@Entity
public class Team {
  @Id
  @Column(name = "TEAM_ID")
  private String id;

  private String name;

  @OneToMany(mappedBy = "team")
  private List<Member> members = new ArrayList<>();
  ...
}

사실 RDB 입장에서는 외래 키 하나로 양방향 참조가 가능하기 때문에 더이상의 정보가 필요 없다. 그러나 객체의 참조는 단방향으로만 가능하기 때문에 양방향 참조를 위해서는 단방향 참조 두 개가 필요하다. 외래 키는 하나인데 참조는 두 개이다. 이 차이 때문에 JPA는 두 객체 연관관계 중 하나를 정해서 테이블의 외래 키를 관리해야하는데 이를 연관관계 주인(Owner)이라고 한다.

연관관계 주인은 주인이 아닌 곳에 mappedBy 속성을 줌으로써 정할 수 있다. 오직 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리(등록, 수정, 삭제)할 수 있다.

mappedBy의 값으로는 주인 쪽에서 참조하는 이름을 넣어주면 된다. 이 경우에는 member가 주인이고 team을 참조하기 때문에 속성으로 "team"을 넣어주었다.

연관관계 주인은 항상 외래 키를 가지고 있는 테이블로 설정한다. ManyToX 관계에서 항상 Many 쪽이 외래 키를 가지므로 @ManyToOne에는 mappedBy 속성이 없다.