- 문제
- foreign key로 참조된 데이터가 무한하게 요청이 가는 현상
- 클라이언트가 필요하지 않은 데이터(password, isDeleted)를 보냄
- 원인
- User와 Notice가 UserId로 참조 되어 있다고 생각해보자
- Notice를 반환할 경우 Notice안에 있는 User가 반환이 된다.
- Notice 안에 있는 User에도 Notice가 있다.
- User에 있는 Notice를 반환하면서 무한 루프가 형성이 된다.
- 해결방안 (조사)
- 직렬화와 역직렬화를 막기 위해 @JsonIgnore 어노테이션을 활용
- 응답하기 위한 DTO를 만든다.
- 설계
- Entity : id로 구분되며 실제 DB와 매핑되는 객체, 비지니스 로직을 갖을 수 있다.
- DAO : 데이터를 조회하거나 조작하기 위한 객체
- DTO : 계층간 데이터를 교환하기 위한 객체, 로직을 갖지 않고 Getter, Setter만을 갖는다.
- ResponseDto : 클라이언트로 데이터를 전송하기 위한 객체, 클라이언트가 필요한 데이터만을 포함한다.
- 코드
- 역직렬화를 무시하기 위해 @JsonIgnore를 사용 했습니다.
- RespoinseDto로 모든 코드를 수정합니다.
# Controller
@GetMapping("/QnAs/{QnAId}")
public ResponseEntity<QnAResponseDto> readQnA() {
return ResponseEntity
.ok()
.body(qnAService.readQnA().toResponse());
}
# Service
public QnADto readQnA() {
...
return QnADto;
}
# Dto
public class QnADto {
...
public QnAResponseDto toResponse() {
...
return QnAResponseDto;
}
}
# ResponseDto
public class QnAResponseDto {
...
}