-
[error] Could not write JSON: Infinite recursion (stackOverflowError)Health-Genie 2023. 11. 19. 19:59728x90
ptProcess 에서 list 조회를 하는데 발생했던 에러입니다.
에러에 해당했던 부분은 service 파일 안에 코드입니다
@Transactional(readOnly = true) public Page<PtProcessResponseDto> getAllTrainerProcess(Long trainerId, int page, int size){ return ptProcessRepository.findAllByTrainerId(trainerId, PageRequest.of(page, size)); }
에러를 고친 후의 코드입니다
@Transactional(readOnly = true) public Page<PtProcessResponseDto> getAllTrainerProcess(Long trainerId, int page, int size){ Page<PtProcess> process = ptProcessRepository.findAllByTrainerId(trainerId, PageRequest.of(page, size)); return process.map(PtProcessResponseDto::of); }
여기저기 찾아보면 에러를 해결하는 방법은 3가지 입니다
1. @JsonIgnore
@oneToMany 부분에 @JsonIgnore 를 붙여주면 해결이다.
이는 해당 프로퍼티의 값을 null로 만들어주며, 데이터가 들어가는걸 막아준다.
2. @JsonMangedReference와 @JsonBackReference
@JsonManagedReference @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>();
@JsonBackReference @ManyToOne @JoinColumn(name = "team_id") private Team team;
이런 식으로 연관관게가 걸려있는 곳에 적어준다.
@JsonMangedReference 가 걸려있는 클래스에서는 해당 부분을 직렬화시키며,
@JsonBackReference 가 걸려있는 클래스에서는 직렬화를 막는다.
3. DTO 사용
엔티티 자체를 응답값으로 리턴하려고 하니, 이런 이슈들이 발생한다.
결론적으로 엔티티 자체를 리턴하기에는 보안쪽으로도 치명적일수 있을 뿐더러, 필요없는 값까지 넘겨줘야 한다.
그럴때는 응답DTO를 새로 만들어, 필요한 데이터만 리턴
나는 이중에서 DTO를 반환하는 식으로 해결했다
public static PtProcessResponseDto of(PtProcess process) { return PtProcessResponseDto.builder() .id(process.getId()) .date(process.getDate()) .content(process.getContent()) .title(process.getTitle()) .photo(process.getPhoto()) .trainerId(process.getTrainer().getId()) .userId(process.getMember().getId()) .build(); }
'Health-Genie' 카테고리의 다른 글
[이미 사용중인 포트 넘버] Port number was already in use 해결하기 (2) 2023.11.21 [error] No enum constant enum명.값 해결방법 (2) 2023.11.21 [이메일 인증] 이메일 인증 구현 & 코드 검증! (2) 2023.11.18 [symbol 에러] error: cannot find symbol log.info (1) 2023.06.12 [UserDetail] InternalAuthenticationServiceException 에러 (0) 2023.06.04