본문 바로가기
백엔드 공부

[Spring] 연관관계 편의 메서드

by CSEGR 2025. 5. 9.
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