Spring

JPA - 1:N 연관 관계

테니드2 2025. 6. 16. 14:57

기본 구조: User (1) ↔ (N) Post

  • User는 여러 Post를 가질 수 있다 (1:N)
  • Post는 하나의 User에만 속한다 (N:1)
  • 관계 주인은 Post (외래키를 가짐)
@Entity
@Data
@NoArgsConstructor
public class User extends AuditableEntity {

    @Id 
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany
    @JoinColumn(name = "user_id", insertable = false, updatable = false) // 읽기 전용
    private List<Post> posts  = new ArrayList<>();; // post.userId = user.id
}
@Entity
@Data
@NoArgsConstructor
public class Post extends AuditableEntity{

    @Id 
    @GeneratedValue
    private Long id;

    private String content;

    @Column(name = "user_id")
    private Long userId; // 연관 객체 대신 외래키 값만 저장
}

단방향 @OneToMany에서 @JoinColumn을 사용하는 이유

문제점: Join Table이 자동 생성됨

JPA에서 @OneToMany 단방향을 사용할 때 @JoinColumn을 명시하지 않으면,

JPA는 중간에 조인 테이블 (예: user_post) 를 생성해서 User와 Post를 연결.

이것은 일반적인 비즈니스 요구와는 맞지 않고, 불필요한 테이블과 성능 비용이 생김.

비교 정리

설정  결과
@OneToMany 단독 사용 JPA가 조인 테이블 생성 (user_post)
@OneToMany + @JoinColumn 조인 테이블 생략, 외래키 user_id가 Post에 직접 생성됨