1. 이전까지의 ResponseEntity 반환 에러 요약
Main server에서 받아온 결과 값을 직렬화해서 캐시로 저장하고 필요할 때 꺼내서 반환해야했다.
- ResponseEntity를 직렬화해서 Redis에 저장하고 이후 꺼내서 역직렬화 할 때 에러가 발생하는 문제가 발생
- ResponseEntity안의 HttpHeaders처럼 일부 객체들이 내부의 추가적인 정보들 때문에 역직렬화가 불가능한 문제로 판단
- CustomResponse를 제작하여 Body, StatusCode, Headers를 분할 저장, Headers는 HttpHeader가 아닌 Map형태로 저장
- 이후 저장한 ResponseEntity로 반환을 했으나 결과가 출력되지 않는 문제 발생
- 여러 방식으로 출력해봤지만 되지 않았고, 값을 하나씩 출력해본 결과 Header에 문제가 있음을 발견
- 정확한 원인은 찾지 못하고 있었다.
2. 반환 에러의 범인과 그 원인
- 지속적인 반환을 통해 Header의 재 구축에서 문제가 있음을 인지
- Chat GPT와 검색을 통해서 함부러 Custom을 하면 안되는 Header들에 대해 인식
- 관련 Header들을 제거하고 송신하니 작동.
- 그러나 기본적으로 보내지는 Header긴 하나 수정하는 것이 아닌 그대로 전송하는 것인데 오류가 발생하는 것에 의문을 가짐
- 그중 Transfer-Encoding Header의 Chunked 에 의구심을 가짐
- 동적인 가변 데이터를 전달받아야할 때 쓰는 Header
왜? 가변 데이터일까?
- Main Server에서 데이터를 받아올 뿐이지 딱히 가변적인 데이터를 받을 이유가 없다.
- 캐시 서버가 딱히 데이터를 가변적으로 전달하지 않는다.
- 그러나 현재 캐시 서버가 보내는 데이터에는 Chunked라는 가변 데이터임을 알리는 헤더가 같이 들어간다.
- 브라우저가 이 Chunked Header로 인해 전달받은 Response가 전부가 아니라고 판단하여 Empty-Response를 보낸 것이 아닌가 판단.
- 해당 헤더만 제거해보니 멀쩡히 잘 동작했다.
- 알고보니 Main에서 전달받기 위해 사용하던 WebClient는 동기적인 데이터를 받는 클래스였다.
- Main에서 데이터를 조금씩 끊어서 전달받아 완성하여 반환해주기 때문에 Chunked Header를 이용해 받아온 것.
- 이 때 남겨진 Chunked Header를 그대로 담아서 반환하니 오류가 발생한 것.
3. 해결
- 전송하기 전에 Header에서 Transfer-Encoding 헤더를 지우고 전송하는 것으로 문제 해결
- 임시 적인 해결에 불과함, WebClient에서 비동기적으로 데이터를 받아올 수 있는 방법을 찾아서 받아오는 것이 더 효율적
public ResponseEntity<?> getDataReadCache(String path, MultiValueMap<String, String> queryParams) {
CustomResponse pathCache = mainCacheService.getDataInCache(path, queryParams);
//ResponseEntity<?> pathCache = mainCacheService.getDataInCache(path, queryParams);
if (pathCache == null)
pathCache = mainCacheService.postInCache(path, queryParams);
/*HttpHeaders headers = new HttpHeaders();
pathCache.getHeaders().forEach(headers::set);*/
System.out.println(pathCache.getBody());
HttpHeaders headers = new HttpHeaders();
for(String key : pathCache.getHeaders().keySet()){
if(key.equals("Transfer-Encoding"))
continue;
System.out.println(key + ":" + pathCache.getHeaders().get(key));
headers.add(key, String.valueOf(pathCache.getHeaders().get(key)));
}
return ResponseEntity.status(pathCache.getStatusCodeValue()).headers(headers).body(pathCache.getBody());
}