이 방법은 작은 규모의 데이터베이스의 경우 간단하게 적용 가능한 방법이다. 조회한 데이터를 메모리에 올리고 간단한 캐싱 처리나 lazy load 등을 적용하면 된다. 그러나 100만 건 이상의 데이터를 조회하는 경우 메모리 이슈가 발생하게 된다. 그럴 경우 애플리케이션 서버와 분리된 캐싱 서버(Redis)를 활용하면 되는데, 단순한 일회성 조회 처리를 원하는 경우 캐싱 서버를 활용하는 것은 적합하지 않다.
페이징 처리를 통해 적당한 수의 데이터를 쪼개서 페이징 처리하는 방법이 있다. Spring Data 가 지원하고 있기 때문에 JpaRepository
상속을 통해 간단히 적용할 수 있다. 하지만 페이징 처리 시 count 조회 쿼리가 매번 일어나기 때문에 성능 이슈가 발생할 수 있다. 이를 해결하기 위해 return type 을 Slice 로 변경하면 되는데, 시간이 흐르면서 더욱 많은 데이터가 쌓이는데, 페이징 처리는 대용량 데이터베이스에는 느린 처리 속도를 보이기 때문에 좋은 선택은 아니다.
Spark 는 탄력적이고 고가용성이 특징이다. 한 번 설정하고 나면 시스템 내에서 대용량 처리를 수월하게 할 수 있다. 하지만 Spark 를 설정하고 동작하는 방법에 대한 러닝커브가 필요하기 때문에 정말 필요한 대규모의 시스템이 아니라면 적용하기 어려울 수 있다.
@Entity
@Getter
@NoArgsConstructor @AllArgsConstructor
public class Product {
@Id @GeneratedValue
private Long id;
private String name;
@Builder
public Product(String name) {
this.name = name;
}
}
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("select p from Product p")
Stream<Product> streamAll();
}