[Spring Boot] JPA로 1:N(일대다) 연관관계 매핑

2jjong·2023년 11월 27일

Spring Boot에서의 JPA를 활용한 연관관계 매핑은 프로젝트에서 중요한 부분 중 하나입니다. 이번 포스팅에서는 일대다 연관관계 매핑과 구현에 대해 알아보겠습니다.

1:N(일대다) 연관관계

1:N (일대다) 연관관계는 한 엔티티가 다른 엔티티와 여러 개의 관계를 가지는 형태입니다.
예시로 한 교수가 여러 명의 학생을 지도하는 경우가 일대다 연관관계가 될 수 있습니다.

방향

데이터베이스에서 연관관계를 매핑할 때는 방향성이 없이 모두 양방향이라 신경쓰지 않아도 되었습니다. 하지만 Spring Boot에서 객체 간의 연관관계에는 단방향, 양방향이 있어, 매핑할 때 신경써주어야 합니다.

  • 단방향: 객체 간 연간관계를 맺을 때 한쪽에서만 참조가 가능하다.
  • 양방향: 객체 간 연관관계를 맺을 때 양쪽에서 참조가 가능하다.

단방향

먼저 단방향 일대다 관계 부터 알아보겠습니다.
앞의 예시로 들었던 한 교수가 여러 명의 학생을 지도하는 경우입니다.

Professor Entity

@Entity
public class Professor {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany
    @JoinColumn
    private List<Student> students = new ArrayList<>();

    // Getter, Setter, 등 생략
}

Student Entity

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Getter, Setter, 등 생략
}

Professor 클래스에서 @OneToMany 어노테이션을 통해 단방향 연관관계를 맺은 것을 볼 수 있습니다. 단방향 연관관계는 원하는 쪽에서 @OneToMany 혹은 @ManyToOne으로 간단하게 설정할 수 있습니다. 단방향의 경우 한쪽에서만 참조가 가능하므로 Professor만이 Student를 참조할 수 있습니다.

양방향

다음으로 양방향 일대다 관계를 알아보겠습니다.
마찬가지로 한 교수가 여러 명의 학생을 지도하는 경우입니다.

Professor Entity

@Entity
public class Professor {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "professor")
    private List<Student> students = new ArrayList<>();

    // Getter, Setter, 등 생략
}

Student Entity

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn
    private Professor professor;

    // Getter, Setter, 등 생략
}

Professor 클래스에서 @OneToMany 어노테이션을, Student 클래스에서 @ManyToOne을 통해 양방향 연관관계를 맺은 것을 볼 수 있습니다. 양방향 연관관계는 양쪽에서 모두 참조가 가능하기 때문에 연관관계의 주인을 지정해주어야 합니다. 연관관계의 주인만이 외래키를 관리하며 주인이 아닌 쪽은 읽기만 가능하게 됩니다.

연관관계의 주인은 mappedBy 속성으로 구분할 수 있는데 mappedBy 속성을 사용하지 않은 곳이 주인이 됩니다. 따라서 해당 코드에서는 Student가 일대다 연관관계의 주인이 됩니다.

profile
student

0개의 댓글