본문 바로가기
JAVA/JPA

인프런 JPA 6화 다양한 연관관계 매핑 "김영한 강사" -PlusUltraCode-

by PlusUltraCode 2024. 7. 20.

연관관계 매핑 기초: 일대일(1:1) 관계 및 다대다(N) 관계

1. 일대일(1:1) 관계

외래키 어디에 넣을까?

  • 일대일 관계에서 외래키는 어느 엔티티에나 넣어도 됩니다.
  • 하지만 일반적으로 조회 빈도가 더 높은 쪽에 외래키를 넣는 것이 성능상 유리합니다.

단방향 일대일 관계

예를 들어, Member와 Locker가 있을 경우 Member에 locker_id를 넣어서 일대일 관계를 표현할 수 있습니다.

@Entity
public class Member {
    
    @OneToOne
    @JoinColumn(name = "locker_id")
    private Locker locker;

    // Getter, Setter
}

양방향 일대일 관계

양방향 관계를 만들고 싶다면 Locker에도 Member를 추가하면 됩니다.

@Entity
public class Locker {
    
    @OneToOne(mappedBy = "locker")
    private Member member;

    // Getter, Setter
}

데이터베이스 설계

일대일 관계에서 데이터베이스 설계 시 외래키에 UNIQUE 제약 조건을 추가해야 합니다.

ALTER TABLE Member
ADD CONSTRAINT UK_Locker UNIQUE (locker_id);

2. 다대다(N) 관계

다대다 관계는 쓰지 말라

  • 다대다 관계는 실무에서 사용하지 않는 것이 좋습니다.
  • 다대다 관계를 사용하면 복잡성과 성능 문제를 유발할 수 있습니다.
  • 대신, 다대다 관계를 1대N과 N대1로 분해하여 새로운 엔티티를 생성하면 해결할 수 있습니다.

다대다 관계 분해 예시

예를 들어, Student와 Course가 다대다 관계를 맺고 있다면, 중간 테이블 Enrollment를 생성하여 관계를 분해할 수 있습니다.

@Entity
public class Student {
    
    @OneToMany(mappedBy = "student")
    private List<Enrollment> enrollments = new ArrayList<>();

    // Getter, Setter
}

@Entity
public class Course {
    
    @OneToMany(mappedBy = "course")
    private List<Enrollment> enrollments = new ArrayList<>();

    // Getter, Setter
}

@Entity
public class Enrollment {
    
    @ManyToOne
    @JoinColumn(name = "student_id")
    private Student student;

    @ManyToOne
    @JoinColumn(name = "course_id")
    private Course course;

    // Getter, Setter
}

결론

  • 일대일 관계: 외래키는 어느 엔티티에나 넣을 수 있으며, 조회 빈도가 높은 쪽에 넣는 것이 좋습니다. 양방향 관계를 설정할 때는 mappedBy 속성을 사용합니다.
  • 다대다 관계: 다대다 관계는 사용하지 않고, 중간 테이블을 생성하여 1대N과 N대1로 분해하는 것이 좋습니다.