Coding/Server
[내일배움캠프] 양방향 연관관계
kangplay
2025. 4. 20. 18:02
양방향 연관관계는 무한루프, 연관관계 주인 혼동 등 신경써야할 부분이 많아서 꼭 필요한 경우가 아니면 사용하지 않는 것이 좋다.
현재 코드는 다음과 같아 양방향으로 구현되어있다. (Todo<->Comment, Todo<->Managers)
@Getter
@Entity
@NoArgsConstructor
@Table(name = "todos")
public class Todo extends Timestamped {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
@OneToMany(mappedBy = "todo", cascade = CascadeType.REMOVE)
private List<Comment> comments = new ArrayList<>();
@OneToMany(mappedBy = "todo", cascade = CascadeType.PERSIST)
private List<Manager> managers = new ArrayList<>();
...
}
@Getter
@Entity
@NoArgsConstructor
@Table(name = "comments")
public class Comment extends Timestamped {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "todo_id", nullable = false)
private Todo todo;
...
}
@Getter
@Entity
@NoArgsConstructor
@Table(name = "managers")
public class Manager {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false) // 일정 만든 사람 id
private User user;
@ManyToOne(fetch = FetchType.LAZY) // 일정 id
@JoinColumn(name = "todo_id", nullable = false)
private Todo todo;
...
}
현재 서비스 코드에서는 다음과 같이 Comment 정보를 필요로하지 않기 때문에 양방향 관계는 필요없다. 근데 만약, todo.getComments()와 같이 댓글의 데이터가 필요하게 된다면 어떻게 할까?
해결 . CommentRepository에서 직접 조회
Todo → Comment 를 직접 매핑하지 않고, CommentRepository에서 Todo ID로 조회할 수 있다. 이를 통해 양방향 연관관계로 인한 순환 참조는 물론, Lazy Loading에 대한 고민이 없어진다.
List<Comment> comments = commentRepository.findAllByTodoId(todoId);
추가 고민. Todo와 Manager, 혹은 Todo와 Comment 관계에서 JPA 연관관계 매핑을 통해 직접 참조(강한 결합)를 연결하면, 다른 도메인에서 해당 객체에 접근이 가능해지면서 변경할 수 있게 된다.
따라서, 직접 참조가 아닌 jpa 매핑이 아닌 id를 통한 간접 참조(느슨한 결합)도 고려해보는 게 것 같다.
JPA 양방향 연관관계 관련하여 질문 드립니다. - 인프런 | 커뮤니티 질문&답변
누구나 함께하는 인프런 커뮤니티. 모르면 묻고, 해답을 찾아보세요.
www.inflearn.com