Intellij에서 ClassDiagram(UML) 보기
유저 매핑 + 회원탈퇴 : 김승민 튜터님이 설명해주신 숙련 강의? n+1 디비 : 무한루프 유저에 맵 적용
순환참조 어노테이션 레인지 user 를 userdto로 바꿔서
https://dev-coco.tistory.com/133
보드에 유저 추가
보드랑 유저 매핑할 때
유저가 보드에도 있고 코멘트에도 있다.
제이슨
연관관계를 양방향으로 할 건지 단방향으로 할 건지
보드랑 게시글은 이미 그런 관계임 둘이 붙어있는..?
유저랑 게시글도 그 관계로
회원탈퇴 : UserServiceImpl 안에 만들기
※ Spring Boot는 @ResponseBody(rest api)를 구현할 시 Object를 JSON 형태로 변환하기 위해 Jackson 라이브러리를 이용하는데,
Jackson은 entity의 getter를 호출하고, 직렬화를 이용해 JSON 형태로 객체를 변화시키고 view로 전달하는데
getter를 호출하는 과정에서부터 순환 참조가 계속 발생해 view로 전달하면서 stackoverflow가 발생하게 된다.
※ 직렬화란, 객체의 내용을 바이트 단위로 변환하여 파일 또는 네트워크를 통해 스트림(송수신)하도록 하는 것을 의미한다.
순환 참조를 방지하기 위한 방법은 여러 가지가 있다.
: 이 어노테이션을 붙이면 JSON 데이터에 해당 프로퍼티는 null로 들어가게 된다.
즉, 데이터에 아예 포함시키지 않는다.
: 부모 클래스(Posts entity)의 Comment 필드에 @JsonManagedReference를, 자식 클래스(Comment entity)의 Posts 필드에 @JsonBackReference를 추가해주면 순환 참조를 막을 수 있다.
3.@JsonIgnoreProperties
: 부모 클래스(Posts entity)의 Comment 필드에 @JsonIgnoreProperties({"posts"}) 를 붙여주면 순환 참조를 막을 수 있다.
- DTO 사용
: 위와 같은 상황이 발생하게된 주원인은 '양방향 매핑'이기도 하지만, 더 정확하게는 Entity 자체를 response로 리턴한데에 있다. entity 자체를 return 하지 말고, DTO 객체를 만들어 필요한 데이터만 옮겨담아 Client로 리턴하면 순환 참조 관련 문제는 애초에 방지 할 수 있다.
: 양방향 매핑이 꼭 필요한지 다시 한번 생각해볼 필요가 있다. 만약 양쪽에서 접근할 필요가 없다면 단방향 매핑을 해줘서 자연스레 순환 참조 문제를 해결하자.