JPA

[ JPA ] 사이드 프로젝트 중 만난 문제 (연관관계)

인생은단짠단짠 2023. 2. 3. 17:29

 

연관관계 개념은 공부를 한 상태지만 실전에서 사용하려고 하니 여전히 어려운 것 같다ㅠㅠ

댓글 구현을 끝내고 남은 api 파트를 맡게 되어 구현하는 도중 만나게 된 문제이다. 기본적인 것처럼 보이지만 jpa를 공부하고 있는 중이다보니 이런 기본적인 문제도 해결하고, 원인을 찾는것에 시간을 소비하게 되는 것 같다.

 

 

상황 설명

Post와 Image 테이블은 양방향 연관관계를 맺고 있다. 이해를 위해 Post, Image 테이블에서 간단하게 필요한 컬럼들만 남겨보았다.

 

Post

public abstract class Post extends TimeAuditingEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "post_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    @NotNull
    private User user; //작성자

    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL)
    @BatchSize(size = 100)
    protected List<PostImage> images = new ArrayList<>();

    @NotNull
    protected String contents; //내용
    
}

 

Image

public class PostImage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "file_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    private Post post; 

    @Column(length = 1000)
    private String imagePath;

}

 

이 상태에서 FeedRequest를 받아 FeedRepository.save 메서드 하나로 image테이블에 까지 데이터들을 넣고 싶었다.

 

public class PostRequest {

    private List<String> images;

    private Long socialId;

    private String content;

    public Post toEntity(User user) {
        Post post = Feed.builder()
                .user(user)
                .contents(content)
                .build();

        post.setPostImages(images.stream().map(Image::new).collect(Collectors.toList()));
        return post;
    }
}

[Post 엔티티에 있는 메서드]

 public void setPostImages(List<PostImage> postImages){
        this.images = postImages;
 }

 

 

그러나 Image 테이블에 imagePath는 제대로 들어가지만 postId가 제대로 들어가지 않았다.

feedRepository.save(feedRequest.toEntity(user));

트랜잭션 어노테이션을 빠트린것도 아니고, setPostImages에서 연관관계를 설정하고 있는데 왜 들어가지 않는 건지 알 수 없었다.

 

 

해결

 

고민하다보니 지금 post와 image가 서로 단방향 매핑 2개로 이루어진 양방향 매핑이 되어있다는 사실을 발견했다.

이 파트는 다른사람이 짜던 코드를 이어받은거라 내가 엔티티를 설계하지 않았고 그래서 간과하고 있던 것이었다.... ㅎㅎ

 

그래서 setPostImages를 양방향 연관관계를 모두 세팅할 수 있도록 바꿔주었다.

public void setPostImages(List<PostImage> postImages){
    this.images = postImages;
    postImages.forEach(postImage -> postImage.setPost(this));
}

 

그제서야 post를 저장할때 image테이블까지 잘 저장되는 것을 확인할 수 있었다.

 

 

 

느낀점

양방향 매핑이 되어있을 때 set메서드를 통해 연관관계를 설정할 수 있는데, 이때 양방향 모두를 신경써줘야 한다. 그리고 데이터를 집어넣고, 사용할때 꼭 엔티티들의 관계를 먼저 확실하게 파악하고 코드를 짜야된다는 사실을 알게 되었다.

 

'JPA' 카테고리의 다른 글

[ JPA ] 프로젝트 도중 만난 에러 ( feat. 트랜잭션 )  (0) 2023.01.12
[ Jpa ] 연관관계  (0) 2023.01.06
[ Jpa ] 영속성 컨텍스트  (0) 2022.12.08