win-j의 자유로운 블로그

개발일지 - 관리자 모드에서 통계 만들기

개발일지 · 2026.03.12 · 조회 2


이번에는 관리자 모드를 만들고 있습니다.




이전에 방문자 통계를 하는 기능을 추가 했는데 아직 글도 없고 아무것도 없는 블로그에 방문자가 하루에 100명이 넘게 들어오는데?? 티스토리에 글이 엄청 많아도 계속 방치하니 하루에 몇 십명 들어오는게 고작인데 이런 사이트에 누가 들어오는건지 궁금해서 우선 관리자 모드를 먼저 만들어보기로 했습니다.


관리자 모드도 최대한 티스토리 관리자 모드와 유사한 형태로 만들고 싶어서 우선 대략적인 틀만 만들고 나중에 세부 기능들을 추가할 때 마다 조금씩 손을 볼 예정입니다.


image.png



블로그 관리자 홈에서는 티스토리처럼 오늘 방문자, 어제 방문자, 전체 방문자를 한 눈에 볼 수 있도록 만들었고 chart.js를 활용해서 방문자수를 보여주는 그래프를 만들어서 표기 했습니다.


왼쪽에는 기능 구현에 필요한 글 관리, 카테고리 관리, 댓글 관리, 방문 통계, 설정을 미리 만들어두었는데 오늘은 먼저 방문 통계 쪽을 살짝 만들었습니다.


image.png



우선 "방문 통계" 부분을 먼저 구현하려고 했습니다. 이유는 방문자가 왜 이렇게 많을까? 웹을 크롤링 하는 봇이라는 것을 알고 있더라도 그래도 한 번 확인해보고 싶어서 기능을 만들게 되었습니다.


유입 채널은 - 방문자 수 통계를 위해 만들어 둔 정보에서 유입 경로를 확인하는 referer 필드에서 정보를 가지고 왔습니다.


if not referer:
    return "Direct"referer = referer.lower()

# 검색엔진search_engines = [
    "google",
    "naver",
    "daum",
    "bing",
    "yahoo"]

# SNSsocial_sites = [
    "facebook",
    "twitter",
    "instagram",
    "t.co",
    "youtube",
    "linkedin",
    "threads"]

for s in search_engines:
    if s in referer:
        return "Search"for s in social_sites:
    if s in referer:
        return "Social"return "Referral"


구글, 네이버, 다음 처럼 검색 엔진으로 들어왔는지 아니면 페이스북, 트위터, 인스타그램 같은 SNS에서 들어왔는지 직접 다이렉트로 들어왔는지 먼저 분류작업을 합니다.



channels = []

for v in visits:
    channel = classify_channel(v.referer)
    channels.append(channel)

channel_counts = dict(Counter(channels))


오늘 날짜로 들어온 유입 경로가 몇건인지 반복문을 통해서 channels 변수에 저장하고

<section class="panel">
    <h3>유입 채널</h3>   
        <ul>
            {% for channel, count in channel_counts.items %}
            <li> {{ channel }} : {{ count }} </li>        
            {% endfor %}
        </ul>
</section>


해당 내용을 뿌려주는 것으로 방문 유입을 확인 할 수 있는 기능을 만들었습니다.




#디바이스 나누기
def classify_device(user_agent):
    ua = user_agent.lower()

    if "mobile" in ua:
        return "Mobile"    elif "tablet" in ua or "ipad" in ua:
        return "Tablet"    else:
        return "Desktop"


디바이스 또한 들어온 user_agent 필드의 정보가 Mobile, tablet, Desktop 의 정보를 나누고 어떤 디바이스에서 접속을 했는지 구분을 먼저 해주었습니다.


#디바이스

devices = []

for v in visits:
    device = classify_device(v.user_agent)
    devices.append(device)

device_counts = dict(Counter(devices))


이렇게 나누어진 디바이스 정보가 각각 몇건씩 들어왔는지 나눠서 저장하고 HTML쪽에서 뿌려주는 작업을 했습니다.


<section class="panel">    
    <h3>디바이스</h3>    
        <ul>        
        {% for device, count in device_counts.items %}
            <li>{{ device }}   :  {{ count }}</li>        
        {% empty %}
            <li>방문 디바이스가 없습니다.</li>        
        {% endfor %}
        </ul>
</section>


여기서 이제 봇을 처리하는 기능을 추가로 만들어야 방문자 통계가 어느정도 확실하게 줄어들 것 같습니다.