728x90
📌 연관관계 편의 메서드는 왜 써야하는가?
양방향 연관관계의 일관성 유지
- JPA에서는 @OneToOne, @OneToMany, @ManyToOne 등 양방향 연관관계는 객체 기준으로 서로 다른 두 필드를 가지는 구조임.
- 이때 양쪽 객체의 연관관계를 동시에 갱신해주지 않으면, 두 객체의 상태가 서로 불일치할 수 있음.
예를 들어, OneToMany 관계를 가지는 Post와 Image가 있다고 가정하자.
-------------Post class----------------
@Entity
public class Post {
@Id @GeneratedValue
private Long id;
private String title;
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Image> images = new ArrayList<>();
}
-------------Image class----------------
@Entity
public class Image {
@Id @GeneratedValue
private Long id;
private String url;
@ManyToOne
@JoinColumn(name = "post_id")
private Post post;
}
❌ 문제 상황 : 주인 필드 설정 없이 저장한 경우
Post post = new Post();
post.setTitle("Sample Post");
Image image = new Image();
image.setUrl("image.jpg");
// 연관관계의 주인이 아닌 쪽만 설정
post.getImages().add(image);
주인인 Image 엔티티의 post 필드가 설정되지 않았기 때문에, 데이터베이스에 저장될 때 post_id FK가 null로 저장되어 연관관계가 제대로 맺어지지 않는다. 이 경우, JPA는 image.post가 null이므로 post_id를 세팅하지 않고 insert 실행하게된다.
✔️ 연관관계 편의 메서드 작성
JPA 양방향 연관관계에서 두 엔티티의 연관 필드를 함께 설정해주는 메서드를 작성한다.
image.setPost(post);
post.getImages().add(image);
연관관계를 양쪽에서 설정하는 과정을 하나의 메서드로 묶어 오류를 방지하는 것이다!
@Entity
public class Post {
//생략
// 연관관계 편의 메서드
public void addImage(Image image) {
images.add(image);
image.setPost(this);
}
}
메서드 명은 setter 대신 다른 메서드 명을 사용하는 것이 좋다.
728x90
'백엔드 공부' 카테고리의 다른 글
[Spring] JPA에서 OneToOne 관계 N+1 문제 (Feat : Lazy Loading) (0) | 2025.05.16 |
---|---|
[Java Spring] Exception 발생 시 로그 및 HTTP 응답 에러 메시지 안뜨는 문제 해결 (1) | 2025.01.22 |
[Java Spring] Mockito & Junit + 코드 예시 (0) | 2025.01.20 |
[Java Spring 설계] MSA + Spring Cloud Eureka 개념 (0) | 2025.01.17 |