머리말#
다들 설 연휴 잘 보내셨나요? 저는 용인에 있는 한국민속촌에 다녀왔는데 정말 즐거웠습니다. 이맘때는 한국에서 특별한 시기이기도 하지만, 마침 키위들이 와이탕이 데이를 기념하는 시기이기도 하거든요!

들어가며#
주한 뉴질랜드 상공회의소(Kiwi Chamber)는 뉴질랜드 공휴일에 맞춰 여러 행사를 엽니다. 다음 차례는 와이탕이 데이입니다. 어느 단체나 마찬가지로, 마케팅과 자연스러운 노출은 “또 오고 싶다"는 이미지를 유지하는 데 꼭 필요합니다. 문제는 많은 단체와 모임이 재방문 손님을 붙잡는 데 늘 애를 먹고, 참석자 물갈이가 심하다는 점입니다.
행사의 성공을 어떻게 잴까#
행사는 본질적으로 사교적인 자리입니다. 현장에서도, 온라인에서도요. 그리고 행사의 성패에는 마케팅이 큰 몫을 합니다. 행사 마케팅이라고 하면 사전 홍보와 기획만 떠올리기 쉽지만, 행사 중과 행사 후의 마케팅도 함께 챙겨야 합니다. 예를 들어 참여도와 만족도는 그 자체로 핵심 성과 지표(KPI)가 될 수 있죠.
중요한 KPI를 꼽자면:#
- 참석자의 행사 참여도
- 소셜 미디어 참여도 - 행사 해시태그를 쓰면 참석자들이 행사에 대해 뭐라고 이야기하는지 소셜 미디어에서 풍부한 데이터를 모을 수 있습니다. 해시태그 말고도, 스폰서와 참석자의 접점을 측정하는 데도 소셜 미디어를 쓸 수 있는데, 스폰서 활성화 프로그램으로 제공했다면 특히 중요합니다.
- 고객 획득 비용(CPA)
- 신규 대 재방문 참석자 - 신규와 재방문 참석자가 균형 있게 유입되고 있는지 보여주는 지표입니다. 시간이 지나면 행사에 흥미를 잃는 사람도 생기고, 어느 정도의 이탈은 잘 되는 비즈니스에서도 자연스러운 일입니다. 하지만 참석자가 거의 전부 신규라면, 뭔가 문제가 있다는 뜻이죠.
눈에 띈 문제#
제가 함께하는 모임들과 직접 다녀본 행사들에서 발견한 문제는, 참석자 상당수가 처음 온 사람들이라는 점입니다. 그리고 교류가 부족하고 아쉬움이 남으니 다음 행사에는 돌아오지 않습니다. 어떤 곳들은 신규 방문자가 끊임없이 유입되는 덕에 겨우 굴러가고 있고요. 주최 측과 참석자 사이에 교류가 거의 없어서 사람들이 불만족스러웠던 걸까요? 아니면 행사가 무엇을 위한 자리인지, 목표가 무엇인지 참석자들에게 제대로 전달되지 않았던 걸까요?
어느 쪽이든 참여에 문제가 있었고, 행사의 취지가 오해받고 있었던 건 분명합니다. 둘째로, 행사 도중에 단체의 활동을 알리려는 노력이 전혀 없었습니다. 자연스러운 노출 기회를 그만큼 날리고 있는 셈이죠. 셋째는 행사장 장비의 활용 부족입니다. 행사장에는 보통 프로젝터가 있어서 초청 연사가 발표하는 동안 자막(한국어와 영어)을 띄우는 데 쓰이는데, 그 뒤로는 행사가 끝날 때까지 그냥 놀고 있습니다. 스마트한 도구로 참석자들과의 접점을 훨씬 늘릴 수 있을 텐데 말이죠.
해결책#
그래서 주최 측과 참석자 사이의 교류를 끌어내는 방법으로, 참석자들의 사진을 모아 프로젝터에 띄워주는 디스플레이를 만들기로 했습니다. 행사에서 뭘 하고 있는지 다른 참석자들에게도, 인스타그램 친구들에게도 보여줄 수 있으니까요!
인스타그램을 활용하면, 평소에 일상을 활발히 공유하는 사용자들은 주최 측과 소통하고 피드백을 남기고, 나아가 Kiwi Chamber 행사의 취지를 친구의 친구에게까지 알릴 도구를 이미 휴대폰에 갖고 있는 셈입니다.
그렇게 해서 #waitangikorea 가 달린 사진을 인스타그램에서 가져오는 작은 웹앱을 만드는 게 제 목표가 되었습니다.

기술 이야기#
프론트엔드#
사용한 도구:#
- Jquery
- HTML
- CSS3
한 페이지짜리 앱이라, 페이지 DOM을 조작하는 역할은 JQuery에 맡겼습니다.
JQuery로 화면 속 이미지 상태를 관리하려고, 사진 칸 수와 같은 크기의 배열을 하나 뒀습니다. 이미지가 화면에 표시될 때마다 그 URL을 배열의 해당 인덱스에 넣어 둡니다. 새 사진을 추가할 때는 같은 이미지가 이미 배열에 있지 않은지 확인해야 하고요. 아래는 제 코드 예시입니다.
var img_on_screen = new Array(number_of_photo_squares);
var post_index = 0;
javascript.js
while (img_on_screen.includes(post_data['img'])) {
if( post_index > post_count - 1 ) {
post_index = 0;
}
post_data = posts[post_index];
post_index = post_index + 1;
}
img_on_screen[curr_index-1] = post_data['img'];
update_img(curr_index, post_data);
}백엔드#
사용한 도구:#
InstaLooter#
InstaLooter는 아이디나 비밀번호 없이 인스타그램 이미지를 긁어올 수 있는 애플리케이션입니다. 내 계정 정보가 인터넷에 새어 나갈 걱정 없이 인스타그램 이미지가 필요할 때 딱입니다.
이 앱을 고른 가장 큰 이유도, 인터넷에 널린 다른 스크래퍼들과 달리 아이디와 비밀번호를 입력할 필요가 없다는 점이었습니다.
scraper.py
print(insta_api)
if insta_api == 1:
subprocess.call("python -m instalooter hashtag " + hashtag +" "+ path_to_json +" -d",shell=True)Flask#
Flask를 고른 처음 이유는 설정이 간단해서였습니다. 정적 파일을 서빙하는 데만 썼는데, 캐시 문제가 생기더군요. 클라이언트가 갱신된 JSON 파일을 요청해도 이전에 내려준 파일과 똑같은 파일이 돌아오는 겁니다. 그 탓에 사용자 화면의 사진이 어긋나 버렸죠. 이를 해결하려고 클라이언트가 정적 파일을 직접 요청하는 방식 대신, 해시태그와 이미지 파일명을 받는 라우트를 Flask에 만들었습니다. 덕분에 cache_timeout=-1 을 설정해서 파일이 캐시되지 않게 할 수 있었습니다.
파일 구조#
@app.route('/update', methods= ['GET'])
def get_file():
# cache_timeout은 send_file 옵션에서 초 단위입니다
return send_from_directory("data/img", "data.json", cache_timeout=-1)Glob#
Glob은 규칙에 맞는 파일을 골라내기에 좋은 도구입니다. 예를 들어 여러 JSON 파일을 합쳐야 할 때, 내용을 병합하기 전에 먼저 모든 JSON 파일을 불러와야 하죠.
scraper.py
for f in glob.glob(path_to_json+"*.json"):
with open(f, "rb") as infile:
result.append(json.load(infile))
여기까지 읽어주셔서 감사합니다!#
궁금한 점이 있으면 언제든 편하게 메일 주세요!
