JPA 연관관계 3

coldrice99·3일 전
0

양방향 관계 설정을 통해 게시물과 댓글의 관계를 설정하면, 게시물 엔티티를 조회할 때 해당 게시물에 연결된 댓글들도 함께 조회할 수 있다. 이를 통해 연관된 데이터를 손쉽게 가져올 수 있게 된다.

예시: 게시물과 댓글 관계 설정

게시물과 댓글의 관계는 일대다(One-to-Many)다대일(Many-to-One) 관계로 설정할 수 있다. 여기서는 PostComment 엔티티를 통해 양방향 관계 설정을 예로 설명하겠다.

Post 엔티티 (게시물)

@Entity
@Getter
@Setter
@Table(name = "posts")
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;

    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Comment> comments = new ArrayList<>();

    // 댓글 추가 메서드
    public void addComment(Comment comment) {
        comments.add(comment);
        comment.setPost(this);
    }
}
  • @OneToMany(mappedBy = "post")Post 엔티티가 여러 개의 Comment 엔티티와 연결될 수 있음을 나타낸다.
  • cascade = CascadeType.ALL로 설정하면, 게시물을 저장할 때 댓글도 함께 저장되며, 게시물을 삭제할 때 연결된 댓글도 함께 삭제된다.
  • addComment 메서드를 통해 PostComment 간의 양방향 관계를 설정한다.

Comment 엔티티 (댓글)

@Entity
@Getter
@Setter
@Table(name = "comments")
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String content;

    @ManyToOne
    @JoinColumn(name = "post_id")
    private Post post;
}
  • @ManyToOne 애노테이션을 사용해 Comment 엔티티가 하나의 Post 엔티티와 연결되도록 한다.
  • @JoinColumn(name = "post_id")comments 테이블에 외래 키 post_id를 생성해 Post 테이블과의 관계를 나타낸다.

게시물 조회 시 댓글도 함께 조회하기

양방향 관계가 설정되었으므로, 게시물을 조회할 때 Post 엔티티의 comments 필드가 자동으로 초기화되어 해당 게시물에 연결된 모든 댓글이 함께 조회된다.

예시 코드

Post post = postRepository.findById(1L).get();
System.out.println("게시물 제목: " + post.getTitle());

// 게시물에 연결된 댓글도 함께 조회
for (Comment comment : post.getComments()) {
    System.out.println("댓글 내용: " + comment.getContent());
}

위 코드에서 postRepository.findById(1L).get()으로 게시물 정보를 가져오면, JPA는 Post 엔티티의 comments 필드도 초기화하여 해당 게시물에 달린 댓글들을 함께 조회한다. 즉, 게시물을 조회할 때 연관된 댓글도 데이터베이스에서 가져와 함께 사용할 수 있게 되는 것이다.

양방향 관계의 장점

양방향 관계를 사용하면:

  • 게시물(Post)을 조회할 때 댓글(Comment)을 쉽게 함께 가져올 수 있다.
  • 댓글을 추가하거나 삭제할 때도 Post 객체와 연관된 comments 리스트를 통해 쉽게 조작할 수 있다.

주의할 점: @OneToMany@ManyToOne의 연관 관계

양방향 관계 설정 시 양쪽 엔티티에서 데이터를 관리할 수 있지만, 실수로 서로 다른 엔티티에서 데이터를 다르게 설정하는 문제가 발생할 수 있다. 따라서 연관된 객체를 추가하거나 삭제할 때, 양방향 관계를 일관되게 관리하는 것이 중요하다.

정리하면, @OneToMany@ManyToOne을 활용한 양방향 관계 설정을 통해, 게시물 엔티티만 조회하더라도 JPA가 댓글 엔티티도 함께 가져올 수 있도록 할 수 있다. 이는 연관된 데이터들을 한 번에 조회할 수 있어 편리한 데이터 처리와 관리가 가능하게 한다.

profile
서두르지 않으나 쉬지 않고

0개의 댓글