본문 바로가기

트러블 슈팅

(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 적용의 이해 문제 정의서버간 circuit breaker 적용의 이해gateway에서 통합적으로 서킷브레이커를 관리할 수 있다는 글을 보긴 했는데, 서킷브레이커에 대한 이해도가 낮아 gateway에서 모든 서비스의 개별 api에 대한 open상태를 감지하여 대응할 수 있는 줄로만 알았습니다. 처음에 이렇게만 생각하고 이것저것 해보다가 결국에는 뭔가 잘못 됐다는 것을 깨달았죠.해결과정제가 궁극적으로 하고 싶었던 목표는 다음과 같습니다.각 서버별 api를 요청했을 때 서킷브레이커 open 상태를 감지하여 gateway 설정으로 간편하게 관리할 수 있다.1번의 방법이 적용되면 각 서버별 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 ..