[JAVA] fallback 코드 작성하기

1 분 소요

설날에 스타벅스와서 블로그 작성하는 내 인생에.. 눈물이.. 아무튼..

개발을 하다보면, 다양하게 차선책을 선택해야하는 경우가 있다. 예로, 코로나 감염자 수를 알려주는 API를 개발한다고 했을 때 대한민국 질병관리청에서 해당 데이터를 받아와 정재해서 내려주도록 개발을 했다고 가정해보자.

그럴 경우, 질병관리청이 오류상황으로 데이터를 내려주지 않는다면? 이럴 경우, 질병관리청의 장애가 우리 서비스까지 전파가 된다. 이럴 경우, 보통은 circuit breaker를 통해 장애 확산을 차단 시킨다. 만약에, 질병관리청이 장애상황인걸 인지했고, 그래서 더이상 질병관리청에 요청을 보내지 않는다면 우리는 어떤 데이터를 내려줘야할까?

그 방법을 fallback이라고 부른다. 뜻은 “대체”이다. 위의 예시에서는 매 호출 시에 호출된 데이터를 임시적으로 저장해 놓고 오류 시 이전 데이터를 내려주면 될 것이다.

이처럼 정상적인 상황이 아닌 비 정상적인 상황에 대체되는 그 무언가를 우리는 fallback이라고 부른다.

fallback 함수 작성 예시

회사에서 개발하면서 다양한 유지보수를 진행하게 된다. 만약, 기존의 RedisTemplate안에서 사용되던 ObjectMapper가 구 버전이고 새로운 ObjectMapper를 사용하고 싶다면 어떤식으로 변경해야 할까?

그냥 바꿔서 재배포를 한다고 가정한다면, 이전 버전의 ObjectMapper로 write된 데이터들은 읽지 못하고 전부 오류로 인식할 것이다. redis의 데이터가 새로운 ObjectMapper의 데이터로 바뀌는 그 시점까지

회사에서는 상상도 할 수 없는 일이다. 가용성과 신뢰성을 보장해야 하기 때문에 오류가 발생하는 상황은 무조건 지양해야한다. 이럴 때 fallback 함수를 사용하면 된다.

먼저, ObjectMapper의 write 함수는 구버전으로 남겨둔다. 그리고, ObjectMapper의 read 함수를 fallback으로 구 버전 ObjectMapper를 읽도록 → 그게 실패한다면 새로운 ObjectMapper를 읽도록 코드를 짠다.

코드 예시는 이렇다.

private <T> T readValueWithFallback(String content, TypeRederenece<T> typeReference) {
        Try<T> tryOrigin = Try.of(() -> objectMapper.readValue(content, typeReference))
                .onFailure(e -> log.info("Fail to readValue of origin objectMapper."));
        if (tryOrigin.isSuccess()) {
            log.info("Success to origin objectMapper.");
            return tryOrigin.get();
        }

        Try<T> fallback = Try.of(() -> newObjectMapper.readValue(content, typeReference)
                .onFailure(e -> log.error("failed to new objectMapper"));
        if (fallback.isSuccess()) {
            return fallback.get();
        }

        return null;
    }

compile group: ‘io.vavr’, name: ‘vavr’, version: ‘1.0.0-alpha-3’

Try 클래스의 gradle 정보

위에서 보면 origin 방식으로 먼저 시도를 하고 실패할 경우, 새로운 방식으로 대체하여 진행하고 있다. 물론, 거기서도 오류가 발생한다면 오류 혹은 null을 반환해야할 것이다.

이런식으로 먼저 read fallback 함수를 배포해놓는다면, 모든 서버에서 어떤 objectMapper로 write하든 문제 없이 읽을 수 있게 되기 때문에 신뢰성과 가용성을 유지하면서 배포를 할 수 있게된다.

마무리

다들 fallback 함수를 통해 안전성있는 배포와 서버 개발을 할 수 있도록 합시다~~

댓글남기기