
연관관계 개념은 공부를 한 상태지만 실전에서 사용하려고 하니 여전히 어려운 것 같다ㅠㅠ
댓글 구현을 끝내고 남은 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 |