멋사 Backend 61일차 🦁

신재원·2023년 7월 18일

🌈 JPA 연관관계

  • 연관관계 설정을 하는 이유 ?

이전 블로그를 보면 정규화를 거쳐 테이블의 데이터 중복을 피하고 전체적인 데이터베이스의 성능을 향상시키는데 도움을 줄수있습니다.

아래의 사진처럼 테이블과 테이블과의 관계는 외래키를 이용해 표현합니다.

  • 왼쪽 테이블의 제조사 id 는 오른쪽 테이블의 PKid를 가지고 있습니다. 즉 왼쪽 테이블의 제조사 id는 외래키라고 할수있습니다.

➡ 일반적으로 테이블과 테이블의 관계는 3종류로 나눌수 있습니다.

One To One (일대일 관계)

이전에 강의를 통해 정리한 블로그 입니다.

  • Membmer 엔티티 클래스와 Locker 엔티티 클래스와 일대일 연관관계를 맺은 코드입니다.
    • 외래키가 있는곳이 연관관계 주인 입니다.
    • 여기 까지만 작성하면 단방향 관계입니다.
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "locker_id")
    private Locker locker;

}

  • 반대편에 mappedBy = "locker" 를 작성하면 Member 엔티티의 locker 필드와 매핑되었다는 뜻이며, 양방향 관계이며 읽기전용입니다.
@Entity
public class Locker {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "locker_id")
    private Long id;

    private String name;
    
    @OneToOne(mappedBy = "locker")
    private Member member;


}

Many To One, One To Many (다대일, 일대다 관계)

  • 다대일 관계에서는 한쪽이 다대일 이면 반대쪽은 항상 일대다 입니다.
  • 외래키는 항상 다 쪽에 있습니다. 그러므로 연관관계 주인은
    항상 다 쪽 입니다.
@Entity
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "teams")
    private Member member;
}
  • 자바 컬렉션중 (List, Map, Set) 하나를 사용하여 참조 해야 합니다.
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "member")
    private List<Team> teams;
}

위 로직 처럼 다대일 방향으로 연관관계를 하는것이 좋습니다.
외래키는 다 쪽에, 외래키가 있는 쪽이 연관관계 주인

  • 일대다 매핑 관계가 권장되지 않는점은 찾아보면 좋을것 같습니다.

Many To Many (다대다 관계)

❗❗ 다대다 관계는 실무에서는 사용하면 안된다고 합니다.
이전 강의를 보며 정리한 블로그 입니다.

다대다 관계에서는 단순히 @ManyToMany 로 매핑 할수 없으며, 중간에
Join 테이블을 두어 연결해야 합니다.

  • 하지만 중간 Join 테이블에 다양한 컬럼이 추가 될수 있는데, 추가된 컬럼을 매핑 할수 없습니다.

❗ TIP

  • X To One 관계에서는 fetch 방식을 무조건적으로 Lazy (지연로딩) 방식으로 바꿔줘야 합니다. (One To One, Many To One 등)

즉시로딩과 지연로딩은 뒤에서 다루겠습니다.

  • 외래키는 주테이블 (많이 접근하는 테이블) 에 설정하는것이 좋습니다.

  • 보통 다대일과 일대다 관계를 실무에서 가장 많이 사용하고 다대다 관계는 실무에서 거의 사용하지 않습니다.

Reference

https://velog.io/@conatuseus/2019-08-30-1808-%EC%9E%91%EC%84%B1%EB%90%A8-s7jzxxz2t0

0개의 댓글