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를 통한 간접 참조(느슨한 결합)도 고려해보는 게 것 같다.

 

레퍼런스) https://www.inflearn.com/community/questions/747142/jpa-%EC%96%91%EB%B0%A9%ED%96%A5-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EA%B4%80%EB%A0%A8%ED%95%98%EC%97%AC-%EC%A7%88%EB%AC%B8-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4?srsltid=AfmBOoqgjGZniwAobfXfA9OAYiX--Q2b0DPy23H3D6r9BzvElIy5-qui

 

JPA 양방향 연관관계 관련하여 질문 드립니다. - 인프런 | 커뮤니티 질문&답변

누구나 함께하는 인프런 커뮤니티. 모르면 묻고, 해답을 찾아보세요.

www.inflearn.com