Redis와 Kafka의 통합

CrudRepository와 JpaRepository는 Spring Data JPA에서
데이터베이스와 상호작용하기 위해 제공하는 두 가지 인터페이스라는것을 학습하면서
두 인터페이스 차이점을 이번 포스팅 하면서 통해서 정리하게 되었습니다.

1. CrudRepository와 JpaRepository의 차이점

CrudRepository

  • 기본적인 CRUD(Create, Read, Update, Delete) 작업을 위한 메서드를 제공합니다.

    • 예: save(), findById(), findAll(), deleteById() 등.
  • JPA 구현에 대한 세부 사항을 몰라도 기본적인 데이터 조작이 가능합니다.

JpaRepository

  • CrudRepository를 상속받아 더 많은 기능을 제공합니다.
  • 페이지네이션, 정렬 및 JPA 관련 기능을 지원합니다.
    • 예: findAll(Pageable pageable), findAll(Sort sort) 등.
  • JPQL (Java Persistence Query Language) 및 Criteria API를 사용하여 더 복잡한 쿼리 를 작성할 수 있습니다.
  • JPA와의 통합이 더 잘 되어 있으며, 데이터베이스와의 상호작용에서 더 많은 기능을 필요로 하는 경우에 적합합니다.

2. 성능 및 효율성

  • 성능: 일반적으로 JpaRepository가 더 많은 기능을 제공하므로, 복잡한 데이터 조작이 필요한 경우 더 효율적일 수 있습니다.
    그러나 단순한 CRUD 작업만 필요할 경우 CrudRepository도 충분합니다.

  • 대용량 기반의 사이트: Redis와 Kafka를 사용하여 대량의 트래픽을 처리하는 시스템에서는 데이터 액세스의 효율성이 중요합니다.

    • Redis: 빠른 캐싱을 통해 데이터베이스의 부하를 줄이고 응답 속도를 높일 수 있습니다.

    • Kafka: 비동기 처리 및 메시징을 통해 시스템 간의 데이터 전송을 효율적으로 관리할 수 있습니다.

3. 코드

아래는 JpaRepository를 사용하는 코드입니다.

데이터베이스와 상호작용하고 Redis 및 Kafka와 통합하는 방법을 보여줍니다.

1. Entity 클래스

@Entity
@Table(name = "videos")
public class Video {
    @Id
    private String id;
    private String title;
    private String description;
    private String thumbnailUrl;
    private String channelId;
    private LocalDateTime publishedAt;

    // Getters, Setters, Builder 패턴 등
}

2. JPA Repository

public interface VideoRepository extends JpaRepository<Video, String> {
    List<Video> findByChannelId(String channelId);
}

3.Service 클래스

@Service
public class VideoService {
    private final VideoRepository videoRepository;
    private final RedisTemplate<String, Video> redisTemplate;
    private final KafkaTemplate<String, Video> kafkaTemplate;

    public VideoService(VideoRepository videoRepository, RedisTemplate<String, Video> redisTemplate, KafkaTemplate<String, Video> kafkaTemplate) {
        this.videoRepository = videoRepository;
        this.redisTemplate = redisTemplate;
        this.kafkaTemplate = kafkaTemplate;
    }

    public Video createVideo(Video video) {
        // 비디오를 데이터베이스에 저장
        videoRepository.save(video);

        // 비디오 정보를 Redis에 캐시
        redisTemplate.opsForValue().set(video.getId(), video);

        // Kafka에 메시지 발송
        kafkaTemplate.send("video-topic", video);

        return video;
    }

    public Video getVideo(String videoId) {
        // Redis에서 캐시된 비디오 조회
        Video video = redisTemplate.opsForValue().get(videoId);
        if (video == null) {
            // Redis에 없으면 데이터베이스에서 조회
            video = videoRepository.findById(videoId).orElseThrow(() -> new VideoNotFoundException(videoId));
            // 조회한 비디오를 Redis에 캐시
            redisTemplate.opsForValue().set(videoId, video);
        }
        return video;
    }
}

4. Redis 설정

RedisTemplate을 사용하여 Redis에 데이터를 저장하고 조회하는 방법을 보여주고 있습니다.

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Video> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Video> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        return template;
    }
}

5. Kafka 설정

KafkaTemplate을 사용하여 비디오 생성 시 Kafka에 메시지를 전송합니다.

@Configuration
public class KafkaConfig {
    @Bean
    public ProducerFactory<String, Video> producerFactory() {
        Map<String, Object> config = new HashMap<>();
        config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, VideoSerializer.class);
        return new DefaultKafkaProducerFactory<>(config);
    }

    @Bean
    public KafkaTemplate<String, Video> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }
}

결론

  • CrudRepository와 JpaRepository는 기본적인 CRUD 작업을 위한 인터페이스입니다.
    일반적으로 JpaRepository가 더 많은 기능을 제공하는것을 학습하게되었습니다.

  • 대용량 트래픽을 처리하는 사이트에서는 Redis와 Kafka를 활용하여
    성능을 극대화할 수 있습니다.

  • Redis는 빠른 데이터 액세스를 제공하고, Kafka는 비동기 처리 및 메시징을 통해
    시스템의 확장성을 지원하는것을 학습하는 계기가되었습니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글