redis 구조도 추가하기 (클러스터링 구조 및 인증방식 추가)

<aside> 💡 요청시 오래걸리는 응답에 대해 속도 개선을 위해 적용 진행하였고 Kotlin 이라 Java 에서 적용할때와 다르게 몇가지 추가 이슈가 발생하였습니다.

</aside>

작업 중 발견한 이슈

  1. 기존 매물리스트의 Response Body가 매우 커서 확인해봤더니 이미지를 조회하기 위해 서명 url 을 사용

    → 이미지 url의 String이 너무 길었음. 이유는 이미지 보안 설정으로 queryString이 길어져 Content-Length가 너무 커짐

    → 해결 : 보안상 이미지 노출을 막을필요 없어서 제거하여 redis 의 메모리에 적재될 때 해당 이미지 파일 경로의 용량을 줄일 수 있었음.

  2. 추상화된 클래스 (eg : DomainQueryService) 를 바로 사용하는 곳에 캐싱을 적용하는 경우 repository가 주입이 제대로 되지 않는 이슈가 있어 해당 Service를 한번 더 주입받아 구현하여 사용

@Service
class FileQueryService(
    private val fileDomainQueryService: FileDomainQueryService
) {
    @Cacheable(value = ["files"], cacheManager = "redisCacheManager")
    fun queryAllByRequest(request: FileDomainQueryRequest): List<File> {
        return this.fileDomainQueryService.queryAll(request)
    }
}
  1. Object Mapper 구현
  1. LocalDateTime 을 Jackson에서 지원하지 않아 모듈 추가
objectMapper.registerModule(JavaTimeModule())
  1. 디폴트 생성자가 존재해야 역직렬화 하는데 이슈가 발생하지 않으므로 코틀린 모듈 추가하여 디폴트 생성자 지원하도록 작업
objectMapper.registerModules(KotlinModule())
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
  1. Object로 저장한 값을 역직렬화 할때 LinkedHashMap 으로 인식하여 오류가 발생한다. Object로 인식할 수 있게 설정해야 한다.
val ptv: PolymorphicTypeValidator =
        BasicPolymorphicTypeValidator.builder()
            .allowIfSubType(Any::class.java)
            .build()
  1. deserialize시 알지 못하는 property가 오더라도 실패하지 않도록 처리하여 견고함의 원칙(Robustness Principle)을 지킨다.
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

직렬화 방법 설정