728x90
Redis Cache 사용 구조
① Client가 Server로 요청을 한다.
② Cache된 Data가 있으면, Redis의 Cache Data를 사용한다.
③ Data가 없다면, DB Data를 사용한다.
④ DB에서 가져온 Data를 Redis Cache에 저장한다.
Spring Boot 사용
Redis Cache 사용을 위한 Spring Boot @Annotation
@Annotation | 설 명 |
@EnableCaching | - Spring Boot에게 캐싱 기능이 필요하다고 전달 - Spring Boot Starter Class에 적용 |
@Cacheable | - DB에서 App으로 데이터를 가져오고 Cache에 저장하는데 사용 - DB에서 데이터를 가져오는 메서드에 적용 |
@CachePut | - DB의 데이터 업데이트가 있을 때 Redis Cache에 데이터를 업데이트 - DB에서 PUT/PATCH와 같은 업데이트에서 사용 |
@CacheEvict | - DB의 데이터 삭제가 있을 때 Redis Cache에 데이터를 삭제 - DB에서 Delete와 같은 삭제에서 사용 |
Spring Boot 설정
- Spring Boot Starter Class에 Redis Cache 사용 설정
@SpringBootApplication
@EnableCaching
public class DemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
return builder.sources(DemoApplication.class);
}
}
- application.properties 설정
### database
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://${DB_IP_주소}/hfi
spring.datasource.username=${DB_ID}
spring.datasource.password==${DB_PASSWORD}
### jpa
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.cache.type=redis
spring.cache.redis.cache-null-values=true
…
ConfigClass 설정
- Redis 연결 정보 설정
- Redis CacheManager 설정
@Configuration
@EnableCaching
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
public RedisConfig() {
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration conf = new RedisStandaloneConfiguration();
conf.setHostName(this.host);
conf.setPort(this.port);
return new LettuceConnectionFactory(conf);
}
@Bean
public CacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration conf = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory).cacheDefaults(conf).build();
}
}
Domain 모델 설정
- DB Table 기준으로 모델 작성
- Table 이름 명시
@Data
@Entity
@Table(name = "userinfo")
public class Userinfo {
@Id
private String emailaddress;
private String zipcode;
private String zipaddress;
private String detailaddress;
private Timestamp regdate;
private Timestamp unregdate;
private String statuscd;
(생략)…
}
Repository 설정
- JpaRepository 상속받아서 생성
- emailladdress를 통해 Userinfo를 얻어오는 메서드 생성
@Repository
public interface RedisUserRepository extends JpaRepository<Userinfo, String> {
Optional<Userinfo> findByEmailaddress(String emailaddress);
}
Service 설정
- eamiladdress를 통해 사용자 정보를 조회하는 서비스 생성
@Service
public class RedisService {
@Autowired
private RedisUserRepository redisUserRepository;
public RedisService() {
}
@Cacheable(value = {"Userinfo"}, key = "#emailaddress", cacheManager = "redisCacheManager")
public Userinfo getUser(String emailaddress) {
return (Userinfo)this.redisUserRepository.findByEmailaddress(emailaddress).get();
}
@CacheEvict(value = {"Userinfo"}, key = "#emailaddress", cacheManager = "redisCacheManager")
public void deleteUser(String emailaddress) {
Userinfo userinfo = (Userinfo)this.redisUserRepository.findByEmailaddress(emailaddress).get();
this.redisUserRepository.delete(userinfo);
}
}
Controller 설정
- http 호출 TEST를 위한 컨트롤러 작성
@RestController
@RequestMapping("/member")
public class RedisController {
@Autowired
RedisService redisService;
@GetMapping("/{emailaddress}")
public Userinfo getUser(@PathVariable String emailaddress){
return redisService.getUser(emailaddress);
}
@DeleteMapping("/{emailaddress}")
public String deleteUser(@PathVariable String emailaddress){
redisService.deleteUser(emailaddress);
return "User with eamiladdress : " + emailaddress + "deleted.";
}
}
TEST 시나리오 및 결과
1. http 호출 (http://127.0.0.1:7071/member/20002@tmaxsoft.co.kr)
2. 첫 호출시 Redis Cache에 데이터가 없기 때문에 DB에서 쿼리 조회 로그 확인 됨
3. 두번 째 호출 부터는 App 로그에서 쿼리 로깅이 되지 않음 (Redis로부터 Cache 데이터를 가져오기 때문에)
4. Redis에 저장된 데이터 확인
728x90
'DataBase > Redis' 카테고리의 다른 글
[Redis]기능 TEST THREADED I/O (0) | 2023.08.07 |
---|---|
[Redis]기능 TEST CLIENTS (0) | 2023.08.07 |
Redis Spring 연동 및 사용 (0) | 2023.07.20 |
Redis 설정(Security, Client, Memory) (0) | 2023.07.20 |
Redis 데이터 관리 (0) | 2023.07.19 |