해결된 질문
작성
·
124
답변 2
0
안녕하세요 질문 남겨주셔서 감사합니다.
직렬화 방식에 대해서 고민을 하고 있는걸로 보이는데, 혹시 어떤 부분을 고려하고 싶은지 좀 더 자세한 정보를 알 수 있을까요??
Best Practice라는게 정답은 없고 개인 스타일이나 해결하고자 하는 문제마다 다른 방식으로 구현이 된다고 생각을 하기 떄문에, 해결하고자 하는 부분을 좀 더 자세히 알려주시면 그 부분에 맞춰서 답변 드리도록 하겠습니다!
안녕하세요 상세하게 질문 남겨주셔서 감사합니다.
우선 저는 redisTemplate
를 기본적으로 사용합니다. 왜냐하면 다양한 타입을 다뤄야 하는 경우도 있기떄문에, 번거로울수도 있겠지만 template
를 기본적으로 정의해 두고 사용하는 편입니다.
물론 Template
을 사용한다는것이 코드의 양이 증가하는 형태이기는 하지만, 그렇게까지 캐싱을 모두 다 적용하는 편은 아닌거 같습니다. 어느정도 적용이 필요한 부분만 적용해서 사용을 하는 편입니다.
오히려 어노테이션을 덜 활용하는 편인거 같습니다.
이건 제가 Spring만 하는 사람이 아니라서 어노테이션에 너무 의지하고 싶지 않아서 그런 것도 있습니다. 아무래도 어노테이션에만 익숙해지면, 그외의 작업을 하는데에 있어서는 큰 어려움이 있다고 생각을 해서
메타 정보를 포함한다는 것이 사실 필요한가라는 의문이 있습니다. 특정 키에 대해서 맵핑해야 하는 Class는 명확하다고 생각하는 편이기 떄문이에요. 그리고 만약 포함하였을 떄 Class이름이 변경되면 그에 따라서 발생가능한 문제도 있다고 생각하는 편입니다.
그래서 그냥 늘 하던대로 Jackson2JsonRedisSerializer
를 사용하는 편입니다.
여기서 타입 추론에 대한 문제가 발생하는것은 관리를 못한 개발자의 문제이지 딱히 구조나 Redis의 문제는 아니라고 생각을 합니다.
음 팀내의 규칙이라... 저희 팀이 개인의 스타일을 존중하고 크게 터치하는 편이 아니라서 ㅋㅋㅋ 딱히 없는편입니다. Spring에 적합한 코드 스타일에 집중하기 보다는 창의성있고 어느정도 효율을 배제하더라도 유지보수를 좀 중요시하는 분위기라 크게 규칙을 정하지는 않고 어느정도 가독성이 있다면 넘어가는 편이거 같습니다.
하지만 저는 redisTemplate
을 사용해서 코드를 작성하는게 좋아서.. 크게 막 어노테이션까지 고려하여 작성을 하는 스타일은 아닌거 같습니다..
어느정도 질문에 대한 대답이 되었는지 모르겠네요. 질문 자체가 개인적인 생각이나 기준을 물어보셔서 좀 서술하듯이 설명을 드린 감이 있는데 혹시 부족하다면 추가로 질문 남겨주시면 감사하겠습니다!
0
안녕하세요, 인프런 AI 인턴입니다. soap님.
SpringBoot와 Kotlin을 기반으로 Redis 캐싱을 구현하는 방법에 대해 질문 주셨군요. 이 주제는 특히 Kotlin의 직렬화와 역직렬화 처리 방식에 대해서도 다루어야 하기 때문에 중요한 부분입니다. Redis 캐싱을 활용할 때 주요 고려사항은 데이터의 직렬화 방법입니다.
Kotlin의 직렬화: Kotlin에서는 기본적으로 kotlinx.serialization
라이브러리를 사용하여 JSON 직렬화와 역직렬화를 수행할 수 있습니다. 이 라이브러리는 Kotlin 멀티플랫폼 프로젝트를 위한 강력한 도구로, 코드의 플랫폼 간 호환성을 유지하면서 직렬화 기능을 제공합니다.
Spring Boot에서 Kotlin으로의 전환: Java에서는 주로 Jackson 라이브러리와 Lombok을 활용하여 직렬화 설정을 간편하게 처리합니다. 그러나 Kotlin에서는 코틀린 자체의 data class를 활용할 수 있으며, 이를 통해 Jackson이나 Gson 같은 라이브러리를 사용하는 방법을 고려할 수 있습니다. Kotlin data class는 copy
기능이나 기본값 설정 등을 통해 더 유연한 객체 구성을 지원합니다.
Redis 캐싱 기법: Redis를 사용할 때는 주로 @Cacheable
어노테이션을 사용하는 Spring Cache 추상화 계층을 활용할 수 있습니다. 이를 통해 손쉽게 캐싱 로직을 구현할 수 있으며, 직접 RedisTemplate 등을 활용하여 더 세밀한 캐싱 처리를 할 수도 있습니다.
다음은 Redis 관련 질문들에 대한 기존의 유사한 논의를 참고하실 수 있는 링크입니다:
이 링크에서는 Spring과 Kotlin을 통합하여 Redis를 효과적으로 사용하는 방법들에 대해 역설하고 있습니다. 기존의 방식들과 어떤 차이점이 있으며, 이와 관련된 실질적인 예제도 포함되어 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
현재 상황
레디스에 캐싱시 GenericJackson2JsonRedisSerializer와 @Cacheable, @CacheEvict를 사용중입니다.
역직렬화시 @class의 메타정보 이슈가 발생해서 이를 해결하기 위한 과정중에 생긴 고민들과 궁금증, 내린 해결책에 대해 조언을 받고 싶습니다.
프로젝트 구조는 레이어드 + 클린 아키텍처 구조입니다.
- 의존성 중심에 domain이 존재, DomainRespotiory와 인프라Repository 관계는 DIP
질문 출~발!!
1. 캐싱 사용시 RestTemplate을 직접 사용해서 get,put하시나요? 아니면 @Cacheable, @CacheEvict를 활용하시나요?
2. 강의에서 RedisTemplate 설정시 Jackson2JsonRedisSerializer를 사용하셨는데 직렬화 객체의 메타정보가 들어가지 않기위해서 사용하신 걸까요? 추가로 StringRedisSerializer도 의도적으로 사용해 보신적이 있으신지 궁금합니다.
고민사항
레디스 캐싱을 세세하게 다룰 필요성이 있으면 RedisTemplate를 사용할 수 밖에 없을 것 같습니다.
근데 단순히 데이터에 대한 캐싱'만' 필요하다면 @Cacheable, @CacheEvict를 사용해도 충분할것 같습니다.
무조껀 RedisTemplate을 사용하기엔 기능이 단순한거에 비해 프로젝트 구조상 코드양도 많아질수 밖에 없더라구요.(세상 귀찮)
결론
Jackson2JsonRedisSerializer과 @Cacheable, @CacheEvict 방식을 사용하되 @Cacheable로 반환하는 타입 모두(단일객체든, 컬렉션이든)를 enum에 정의후 Jackson2JsonRedisSerializer(objectMapper, redisCacheType.clazz)로 모두 적용
강사님이 현재 팀에서 사용하시는 기준 혹은 생각이 궁금합니다.
코드도 필요하시면 말씀 부탁드립니다~!
감사합니다.
참고한 글
https://github.com/binghe819/TIL/blob/master/Spring/Redis/redis%20serializer/serializer.md#2-2-genericjackson2jsonredisserializer