TIL :221230

JINSEON YE·2022년 12월 30일

TIL

목록 보기
45/88

깃 활용법

어노테이션 정리

Notion API 명세 작성

API 예제 문서 양식

Postman API 명세 작성

Intellij에서 ClassDiagram(UML) 보기

유저 매핑 + 회원탈퇴 : 김승민 튜터님이 설명해주신 숙련 강의? n+1 디비 : 무한루프 유저에 맵 적용

순환참조 어노테이션 레인지 user 를 userdto로 바꿔서

https://dev-coco.tistory.com/133

보드에 유저 추가
보드랑 유저 매핑할 때
유저가 보드에도 있고 코멘트에도 있다.
제이슨
연관관계를 양방향으로 할 건지 단방향으로 할 건지

보드랑 게시글은 이미 그런 관계임 둘이 붙어있는..?
유저랑 게시글도 그 관계로

회원탈퇴 : UserServiceImpl 안에 만들기

순환참조(Circular reference)

  • 참조하는 대상이 서로 물려있어 참조할 수 없게 되는 현상
  • JPA에서 양방향으로 연결된 Entity를 그대로 조회하는 경우, 서로의 정보를 순환하면서 조회하다가 stackoverflow가 발생하게 된다.

※ Spring Boot는 @ResponseBody(rest api)를 구현할 시 Object를 JSON 형태로 변환하기 위해 Jackson 라이브러리를 이용하는데,

Jackson은 entity의 getter를 호출하고, 직렬화를 이용해 JSON 형태로 객체를 변화시키고 view로 전달하는데

getter를 호출하는 과정에서부터 순환 참조가 계속 발생해 view로 전달하면서 stackoverflow가 발생하게 된다.

※ 직렬화란, 객체의 내용을 바이트 단위로 변환하여 파일 또는 네트워크를 통해 스트림(송수신)하도록 하는 것을 의미한다.

순환 참조를 방지하기 위한 방법은 여러 가지가 있다.

  1. @JsonIgnore

: 이 어노테이션을 붙이면 JSON 데이터에 해당 프로퍼티는 null로 들어가게 된다.

즉, 데이터에 아예 포함시키지 않는다.

  1. @JsonManagedReference 와 @JsonBackReference

: 부모 클래스(Posts entity)의 Comment 필드에 @JsonManagedReference를, 자식 클래스(Comment entity)의 Posts 필드에 @JsonBackReference를 추가해주면 순환 참조를 막을 수 있다.

3.@JsonIgnoreProperties

: 부모 클래스(Posts entity)의 Comment 필드에 @JsonIgnoreProperties({"posts"}) 를 붙여주면 순환 참조를 막을 수 있다.

  1. DTO 사용

: 위와 같은 상황이 발생하게된 주원인은 '양방향 매핑'이기도 하지만, 더 정확하게는 Entity 자체를 response로 리턴한데에 있다. entity 자체를 return 하지 말고, DTO 객체를 만들어 필요한 데이터만 옮겨담아 Client로 리턴하면 순환 참조 관련 문제는 애초에 방지 할 수 있다.

  1. 매핑 재설정

: 양방향 매핑이 꼭 필요한지 다시 한번 생각해볼 필요가 있다. 만약 양쪽에서 접근할 필요가 없다면 단방향 매핑을 해줘서 자연스레 순환 참조 문제를 해결하자.

참고

profile
백엔드 개발자

0개의 댓글