[Spring] Redis 적용

merci·2023년 5월 12일
0

Spring

목록 보기
17/21

인 메모리 데이터 구조 저장소로서 캐시를 이용하거나 메세지 브로커등의 역할을 한다.
다양한 타입의 key - value 를 지원한다. ( 다양한 자료구조 지원 )

Redis의 특징

  1. 데이터를 주기적으로 디스크에 저장하는 스냅샷기능을 지원
  2. Append Only File(AOF)방식을 이용한다. - 데이터 영구 저장 ( 백업 )
  3. 트랜잭션 지원
  4. Pub/Sub -> 메세지 브로커 기능
  5. 리플리케이션 지원 ( 백업 )

세션 클러스터링

예를 들어 로그인 정보를 여러 ec2서버에 저장하지 않고 로드밸런서 다음 서버로 가기 전에 redis가 존재해 로그인 정보를 공유할 수 있다.
즉, 클라이언트 요청이 어떤 서버로 가든 동일한 세션 정보에 접근할 수 있다.

적용하기

의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.session:spring-session-data-redis'

설정 파일

spring:
  session:
    store-type: redis # session 을 redis 로 설정
  redis:
    host: localhost
    port: 6379 # redis 디폴트
    
server:
  servlet:
    session:
      timeout: 10m # 레디스 세션 10분 유효

빈 설정

// @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 10) // 10초 , yml 이나 어노테이션으로 시간 설정
@Configuration
public class SessionConfig {

	@Value("${spring.redis.host}")
    private String host;

	@Value("${spring.redis.port}")
    private int port;

	// Redis 연결
	@Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

	// Redis 접근.. 명령
	@Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }   
    
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("JSESSIONID"); // 커스텀 가능
        serializer.setCookiePath("/");
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
        // serializer.setCookieMaxAge(10); // -1 은 브라우저 생명주기, 초 기준
        return serializer;
    }    
}

RedisConnectionFactory 는 Redis 서버에 연결을 생성하고 관리하는 데 필요한 모든 기능을 제공하는 인터페이스다.
인터페이스의 구현체인 LettuceConnectionFactory Lettuce라는 Redis 클라이언트 라이브러리를 이용해 Redis 서버에 연결한다.

@Value 를 이용하면 설정파일의 데이터를 가져올 수 있다.

cookieSerializer()를 이용해 클라이언트에게 쿠키를 반환한다. 사용자는 쿠키를 브라우저에 저장하고 브라우저를 끄거나 컴퓨터가 종료되어도 쿠키를 삭제하거나 시간이 만료되지 않는한 쿠키는 유지되어 다음 요청시 쿠키를 헤더에 넣어 서버로 요청을 보내게 된다.
서버에서는 세션정보가 필요할때마다 Redis에서 조회를 하기 때문에 어떤 ec2서버로 포트포워딩이 되더라도 세션은 유지가 된다.

redis 세션 (user)

@Getter
@Setter
@RedisHash("users")
public class Users implements Serializable{
	
	@Id
	private Integer id;
	private String username;
	private String password;
	private String email;
	private Timestamp createdAt;
	
	public Users(String username, String password, String email) {
		this.username = username;
		this.password = password;
		this.email = email;
	}
}

RedisHash 와 해시데이터

@RedisHash("users") 는 Redis와 상호작용하기 위한 어노테이션이다.
Users객체가 Redis에 저장될 때 해시데이터 형태로 저장된다.

해시데이터는 Key-Value형태를 의미하며 해시테이블 데이터 구조를 이용한다.
해시테이블은 배열과 해시함수를 사용해 데이터를 저장하고 검색하는데 해시함수는 고정된 크기로 배열의 인덱스에 매핑되므로 O(1)시간의 빠른 검색이 가능하다.
해시데이터로 저장되므로 앞서 말했든 다양한 유형의 데이터를 Key-Value에 저장할 수 있다.
해시데이터는 인덱싱, 캐시 메모리, 암호화 기법, 데이터 구조의 구현 등에 사용된다.
해시데이터는 Key-Value형태의 의 효율적인 저장과 검색을 제공하여 데이터의 처리 속도와 성능을 향상시킨다.

Redis와는 바이트배열을 저장하므로 직렬화가 필요하다.

서비스 레이어

로그인 하거나 로그아웃을 했을때 redis에서 세션을 주입하거나 삭제하는등의 방법

	// 로그인 관련
    public void login(User user) {
        redisTemplate.opsForValue().set(USER_KEY_PREFIX + user.getId(), user);
    }

    public void logout(String userId) {
        redisTemplate.delete(USER_KEY_PREFIX + userId);
    }

    public User getUser(String userId) {
        return (User) redisTemplate.opsForValue().get(USER_KEY_PREFIX + userId);
    }
    // 또는 데이터 관련
    public void save(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void delete(String key) {
        redisTemplate.delete(key);
    }

또는 Spring Session이 Redis와의 연동을 관리하기 때문에

session.invalidate()

위 코드를 이용해 세션을 제거하면 연동이 되어 Redis에서도 세션이 제거 된다.
하지만 로그인 정보 외에 Redis에 저장된 데이터를 제거하기 위해서는 redisTemplate.delete를 이용해야 한다.

아래 코드를 이용해서 클라이언트의 특정한 정보만 제거하도록 할수도 있다.

session.removeAttribute()

Redis-cli

간략하게 몇개만 적음

접속

# redis-cli -h [접속 IP] -p [포트] -a [패스워드]
redis-cli -h 127.0.0.1 -p 6379 -a foobared

set / get / 삭제 / 전부 삭제

SET [Key] [Value]
GET [Key]
DEL [Key]
FLUSHALL

전체 조회

KEYS *
profile
작은것부터

0개의 댓글