인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

박철현님의 프로필 이미지

작성한 질문수

대기업 근무하며 경험한 Redis를 야무지게 사용하는 방법 [실습]

SortedSet Collection API 및 Service

질문있습니다

해결된 질문

작성

·

44

·

수정됨

0

RedisConfig 클래스에서 @Bean을 이용해서

 @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redis = new RedisTemplate<>();
        redis.setConnectionFactory(factory);
        redis.setKeySerializer(new StringRedisSerializer());
        redis.setHashKeySerializer(new StringRedisSerializer());
        redis.setHashValueSerializer(new StringRedisSerializer());
        redis.setValueSerializer(new StringRedisSerializer());
        return redis;
    }

해당 코드를 통해 RedisTemplate를 빈으로 등록한걸 확인했는데요.

근데 왜 RedisCommon 클래스 쪽에선 해당 Bean을 사용하지 않고 RedisTemplate<String,String> 을 사용하나요?

Bean으로 등록한건 RedisTemplate<String,Object>인데 그럼 스프링에서는 만들어 놓은 RedisTemplate<String,Object>을 사용하지 않고 새로운 RedisTemplate<String,String>을 만들어서 주입하는 걸로 알고있습니다.

저 Bean으로 등록해놓은 RedisTemplate<String,Object>의 직렬화 및 역직렬화에 사용될 객체를 집어넣어주는 코드는 Redis 전체 설정인가요?? 저렇게 하면 RedisTemplate<String,String>에도 적용이 되는건가요??

- 강사님의 이론편을 안봐서 제가 이해가 잘 안가는 것 일 수도 있습니다 ㅠㅠ

실제로 RedisConfig 클래스에서 정의한 RedisTemplate<String, Object>와 RedisString에서 정의한 RedisTemplate<String,String>의 해시코드를 비교해봤는데 서로 다른 값이 나왔습니다.

@Service
@RequiredArgsConstructor
public class RedisString {

    private final RedisTemplate<String, String> template;
    private final RedisTemplate<String, Object> template2;

// RedisTemplate@544e3679

RedisConfig에서 스프링의 빈 초기화시 로그

// RedisTemplate@544e3679

RedisString에서 찍은 template2 로그

// StringRedisTemplate@6d5bb599

RedisString에서 찍은 template 로그

 

 



답변 2

0

Hong님의 프로필 이미지
Hong
지식공유자

안녕하세요. 먼저 질문 주셔서 감사드리며, 제가 답변이 늦어서 죄송하다는 말씀을 먼저 드립니다.

 

우선 이론적인 강의와는 무관한 내용이라는 부분을 말씀드리고 싶어요. 그리고 @Bean으로 등록을 하였기 떄문에 다른 객체로써 관리가 됩니다. 원하는 타입을 선언하고 관리하고자 사용이 되었다고 보시면 됩니다.

 

질문자님께서 질문을 주셨던 내용에서 제가 유추한 바로는 어느정도 Spring에 대해서 지식이 있으신걸로 보입니다.

 

제가 따로 @Bean으로 등록한 이유는 다양한 타입을 받기 위해서 선언을 하였고, @Bean으로 등록을 하였기 떄문에 앞서 말씀드렸듯이 다른 객체로써 관리가 됩니다.

 

현재 제가 해당 강의에 대해서 코드가 유실이 되어서.. 구체적인 확인이 어렵지만, 이 질문은 다른 객체로써 관리가 되는지에 대한 질문이기 떄문에 어느정도 답변이 되었다고 생각을합니다.

 

혹시라도 제가 부족한 답변을 드렸다면, 편하게 추가로 질문 남겨주시면 감사하겠습니다.!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 박철현님.

Redis 관련 설정과 그 사용법에 대해 질문을 주셨군요. RedisTemplate을 빈으로 등록하면서 RedisTemplate<String, Object>로 선언했지만, RedisCommon 클래스에서는 왜 RedisTemplate<String, String>을 사용하는지 궁금하신 듯합니다. 이는 스프링 설정과 관련된 일부 유연한 처리에서 비롯된 것입니다.

RedisTemplate의 빈 등록:
- 질문에 제시된 RedisTemplate<String, Object>는 다양한 형태의 데이터를 저장하고 가져오기 위해 유용하게 사용됩니다. 여기서는 키와 값 모두 문자열로 직렬화하는 설정을 하고 있습니다.
- 이 설정이 객체 단위로 직렬화/역직렬화를 가능하게 하기 때문에 다양한 데이터 타입을 다룰 수 있게 됩니다.

클래스에서의 사용 차이:
- RedisCommon 클래스에서 RedisTemplate<String, String>을 사용하는 것은 특정 목적을 위한 것일 가능성이 큽니다. 예를 들어, 데이터가 모두 문자열이라는 보장이 있을 때는 String으로 타입을 명시하여 사용하면 더 명확하고 안전한 데이터 처리가 가능합니다.
- 스프링의 DI(Dependency Injection) 특성상, 만약 동일한 타입의 빈이 여러 개 존재할 경우 Qualifier를 통해 특정 빈을 명시적으로 주입받도록 설정할 수 있습니다. 여기서 따로 RedisTemplate<String, String>이 생성되는 것이라면 코드의 일관성이나 다른 특정 이유에 의해 의도된 사용일 수 있습니다.

사용 의도 여부 및 직렬화 객체 설정:
- 이런 설정은 종종 개발자가 인터페이스의 통일성을 위해 의도적으로 구분합니다. 객체 타입을 일반화(Object)하여 다양한 저장소로의 확장을 허용하는 한편, 실제 사용에서는 유연한 데이터 타입을 지정하여 명확성을 추구할 수 있습니다.
- 직렬화 객체를 설정하는 것은 데이터의 보존과 처리 방식에 큰 영향을 미칩니다. 요구사항에 따른 데이터 저장방식의 차이로 인해 두 타입의 RedisTemplate을 명시적으로 분리하여 사용하는 경우도 흔합니다.

관련된 질문과 답변으로 이해를 돕기 위한 링크는 아래를 참고하세요:

  1. RedisTemplate 설정과 사용 방법

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.