문제상황
06/06일 TIL로 작성한 2번째 문제가 아직 근본적으로 해결되지 않아서 쓰는 삽질로그.
[TIL] 06/06 항해99 25일차 - 과제 [나만의 블로그 만들기]
결국 stackoverflow 에러는 해결을 했지만 지연로딩으로 설정했을 때 해결이 되었어야하는게 아닌가? 라는 물음에서 시작된 순환참조 해결하는 삽질이다.
+
지연로딩을 설정했음에도 참조하고 있는 객체를 전부 들고다니는 이유를 어느정도 파악한 것 같다.
지연로딩은 참조하고 있는 객체를 실제로 사용할 때 조회하는 방식이라고 하는데 이 부분에 대한 이해가 부족했었다.
관련 삽질로그는 따로 포스팅을 분리해서 맨 아래 DTO부분에 첨부하도록 한다.
사진을 보면 comment entity에 들어있는 post가 다시 comment를 부르고 있다.
이를 해결하기 위해 시도한 것들을 쭉 나열하겠음!
현재 에러 해결까지 해놓은 Entity 코드
Comment.java
@Entity
@Getter
@NoArgsConstructor
public class Comment extends Timestamped{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "POST_ID", nullable = false)
private Post post;
@Column(nullable = false)
private String nickname;
@Column(nullable = false)
private String comment;
@Builder
public Comment(Post post, String nickname, String comment) {
this.post = post;
this.nickname = nickname;
this.comment = comment;
}
public void update(CommentDto commentDto) {
this.nickname = commentDto.getNickname();
this.comment = commentDto.getComment();
}
}
Post.java
@Entity
@Getter
@NoArgsConstructor
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Post extends Timestamped{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String nickname;
@Column(nullable = false)
private String content;
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments;
@Builder
public Post(String title, String nickname, String content) {
this.title = title;
this.nickname = nickname;
this.content = content;
}
public void update(PostDto postDto) {
this.title = postDto.getTitle();
this.nickname = postDto.getNickname();
this.content = postDto.getContent();
}
}
해결과정
첫번째 - Lazy loading으로 설정하기
@ManyToOne(fetch = FetchType.LAZY)
@OneToMany
는 기본적으로 지연로딩이고, @ManyToOne
은 위처럼 따로 설정을 해줘야한다고 하기에 Comment Entity에 추가해줬는데 생각했던 것과는 달리 여전히 같은 문제를 일으켰다.
두번째 - Jackson 라이브러리가 해결하게 하기
순환 참조 에러를 고치면서 알게된 내용인데, 넘어온 Entity 객체가 @ResponseBody
를 만나게되면 Jackson 라이브러리를 통해 직렬화가 된다고 한다. 이 과정에서 Entity에 들어있는 comments 객체 또한 직렬화가 되기 때문에 생기는 문제였다.
따라서 Jackson 라이브러리에서 제공하는 @JsonIgnore
어노테이션을 이용해서 직렬화하지 못하게 막아버리면...
Comment는 이제 Post_id만 들고다니는데, Post는 여전히 Comment를 들고다닌다. 근데 이건 필요한 부분이여서 더이상 처리하지 않기로 했다.
세번째 - 기획을 바꿔버리기
이게 해결방법이라고 말할 수 있는 부분인가 싶긴 한데, 그래도 기록을 위해 적어본다.
맨 위에 올려둔 사진이 CommentList를 조회할 경우에 나타나는 형태인데, comment안에 있는 post가 comment를 조회하는 모습이다.
post가 comment를 조회하는 걸 보면서 드는 생각이, 어차피 게시판인데 comment를 조회하는 api가 존재할 이유가 없지 않나? 였다.
따라서 문제를 일으키는 getComment API를 삭제함으로써 눈에 거슬리는 부분을 회피했다.
네번째 - 문제가 되는 Comment Entity의 Post 컬럼(매핑) 없애기
당연히 해결되지 않았다. 일대다 단방향 매핑의 단점에 대한 글을 읽고나서 양방향 매핑으로 변경해두었는데 해당 컬럼을 삭제하면 문제를 해결하다가 오히려 퇴보하는 상태가 되니...
일단 저 컬럼에 엮여있는 코드가 생각보다 좀 있어서 이 부분은 과제가 끝나고 여유가 되면 시도해보기로 했다
다섯번째 - Entity를 DTO로 파싱해서 넘겨주기
시도는 해봤지만 원하는 기획과는 달라서 이용하지는 않기로 했다!
'Study > Trouble Shooting' 카테고리의 다른 글
[삽질로그] 소스트리 강제 종료 에러 (0) | 2022.06.11 |
---|---|
[삽질로그] JPA 지연로딩 (0) | 2022.06.08 |
[삽질로그] 깃 잔디가 안심어지는 문제 (0) | 2022.05.16 |
[삽질로그] 파이썬 missing 1 required positional argument: 에러 (0) | 2022.05.15 |
[삽질로그] Unsupported class file major version 61 에러 (0) | 2022.04.03 |