트러블 슈팅 (7) 썸네일형 리스트형 spring에서 cache 활용 시 key 값 설정 주의점 문제 정의spring boot와 redis를 활용해 cache 저장소를 구현하려고 할 때 발생했던 문제입니다. @Cacheable(cacheNames = "itemCache", key = "args[0]") public ItemDto readOne(Long id) { log.info("Read One: {}", id); return itemRepository.findById(id) .map(ItemDto::fromEntity) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); } @Cachea.. gateway에서의 FeignClient 사용 문제 정의gateway는 기본적으로 reactive방식인 비동기 형식으로 진행되기 때문에 동기형식인 FeignClient를 사용하는데 몇가지 추가 설정이 필요합니다. gateway가 아닌 다른 서버에서 FeignClient사용을 할 때는 이런 설정들이 필요없긴 한데 말이죠.. 한번 설정들을 살펴보겠습니다. 해결 과정build.gradle 파일을 따로 설명하지는 않겠습니다.먼저 main class입니다. 당연히 feignclient 사용 설정을 해주어야겠죠? @SpringBootApplication@EnableFeignClientspublic class GatewayApplication { gateway에서는 FeignClient로 등록된 객체를 불러올 때 순환 참조 문제가 발생합니다. 저는 gateway.. gateway에서 exchange를 사용하여 값을 전달할 때 주의점 문제 정의gateway에서 exchange통해 값을 넘겨줄 때 문제가 되는 부분이 있었습니다. 이번 프로젝트에서 제가 설계한 gateway에서는 토큰의 유효성을 검증하는 부분이 있었는데요, 예를 들어서 아래처럼 넘겨주게 되면 변환된 exchange 값이 사용되지 못합니다.private ServerWebExchange validateToken(String token, ServerWebExchange exchange) { try { SecretKey key = getSigningKey(); Jws claimsJws = Jwts.parser() .verifyWith(key) .build()... gateway와 각 서버별 circuitbreaker 적용의 이해 25년 3월 21일 현재 생각을 해보니, 서킷브레이커의 목적은 다른 서비스로의 장애 전파를 막는 역할을 하는 것입니다. 즉, 내가 만든 서비스 로직 메서드에 모두 적용할 필요가 없고, 다른 서비스에 요청을 하는 method, class에 적용시키면 됩니다. 문제 정의서버간 circuit breaker 적용의 이해gateway에서 통합적으로 서킷브레이커를 관리할 수 있다는 글을 보긴 했는데, 서킷브레이커에 대한 이해도가 낮아 gateway에서 모든 서비스의 개별 api에 대한 open상태를 감지하여 대응할 수 있는 줄로만 알았습니다. 처음에 이렇게만 생각하고 이것저것 해보다가 결국에는 뭔가 잘못 됐다는 것을 깨달았죠.해결과정제가 궁극적으로 하고 싶었던 목표는 다음과 같습니다.각 서버별 api를 요청했을 때.. @ModelAttribute 매핑 시 null값에 대한 이해 먼저 매핑과 바인딩에 대한 부분이 약간 헷갈렸던 개념이라 이 부분을 간단하게 짚고 넘어가게 된다면, 매핑이란 두 개의 서로 다른 데이터 구조를 서로 연결하는 작업을 말합니다. 예를 들어, 데이터베이스의 테이블과 자바 객체 간의 필드를 연결하는 작업을 "매핑"이라고 합니다. 바인딩이란 변수를 특정 값이나 객체에 연결하거나, 함수 호출 시 인자와 매개변수를 연결하는 행위를 주로 말합니다. 문제 원인프로젝트 진행 시에 Querydsl을 사용하여 여러 값을 쿼리파라미터로 받아 사용하는 api를 구성 후 각 쿼리파라미터를 받을 수 있는 dto를 만들어 @ModelAttribute를 활용해 매핑해주었습니다. 당연히 잘 동작을 할 줄 알고 테스트를 진행하였으나, 매핑되는 값들이 전부 null값을 가지고 들어오게 되.. MSA 구성 시 데이터 정합성의 문제 문제 정의MSA 구성 시에 데이터 정합성의 문제유저 서버에서 유저 삭제 API 실행 → 메서드 내에서 동기형식으로 주문, 배송, 허브 순으로 요청을 보내게 됐을 때 주문, 배송까지는 완벽하게 통신을 끝냈지만 허브에서 예외가 발생했을 경우. 이 경우 주문과 배송은 삭제 처리가 됐지만 유저와 허브의 경우 삭제 처리가 안된 경우가 발생하게 될겁니다. 이렇게 되면 데이터 정합성이 어긋나게 되는데 이 문제를 해결하기 위해 어떻게 보상 로직을 구현할 것인지..?해결과정가장 먼저 떠오른 방법은 SAGA 패턴을 적용하여 보상 트랜잭션을 구성하는 것이었습니다. FeignClient로 요청을 보내는 것마다 예외를 따로 만들어, 해당 예외가 발생시 try-catch로 잡아내어 이전에 정상적으로 실행된 서버에 보상 요청을 보.. RestTemplate 사용시 주의점(4xx, 5xx 응답 반환) 배경서버간 데이터를 주고 받을 때 RestTemplate을 사용하는 경우가 있었습니다. 이떄 exchange를 통해 HttpStatus 코드를 Bad_Request로해서 body에 응답 메시지를 함께 넣어주는 테스트를 진행하였습니다. 당연히 이 응답 결과를 잘 받을 줄 알았는데 데이터를 출력되지 않고 예외가 발생했습니다. 도대체 뭐지? 내용RestTemplate은 기본적으로 HttpClientErrorException을 던집니다. 이 때문에 예외가 발생하고, 응답 본문을 정상적으로 읽을 수 없게 됩니다. 요청한 서버에 응답이 되돌아 갔을 때 따로 예외 처리를 해주지 않으면, 400응답으로 넘어온 body부분의 내용을 확인하지 못하는거죠. 예를 들어서 이런식으로 작성을 해야합니다. public class .. 이전 1 다음