MS-SQL Server

블로그의 "일간 방문자수 보여주기" 구현 사례

임현수 2010. 12. 15. 06:17


이 글을 작성한 목적은 일정 기간동안 컬럼의 값을 증가시키다가 일정기간마다 초기화가 필요한 경우에 활용하면 좋을 듯 하여
블로그 일간 방문자수 보여주기 기능을 사례로 들어서 테스트해 본 것입니다.

원활한 테스트를 위해서 “일간 방문자수 보여주기” 기능에 대한 정의는 아래와 같이 단순화하겠습니다.
    1. 임의의 사용자가 블로그에 방문하면 일간 방문자수를 +1 증감시켜준다.
    2. 날짜가 변경되면 일간 방문자수를 0으로 초기화되며, 새로 방문자가 올 경우 1로 보여준다.
    3. 이전날짜의 방문자수를 따로 보여주지 않는다.

제가 생각해 본 이 방식의 장점은 아래와 같습니다.
    1. 매일 0시에 대량의 업데이트를 할 필요가 없다.
    2. 접근이 없는 블로그에 대해서는 불필요한 업데이트를 하지 않아도 된다.
   3. 웹서비스의 경우 불특정 다수를 상대로 서비스하기 때문에, 사용자가 많아짐에 따라서 순간적인 병목이 발생할 수 있는데요.
      필요한 경우에만 데이터를 업데이트 함으로써 부하를 분산할 수 있습니다.

그럼 이제 테스트를 진행하도록 하겠습니다.

use
tempdb

go

 

-- @@ 예제 테이블 생성 및 데이터 추가

drop table BlogMainTable

create table BlogMainTable (

       blogId          varchar(50)         -- 블로그이름

,      VisitorCount    int                 -- 오늘 블로그에 방문한 방문자수

,      lastModified    datetime            -- 블로그 최종데이터 변경일자

)

 

insert into BlogMainTable values ( 'Blog_01', 5, getdate() - 1 )  -- 어제 50명이 방문하고 오늘 방문자가 없는 블로그

insert into BlogMainTable values ( 'Blog_02', 10, getdate())      -- 오늘 10명이 방문한 블로그

 

 

-- @@ 어제 방문자가 5명이였고, 오늘 방문자가 없는 블로그 조회 쿼리

select

       blogId

,      VisitorCount as VisitorCount_real

,      case

             when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) < DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then 1                      -- 최종변경일시가 어제라면 1을 보여줌

             when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) = DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then VisitorCount           -- 최종변경일시가 오늘이면 +1된 건수를 보여줌

             else 0

       end as VisitorCount_view

,      lastModified

from BlogMainTable

where blogId = 'Blog_01'







-- @@  오늘 10명이 방문한 블로그

select

       blogId

,      VisitorCount as VisitorCount_real

,      case

             when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) < DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then 1                      -- 최종변경일시가 어제라면 1을 보여줌

             when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) = DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then VisitorCount           -- 최종변경일시가 오늘이면 +1된 건수를 보여줌

             else 0

       end as VisitorCount_view

,      lastModified

from BlogMainTable

where blogId = 'Blog_02'







-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-- @@ 실제 적용시에는 업데이트와 조회를 한방에 처리하면 좀 더 비용을 절감할 수 있습니다.
-- @@ 업데이트와 조회를 한번에 처리하는 예제는 아래와 같습니다.


declare

       @blogId                   varchar(50)

,      @VisitorCount_before       int = 0

,      @VisitorCount_view         int = 0

,      @lastModified              datetime

 

-- 현재 테이블에 저장된 데이터 확인

select * from BlogMainTable where blogId = 'Blog_01'






--
데이터 변경하기

update bm

set

       @blogId = blogId

,      @VisitorCount_view = VisitorCount = case

                                              when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) < DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then 1                      -- 지난달의 기록이면 노출

                                              when DATEADD( day, DATEDIFF(day, 0, lastModified), 0) = DATEADD( day, DATEDIFF(day, 0, GETDATE()), 0) then VisitorCount + 1       -- 이번달의 Sum이면 합계금액 노출

                                              else 0

                                           end

,      @lastModified = lastModified = getdate()

from BlogMainTable as bm

where blogId = 'Blog_01'

 

-- 업데이트된 결과 확인(Blog_01의 경우 어제일자이므로 1로 변경됨)

select @blogId as blogId , @VisitorCount_view as VisitorCount_view, @lastModified as lastModified