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 |