내 맴
[JPA] @OneToMany와 @ManyToOne의 차이 본문
728x90
✅ 정리
@OneToMany: 하나의 엔티티가 여러 개를 참조함
@ManyToOne: 여러 개의 엔티티가 하나를 참조하며 연관관계 주인으로 동작
✅ 상세 정리
1. 관계 방향성과 주인 개념
- JPA에서 양방향 관계 설정 시 외래 키를 관리하는 연관관계 주인이 필요
- @ManyToOne은 외래 키 컬럼을 가지므로 연관관계의 주인 역할 수행
- @OneToMany는 외래 키를 가지지 않고, mappedBy를 통해 상대방 필드 지정
// 연관관계 주인: Member
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@ManyToOne
@JoinColumn(name = "team_id") // 외래 키
private Team team;
}
// 연관관계 비주인: Team
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "team") // 연관관계 주인 필드명
private List<Member> members = new ArrayList<>();
}
→ Member.team이 실제 외래 키를 가지는 필드로, 데이터베이스에 반영되는 쿼리는 이 필드 기준으로 생성
2. fetch 전략 차이
- @ManyToOne: 기본값 EAGER → 즉시 로딩
- @OneToMany: 기본값 LAZY → 실제 접근 시 조회
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;
→ 대량 연관 조회 시 N+1 문제 발생 가능 → fetch join 또는 @BatchSize로 해결 필요
3. 주의
- @OneToMany는 단방향보다 양방향으로 사용하는 것이 일반적
- 단방향 @OneToMany는 insert, update 쿼리 두 번 발생 가능 → 성능 및 유지보수 고려 필요
- 연관관계 설정 시 객체 간 관계도 양쪽 모두 설정해야 일관성 유지 가능
team.getMembers().add(member);
member.setTeam(team);
→ 객체 관계와 DB 상태를 일치시키기 위해 양쪽 모두 설정 필수
728x90
'개발 공부 > Database & JPA' 카테고리의 다른 글
[JPA] N+1 문제 발생 원인과 해결 (0) | 2025.04.10 |
---|