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에 직접 생성됨 |