NeuroWhAI의 잡블로그

[Rust] 구글 애널리틱스에서 페이지별 조회수를 얻는 HTTP API 만들기 성공! 본문

개발 및 공부/라이브러리&프레임워크

[Rust] 구글 애널리틱스에서 페이지별 조회수를 얻는 HTTP API 만들기 성공!

NeuroWhAI 2018. 11. 10. 14:58


이용한 라이브러리는 rocket, google-analytics3, yup-oauth2입니다.

사실 제가 한거라곤 위 라이브러리들 공부한거랑 중간 캐시 로직을 만든 것 뿐이지만요 ㅋㅋ...

보안도 없습니다.


API는 아래처럼 생겼습니다.

http://hostname/pv/{ids}/{page_id}

(참고로 pv는 page view라는 뜻입니다 promotional video 아님)

ids는 "ga:숫자들"형식의 애널리틱스 아이디이며

page_id는 119, 112 등의 블로그에서의 글 주소이자 번호입니다.

티스토리는 번호가 아니라 제목을 주소로 사용할 수도 있어서 그것도 되게끔 하긴 했는데 테스트는 안해봤습니다...

이전 글에서는 자체 DB를 이용할 예정이라고 했는데 일단 구글 애널리틱스 자체를 DB로 쓰고 문제가 있다 싶으면 그때 고치려고 합니당.

응답으론 정보에 해당하는 페이지의 조회수나 에러가 텍스트 형식으로 반환됩니다.


위 API에 해당하는 소스코드를 발췌해봤습니다.

type LockCountCache = Arc<RwLock<CountCache>>;

/*...*/

#[get("/pv/<ids>/<page_id>")]
fn get_pageview(ids: String, page_id: String,
    service: State<Analytics>, cache: State<LockCountCache>) -> String
{
    // 캐시에 유효한 데이터가 있으면 바로 반환.
    {
        let r_cache = cache.read().unwrap();
        
        if let Some(cnt) = r_cache.get(&ids, &page_id, true) {
            return cnt.to_string();
        }
    }

    // API 호출.
    let result = service.get_pageview(&ids, &page_id);

    match result {
        // 캐시 업데이트.
        Ok(data) => {
            let mut w_cache = cache.write().unwrap();
            w_cache.update(&ids, &page_id, data);

            data.to_string()
        },
        Err(err) => {
            // 에러시 캐시의 데이터가 비록 오래 되었더라도
            // 존재만 한다면 그 데이터를 반환.
            {
                let r_cache = cache.read().unwrap();

                if let Some(cnt) = r_cache.get(&ids, &page_id, false) {
                    return cnt.to_string();
                }
            }
            
            // 실패할 API 요청을 계속 보내는 것을 방지하기 위해
            // 임의 데이터를 캐시에 기록.
            let mut w_cache = cache.write().unwrap();
            w_cache.update(&ids, &page_id, 0);

            err
        }
    }
}

헛점이 많이 있는데 일단 티스토리에 적용해보고 되나 함 봐야겠습니다.

풀 소스코드는 완성 후 GitHub에 올릴겁니다.


근데 진짜 구글링 해도 안나오는 문제들 해결하기 참 힘드네요.

레퍼런스 보면서.. 아오 ㅠㅠ



Comments