
CrudRepository와 JpaRepository는 Spring Data JPA에서
데이터베이스와 상호작용하기 위해 제공하는 두 가지 인터페이스라는것을 학습하면서
두 인터페이스 차이점을 이번 포스팅 하면서 통해서 정리하게 되었습니다.
기본적인 CRUD(Create, Read, Update, Delete) 작업을 위한 메서드를 제공합니다.
JPA 구현에 대한 세부 사항을 몰라도 기본적인 데이터 조작이 가능합니다.
성능: 일반적으로 JpaRepository가 더 많은 기능을 제공하므로, 복잡한 데이터 조작이 필요한 경우 더 효율적일 수 있습니다.
그러나 단순한 CRUD 작업만 필요할 경우 CrudRepository도 충분합니다.
대용량 기반의 사이트: Redis와 Kafka를 사용하여 대량의 트래픽을 처리하는 시스템에서는 데이터 액세스의 효율성이 중요합니다.
Redis: 빠른 캐싱을 통해 데이터베이스의 부하를 줄이고 응답 속도를 높일 수 있습니다.
Kafka: 비동기 처리 및 메시징을 통해 시스템 간의 데이터 전송을 효율적으로 관리할 수 있습니다.
아래는 JpaRepository를 사용하는 코드입니다.
데이터베이스와 상호작용하고 Redis 및 Kafka와 통합하는 방법을 보여줍니다.
@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 패턴 등
}
public interface VideoRepository extends JpaRepository<Video, String> {
List<Video> findByChannelId(String channelId);
}
@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;
}
}
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;
}
}
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는 비동기 처리 및 메시징을 통해
시스템의 확장성을 지원하는것을 학습하는 계기가되었습니다.