들어가기 전

글의 순서는 Docker-Compose로 Redis 세팅하고 Spring에서 세팅된 Redis에 대한 설정을 한 뒤 Session을 이용해서 로그인하는 순서대로 설명하겠습니다.

 

 Docker-Compose로 Redis 세팅

docker-compse.yml 파일을 만들어서 아래와 같이 설정을 해줍니다.

 

version : "3"
services :
  redis:
    image: redis:latest
    container_name: redis
    hostname: test
    ports:
      - "6379:6379"

 

  • image : redis 이미지를 내려받습니다. 여기서 latest는 최신버전을 뜻합니다. 즉 최신버전 redis를 이미지로 내려받습니다.
  • container_name : 다운받은 redis image를 run 시키면 redis에 대한 container가 실행이 되는데 해당 container에 대한 이름을 설정하는 것입니다.
  • ports : "6379:6379"에서 앞 6379는 사용자가 redis에 접근할 포트번호이고 뒤 6379는 redis 포트번호입니다.

 

설정을 다 했으면 docker-compose.yml파일이 있는 프로젝트 디렉터리로 들어가서 아래와 같이 명령어를 작성합니다.

 

docker-compose up  <-- docker-compose.yml에 정의한 image를 실행시키는 명령어


docker-compose start <-- 컨테이너를 백그라운드에서실행시키는 명령어

 

  • docker-compose up 또는 docker-compose start를 실행시키시면 docker-compose.yml에 작성한 image들을 실행시켜 줍니다.

 

아래와 같은 명령어를 작성을 하면 컨터이너가 실행 중인지 아닌지를 확인할 수 있습니다. 

 

docker ps

 

 

 

 

Spring에 설정

 

application.yml에 아래와 같이 작성하고 build.gradle에 의존성을 추가하면  세팅은 끝이 납니다.

 

application.yml

spring :
  redis:
    host: test
    port: 6379

 

build.gradle

 

implementation 'org.springframework.boot:spring-boot-starter-data-redis' // redis 의존성
implementation 'org.springframework.session:spring-session-data-redis' // 세션을 저장하기 위한 redis의존성

 

 

 

Redis + Session을 이용한 로그인

 

@SpringBootApplication
@EnableRedisHttpSession
public class ProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProjectApplication.class, args);
    }


}
  • @EnableRedisHttpSession를 이용해서 redis 세션을 이용할 수 있게 설정을 해줍니다.

 

 

@Configuration
public class RedisConfig {
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;

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

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);
        return new LettuceConnectionFactory(redisStandaloneConfiguration);
    }

 

  • host와 port는 application.yml에 설정해 놓은 redis 값을 @Value를 통해 가져옵니다.
  • redisTemplate.setKeySerializer(new StringRedisSerializer()), redisTemplate.setValueSerializer(new GenericJackson2 JsonRedisSerializer()) : spring - redis 사이에서 키와 value값을 직렬화하여 읽을 수 있는 형태로 만들어 줍니다.
  • redisConnectionFactory() : Lettuce에 application.yml에 설정해 놓은 port와 host정보를 담아서 redis와 연결을 해줍니다. 이미 존재하는 Connection이 있다면 이미 있는 것을 리턴하고 그렇지 않으면 새로 만든 것을 리턴해줍니다.

 

@RestController
@RequiredArgsConstructor
@Slf4j
public class RedisTestController {

    private final HttpSession session;
    
    
    @PostMapping("/save")
    public void save() {
        session.setAttribute("ID","redisTest");
        session.setMaxInactiveInterval(30);
    }
    
    @GetMapping
    public void showRedisValue() {
        log.info("result = {}", session.getAttribute("ID"));
    }
  • 세션 키값 "ID"에 "redisTest"라는 값을 담아 담아두고 만료시간을 30초로 설정해 둡니다.
  • 세션 키값을 이용해서 "redisTest"을 값을 가져옵니다.

 

세션에 저장된 값이 Redis에 잘 저장되었는지 확인방법

아래와 같은 명령어를 작성을 하면 Redis에 값이 저장되었는지 확인이 가능합니다.

 

1. 도커에서 실행 중인 redis컨테이너에 접속하기

docker exec -it redis bash

 

2. redis에 접속하기

 

redis-cli

 

3. 레디스에 저장된 값들 확인하기

 

keys *

 

 

만약 redis에 아무것도 저장이 안 되어있으면 아래 사진과 같은 메시지가 나옵니다.

 

redis에 저장이 잘 되었다면 아래와 같이 나옵니다.

 

 

아래와 같은 명령어를 작성하면 세션에 대한 정보를 보여줍니다.

 

hkeys "spring:session:sessions:998ad368-4986-4b06-b1f2-948f74095012"

 

 

'Redis' 카테고리의 다른 글

[Redis] 기본 명령어  (0) 2023.07.31
[Redis] Redis 개념 및 특징  (1) 2023.01.27