해결된 질문
작성
·
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
안녕하세요. 먼저 질문 주셔서 감사드리며, 제가 답변이 늦어서 죄송하다는 말씀을 먼저 드립니다.
우선 이론적인 강의와는 무관한 내용이라는 부분을 말씀드리고 싶어요. 그리고 @Bean으로 등록을 하였기 떄문에 다른 객체로써 관리가 됩니다. 원하는 타입을 선언하고 관리하고자 사용이 되었다고 보시면 됩니다.
질문자님께서 질문을 주셨던 내용에서 제가 유추한 바로는 어느정도 Spring에 대해서 지식이 있으신걸로 보입니다.
제가 따로 @Bean으로 등록한 이유는 다양한 타입을 받기 위해서 선언을 하였고, @Bean으로 등록을 하였기 떄문에 앞서 말씀드렸듯이 다른 객체로써 관리가 됩니다.
현재 제가 해당 강의에 대해서 코드가 유실이 되어서.. 구체적인 확인이 어렵지만, 이 질문은 다른 객체로써 관리가 되는지에 대한 질문이기 떄문에 어느정도 답변이 되었다고 생각을합니다.
혹시라도 제가 부족한 답변을 드렸다면, 편하게 추가로 질문 남겨주시면 감사하겠습니다.!
0
안녕하세요, 인프런 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
을 명시적으로 분리하여 사용하는 경우도 흔합니다.
관련된 질문과 답변으로 이해를 돕기 위한 링크는 아래를 참고하세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.