ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [error] Could not write JSON: Infinite recursion (stackOverflowError)
    Health-Genie 2023. 11. 19. 19:59
    728x90

    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();
        }

     

Designed by Tistory.