Spring Boot에서의 JPA를 활용한 연관관계 매핑은 프로젝트에서 중요한 부분 중 하나입니다. 이번 포스팅에서는 일대다 연관관계 매핑과 구현에 대해 알아보겠습니다.
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가 일대다 연관관계의 주인이 됩니다.