본문 바로가기
스프링 부트3

스프링 부트 3와 Redis 통합

by 굿센스굿 2024. 12. 5.
반응형

 

스프링 부트 3는 효율적인 애플리케이션 개발을 위해 다양한 기능과 유연한 구조를 제공하며, Redis는 데이터 캐싱, 메시지 브로커, 세션 저장 등에서 강력한 성능을 자랑하는 인메모리 데이터 저장소입니다. 두 기술을 결합하면 애플리케이션의 성능과 확장성이 크게 향상됩니다. 이번 글에서는 스프링 부트 3Redis를 통합하는 방법을 상세히 설명하고, 실용적인 예제 3가지를 통해 이해를 돕겠습니다.


1. Redis란 무엇인가?

Redis는 Remote Dictionary Server의 약자로, 키-값 구조로 데이터를 저장하는 인메모리 데이터베이스입니다.

Redis의 주요 특징

  • 빠른 속도: 메모리에 데이터를 저장하므로 읽기 및 쓰기 속도가 매우 빠릅니다.
  • 다양한 데이터 구조 지원: 문자열, 리스트, 해시, 셋, 정렬된 셋 등 다양한 데이터 타입을 저장할 수 있습니다.
  • 지속성 지원: 필요에 따라 데이터를 디스크에 저장하여 복구 가능.
  • 다양한 활용 사례: 캐싱, 세션 관리, 메시지 큐 등.

2. 스프링 부트 3와 Redis의 통합 준비

스프링 부트 3에서 Redis를 통합하려면 다음의 준비 작업이 필요합니다.

2.1 의존성 추가

Spring Initializr 또는 build.gradle 파일에서 Redis 관련 의존성을 추가합니다.

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

2.2 Redis 서버 설정

Redis 서버를 설치하거나 Docker를 이용해 실행합니다.

docker run --name redis -p 6379:6379 -d redis

3. Redis와 스프링 부트 통합 예제

예제 1: RedisTemplate을 이용한 데이터 저장 및 조회

RedisTemplate은 Redis와 상호작용할 수 있는 강력한 도구입니다.

설정

RedisConfig 클래스를 생성하여 RedisTemplate을 설정합니다.

@Configuration
public class RedisConfig {

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

데이터 저장 및 조회

@Service
public class RedisService {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void saveData(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public Object getData(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

테스트

@RestController
@RequestMapping("/redis")
public class RedisController {

    private final RedisService redisService;

    public RedisController(RedisService redisService) {
        this.redisService = redisService;
    }

    @PostMapping("/save")
    public ResponseEntity<String> saveData(@RequestParam String key, @RequestParam String value) {
        redisService.saveData(key, value);
        return ResponseEntity.ok("Data saved successfully");
    }

    @GetMapping("/get")
    public ResponseEntity<Object> getData(@RequestParam String key) {
        return ResponseEntity.ok(redisService.getData(key));
    }
}

예제 2: @Cacheable을 활용한 캐싱

스프링의 캐싱 추상화 기능을 활용하면 Redis를 캐시 저장소로 설정할 수 있습니다.

설정

application.yml 파일에 Redis 캐시 설정을 추가합니다.

spring:
  cache:
    type: redis
  redis:
    host: localhost
    port: 6379

코드 작성

@Service
public class ProductService {

    @Cacheable(value = "products", key = "#id")
    public Product getProductById(Long id) {
        simulateSlowService();
        return new Product(id, "Product " + id);
    }

    private void simulateSlowService() {
        try {
            Thread.sleep(3000); // 느린 서비스 시뮬레이션
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

테스트

@RestController
@RequestMapping("/product")
public class ProductController {

    private final ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @GetMapping("/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.getProductById(id);
    }
}

예제 3: Pub/Sub 기능 구현

Redis의 Pub/Sub 기능을 사용하여 메시징 시스템을 구현할 수 있습니다.

메시지 리스너 설정

@Component
public class RedisMessageSubscriber implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println("Message received: " + new String(message.getBody()));
    }
}

설정 파일 추가

@Configuration
public class PubSubConfig {

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory,
                                                                       RedisMessageSubscriber subscriber) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(subscriber, new ChannelTopic("myTopic"));
        return container;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        return new RedisTemplate<>();
    }
}

메시지 발행

@Service
public class RedisPublisher {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisPublisher(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void publish(String topic, String message) {
        redisTemplate.convertAndSend(topic, message);
    }
}

결론

스프링 부트 3와 Redis를 통합하면 데이터 캐싱, 메시징, 세션 관리를 효율적으로 처리할 수 있습니다.

  1. RedisTemplate으로 데이터를 저장하고 읽는 방법.
  2. @Cacheable로 캐싱을 적용하여 성능을 최적화하는 방법.
  3. Redis Pub/Sub 기능으로 실시간 메시지 전달을 구현하는 방법.

위의 예제들을 활용하여 고성능, 확장성 있는 애플리케이션을 개발해 보세요!

반응형