전제
1. (1)편을 통해 Docker로 Redis를 연결해두기 : https://radpro.tistory.com/541
2. Spring Security가 구현되어있는 상태 (자체 회원가입 - 로그인까지)
3. application.yml에서 Redis연결 코드를 넣어둔다.
spring:
...
redis:
host: localhost # 로컬 사용시
port: 6379 # redis 기본 포트
참고 시리즈
1. Redis - Docker 연결 - https://radpro.tistory.com/541
3. Redis를 이용한 로그아웃 관리 - https://radpro.tistory.com/544
4. Redis - Ubuntu로 연결 (도커없이) - https://radpro.tistory.com/546
적용 방법
: Redis 저장소에 접근하기위한 방법은 두 가지가 있다. [ RedisTemplate 방식 ]과 [ RedisRepository 방식 ]
: 필자의 경우 [ RedisTemplate 방식 ]을 사용했다.
[ RedisTemplate 방식 ]
1. RedisConfiguration을 만든다. 필자의 경우 global/redis/config 라는 경로를 만들어서 그 안에 만들어줬다.
package TeamBigDipper.UYouBooDan.global.redis.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
2. SpringSecurituy에 만들어둔 JwtAuthenticationFilter에서 redisTemplate를 DI받아,
회원 로그인마다 RefreshToken을 Redis에 저장하게 한다.
이때, 레디스에 저장할 key:value로 필자는 RTkey+회원식별자 : RefreshToken 으로 지정했다.
@Slf4j
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
...
private final RedisTemplate redisTemplate;
...
@Override
@SneakyThrows
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain, Authentication authResult) {
...
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue(); // redisTemplate를 이용해
valueOperations.set("RTKey"+authenticatedMember.getMemberId(), refreshToken); // key:value로 refreshToken을 Redis에 저장
log.info("redis RT : {}", valueOperations.get("RTKey"+authenticatedMember.getMemberId())); // 잘 드갔는지 확인 로그
...
}
}
[ RedisRepository 방식 ]
1. RedisRepository에 저장할 객체를 만든다. 여기서 @RedisHash("key값의_prefix값") 이 핵심이다.
@Getter
@RedisHash("member") // redis에 저장할 것이고, key값의 prefix로 사용할 값
public class Member {
@Id
private String id;
private String name;
public Member(String name, int age) {
this.name = name;
}
}
2. 해당 도메인의 RedisReposiotry 인터페이스를 만든다. CrudRepository를 상속받으면 된다.
public interface MemberRedisRepository extends CrudRepository<Member, String> {
}
3. 해당 도메인의 Service 클래스 만들어서 메소드를 만들어 호출해주면 된다.
JpaRepository와 마찬가지로 save()와 findById() 등을 지원해준다.
@RequiredArgsConstructor
@Service
public class MemberService {
private final MemberRedisRepository memberRedisRepository;
public void addMember() {
memberRedisRepository.save(new Member("민무니너구리"));
}
}
레퍼런스
'Java & Spring > Spring' 카테고리의 다른 글
[Redis] (4) 도커 없이 Redis 적용하기 - Ubuntu 사용 (0) | 2023.02.14 |
---|---|
[Redis] (3) Redis로 로그아웃 (Access 및 Refresh Token 관리) (0) | 2023.02.11 |
[Redis] (1) Docker를 이용한 Redis 연결하기 (0) | 2023.02.11 |
[OAuth2.0] 카카오 로그아웃 (0) | 2023.02.09 |
[OAuth2.0] Google 로그인 (프론트엔드 브라우저 연동 버젼) (0) | 2023.02.06 |