Primary Key

곽현민·2026년 1월 2일

Id에 대해서

public class Schedule extends BaseEntity{
    // 일정 고유 식별 번호, 일정 제목, 일정 내용, 작성자명, 비밀번호, 작성일, 수정일
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(length = 30, nullable = false)
    private String title;
    @Column(length = 200, nullable = false)
    private String contents;
    @Column(length = 10, nullable = false)
    private String username;
    @Column(length = 20, nullable = false)
    private String password;
public class Comment extends BaseEntity{
    // 댓글 고유 식별자, 일정 (외래 키), 댓글 내용, 작성자명, 비밀번호, 작성일, 수정일
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne
    @JoinColumn(name = "schedule_id")
    private Schedule schedule;
    @Column(length = 100, nullable = false)
    private String contents;
    @Column(length = 10, nullable = false)
    private String username;
    @Column(length = 20, nullable = false)
    private String password;

2개의 엔티티가 존재한다. 댓글 엔티티는 일정 엔티티의 외래 키를 지닌다.

문제 발생

처음에는 댓글이 외래 키로 일정을 지닌다고 했을 때,
외래 키 = 고유 키. 라고 생각했다.
@IdClass를 이용하기 위해

public class ScheduleId {
	private Long schedule;
}

를 생성했다.

이로 특정 일정에 댓글 생성을 포스트맨으로 확인해본 결과
처음에는 잘 구현된 줄 알았으나, BaseEntity를 활용한 작성일, 수정일의 결과가 두 번째부터 null값으로 구현됨.

문제 원인

한 일정에 여러 댓글이 생성되도록 ManyToOne을 구상하였으나,
외래 키 = 고유 키로 인해 한 일정에 여러 고유 객체 생성 불가한 상황

문제 해결 (위의 코드)

따라서 댓글의 고유 키를 따로 설정, 일정의 고유 키를 속성으로 설정 >> 구상대로 작동 확인

외래 키라는 키워드에서 너무 키에 집착해서 Id로 좁은 생각..
@Id에 대해서 이해가 넓어지는 계기가 됨

더욱 더

더욱 이해를 넓히기 위해 @EmbeddedId, OneToOne, ManyToMany, 식별/비식별 관계에 대해서도 알면 좋을 듯 하다.

0개의 댓글