오늘은 어제 학습한 @ManyToOne과 @OneToMany를 활용해서 Entity들을 설계한 대로 객체를 매핑을 하는 작업을 했다.
기존의 모델들을 변경하고 새로만들고 하다 보니까 작성했던 테스트 코드나 프론트엔드에서 값을 전달해주는 방식, 테스트 코드 등 모든 게 바뀌어야 했다. 그래서 오늘 리팩터링 하는데만 스토리 포인트 5를 사용해버렸다..
모델 설계를 초반에 하고 했어야 했는데 생각없이 첫 주차에 게시글 보기와 작성하는 기능을 만든다고 임시방편으로 만들었던 모델이 오늘 모델들을 다시 설계한 대로 바꾸면서 발생한 문제들을 해결하는 것과 변경해야 하는 코드들이 너무 많아 고통으로 돌아왔다.
작업설계의 중요성..
@JsonManagedReference @JsonBackReferenc
@ManyToOne과 @OneToMany어노테이션으로 양방향으로 연관관계를 설정 했더니 Infinite recursion 문제가 발생했다. 서로가 서로를 참조를 하면서 무한으로 참조하면서 발생한 문제였다.
무한 참조 문제를 @JsonManagedReference @JsonBackReference 두 어노테이션을 추가해줌으로써 해결해줄 수 있었다.
@JsonManagedReference -> 참조의 정방향 부분을 관리하고 이 어노테이션을 추가한 필드는 직렬화되는 필드이다.
@JsonBackReference -> 참조의 역방향 부분을 관리하고 이 어노테이션을 추가한 필드는 직렬화되지 않는다
직렬화란
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 것을 의미한다.
Infinite recursion이 발생한 문제의 코드인데 @OneToMany, @ManyToOne으로 서로 양방향 관계를 맺고 있기 때문이다.
서로 참조하는 과정을 살펴보면 아래와 같다.
Post의 필드중 User 객체를 직렬화 한다 --> User 객체의 필드 중에는 List <Post>가 존재한다. --> 다시 Post를 직렬화 한다. 그러면 또 Post에 User가 존재해 직렬화 하는 무한 루프에 빠지게 된다.
이 user와 post의 양방향 관계에서 User에 @JsonBackReference어노테이션을 추가해줌으로써 직렬화에서 user객체를 제외시켰다.
Post객체를 직렬화 할때 user를 직렬화에서 제외시켰기 때문에 무한 참조 문제에서 벗어날 수 있었다.
'성장이야기 > TIL' 카테고리의 다른 글
221103 TIL [Spring boot + React]실시간 채팅 기능 구현하기 - 1 (0) | 2022.11.03 |
---|---|
221102 TIL JPA n + 1문제란 (0) | 2022.11.02 |
221031 TIL @OneToMany, @ManyToOne (feat. mappedby) (0) | 2022.10.31 |
221030 TIL Spring Boot AWS S3 연동해서 파일 업로드 하기 (S3 Bucket 생성부터 연동까지) (0) | 2022.10.30 |
221029 TIL 게시판 조회수 기능 구현하기 (0) | 2022.10.29 |