본문 바로가기
DB/Redis

[Redis] FCM Token Redis에 넣어보기

by persi0815 2024. 7. 8.

 

1. DB에 FCM Token 저장하는 기존 방식

@PostMapping("/generate")
public ApiResponse<JwtDto> tokenToFront(
        @RequestBody UserReqDto userReqDto // email, username, nickname, provider
) {
    // 1. 받은 email 가지고 회원가입 되어있는 사용자인지 판단
    Boolean isMember = userService.checkMemberByEmail(userReqDto.getEmail());

    // 2. jwt 생성
    String accessToken = "";
    String refreshToken = "";

    // 3. 기존 회원인지 판별 -> 튜토리얼 때문
    String signIn = "wasUser";

    if(isMember){ // jwt 재생성 -> 성공
        // user 찾기
        User user = userService.findByEmail(userReqDto.getEmail());
        // jwt 생성
        JwtDto jwt = userService.jwtMakeSave(userReqDto.getUsername());
        // 변수에 저장
        accessToken = jwt.getAccessToken();
        refreshToken = jwt.getRefreshToken();
        // 토큰 저장
        userService.saveFcmToken(user, userReqDto.getDeviceToken());

    } else{ // 회원 가입 이후 jwt 생성 (db 접근 해야함)
        // db에 정보 넣기(= 회원가입)
        User user = userService.createUser(userReqDto);
        // jwt 생성
        JwtDto jwt = userService.jwtMakeSave(userReqDto.getUsername());
        // 변수에 저장
        accessToken = jwt.getAccessToken();
        refreshToken = jwt.getRefreshToken();
        // 토큰 저장
        userService.saveFcmToken(user, userReqDto.getDeviceToken());
        // 회원이 됨
        signIn = "newUser";
    }

    return ApiResponse.onSuccess(SuccessCode.USER_LOGIN_SUCCESS, UserConverter.jwtDto(accessToken, refreshToken, signIn));
}
public void saveFcmToken(User user, String deviceToken){
    user.setDeviceToken(deviceToken);
    userRepository.save(user);
}

 

로직을 보면 알 수 있듯이, 한명의 유저가 하나의 디바이스만을 등록할 수 있었다. 


2. Redis에 FCM Token 저장해보자

Redis에 FCM 토큰을 저장하는 방법은 여러 가지가 있을 수 있지만, 가장 일반적인 방법은 Redis에 Key-Value 형식으로 저장하는 것이다. Spring Data Redis를 사용하여 Redis에 FCM 토큰을 저장해보았다. 

 

1. Spring Data Redis 의존성 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // 다른 의존성들...
}

 

2. Redis 설정 - application.yml 파일에 Redis 연결 설정을 추가

spring:
  data:
    redis:
      host: ${REDIS_HOST} // localhost
      port: ${REDIS_PORT} // 6379

 

3. Redis 구성 클래스

package reborn.backend.global.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
        template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
        return template;
    }
}

 

4. Redis를 사용하여 FCM 토큰 저장

public void saveFcmToken(User user, String deviceToken){
    // Redis에 저장
    redisTemplate.opsForValue().set(user.getEmail() + ":deviceToken", deviceToken);
    // 특정 유저에 대한 여러 디바이스를 저장하고 싶다면, Set 사용
    // redisTemplate.opsForSet().add(user.getEmail() + ":deviceTokens", deviceToken);

    // 기존 DB 저장 로직
    user.setDeviceToken(deviceToken);
    userRepository.save(user);
}

 

redis-cli

keys *

=> terminal에서 확인 가능

'DB > Redis' 카테고리의 다른 글

[Redis] Refresh Token Redis에 넣어보기  (0) 2024.07.08
Redis란? Remote Dictionary Server  (0) 2024.07.08