현실세계의 요구사항을 실제 현업해서 어떻게 코드로 만들어 내는지에 대한 사고 과정을 한번 적어보려고 해.
먼저 데이터베이스에서 랜덤하게 자료들을 뽑아오고 싶다고 가정하자.
이 경우에 제일 손쉽게 처리할 수 있는 방법은 mysql 기준으로 order by rand()를 꼬리에 붙이는거야. 그럼 매 쿼리마다 순서가 랜덤해질테고 내가 가져오고 싶은 개수만큼만 limit를 붙이면 되니까 간단하지. 이게 토이 프로젝트 수준이라면 이렇게만 하면 돼. 근데 실무에서는 이런 코드는 거의 안쓰여.
왜? 느리니까.
예를 들어 테이블에 데이터가 10만개가 쌓였다고 하면 한번 쿼리할때마다 디비는 rand 함수를 10만번 호출해. 최악이지.
요구사항을 좀더 좁혀서 랜덤하게 단 하나만 가져오면 된다고 가정을 해보자.
그럼 이때는 아래처럼 하면 쉽게 풀려. (pseudocode)
count = query("select count(*) from table")
random_index = rand(0, count-1)
return query("select * from table limit , 1")
쿼리를 두번하는게 단점이긴 한데 데이터가 많은 경우에는 order by rand() 보다 훨씬 빠르게 처리되지.
근데 가져와야 되는 데이터가 하나 이상이라면?
거기다가 설상가상으로 확률적으로 특정 데이터 타입들을 필터링해야한다면?
사용자와 관련해서 개인화 추천이 들어가야 한다면?
생각보다 이런 요구사항은 흔한데 이런 경우에는 rdb로 처리하면 안돼. 애초에 저렇게 계산이 복잡한 로직을 매 요청마다 처리하게끔 구성하면 시스템이 터져나가겠지.
이럴땐 보통 "미리 랜덤하게, 확률 반영하고, 개인화 반영해서 딱 한번만 계산"한 이후에 그 계산된 결과들을 캐싱해놓고 캐싱된결과들중에 랜덤하게 골라주는 식으로 구성해. 그리고 주기적으로 캐싱 데이터들을 교체해주고.
캐싱은 머 memcached를 쓸 수도 있고, redis를 쓸 수도 있고, 직접 메모리에 들고 있을 수도 있고.
먼저 데이터베이스에서 랜덤하게 자료들을 뽑아오고 싶다고 가정하자.
이 경우에 제일 손쉽게 처리할 수 있는 방법은 mysql 기준으로 order by rand()를 꼬리에 붙이는거야. 그럼 매 쿼리마다 순서가 랜덤해질테고 내가 가져오고 싶은 개수만큼만 limit를 붙이면 되니까 간단하지. 이게 토이 프로젝트 수준이라면 이렇게만 하면 돼. 근데 실무에서는 이런 코드는 거의 안쓰여.
왜? 느리니까.
예를 들어 테이블에 데이터가 10만개가 쌓였다고 하면 한번 쿼리할때마다 디비는 rand 함수를 10만번 호출해. 최악이지.
요구사항을 좀더 좁혀서 랜덤하게 단 하나만 가져오면 된다고 가정을 해보자.
그럼 이때는 아래처럼 하면 쉽게 풀려. (pseudocode)
count = query("select count(*) from table")
random_index = rand(0, count-1)
return query("select * from table limit , 1")
쿼리를 두번하는게 단점이긴 한데 데이터가 많은 경우에는 order by rand() 보다 훨씬 빠르게 처리되지.
근데 가져와야 되는 데이터가 하나 이상이라면?
거기다가 설상가상으로 확률적으로 특정 데이터 타입들을 필터링해야한다면?
사용자와 관련해서 개인화 추천이 들어가야 한다면?
생각보다 이런 요구사항은 흔한데 이런 경우에는 rdb로 처리하면 안돼. 애초에 저렇게 계산이 복잡한 로직을 매 요청마다 처리하게끔 구성하면 시스템이 터져나가겠지.
이럴땐 보통 "미리 랜덤하게, 확률 반영하고, 개인화 반영해서 딱 한번만 계산"한 이후에 그 계산된 결과들을 캐싱해놓고 캐싱된결과들중에 랜덤하게 골라주는 식으로 구성해. 그리고 주기적으로 캐싱 데이터들을 교체해주고.
캐싱은 머 memcached를 쓸 수도 있고, redis를 쓸 수도 있고, 직접 메모리에 들고 있을 수도 있고.
- dc official App
댓글 0