먼저 SQL 관점에서 보겠습니다. 게시글(post)과 댓글(comment)의 관계입니다:
CREATE TABLE post (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
author VARCHAR(100) NOT NULL
);
CREATE TABLE comment (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
content VARCHAR(500) NOT NULL,
author VARCHAR(100) NOT NULL,
post_id BIGINT NOT NULL, -- 외래키 (FK)
FOREIGN KEY (post_id) REFERENCES post(id) -- post 테이블의 id를 참조
);
comment 테이블에 post_id 컬럼이 있습니다. 이게 외래키(Foreign Key)입니다. "이 댓글이 어떤 게시글에 달렸는지"를 나타냅니다.
JPA에서 연관관계는 방향이 있습니다. DB의 외래키는 양쪽에서 JOIN할 수 있지만, Java 객체는 참조가 있는 쪽에서만 접근할 수 있습니다.
@Entity
public class Comment {
@ManyToOne
@JoinColumn(name = "post_id")
private Post post; // 댓글에서 게시글을 참조할 수 있음
}
@Entity
public class Post {
// Comment에 대한 참조 없음
// 게시글에서 댓글 목록을 가져올 수 없음
}
댓글에서 comment.getPost()로 게시글에 접근할 수 있지만, 게시글에서 댓글 목록을 가져올 수 없습니다.
@Entity
public class Comment {
@ManyToOne
@JoinColumn(name = "post_id")
private Post post; // 댓글 → 게시글
}
@Entity
public class Post {
@OneToMany(mappedBy = "post")
private List<Comment> comments; // 게시글 → 댓글 목록
}
양쪽에서 서로 접근할 수 있습니다. comment.getPost(), post.getComments() 모두 가능합니다.
실무에서는 대부분 양방향을 씁니다. 게시글 상세 조회 시 댓글 목록을 같이 보여줘야 하니까요. 우리도 양방향으로 만듭니다.
"댓글 여러 개(Many)가 게시글 하나(One)에 속한다"
@ManyToOne
@JoinColumn(name = "post_id")
private Post post;
@ManyToOne: 이 Entity(Comment)가 Many쪽, 상대방(Post)이 One쪽이라는 뜻입니다.