지금까지 요구 사항에 나온 내용을 작성하였다. 이제는 프로젝트의 성능을 높여볼 것이다.

1. 대용량 데이터 처리


문제 정의

다음날로 넘어갈 때, 모든 Daily의 값을 history에 저장하고 Daily의 오늘 조회수는 0으로 바꾸는 대용량 데이터 처리가 진행된다. 대용량 데이터 처리가 일어나는 경우는 다음 세 가지이다.

  1. 전체 Daily 데이터를 가져올 때
  2. 전체 Daily 데이터를 History 데이터에 저장할 때
  3. 전체 Daily 데이터의 오늘 조회수를 0으로 바꿀 때

현재 코드에서는 2,3에서 각각 데이터 하나 당 하나의 쿼리를 보내고 있어 속도가 저하되는 문제가 발생하였다. 이를 해결하기 위한 방법을 시도하였다.

해결 방안 도출

가장 먼저 생각한 방식은 전체 데이터를 한 번에 읽어오고 한 번에 저장하는 것이다. 하지만, 이런 방식의 경우 데이터가 더 많아지면 메모리 초과가 일어날 수 있을 것이라는 생각이 들었다. 따라서 적당한 수로 데이터를 쪼개어 한번에 불러오고 불러온 만큼 한번에 저장하는 방식을 사용하기로 하였다.

  1. 데이터를 쪼개어 불러오는 방법

→ 우리는 jpa를 사용하고 있기 때문에 페이징을 선택

→ paging에서 성능을 높이기 위해서 반환 형태를 Page가 아닌 List를 사용 (불필요한 page 정보는 반환 x)

  1. 대용량 저장의 경우에는

→ jdbctemplete의 batch update를 이용하여 bulk update를 선택

paging + jdbctemplete batch update

만 개의 데이터를 이용하여 다음날로 넘어가는 경우 작동되는 함수의 실행 시간을 확인해보았다.

  1. 기존 코드의 실행 시간 (전체 불러오기 + jpa saveAll)