1. 관계형 DB에서의 1:N

먼저 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)입니다. "이 댓글이 어떤 게시글에 달렸는지"를 나타냅니다.


2. 단방향 vs 양방향

JPA에서 연관관계는 방향이 있습니다. DB의 외래키는 양쪽에서 JOIN할 수 있지만, Java 객체는 참조가 있는 쪽에서만 접근할 수 있습니다.

단방향: Comment → Post

@Entity
public class Comment {
    @ManyToOne
    @JoinColumn(name = "post_id")
    private Post post;    // 댓글에서 게시글을 참조할 수 있음
}

@Entity
public class Post {
    // Comment에 대한 참조 없음
    // 게시글에서 댓글 목록을 가져올 수 없음
}

댓글에서 comment.getPost()로 게시글에 접근할 수 있지만, 게시글에서 댓글 목록을 가져올 수 없습니다.

양방향: Comment ↔ Post

@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() 모두 가능합니다.

어떤 걸 써야 하나

실무에서는 대부분 양방향을 씁니다. 게시글 상세 조회 시 댓글 목록을 같이 보여줘야 하니까요. 우리도 양방향으로 만듭니다.


3. @ManyToOne : N쪽 (댓글)

"댓글 여러 개(Many)가 게시글 하나(One)에 속한다"

@ManyToOne
@JoinColumn(name = "post_id")
private Post post;

@ManyToOne: 이 Entity(Comment)가 Many쪽, 상대방(Post)이 One쪽이라는 뜻입니다.