Springboot 와 Redis 연동

HyunHwa Cho·2022년 10월 27일
0

Spring

목록 보기
1/1

오늘은 스프링부트와 레디스를 연동시켜 회원가입시 이메일인증 기능을 리팩토링 해줬다.

기존 이메일중복 인증 방식

1.이메일중복체크
2.DB에 중복된 이메일조회
3.중복된 이메일이 없을시 이메일인증번호 발송과 동시에 인증번호 쿠키에 저장
4.전송받은 이메일의 인증번호와 쿠키의 인증번호 대조 후 중복확인

리팩토링 후 이메일중복 인증 방식

1.이메일중복체크
2.DB에 중복된 이메일조회
3.중복된 이메일이 없을시 이메일인증번호 발송과 Redis에 키+값으로 저장
4.Redis의 키값과 입력된 인증번호값을 대조 후 중복확인



brew install redis //레디스설치
brew services stop redis // 레디스서버중지
brew services start redis // 레디스서버실행
redis-cli //레디스 cli 사용
keys * //저장된 키들 조회
set {key} {value} // key와 value저장
get {key} // key값으로 value 조회
del {key} // key값으로 key-value 삭제

이정도가 기본적인 레디스 명령어이다.



application.yml

spring:
  redis:
    pool:
      min-idle: 0 //pool에서 관리하는 idle 커넥션 최소 수
      max-idle: 8 //pool의 idle 커넥션 최대수
      max-active: 8   //pool에 할당될 수 있는 커넥션 최대수
    port: 6379   //레디스 포트넘버
    host: 127.0.0.1 //로컬에서 실행시 ip

기본 redis 설정이다.
레디스는 기본적으로 6379포트를 사용한다.
pool의 connection과 idle에 대해서는 기본적으로 접속자가 몰릴경우에 해당하는 경우 효과적으로 처리하는 방식정도로 알고있으며 추후에 공부 할 예정이다.

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

레디스의 Gradle 디펜던시




레디스 Config로 레디스와 스프링부트의 여러 연동방법이 존재하지만 Template방식을 채택하였다.

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

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

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

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());  //레디스템플릿과 팩토리 연결
        redisTemplate.setKeySerializer(new StringRedisSerializer()); //레디스템플릿의 키값을 직렬화(레디스에 저장하기위해)
        redisTemplate.setValueSerializer(new StringRedisSerializer()); //레디스템플릿의 밸류값을 직렬화(레디스에 저장하기위해)
        return redisTemplate;
    }
}


Redis 서비스 코드 -> 간단하게 스트링의 해쉬맵 값으로 키 밸류를 가지며 키,값 생성 / 키입력시 값 리턴 으로 메서드를 작성하였다.

@Service
@RequiredArgsConstructor
public class RedisService {

    private final RedisTemplate redisTemplate;

    public void setValues(String key, String value){
        ValueOperations<String, String> values = redisTemplate.opsForValue();
        values.set(key, value);
//        values.set(key, value, Duration.ofMinutes(1));
    }

    public String getValues(String key){
        ValueOperations<String, String> values = redisTemplate.opsForValue();
        return values.get(key);
    }

}


다음은 이메일로 전송받은 인증번호 인증 메서드이다.
redis에 저장된 인증번호와 유저가 입력된 인증번호가 일치할 경우 true 다를경우 false를 반환한다.

   public boolean checkKey(MailDto.AuthEmail mailDto){
        String storigeKey = redisService.getValues(mailDto.getEmail());
        if(mailDto.getCreateKey().equals(storigeKey)){
            return true;
        } else return false;
    }

이상으로 redis를 이용한 리팩토링 블로그를 마칩니다.

추후에는 Jwt토큰에 Redis를 이용하여 RefreshToken 적용 및 Docker를 이용하여 WAS와 Redis를 함께 배포 해볼 예정이다. :)

profile
개발 공부 및 기록용 블로그 입니다.

0개의 댓글