스토리 홈

인터뷰

피드

조회수 711

깃발 올려, Git Effect!

안녕하세요, 개발 2팀에서 단아함을 맡고 있는 오연주입니다. 평소에 관심이 많았던 깃(Git)을 공부하면서 알게 된 내용들을 글로 쓰려고 합니다. ‘어떤 닝겐이 만들었나’ 궁금할 정도로 천재적인 깃은 도대체 누가 만든 것일까요? 바로 리누스 토발즈(Linus Torvalds)입니다. 이름에서부터 OS의 느낌이 가득합니다. 네, 맞습니다. 그는 리눅스(Linux)의 창시자이기도 합니다. 리누스는 말했죠. “My name is Linus, and I am your God.” 리누스 토발즈 (Linus Torvalds)그가 깃을 만들기 전에는 보통 중앙집중식 VCS(Version Control System)를 사용했었습니다. 예를 들면 다음과 같은 도구들로요. CVSSVN(Subversion)…반면에 깃은 분산 버전 관리 시스템(DVCS, Distributed Version Control System)입니다. 그렇다면 중앙집중식의 대표주자인 Subversion(VCS)에 비해 무엇이 더 좋을까요? 속도가 빠르다. snv log svn diff -rN svn commit 등 대부분의 명령어가 네트워크 연결이 되어야 실행 가능한 명령어입니다. 그러나 git push git clone 등 몇몇 명령어를 제외하고는 네트워크에 연결되어 있지 않아도 로컬에서 실행할 수 있습니다. 용량이 적다. Mozilla의 SVN Repository는 126GB인데 반해 Git Repository은 420MB입니다. 왜냐하면 해쉬, 스냅샷을 이용한 효율적인 파일 변화 관리가 가능하기 때문입니다. 브랜치를 만드는 작업이 수월하다. SVN은 diff를 전부 적용해서 파일을 생성한 뒤 네트워크에서 내려받는 반면, 깃은 스냅샷을 가리키는 링크(Commit Object)만 만들면 됩니다.어떠한 특징을 가지고 있길래 이런 차이점이 생기는 걸까요?분산 저장소로, 로컬에서도 중앙 저장소와 연결되지 않은 상태에서 지지고 볶기가 가능하다니! 여러 개의 다른 저장소를 생성할 수 있고 서로서로 연결되어 독립적으로 개발 프로젝트를 진행할 수 있고 유기적인 업데이트가 가능합니다. 델타 기법이 아닌 스냅샷 방식을 사용합니다. SVN의 경우 파일 변화를 diff로서 추적한 반면, Git은 각 시점의 파일 상태를 모두 스냅샷을 찍어 관리합니다.변화를 기억했던 기존 방식변화된 소스를 커밋할 때 스냅샷을 찍는 방식두 가지 특징을 살리려면 깃이 여타 다른 VCS와는 다른 방식으로 정보를 관리할 필요가 있습니다. 예를 들어 Revision number로 히스토리를 관리했던 Subversion으로 분산된 저장소의 히스토리를 관리하려고 하면 ‘시점 충돌’ 문제가 발생합니다.그..그려봤습니다..금융 프로젝트에 참여했을 때의 일입니다. VCS 중 H사 툴을 사용하였는데 한 소스의 버전을 받고 개발하는 과정에서 커밋의 횟수가 많아지니 중앙 저장소 입장에서는 ver 1 → ver 9로 갑자기 타임워프하는 일이 생겼습니다. 그래서 개발자 스스로 본인의 버전을 모두 삭제한 후 ver 9였던 파일을 수동으로 ver 2로 바꿔주는 것이 관례였습니다. 소스가 모두 날아가는 경우가 있어 소스 commit 과정이 공포스러웠죠. 깃은 해쉬(hash)를 이용한 정보 관리를 통해 이런 문제를 말끔하게 해결합니다.Git의 핵심, 정보 Hashing! git reset --hard 3269aecad9ffea81763a42b9fff34c76a0aa4cf0 브랜디 소스 코드를 pull 했는데 특정 시점으로 돌아가 할 일이 생겨 위의 명령어를 입력했던 적이 있습니다. 명령어로 깔끔하게 원하는 시점으로 되돌아올 수 있었죠. 뒤에 붙는 40자리의 기괴한 문자열은 바로 깃이 정보를 관리하는 데에 사용하는 해쉬값입니다. 해쉬값이 제일 많이 보이는 곳은 git log 가 아닐까 싶은데요. commit 옆에 나열된 일련번호같은 문자열이 궁금하진 않으셨나요?깃은 소스 코드를 포함해서 히스토리를 관리하는데 필요한 모든 정보를 이런 해쉬로 저장 및 관리합니다. 이 해쉬값은 40자리 16진수 숫자이며 SHA-1 알고리즘으로 생성됩니다. SHA-1 알고리즘은 보안 표준 해쉬 알고리즘 중 하나입니다. 충돌할 확률은 1 / 10^45로, 매우 매우 낮기 때문에 수많은 정보를 저장 및 관리하기에 안전하고 적합합니다. 4GHz CPU로 SHA-1 해쉬 중복값을 찾아내려면 4000년이 걸린다.앞서 SHA-1 해쉬값으로 모든 정보를 저장한다고 말씀드렸는데, 과연 어떤 정보를 어디에, 어떻게 저장하고 있는 것일까요? 각 해쉬 값은 깃이 내부적으로 저장하는 파일 이름이 되기도 하는데, 이 파일들은 .git/objects 경로에서 전부 찾아볼 수 있습니다. 해쉬값 40자리 중 앞 2자리를 디렉토리 이름으로 따고, 뒤 38자리를 파일 이름으로 지정합니다. 각 파일 안에는 서로 다른 정보가 담겨 있습니다. 해쉬값으로 표현되는 이 파일들은 정보의 종류에 따라 3가지 객체로 분류됩니다. Blob ObjectTree ObjectCommit Object폴더나 파일명이 어떤 오브젝트인지 힌트를 주지 않기 때문에 세 가지의 오브젝트 파일 내용의 캡처를 위해 복불복으로 열어봤는데요, 하나의 파일을 열 때마다 포춘쿠키를 까듯 심장이 쫄깃쫄깃했습니다. Blob Object란 실제 파일을 뜻하며, 실제 소스파일을 가지고 있는 실세 오브젝트같은 느낌입니다. Blob Object - 열어보면 내가 작성한 소스 코드가 들어있다.Tree Object 내부에는 프로젝트 구조의 각 디렉토리에 대한 정보가 담겨 있습니다. 하위에 어떤 폴더와 파일을 가지고 있는지 알려주고, 객체 해쉬 값을 저장하고 있습니다. 이 Tree Object의 제일 상위 객체는 root이며, 프로젝트의 최상위 폴더에 대한 정보를 담게 됩니다.앞서 깃은 각 시점별 스냅샷을 찍어 관리한다고 했습니다. 스냅샷을 찍는 행위는 새로운 Root Tree Object를 만들고, 각 시점에 가지고 있는 Tree Object와 Blob Object로 새로운 트리 구조를 만드는 과정입니다. Tree Object - 하위에 php라는 폴더와 README.md라는 파일이 들어있는 것을 볼 수 있다.Commit Object는 커밋 시점의 Repository Root Directory의 해쉬 값을 가지고 있는 녀석입니다. Parent는 내 커밋 전에 커밋이 누구인지를 뜻하는데요. 또한, 커밋할 때의 committer(user), commit message등의 정보도 가지고 있습니다.Commit Object - 해당 commit 시점의 root tree object와 이전 커밋, 작성자 등에 대한 정보를 담고 있다.세 종류의 객체는 깃이 분산된 Repository 간의 소스 히스토리를 쉽게 관리하도록 도와줍니다. 해쉬값으로 관리되기 때문에 특정 스냅샷에 이동하거나, 히스토리를 변경 또는 추가하는 데에 적은 리소스만 필요합니다. 또 분산된 저장소 사이에 상호 시간 순서에 대한 모호함도 해결할 수 있었습니다. 이 정도면 갓누스….깃을 공부하기 시작한 이유는 Git UI Tool을 쓰면서 습관적으로 commit, push 버튼을 눌렀기 때문입니다. 깃에 대한 이해도가 있는 상태에서 사용한다면 실수가 줄어들 거라 생각합니다. 다음 글은 Git branching Model을 다루겠습니다. ps. Git, 협업과 원활한 커뮤니케이션을 위해 알고 씁시다! 우리 함께 깃빨 받읍시다!! 참고 Scott Chacon and Ben Straub, ⌈Pro Git, 2nd Edition⌋, Apress(2014)Schneier on SecurityProbability of SHA1 collisions, stack overflowSVN 능력자를 위한 git 개념 가이드, Insub Lee, Slide Share글오연주 사원 | R&D 개발2팀ohyj@brandi.co.kr브랜디, 오직 예쁜 옷만#브랜디 #개발문화 #개발팀 #업무환경 #인사이트 #경험공유
조회수 1084

잠을 질병 취급하는 멍청한 현대인을 위한 테드 추천4개

 "수면은 신이다. 숭배하라"-판타지 소설가 짐 버처나도 몇년 전쯤에는 잠을 사치라고 여겼다. 잠을 참으며 내 삶에 투자해야되고 내 커리어를 만들어나가는 것이 당연한 것이였고 그렇지 않은 사람들은 삶에 열정이나 야망이 없다고 생각을 했던 어릴 때가 있었다.원래 건강에 대한 관심이나 잠에 대한 호기심은 굉장히 많았었다. 그러나 작년쯤부터 인사이트를 내 삶에 옮기려고 노력을 시작했다. 작년 사업을 시작하면서 몸을 혹사시키고 있는 스스로를 발견하고 나 스스로가 무엇을 위해서 이러고 있는지를 반성했던 시간이 있었다. 그리고 안타깝게도 잠을 제대로 안잤던 사람들의 위독한 질병이나 세상을 떠나곤 했던 기억들이 생각나면서 잠에 대한 중요성을 계속 인지하고 있었다.대체로 올해는 잠에 대한 질을 높이고 있었지만 몇몇 이슈가 터질 때는 그러진 못했다. 또 여전히 습관적으로 잠에 대한 가치를 저평가하는 행동은 내 삶을 더 불행하게 하기도 했다. 그래서 오늘 아침 여러가지 테드를 또 보면서 잠에 대한 사람들의 생각에 (저평가하고 있는) 약간의 변화를 주고자 나 스스로 정리할 겸 포스팅을 한다.*참고로 공유하는 테드들은 모두 한국 번역이 되어서 부담스럽지 않게 언어를 바꿔서 볼 수 있다.1) 숙면을 해야하는 또 한 가지 이유 - 제프 리프-https://www.ted.com/talks/jeff_iliff_one_more_reason_to_get_a_good_night_s_sleep(11:42)가장 추천하는 영상이다. 잠에 대한 원리를 가장 과학적으로 추적해서 이 중요성을 말해준다. 뇌는 놀랍도록 신체 어느 곳보다 스마트하게 설계되어있는데 사람들이 잠을 잘 때 뇌에서 단백질 찌꺼기를 청소한다. 그래서 잠을 자지 않으면 그 찌꺼기를 계속 머리에 축적시켜놓고 알츠하이머에 노출될 확률이 크다고 얘기한다.2) 어떻게 성공하냐고? 더 자라 - 아리아나 허핑턴-https://www.ted.com/talks/arianna_huffington_how_to_succeed_get_more_sleep(4:10)아리아나 허핑턴은 미국의 대표적인 블로그 뉴스 허핑턴 포스트로 이미 유명하다. 2011년에 AOL(America Online, Inc.)에 exit했다. 아리아나는 잠을 안자고 일만 하다 정신을 잃고 책상에 부딪히면서 얼굴을 꿰맸던 스토리를 들려주며 잠을 줄이면서 잘못된 의사결정들을 하는 위대한 리더들(비꼬는)을 풍자한다. 잠에 관련된 책도 낸 것이 있었는데 흥미롭게 읽었었다. http://book.naver.com/bookdb/book_detail.nhn?bid=11038409 3) 왜 우리는 잠을 자는가? - 러쉘 포스터-https://www.ted.com/talks/russell_foster_why_do_we_sleep(21:43)사람들이 잠에 대해서 굉장히 과소평가하고 있다고 한다. 특히 에디슨, 마가렛 대처, 월스트리트는 잠을 질병 취급까지 했다고 한다. 잠 잘 때는 밥을 먹지도 물을 마시지도 섹스를 하지 않기 때문에 사람들은 별로 중요하게 생각하지 않는다고 한다. 하지만 잠은 과학적으로 문제 해결력의 강화, 창의력을 증대, 비만율을 낮추고 어떻게 하면 좋은 수면을 취할 수 있는지도 간단히 소개한다.4) 우리가 현재 자는 패턴은 자연적인 수면 주기와 전혀 맞지 않다. -제사 갬블-https://www.ted.com/talks/jessa_gamble_how_to_sleep#t-188197(3:55)아주 짧은 테드 강연이지만 큰 울림을 준다. 자연적으로 인류가 가지고 있던 생체리듬을 현대인들은 전혀 따르지 않다고 한다. 24시간 상점, 교대 근무 등 자연과 많이 멀어졌다고 한다. 그러면서  현대인들은 그 대가를 치뤄야한다고 한다. 스스로가 잠에 대한 질문을 던지게 만드는 강렬한 짧은 강연이다. 결국 더 크게 성공하려면 더 오래 살아야된다. 온갖 질병을 다 갖고 비실대면서 오래 사는 것이 아니라 매일 매일 건강하게 오래 살 수 있는 힘을 길러야한다. 인간이 90년을 산다고 하면 30년은 잠을 잔다. 한 개인의 삶에 있어서 가장 중요한 것은 잠이라고 확신한다. 1) 밥을 안먹는 것과 2) 물을 안먹는 것과 3) 잠을 안자는 것과 이 3가지 중 무엇을 안하면 가장 빨리 죽는지 애기하는 것을 책에서 봤다. 근데 놀랍게도 3)이였다. 잠을 안자면 제일 빨리 죽는다고..다들 인생을 굵고 짧게 가즈아..!라고 하기보다는 내 삶에서 가장 중요한 것이 무엇이고 그것을 이루기 위해서 난 하루 하루를 어떻게 살아가야하고 그러함에 있어서 잠은 내 삶에서 어떤 의미를 가져야하는지 모두 돌아볼 수 있는 시간이 되었으면 좋겠다.건강한 강아지와의 특별한 만남, 페오펫'유리 진열장'이 아닌 '잔디밭'에서 특별하게 시작하세요.#페오펫 #peopet #아이디어기업 #기업문화 #목표 #비전 #각오 #인사이트 #조언
조회수 1392

공대 석졸생(석사 졸업생)의 인생 3막 1장: 스타트업 입사기

안녕하세요 "사운들리"입니다 :) 오늘은 기존 포스팅에 비해 조금은 덜 전문적이고, 조금은 더 개인적인 이야기를 해볼까 합니다. 이번 포스팅을 맡게 된 필자는 최근 공학 석사를 마치고 사운들리에 조인하였는데요. 이번 포스트에서는 그러한 결단을 내리게 된 계기와 사운들리에서 일하게 되면서 느낀 여러 가지 생각들을 정리해보려 합니다. 이 글을 접하시는 분들 중에서 스타트업에 관심이 있는 학부생, 또는 대학원생들에게 하나의 경험 사례로 읽힐 수 있다면 좋을 것 같습니다!인생 2막 먼저 간단히 필자의 소개를 해보려 합니다. 크게 고등학교 시절까지를 1막이라고 한다면, 대학 입학부터가 2막이라고 할 수 있겠습니다. 아래는 간략히 제 인생 2막을 요약한 내용입니다.1. 공대생, 그 흔한 남자 저는 국내 모 대학교에서 학사와 석사로 전기공학을 전공한 공대생 남자입니다. 학부 4학년 초까지 다른 많은 공대생들처럼 전공 위주로 강좌를 들었고, 큰 고민 없이 막연히 ‘그래, 대학원을 가야지'라는 생각을 가지고 있었습니다. 학부 시절 가장 잘한 일은 전공과 무관한 음악 동아리 활동을 열심히 했다는 것을 꼽을 수 있는데요. 동아리 활동은 평생 그 자체로도 큰 추억 자산으로 남으니까요 :) 반면 학부 시절을 떠올렸을 때 가장 후회되는 일은, 당시 직업적으로 관심있는 분야에 대해서 더 적극적으로 알아보려고 하지 않았다는 것입니다. 요새는 좀 더 적극적으로 저학년 때부터 (취직이 힘들어지는 사회 구조 때문이든, 좀 더 적극적인 세대가 출현해서든) 다양한 대회 및 인턴 기회를 활용하는 학생들이 많은데 안타깝게도 학부생 때의 저는 그렇지 못했습니다 ㅠㅠ 결국 황금같은 대학 생활을 (전문적으로 음악을 할 계획이 아님에도) 아름다운 음악 활동으로만 채워가며, 막상 제 인생을 결정 지을 소중한 경험의 기회들을 날려버리고 말았습니다.2. 어학연수에서 알을 깨고 상당수의 공대생들과 비슷하게 큰 고민 없이 한 길을 가고 있던 제 생각을 근본부터 뒤흔든 것은 1년 남짓의 어학 연수 경험입니다. 우연한 계기로 4학년 1학기를 마치고 영국으로 어학 연수의 길을 오르게 된 필자는, 약 10개월의 시간 동안 유학 생활을 하면서 자기의 꿈을 펼치기 위해 거침없이 도전하는 세계각국의 친구들을 만나게 됩니다. 그 때 당시 23살이었던 저보다도 훨씬 어린 친구들이 타지에서 홀로 치열하게 꿈을 위해 고군분투하는 모습을 보며, 아래와 같은 몇 가지 큰 물음을 마주하게 되었습니다.나는 공학이 정말 재미있고 미치도록 배우고 싶어서 선택하였는가? 내가 이 진로를 선택하는 이유가, 이 일이 정말 하고 싶은 일이기 때문일까, 아니면 남들이 - 친구들이, 친지들이, 부모님이 - 보기에 그럴싸해보이고 안정적인 일이기 때문일까? 이 물음들 앞에서 제가 마주했던 가장 큰 절망감은, 아무 생각없이 이 일을 최소 십 몇년동안 열정 없이 하게될 거라는 두려움이었습니다. 그제서야 정신이 번쩍 들더군요. 내가 정말 하고 싶은 일이 무엇인 지 고민해야겠다는 생각이 들었습니다. 설사 다시 이 길로 돌아 오게되더라도, 최소한 내가 이 일을 하고 싶은 이유, 이 일에서 얻게 될 보람이 무엇인 지 알아내고 그것을 받아들일 수 있어야겠다라는 생각 말이죠. 어학 연수를 갔다온 이후로 반 년이면 바로 졸업을 할 수 있었지만, 1년의 시간을 더 심사숙고하고 나서야 최종적으로 대학원 진로를 결정지었습니다. 만약 이러한 고민의 시간이 없었다면, 대학원 공부가 힘들 때마다 저는 혼자 스트레스에 가득 차 있었을 것입니다. 그 누구도 대학원에 가라고 시킨 적도 없는데 막상 내가 가고 싶어서 간 것도 아닌, 아주 묘하고 이상한 딜레마에 빠져 괴로워했겠죠! 최소한 저는 제가 선택한 길이기에 그 누구의 탓도 하지 않을 준비가 되어 있었습니다.3. 뜻밖의 여정: 대학원에서 마주친 스타트업 이제 제 인생 3막으로 인도하게 될 스타트업과의 인연은, 조금은 얄궂게도, 굳은 결심을 하고 들어간 대학원에서 마주하게 됩니다. 대학원에서 통신 전공을 하며 2년 동안 기술 과제를 하게 된 회사가 바로 사운들리였고, 자연스레 스타트업에 대한 관심도 높아지게 되었습니다. 음파를 이용한 기술에 흥미를 느끼고 과제를 지원하여 시작하게 되었지만, 점차 일을 함께 진행하면서 기존의 정립된 회사와는 다른 스타트업의 매력에 빠지게 되었습니다. 결국 2년의 공동 연구를 인연으로 사운들리에 조인하게 되었는데요. 아래에 그 조인하게 된 동기와 느낀점을 간단히 적어 보았습니다.스타트업으로 유려하게 다이빙1. 유연한 체계에서 직접 이정표를 세우고 함께 성장<그림1> 2015년 구글 캠퍼스 런던 교환 프로그램 참가 필자가 스타트업에서 가장 매력적으로 느꼈던 부분은 사업 아이템을 구상하고 발전시켜 제품으로 연결짓는 일련의 과정 전체를 팀원 전체가 모두 공유한다는 것입니다. 회사의 문화를 구축하고 직접 체계를 만드는 것이 마냥 쉬운 일은 아니지만, 팀원들의 공감대를 토대로 하나 하나 벽돌을 쌓아나간다는 측면에서 보람차고 즐거운 일이라고 생각됩니다. 대기업 등 이미 체계가 잡힌 회사에 다니는 친구들과 회사 생활 이야기를 하다보면 사내 문화가 가장 핫한 이슈로 떠오르게 되는데요. 사운들리에서는 매일 아침 대표 이사부터 연구직 막내인 필자까지 모든 팀원들이 모여 제품 이슈를 논의하고, 사업적인 아이디어도 함께 고민하고 공유하는 것이 일상인 반면, 상당수의 기업에서는 모든 사업 이슈가 분업화 되어 진행되고 논의 단계도 직급에 따라 계층화되어 있습니다. 회사의 규모차 등에 의한 당연한 결과이고 각자의 장단이 있는 부분이겠지만, 저는 스타트업의 수평적인 문화가 더 크게 끌렸던 것 같습니다 :)2. ‘이상형의 나’와의 간극을 좁혀가는 길 사실 스타트업으로 뛰어든 것 자체가 제 스스로에게 내민 큰 도전장과도 같습니다. 사운들리에 조인하기 위해 얻은 과제들 - 스스로 납득시키는 일, 부모님을 설득하는 일 등 - 을 해결하고, 회사에서 매일 이슈가 발생했을 때 팀원들에게 배우고 해결해나가는 것 하나 하나가 늘 필자에게 새로운 도전을 안겨줍니다. 스타트업은 늘 사람이 부족한 반면 일이 넘쳐 나는 특성상 팀원들의 능동적이고 적극적인 해결 능력이 요구됩니다. 저는 이러한 도전을 통해서 기존에 싫어했던 제 모습을 없애고, 늘 되고 싶어했던 이상형의 모습으로 채워나가고 싶었습니다.기존의 나 - 본인이 하고 싶은 것 잘 모름, 모르는데 굳이 찾으려 하지도 않음, 내 인생의 중요한 결정은 하기 싫어서 미루거나 타인의 말 들음, 일 미루기 좋아함, 꾸역꾸역 막판에는 뭐든 해서 막장까진 안가고 어중간하게 또 살아감, 적당히 적당히 이상형의 나 - 내가 하고 싶은 일이 무엇인 지 찾아 나감, 무엇이든 주도적으로 함, 목표지향적으로 일함, 실패를 두려워 하지 않음, 일을 벌이면 완결지음, 할 일을 미루지 않음, 일도 노는 것도 확실하게, Work hard play hard<그림2> 2015년 구글 캠퍼스 교환 프로그램 참가3. 일당백이어야만해 사운들리에 입사한 후 가장 많이 느낀 것은 제 스스로의 부족함이었습니다. 모두가 합심하여 성장해야하는 스타트업에서 '경력이 없으니 좀만 봐주세요 ㅠ' 할 여유 따윈 없는 것 같습니다! 제 몫은 그 누구도 아닌 제 스스로 해야하고, 그 몫 이상을 해야 제품이 발전할 수 있다는 생각이 절실히 들었습니다. 부족한 만큼 일과 더불어 공부에 투자해야 할 시간도 많이 필요하지만, 그만큼 제품과 함께 제 실력도 성장시킬 수 있으리라 생각됩니다 :)마치며 이번 글은 사운들리의 핵심 꿀팁들을 기대하셨던 분들에게는 조금은 아쉬운 포스팅이었을 수도 있을 것 같습니다. 아직 모든 것이 새로운 사회 초년생의 일기와도 같은 이 포스팅에 당황하셨겠지만, 저와 비슷한 길을 걷고 있을 분들에게 조금이나마 경험담을 들려드리고 싶었습니다. 사운들리와 함께 제 자신도 큰 폭으로 성장시키리라 다짐하며 이번 글을 마치고자 합니다.감사합니다!#사운들리 #입사후기 #석사 #석사졸업 #스타트업 #스타트업입사 #스타트업합류
조회수 668

레진 기술 블로그 - Kotlin의 빛과 그림자

핀터레스트의 안드로이드 개발팀이 코틀린을 도입하면서 겪은 어려움과 해결책을 소개한 The Case Against Kotlin을 foot번역하고 자의적으로 해석하고 요약했습니다. 저자 라이언 쿡(Ryan Cooke)은 현재 코틀린이 가트너의 하이프 사이클에서 “뻥튀기된 기대감의 산(Peak of Inflated Expectations)” 쯤에 있다고 말합니다. 레진시 개발동에서는 이미 코틀린을 부분적으로 도입했고, 현재는 범위를 넓혀가는 중인데요… 정말 괜찮은 걸까요?문제: 학습 곡선자바 개발자로서 문법에 익숙해지는 데 1주일 정도 걸립니다.코틀린을 이미 잘하는 사람이 없으면 베스트 프랙티스들을 찾아보면서 해야하는 데 시간이 듭니다.코틀린 사용을 가속화 시키는 데 팀 트레이닝을 계속 해야합니다. -> 기회비용 많이 듭니다.하기 싫어 하는 사람도 있고…혼자서 알아서 잘 배우는 사람도 있고…해결책: 학습 곡선코틀린은 아직 말년병장성숙한 언어가 아닙니다! 지금도 자라나고 있습니다! 그게 제일 무서워..책도 있고 인터넷 리소스도 있지만, 코틀린 신봉자가 하나 있어서 다 가르쳐주는 게 짱입니다.필자가 코틀린을 하고 싶었던 이유는 생산성인데요, 동료들 중에는 그렇게 느꼈던 사람들이 많지 않은 것 같습니다. 정착이 되면 보이겠죠.문제: 빌드 속도Gradle 빌드 속도는 보통 30초, 클린 빌드는 75초 까지 걸립니다.코틀린은 보통 빌드 속도의 25%, 클린 빌드의 40% 밖에 안나옵니다.해결책: 빌드 속도알아서 하셈 ㅋ코틀린 파일 하나 변환 -> 클린 빌드 시 조금 시간이 더 걸립니다. 파일을 많이 변환할수록 느려지긴 하지만 체감하긴 어렵습니다.보통 빌드할 때는 코틀린 파일 많아도 상관 없습니다.결론: 클린 빌드할 때 느려진다는 걸 체감할 겁니다.문제: 개발 안정성코틀린의 문법이나 특성이 문제가 아니라, 코드를 생산성 있게 작성하는 자신을 막는 새로운 문제들 때문이라고 생각합니다.사실 그냥 코틀린 배우기 싫은 거 같아요.예를 들면, 코틀린 애노테이션 프로세서 툴(kapt) 때문에 빌드가 안 되고, 무조건 클린 빌드로만 개발을 했던 적이 있습니다.이거… 코틀린 때문 아니야?!?!?! 하는 의심들 많았죠.고치느라 시간이 많이 흘렀습니다.또 어떤 문제가 튀어나올지에 대한 두려움이 커지네요.해결책: 개발 안정성그냥 IDE 나 언어의 stable 버전만 업데이트 하세요.안정된 버전들만 사용하면 그나마 힘든 일 없을거예요.정말?문제: 정적 분석FindBugs, PMD, Error Prone, Checkstyles and LintJava 는 이와 같은 툴들로 인해 Code Review에 쓸데없는 걸 줄이거나 룰을 적용할 수 있는데,코틀린에는… 이런 게 없… 분석을 위한 게 아직… 없습니다… 사람들이 알아서 다 찾아야 합니다.해결책: 정적 분석그냥 손가락빨고 기다려야 합니다. 아니면, 직접 만드세요!문제: 나 돌아갈래~돌아가기 쉽지 않습니다. 자바를 코틀린으로 옮기기에는 쉬운데, 반대는… 어렵습니다!코드가 깨지고, 변수명부터, 이런 저런 부분들을 다시 구현해야합니다.코틀린스럽거나, 코틀린의 고유한 기능들을 사용했다면, 여기서부터 헬이죠.해결책: 나 돌아갈래~되돌아오는 건 쉽지 않기 때문에 잘 생각해야 합니다.유닛 테스트가 정말 잘 된 파일들부터 바꾸세요.간단하고 재사용 가능한 잘 모듈화된 파일들을 먼저 바꾸세요.결론이 글은 고려해야 할 리스크에 대해서 나열했습니다.단점들은 구글과 젯브레인과 스택오버플로우가 차차 해결해 줄 겁니다.TL;DR 코틀린으로 작성하는 건 쉽지만, 되돌리기는 어렵습니다.그래서 말인데… 레진코믹스에서 코틀린 삽질을 함께 할 개발자를 모십니다!
조회수 1363

레진 기술 블로그 - IntersectionObserver를 이용한 이미지 동적 로딩 기능 개선

구글 크롬 51 버전부터 DOM 엘리먼트의 노출 여부를 비동기로 처리하는 IntersectionObserver API를 사용할 수 있게 되었습니다. 이 기능을 이용하면 이미지의 동적 로딩이나 광고 배너의 노출 측정 등을 효율적으로 사용할 수 있다고 구글 개발자 블로그에서 소개하고 있습니다. 이 글에서는 기존의 이미지 동적 로딩에 대한 문제점을 짚어보고 여러 예제를 통해 IntersectionObserver의 사용 방법을 익혀 기존 기능을 개선할 수 있도록 합니다. 사용한 예제들은 브라우저의 호환성을 고려하지 않고 구글 크롬을 기준으로 작성하였습니다.기존의 이미지 동적 로딩 구현이미지의 개수가 많거나 용량이 큰 페이지를 불러올 경우 쓸데없는 네트워크 비용이 증가하고 이미지를 불러오는 과정에서 서비스 속도에 문제가 발생할 소지가 있어서 이미지가 사용자에게 보일 때만 불러오는 동적 로딩 기능이 필요합니다. IntersectionObserver를 소개하기 전에 먼저 기존 라이브러리들이 이미지 동적 로딩을 어떤 방법으로 구현하고 있는지 간단하게 알아보도록 합니다.엘리먼트 가시성 판단이미지 동적 로딩에서 가장 중요한 코드는 해당 엘리먼트가 현재 화면 내에 보이는지 알아내는 것입니다. 이를 위해 엘리먼트의 크기와 위치 값을 돌려주는 Element.getBoundingClientRect 함수를 사용하는 경우가 많습니다. 아래는 이 함수를 사용한 간단한 구현 예제입니다.function isInViewport(element) { const viewportHeight = document.documentElement.clientHeight; const viewportWidth = document.documentElement.clientWidth; const rect = element.getBoundingClientRect(); if (!rect.width || !rect.height) { return false; } var top = rect.top >= 0 && rect.top < viewportHeight; var bottom = rect.bottom >= 0 && rect.bottom < viewportHeight; var left = rect.left >= 0 && rect.left < viewportWidth; var right = rect.right >= 0 && rect.right < viewportWidth; return (top || bottom) && (left || right); } 이벤트 처리위에서 구현한 isInViewport 함수는 언제 호출해야 할까요? 먼저 문서를 처음 불러왔을 때 호출해야 합니다. 그 후에는 동적 로딩이라는 단어에 맞게 사용자의 동작에 따라 보이지 않던 엘리먼트가 보이게 되는 이벤트를 감지해야 합니다. 마우스나 터치로 스크롤을 통해 문서의 위치가 바뀌거나 브라우저의 크기가 바뀔 수도 있고 모바일 기기의 화면을 돌려서 볼 수도 있습니다. 데스크톱의 경우 scroll, resize 이벤트를, 모바일의 경우 orientationchange 이벤트의 처리를 생각해야 합니다.const images = Array.from(document.querySelectorAll('img')); document.addEventListener('scroll', () => { images.forEach(image => { if (isInViewport(image)) { image.onload = () => images.splice(images.indexOf(image), 1); image.src = 'original_image_path'; } }); }); 간단하게 위 코드와 같이 구현할 수 있습니다. 물론 실제 서비스를 위해서는 수정할 점이 몇 가지 있습니다. 동적 로딩의 대상이 되는 이미지를 구분하기 위해 해당 엘리먼트에만 특정 클래스를 부여하거나 HTML5에서 지원하는 data 속성을 이용하기도 합니다. 스크롤이나 리사이즈 이벤트가 과도하게 발생하는 경우가 많으므로 throttle 또는 debounce 등을 사용해 실행 빈도를 조절할 수도 있습니다. 일부 라이브러리에서는 requestAnimationFrame을 이용해 이벤트 핸들러를 처리하기도 합니다.TADA레진코믹스에서는 이미지 동적 로딩을 위해 서비스 초기에 Unveil 라이브러리를 사용했었습니다. 그러나 적용 후 몇 가지 아쉬움이 있어 따로 TADA 라이브러리를 제작했습니다. 먼저 마크업 구조상 이미지를 태그가 아닌 다른 태그에 배경 이미지로 사용하는 경우를 지원해야 했습니다. 그리고 모바일 웹에 주로 많이 적용하는 수평 스크롤 구역에 대한 처리도 필요했습니다. 문서의 스크롤 이벤트로는 처리가 되지 않기 때문에 특정 엘리먼트를 받아 그 엘리먼트의 스크롤 이벤트 핸들러를 등록할 수 있도록 해야 했습니다. 이를 해결하기 위해 만든 라이브러리를 현재 서비스에 적용 중이지만 이 라이브러리 역시 아래와 같은 문제점들을 가지고 있습니다.</> < id>기존 이미지 동적 로딩의 문제점getBoundingClientRect 함수의 문제점위 코드에서 특정 엘리먼트가 현재 화면 내에 보이는지 검사할 때 사용하던 Element.getBoundingClientRect 함수에는 치명적인 단점이 있습니다. 이 함수를 호출할 때마다 브라우저는 엘리먼트의 크기와 위치값을 최신 정보로 알아오기 위해 문서의 일부 혹은 전체를 다시 그리게 되는 리플로우(reflow) 현상이 발생한다는 점입니다. 호출 횟수가 적을 경우에는 부담이 되지 않지만, 이 함수는 위에서 구현한 것처럼 스크롤이나 리사이즈 이벤트가 발생할 때마다 등록한 모든 엘리먼트를 순환하면서 호출하게 됩니다. 이 코드들이 하나의 메인 스레드에서 실행되기 때문에 스크롤을 할 때마다 실행 속도가 눈에 띄게 느려질 수도 있습니다.외부 도메인 문서를 사용하는 iframe최신 브라우저들은 동일 도메인 정책에 따라 iframe 내의 외부 도메인 문서에서 현재 문서에 접근하지 못 하게 막고 있습니다. 이 제한은 서비스 개발에서 겪게 되는 문제는 아니고 외부 광고 플랫폼 개발자의 입장에서 발생하는 문제입니다. 광고 이미지의 표시나 클릭 이벤트의 처리 등은 iframe 내에서 처리할 수 있지만 광고 이미지를 지연 로딩한다거나 이 광고가 사용자에게 노출이 되었는지 기록하는 등의 기능은 iframe 내에서 불가능합니다. 그래서 광고를 적용하는 서비스 개발자에게 스크립트를 제공하고 서비스 문서 내에 삽입하는 방식으로 처리하고 있습니다. 이러한 외부 광고가 여러 개라면 삽입해야 하는 코드가 늘어날 뿐만 아니라 코드 내에서 스크롤이나 리사이즈 이벤트 등을 각각 사용하기 때문에 위에서 언급한 문제점들이 배가될 수 있습니다.기타 이벤트에 대한 처리대부분의 동적 로딩 라이브러리들은 적용할 엘리먼트에 특정 클래스 또는 data 속성을 부여하면 코드를 추가 작성하지 않더라도 쉽게 사용할 수 있습니다. 하지만 화면에서 보이지 않던 엘리먼트가 갑자기 나타나는 현상은 스크롤이나 리사이즈 이벤트에서만 발생하는 것이 아닙니다. 더보기 버튼을 눌렀을 때 숨겨져 있던 엘리먼트를 노출할 수도 있고 AJAX 호출 후 엘리먼트를 생성한 후 보여줄 수도 있습니다. 이런 경우 일괄적으로 처리하기가 어렵우므로 해당 이벤트가 발생할 때 수동으로 처리하는 수밖에 없습니다.IntersectionObserver위에 나열한 문제들을 효과적으로 처리하기 위해 크롬 51/엣지 15/파이어폭스 55 버전부터 IntersectionObserver를 지원하기 시작합니다. 우리말로 번역하면 교차 감시자 정도가 될 이 기능은 등록한 엘리먼트가 보이는 영역에 나타나거나 사라질 때(용어에 충실하자면 대상 엘리먼트의 영역이 루트 엘리먼트 영역과 교차하기 시작하거나 끝났을 때) 비동기로 이벤트를 발생시켜 줍니다. 기본적인 사용법은 아래와 같습니다.const intersectionObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { // do something observer.unobserve(entry.target); } }); }); intersectionObserver.observe(element); 먼저 IntersectionObserver 생성자에 콜백 함수를 인자로 넘겨주고 생성한 인스턴스의 observe 메소드를 통해 동적으로 처리할 엘리먼트를 등록합니다. 콜백 함수는 IntersectionObserverEntry 객체 목록을 전달받으므로 순환문을 통해 각 엘리먼트에 대한 처리를 완료하고 필요한 경우 unobserve 메소드를 이용해 감시 대상에서 해제할 수 있습니다.IntersectionObserver 예제아래 예제들은 기본적으로 아래 코드를 바탕으로 작성되었습니다. 각 예제들의 최상단에 엘리먼트에 짝을 이룬 표시등을 두었고 콜백 함수가 호출될 때마다 파동 효과를 주었으며 이 때 isIntersecting 속성을 기준으로 표시등을 켜지거나 꺼지게 되어 있습니다.const io = new IntersectionObserver(entries => { entries.forEach(entry => { // isIntersecting 속성으로 해당 엘리먼트가 보이는 지 표시 }); }); Array.from(document.querySelectorAll('.box')).forEach(box => { io.observe(box); }); 스크롤 이벤트를 다루지 않더라도 엘리먼트의 가시성 여부를 isIntersecting 속성을 통해 알 수 있습니다.<iframe class="demo" data-fr-src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/basic-verticalscroll.html" width="600" height="400" frameborder="0">수평 스크롤의 경우에도 overflow 속성이 적용된 컨테이너 엘리먼트의 스크롤 이벤트를 처리하지 않더라도 상관없습니다.<iframe class="demo" src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/basic-horizontalscroll.html" width="600" height="200" frameborder="0">더보기 버튼에 대한 클릭 이벤트를 따로 등록하지 않아도 동작합니다.<iframe class="demo" src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/basic-unfold.html" width="600" height="240" frameborder="0">리사이즈 이벤트 역시 따로 처리할 필요가 없습니다. 새 창을 띄운 후 창 크기를 조절하면서 확인할 수 있습니다.위의 모든 예제들은 <iframe> 태그 안에서 실행되고 있습니다. 이처럼 작성한 코드가 외부에서 실행이 되더라도 IntersectionObserver API는 문제없이 동작합니다.IntersectionObserver 생성자 옵션rootroot 옵션에는 가시성의 판단 기준이 될 HTML 엘리먼트를 지정합니다. observe 메소드로 등록하는 엘리먼트들은 반드시 이 루트 엘리먼트의 자식이어야 합니다. 이 옵션을 지정하지 않을 경우 브라우저 화면에서 현재 보이는 영역인 뷰포트가 기본이 됩니다. 아래 예제에서 알 수 있듯이 루트 엘리먼트를 지정하면 현재 화면과는 상관없이 루트 엘리먼트와 등록한 엘리먼트들의 영역이 교차하는 지 판단하게 됩니다.<iframe class="demo" src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/option-root.html" width="600" height="400" frameborder="0">rootMargin루트 엘리먼트의 마진값을 지정할 수 있습니다. CSS에서 사용하는 형식과 같기 때문에 “10px”, “10px 20px”, “10px 20px 30px 40px” 형태가 모두 가능하며 음수값으로 지정할 수도 있습니다. 기본값은 0이고 루트 엘리먼트를 지정한 상태라면 퍼센트값을 사용할 수도 있습니다. 이 옵션을 이용하면 이미지 동적 로딩에서 해당 엘리먼트가 화면에 나타나기 전에 이미지를 불러오기 시작해 이미지 공백을 줄이는데 유용하게 이용할 수 있겠습니다.<iframe class="demo" src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/option-rootmargin.html" width="600" height="400" frameborder="0">위 예제에서는 root 옵션은 지정하지 않고 rootMargin 옵션을 각각 0, 100px, -100px, 50%로 지정했습니다. 하지만 iframe 내에서 실행을 하게 되면 이 옵션이 정상적으로 동작하지 않습니다. 프로젝트 페이지의 이슈 댓글에는 동일 도메인의 프레임 안에서는 동작하는 것으로 논의되고 있지만 뷰포트에는 해당하지 않거나 버그 또는 아직 크롬에 반영이 되지 않아 보입니다.이 예제는 새 창을 띄워 프레임을 벗어나면 정상적으로 동작합니다. 스크롤을 내리다보면 엘리먼트마다 IntersectionObserver 콜백 함수가 다른 위치에서 호출됨을 알 수 있습니다.thresholdthreshold 옵션은 엘리먼트가 콜백 함수의 호출 시점을 정하는 옵션입니다. 0과 1을 포함한 그 사이의 숫자 또는 숫자 배열을 지정할 수 있는데 이 숫자는 엘리먼트의 전체 영역 중에 현재 보이는 영역의 비율입니다. 이 비율의 경계를 넘나들 때마다 콜백 함수가 호출됩니다.<iframe class="demo" src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/option-threshold-value.html" width="600" height="400" frameborder="0">위 예제에서는 threshold 옵션을 각각 0, 0.5, 1, [0, 1]로 지정했습니다. rootMargin 예제처럼 엘리먼트마다 콜백 함수가 다른 위치에서 호출됩니다. 두 번째와 세 번째 상자는 콜백 호출 시점에 isIntersecting 값이 항상 참이기 때문에 표시등이 정상적으로 표시되지 않습니다. isIntersecting 속성을 기준으로 처리해야 할 작업이 있다면 반드시 threshold 속성에 0을 포함시켜야 정상적으로 동작합니다. threshold 속성은 아래 예제처럼 콜백 함수의 인자로 받는 IntersectionObserverEntry 객체의 intersectionRatio 속성과 같이 사용하기에 유용합니다.<iframe class="demo" src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/option-threshold-ratio.html" width="600" height="400" frameborder="0">위 예제에서는 threshold 옵션을 각각 [0, 1], [0, 0.5, 1], [0, 0.25, 0.5, 0.75, 1]로 지정하고 콜백이 호출되면 intersectionRatio 값을 기준으로 표시등의 배경 투명도를 바꾸도록 했습니다.IntersectionObserver의 활용이미지 동적 로딩지금껏 알아본 IntersectionObserver를 이용해 이미지 동적 로딩을 간단하게 구현해봅니다. 이미지 엘리먼트를 구성할 데이터가 배열로 존재한다고 가정하고 ES6에서 지원하는 템플릿 문자열을 사용해 배열을 순환하면서 이미지 목록을 생성합니다. 그 후 IntersectionObserver를 초기화하고 만들어진 엘리먼트들을 등록합니다. 콜백 함수에서는 엘리먼트가 보이는 상태일 때 이미지를 로딩하고 해당 엘리먼트를 감시 해제합니다. id="comics"> const comics = [ { alias: 'eunsoo', id: 6080299074584576, title: '은수' }, ... ]; const template = comics => ` ${comics.map(comic => ` ${comic.id}"> ${comic.alias}" class="info">${comic.title} `).join('')} `; document.getElementById('comics').innerHTML = template(comics); const io = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (!entry.isIntersecting) { return; } const target = entry.target; const id = target.dataset.id; target.querySelector('.info').style.backgroundImage = `url(https://cdn.lezhin.com/v2/comics/${id}/images/wide?width=600)`; observer.unobserve(target); }); }); Array.from(document.querySelectorAll('.comic')).forEach(el => { io.observe(el); }); 아래 예제를 실행하면서 브라우저의 개발자 도구를 열고 네트워크 탭을 살펴보면 이미지 엘리먼트가 보이기 시작할 때 불러오기 시작하는 것을 확인할 수 있습니다.<iframe class="demo" src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/demo-lazyload.html" width="600" height="400" frameborder="0">무한 스크롤IntersectionObserver 기능을 이용하면 무한 스크롤 역시 쉽게 구현할 수 있습니다. 아래 예제에서는 스크롤의 끝부분에 감시를 할 엘리먼트를 두고 그 엘리먼트가 노출이 될 때마다 콘텐츠를 추가로 불러오도록 작성하였습니다. id="items"> id="sentinel"> const count = 20; let index = 0; function loadItems() { const fragment = document.createDocumentFragment(); for (let i = index + 1; i <= index + count; ++i) { const item = document.createElement('p'); item.classList.add('item'); item.textContent = `#${i}`; fragment.appendChild(item); } document.getElementById('items').appendChild(fragment); index += count; } const io = new IntersectionObserver(entries => { entries.forEach(entry => { if (!entry.isIntersecting) { return; } loadItems(); }); }); io.observe(document.getElementById('sentinel')); loadItems(); 실행 결과를 아래 예제에서 확인할 수 있습니다.<iframe class="demo" src="https://cdn.rawgit.com/fallroot/intersectionobserver-examples/master/demo-infinitescroll.html" width="600" height="400" frameborder="0">마무리IntersectionObserver API는 아직 몇몇 브라우저의 최신 버전에서만 사용할 수 있지만 지원하지 않는 브라우저를 위해 Polyfill을 제공하고 있습니다.IntersectionObserver API는 웹 광고 플랫폼 제공자와 사용자 모두에게도 좋은 소식이라 봅니다. 이 API가 정착된다면 광고 노출 여부를 측정하기가 쉬워지고 서비스에 더해졌던 리소스 낭비를 줄일 수 있을 것이라 생각합니다.레진코믹스는 크롬 브라우저 사용자의 비중이 높은 편이기 때문에 빠른 시일 안에 적용해 볼 예정입니다. 이미지 동적 로딩 기능의 개선과 정주행 기능과 같이 현재 스크롤 이벤트를 과하게 사용하고 있는 코드에 대한 부담을 덜 수 있기를 기대하고 있습니다.참고자료Intersection Observer API SpecificationIntersectionObserver’s Coming into ViewIntersection Observer API
조회수 1018

나누고 싶은 이야기들...

지난 3년 7개월 동안 스타트업을 하면서 정말 많은 경험을 했고 좋은 분들을 많이 만났습니다.더 시간이 지나서 머리속의 기억이 잊혀지기 전에 그리고 지나온 시간들을 반성하고 되짚어보는 시간을 가지는 방법을 찾던 중 글로 남겨보자라는 생각을 했습니다.-노점상부터 시작된 창업-3번의 투자유치-실리콘밸리 엑셀레이터 참여-퇴사율 0% 특이한 조직-서비스 폐업-피벗팅-컨텐츠 서비스 시작-재투자유치와 팁스프로그램 선정-새로운 서비스의 매출 발생 시작다양하고 경험을 했고, 하면서 느꼈던 점 위주로 적어 볼까 합니다.  이 이야기들은 흔히 볼 수 있는 성공을 거둔 스타트업의 이야기가 아닙니다. 삽질에 삽질을 거듭하며 성공을 위해 달려가고 있는 현재 진행형의 어느 작은 스타트업의 이야기 입니다.1. 독한 녀석들 (실행)2. 문득 찾아온 첫사랑(첫번째 투자사 본엔젤스)3.회사가 전쟁터라고? 밖은 지옥이다.(창업을 말리는 이유)4.내가 창업을 선택한 3가지 진짜 이유(동기)5.학연 지연,그들만의 리그 (인맥)6. 우리가 세월호 현장에 간 이유 (실천)7. 구글 VS 노점상 (결정)8. 스타트업 초기멤버의 중요성 ( Co-founder )9. 내 통장과 회사 통장의 차이 ( 스타트업에게 투자금의 의미 )10. 스타트업 MVP 사례 ( 홍대의 초록색 오빠들 )11. 신내림 (두번째 투자사 IDG)12. 영어 유치원 보내자. (첫번째 팀빌딩)13.미친놈,이상한놈,특이한놈(두번째 팀빌딩)14.나가서 뭐라도 배워오자.(전시회,컨퍼런스,모임)15.까칠한 미국인(세번째 투자사 500Startups)16.거리의 스타트업 실리콘 밸리를 가다.(해외진출 준비하기)17.Tenderloin (생활하기)18.Tell me your number! (데이터,분석)19.I'm founder & CEO of Plugger. (피칭)20.좋은 회사? 나쁜 회사? ( 경력 )21.내깜댕이의 자위기구 (서비스 네이밍)22.유니콘들 (외부동료)23.반쯤 채워진 물컵(미국에서 얻은 것들, 잃은 것들)24.그래서 연봉이 얼만데? (처우,복지)25.어둠의 자식들 ( 멘탈 추스리기 )26.편집증 (양보하지 않는 것들)27.낮새와 밤쥐 (평판)28.사실과 진실의 차이 (의사소통)29.유료사용자 10만명 허와 실 (성장성)30.잘되면 팀원 탓 안되면 대표탓(대표의 역할)31.그만 두세요. 할만큼 했어요.(폐업권유)32.우리는 망했습니다. (내려놓기)33.퇴사율 0% 특공대들 (피벗팅의 시작)34.남이 하면 불륜 내가 하면 로맨스 (카피캣)35.엄친아 (벤치마킹)36.빠르게 망하기 ( 런웨이,타임라인 )37.라디오를 누가 들어요? (아이템선정)38.나는 한놈만 팬다.( 목표설정 )39.열심히 하기? 잘하기! ( KPI )40.주크버그가 잡스가.. (멘토,멘티)41.바닥 쳐봤잖아요.(네번째 투자사 엔텔스,넥스트랜스)42.연락처 좀 알려주세요.(좋은 투자사 찾기)43.노가다 (세번째 팀빌딩)44.살려면 뭔들 못해? (정부지원)45.글로벌? (다시 준비하는 해외진출)46.히든 챔피언(숨은 조력자들)47.매출이 깡패다.(회사의 본질)48.마음속으로만...(목표와 비전)49.프로와 아마추어 (성과)50.행복해지거나 현명해지거나 (Next)참고로 공돌이 개발자 출신이라 글재주가 부족한 점 양해의 말씀 드립니다.#스푼 #Spoon #개발자 #개발 #인사이트 #경험공유 #스타트업 #투자유치 #초기창업 #창업 #고민
조회수 1291

주니어디자이너가 알아야 하는 오묘한 디자인용어 60

안녕하세요. 여러분. 스크롤을 내리기 전 드릴 말씀이 있어요. 물론 제목이 틀린 말은 아니지만, 혹시 GNB나 LNB등의 전문용어를 기대하고 오신거라면 죄송합니다. 오늘 말할 단어들은 그런게 아니에요. 그런 전문용어들은 구글에 치시면 엄청나게 많이 나오니까요. 오늘은 좀 더 실전적인 오묘한 단어들에 대해 알아보려고 해요. 사실은 좀 짤에 가깝습니다. 뇌피셜도 가득하구요. 60개의 단어들 중 한 개만 오호! 하고 가셔도 전 매우 행복할 듯 합니다. 각설하고 바로 시작하겠숩니다 :)01. 후까시 : 쓸데없는 걸 쳐바른 상태02. 뻬다 : 백그라운드03. 짜치다 : 자잘한 레이어수정이 겁내 많은데 액션으로도 어떻게 안되는 상태04. 귀도리(v. 귀도리친다) : 네 귀퉁이 둥글게 잘라내기05. 도무송 : 특정한 모양대로 잘라내거나 구멍을 뚫는 인쇄 후가공 기법06. 목업(v. 목업에 얹히다) : 실제로 구현된 상태를 가상으로 보여주기 위한 시각적 프로토타이핑07. 블리딩(BLEEDING) : 여백없이 꽉찬 이미지를 위해 재단선을 넘기는 방법. (유사어. 상하좌우 여백오미리)08. 스프레드(spread) : = 펼친 좌우 페이지에 하나의 개체를 뙇! 까는 일09. 커닝(먹이다) : 글자의 모양때문에 배열이 달라질 때 적당한 간격을 조정하는 일10. 비교견적 : 우리 견적에 20만원 플러스 시켜서 가라로 만드는 견적11. 실장님 : 보통 협력업체의 책임자를 부르는 보통명사12. 대리님 : 보통 협력업체의 실무자를 부르는 보통명사13. 이봐요 : 보통 협력업체의 나쁜놈을 부르는 보통명사(자매품 : 저기요)14. 깨서줘 : 폰트나 획에 오브젝트 확장해달라 (=돌이킬 수 없을 것이다.)15. 부탁해 : 니가해16. 언제까지 돼? : 1시간 내로 줘라17. 다 좋은데 : 다시해야겠는데?18. 이 부분이 좀 : 그걸 포함한 모든 것들이19. 조금만 싸게 : 반값으로 해달라20. 스타일가이드 : 컴포넌트 전반을 규정(버튼, 컬러, 간격, 텍스트 등 디자인/퍼블리싱/개발의 기준을 설정하는 것(그러나 지키진 않겠다)21. 플랫하게 : 셔터스톡에 있는22. 브랜드디자인 : 모든 것을 다하는23. UX디자이너 : 전투력이 높은24. 편집디자이너 : 자간에 극도로 예민한25. 시마이 : 오늘은 여기까지30. _final : = start31. 정렬 : 생명32. 컬러 : 블랙홀33. 시발 : 프로그램이 응답하지 않습니다.34. 컨셉 : 기획과 디자인 등 전과정을 아루는 맥락이나 의미. 특정한 목적을 지니고 그것의 달성을 위해 만들어지는 경우가 많다. (유사어 : 대표님의 생각)35. 이거 : 내 모니터에 있는 거(=니가 와서 봐라)36. 그거 : 니 모니터에 있는 거(=내가 가긴 귀찮다)37. 쓰읍 : 다시 해라38. 죄송한데 : 너의 퇴근은 없다39. 로고 : 1)본디 텍스트타입의 아이덴티티 표현 방식으로 기업이나 서비스의 이름이나 정체성을 표현한 이미지. 2) 대표님의 생각을 읽고 시각화 시키는 작업 (유사어 : 야근)40. 데드라인 : 나는 지키지 않겠지만 너는 지켜야 하는 것41. 픽셀과 벡터 : 클라이언트가 이해하지 못하는 개념42. 프리미어 : 다루기 싫거나 못 다루지만 어쩌다보니 하고있는 어도비툴43. 핀터레스트 : 구원의 샘 (자매품 : 비핸스)44. 유튜브 : 스승님, 지식의 샘, 바이블, 모든 게 다 있는 곳, 메시아45. 맥북 : 어깨를 파괴하고 성능을 득한다46. 외장하드 : 이유는 모르지만 자꾸 고장나는 것. 모든 것을 강제로 내려놓게 하는 인생의 참스승47. 사수(+접미어 놈/새끼) : 있으면 미칠 것 같은데 없어도 미칠 것 같은 사람48. 부사수(+접미어 놈/새끼) : 있으면 미칠 것 같은데 없어도 미칠 것 같은 사람49. 엑셀 : 잘 모르겠는 것(자매품 : '한글2000')49. 캘리브레이션 : 모니터의 색온도, 밝기, 명암, 감마 등을 조정해 일정한 표준으로 보이도록 하는 작업.50. 휘도 : 광원의 단위 면적당의 광도. 광도는 광원에서 나오는 빛의 세기, 조도는 빛을 받는 사물의 밝기, 휘도는 면적당 광도를 의미해요. 모니터 등 디스플레이에선 휘도가 중요해요. 휘도에 따라 색감이나 선예도가 달라지기도 하죠.51. N10단계 : 명암을 10단계로 쪼개 나눈 것으로 대학교1학년 때 손으로 그리기도 했지만 잘 기억나지 않는 것52. HSB : 웹디자인할 때 쓰면 좋은 색상팔레트. 53. 팬톤컬러 : 이쁘고 비싼 것(컬러칩 사야함)54. RAM : 디자이너의 성격과 탈모를 결정하는 컴퓨터장치(16GB이상은 필수로..)55. 카페 : 커피가 있는 사무실56. 스크래치디스크 : 가상메모리와 비슷한 개념인데, RAM이 부족해서 임시저장할 곳이 모자르면 당신컴터의 하드디스크나 SSD의 일부분을 활용하여 RAM처럼 활용합니다. (자매품 : 스크래치디스크가 꽉 찼으므로 photoshop을 초기화할 수 없습니다.)57. png : 픙58. 누끼(v. 누끼따다) : 개체의 외곽선을 따라 펜툴로 따는 작업. 디자인계의 인형눈깔붙이기 같은 작업59. 시안 : 대장정의 서막60. 디자인 : 일단 나는 배웠으니 하겠지만, 누가 한다그러면 한번쯤 말리고 싶은 것.
조회수 1721

당신이 고민해야 할 성능 분석 요소

IT 서비스는 더욱 복잡해지고 어플리케이션과 인프라의 경계도 클라우드 환경과 함께 허물어지고 있습니다. 많은 기업들이 가상화를 넘어 컨테이너로 가고 있으며 서버리스도 더이상 낮설지 않습니다. 인프라의 변화와 함께 아키텍처의 변화도 다양하게 만들어져 가고 있습니다. 복잡성이 아무리 높아져도 우리는 서비스의 성능을 보장해야 합니다. 서비스의 성능을 보장하기 위해 우리가 체크해야 할 중요 요소들을 알아보려고 합니다. 1. 인프라스트럭처와 클라우드서비스의 성능은 코드 밖에서도 만들어집니다. 그중에서도 인프라스트럭처는 매우 중요한 요소입니다. 국내에서 인프라스트럭쳐 분야는 클라우드로 전환하는 과도기적인 상황에 있습니다. SMB 시장에서 클라우드는 익숙한 환경이지만 국내 엔터프라이즈 기업의 클라우드 도입 비율은 20%가 되지 않습니다. 특히 클라우드를 도입하려는 엔터프라이즈 기업들은 데이터 센터, 퍼블릭 클라우드, 프라이빗 클라우드를 모두 사용하는 상황으로 넘어가면서 클라우드에 대한 모니터링 체계를 구성하는데 많은 어려움을 겪고 있습니다. 특히 기존의 자원 사용량을 설계하고 운영하던 방식에서 스케일의 변화를 통해 서비스의 성능을 실시간으로 조절하는 클라우드 서비스 운영 방법은 조직의 구조 변화를 동반하기 때문에 더욱 어려운 작업이기도 합니다. 이렇듯 클라우드의 전환은 최근 웹 서비스의 성능에 많은 영향을 미치고 있으며 데이터독이나 뉴렐릭 그리고 와탭 같은 성능 분석 서비스들은 클라우드 기반의 인프라 모니터링 기능들을 강화하고 있습니다. 2. 데이터베이스어플리케이션 성능 이슈의 80% 이상이 데이터베이스 레이어에서 발생합니다. 대부분의 엔터프라이즈 기업들은 자사의 어플리케이션을 성능 분석을 위해 DBA 포지션을 마련하거나 필요에 의해 컨설팅을 받고 있지만 아쉽게도 스타트업은 DBA포지션을 마련하는 경우가 거의 없습니다. 웹 서비스의 규모가 커지기 시작하면 데이터베이스로 인한 지연 장애가 매우 심각해 지기 시작합니다. 레거시로 인한 이슈까지 추가되면 서비스의 성능은 지속적으로 낮아지게 되므로 데이터베이스는 꾸준히 관리해야 하는 요소입니다.데이터베이스의 비중이 높다보니 어플리케이션 분석 서비스 중에서도 데이터베이스만 집중적으로 분석하는 도구들이 있습니다. 국내에서는 엑셈과 티맥스에서 데이터베이스 분석 솔루션을 제공하고 있습니다.  3. 오픈 소스와 써드파티 소프트웨어최근 두가지 형태의 트렌드가 서비스 성능에 영향을 주고 있습니다. 하나는 오픈 소스이고 다른 하나는 써드 파티 소프트웨어 입니다. 안정화 된 오픈 소스를 사용하더라도 설정 이슈 또는 사용 환경 이슈로 성능에 영향을 주는 상황이 많이 발생합니다. 위젯, 광고플랫폼, 플러그인등의 써드파티 또한 웹 서비스의 성능에 영향을 주는 요소입니다. 최근 써드 파티의 사용은 점점 늘어나는 추세로 인해 장애 발생에 대한 위험도는 더욱 높아가고 있습니다. 특히 써드 파티는 시간이 흐르면서 성능에 조금씩 부하를 누적시키기도 하므로 충분히 주의를 기울여야 합니다. 이런 환경에서도 서비스의 성능을 유지하기 위한 방법으로 통계 기반의 메소드 분석 기법 모니터링의 중요한 요소가 되어 가고 있습니다. 와탭의 Java 모니터링이 메소드 분석 서비스를 제공하고 있습니다. 4. 모바일구글 이 운영하는 더블클릭(https://www.doubleclickbygoogle.com/articles/mobile-speed-matters/)에 따르면 북미에서 3G에서의 모바일 페이지 로딩까지 소요되는 시간은 평균 19초입니다. 한국은 이미 4G를 넘어가고 있기도 하고 모바일 기기의 성능도 매우 높아서 북미와 상황이 다르지만 모바일 기반의 웹 서비스 성능을 분석할 수 있는 방안의 필요성은 높아져 가고 있습니다. 이와 함께 다양한 환경을 지원하는 end-to-end 모니터링의 중요성이 점점 대두되고 있는 상황입니다.  5. 컨테이너최근 인프라스트럭처의 새로운 흐름은 컨테이너 입니다. 한국은 리눅스 기반의 서비스 구축 시스템이 잘 발달한 덕분에 클라우드 도입이 다른 나라보다 늦은 편입니다. 하지만 최근 국내에 컨테이너 기반의 인프라스트럭처 도입 기업들이 많아지고 있습니다. 우리나라는 가상화를 건너뛰고 컨테이너부터 활성화 될수도 있을 거라 생각됩니다. 컨테이너 환경은 가상화보다 더 많은 인프라를 더 유동적으로 사용하게 되므로 기존의 규모를 뛰어 넘는 관리 체계를 만들어 나가야 합니다. 데이터독과 뉴렐릭 같은 SaaS 기반의 모니터링 서비스들은 이미 컨테이너의 대한 지원을 하고 있으며 와탭 또한 단순 지원을 넘어 컨테이너 전용 서비스를 준비중에 있습니다. 6. 마이크로 서비스많은 기업들이 클라우드와 함께 Micro Service Arichtecture를 도입하고 있기 때문에 독립적인 어플리케이션을 기반으로 하는 서비스 구조는 계속 발전해 나갈 것입니다. 마이크로 서비스와 클라우드의 조합은 커져가는 서비스의 규모를 독립적인 작은 단위로 나눌 수 있어서 매력적이긴 하지만 과거와 다른 운영 조직과 프로세스를 만들어야 하는 숙제를 만들었습니다. 예를 들면 기존에는 하나의 임계치를 사용하여 서비스의 위험도를 관리했다면 이젠 독립적으로 동작하는 서비스들의 임계치를 각각 어떻게 설정하고 관리할 것인지 고민해야 합니다. 독립된 마이크로 서비스의 성능 이슈가 전체 서비스 성능 이슈로 확대되지 않더라도 작게 발생하는 이슈들을 관리하지 못한다면 지속적으로 발전해야 하는 서비스의 미래도 흔들리게 될 것입니다. 7. 서버사이드 코드정상적인 상황이라면 서버사이드 코드에서 발생되는 지연시간은 찰나에 가깝지만 장애 상황에서의 지연은 서버사이드에서 발생하는 경우가 많습니다. 특히 방어가 되어 있지 않은 코드들은 물리적 요소의 작은 변화에 대처하지 못하고 웹 서비스 전체에 영향을 미치게 됩니다. 스타트업의 경우 개발팀이 운영을 함께 맡고 있는 경우가 많기 때문에 서버사이드의 코드를 직접 분석하곤 합니다. 하지만 서비스의 성능이 느려지는 상황 자체를 파악하지 못하는 경우가 많습니다. 서버 사이드에서 평균 응답시간을 체크하는 경우 10초 평균 응답시간이 0.5초를 넘는 경우는 거의 없습니다. 하지만 0.5초의 평균 응답시간을 같는 서비스라 할지라도 하루 동안 10초이상 걸린 고객의 숫자는 규모에 따라 1,000명이 넘을 수도 있습니다. 서비스에 규모가 있다면 꼭 APM을 사용해야 합니다.8. 네트워크 지연네트워크의 지연으로 인한 고객 불만은 예상외로 많이 발생합니다. 인프라스트럭처 이슈로 볼 수도 있겠지만 서비스를 운영한다면 항상 체크하고 있어야 하는 요소입니다. 해당 이슈를 확인 하려면 웹서비스 모니터링을 사용하시면 됩니다. 웹서비스 모니터링을 통해 네트웍상태를 포함한 서비스의 응답시간을 체크해 볼수 있습니다. 와탭의 경우 내부적으로 웹서비스 모니터링을 개발하여 사용하고 있지만 아직 서비스 하고 있지는 않습니다.  9. 자원 사용률자원 사용률은 최근 새로 떠오르는 이슈입니다. 이전에는 인프라스트럭쳐가 고정값이였기 때문에 자원 사용률이 모자라는 경우 서비스 성능을 포기하고 초과되는 고객의 요청을 앞단에서 버리거나 대기시키는 기법들을 사용해왔습니다. 클라우드 환경에서는 자원 사용량의 임계치가 넘어가면 자동으로 스케일을 조정하는 환경이 마련되면서 성능을 유지하는 것이 가능합니다.  클라우드 환경에서 과부하 상태에 접근하면 자동으로 인프라의 규모가 확장되고 과부하 상태는 정상으로 돌아갑니다. 이렇게 환경이 바뀌면서 자원 사용률의 중요 이슈가 성능에서 비용으로 전환되고 있습니다. 부하에 따른 스케일링 정책을 어떻게 정하는지에 따라서 성능과 비용 모두가 영향을 받기 때문에 Auto Scale에 대한 모니터닝이 관심을 받고 있습니다.  마무리웹 서비스의 성능에 영향을 주는 요소는 정말 많습니다. 와탭랩스 IT 기업의 어플리케이션을 모니터링 하기 때문에 기업의 IT 어플리케이션 성능 문제에 대해 항상 고민하고 있습니다. 해당 내용은 매달 또는 분기별로 트렌드를 반영하여 업데이트하고 할 생각입니다. 많은 분들에게 도움이 되었으면 좋겠습니다. #와탭랩스 #개발자 #개발팀 #인사이트 #경험공유 #일지
조회수 820

[인공지능 in IT] 올림픽의 주인공은 여전히 인간이다

2011년 7월 7일 새벽 오전0시 18분, 남아프리카 공화국 더반 컨벤션센터에서 평창이라는 단어가 적힌 흰색 쪽지가 뽑힐 당시, 대한민국 국민 모두의 염원이 현실로 이뤄졌다. 88 서울 올림픽, 2002 한일 월드컵 이후 우리나라에서 열린 전세계 규모의 가장 큰 축제가 평창에서 개최됨을 알리는 순간이었다. 동계올림픽은 인종과 국가, 정치 및 이념을 초월하고 전인류의 평화와 화합을 증진시키기 위한 글로벌 겨울 축제이자 세계 젊은이들의 힘과 기록의 제전이라 할 수 있다. 1924년 프랑스 샤모니 대회를 시작으로 2018년까지 총 22회 개최, 고대 그리스의 올림피아 경기부터 시작된 '올림픽'보다 그 역사가 현저히 짧지만, 올림픽이라는 의미만은 분명하다.< 2018>올림픽에 참가하는 선수들은 그들의 육체적, 정신적인 능력의 최대치를 겨룬다. 올림픽은 인간이 가진 힘을 시험하는 장이고, 이에 관중들은 우월한 선수들의 능력에 환호성을 자아낸다. 물론, 기술이 발달하며 선수들이 입는 유니폼이나 여러 도구들이 진화를 거듭했지만, 올림픽이라는 것은 인간 본연의 모습에 큰 초점을 맞춘 시험대다. 이렇듯 'Raw'하다고 볼 수 있는 선수들의 경쟁을 비 선수 입장에서 지켜볼 수 있는 것만으로도 엄청난 기회라고 생각한다.이번 평창 동계올림픽에서 발견한 재미있는 요소 중 하나는 관중을 위한 기술의 접목이라 할 수 있다. 과학기술정보통신부는 동계올림픽과 패럴림픽 진행 중 다양한 기술을 누릴 수 있도록 '평창 ICT 올림픽 가이드북'을 발간했다. 해당 가이드북을 살펴보면, ICT 올림픽은 이번 평창 올림픽의 5대 목표 중 하나다. 인공지능, 5G, UHD, IoT, 가상현실(VR) 등을 어떻게 이용할 수 있는지 국문과 영문으로 된 가이드북을 제작하고, 평창 ICT 체험관과 인천공항 등 오프라인을 포함한 온라인 상에도 게시한다.< 2018>5대 ICT 서비스 중 가장 관심이 가는 영역은 인공지능이다. 한국을 찾는 외국인들이 느낄 수 있는 언어장벽을 완화시키기 위해 인공지능 기반 통번역서비스를 제공하고, 올림픽이 열리는 동안 경기 정보 및 교통상황을 알아보기 위해 인공지능 콜센터를 통해 24시간 문의할 수 있다. 혹자는 단순히 편의성을 위해 간단한 기술을 도입했다 할 수 있을 것이다. 하지만, 인공지능 기술은 그 자체로도 어려운 과제임과 동시에, 선수가 아닌 관람객을 위해 도입했다는 것에서 의미를 부여하고 싶다.다시 한번 언급하지만, 올림픽은 오랜 훈련을 통해 능력을 입증하고 싶은 선수들은 물론, 경기를 지켜보고 이들을 응원하는 관람객들까지 모두 '참여'하는 축제다. 한국어를 전혀 모르는 핀란드의 방송사 관계자가 통번역서비스를 활용해 아무 문제없이 스피드 스케이팅 경기를 중계할 수 있을 것이고, 대구에서 평창까지 봅슬레이 경기를 보러 가는 가족들이 편안한 운전을 위해 새벽 1시에라도 교통 정보를 얻을 수 있는 것이다.최근 인공지능을 활용한 통번역 서비스는 날이 갈수록 진화를 거듭하고 있다. 대부분의 기업에서 'NMT(Neural Machine Translation)'라고 부르는 인공신경망 기계번역을 활용하는데, NMT는 인공지능 기술을 적용해 어마어마한 양의 번역 결과 데이터를 스스로 학습하고, 다른 번역 케이스에도 적용하는 기술이다. 우리에게 많이 알려진 NMT 탑재 번역 서비스는 구글 번역과 네이버 파파고가 대표적이다. 이번 평창올림픽에서 사용되는 통번역서비스는 한글과컴퓨터가 한국전자통신연구원(ETRI)과 공동 개발한 '말랑말랑 지니톡'이다. 실제로 지니톡에는 올림픽 종목, 강원도 지역 관광지, 음식 등 동계올림픽에 관련된 데이터베이스 10만 건을 적용, 상당한 정확도를 보인다고 한다.한글과컴퓨터가 한국전자통신연구원(ETRI)과 공동 개발한 말랑말랑 지니톡, 출처: 한컴24시간 상담할 수 있는 콜센터도 인공지능은 핵심적인 역할을 담당한다. 여기서의 인공지능은 대량의 텍스트 기반 데이터를 학습하는 것이 중요하다. (1) 인식률이 높은 'DNN(Deep Neural Network)'을 토대로, (2) 한국어를 음성으로 인식할 수 있는 'STT(Speech To Text)'를 구축한 뒤(굉장히 어려운 과제다), (3) 콜센터로 들어오는 상담 내용을 분석하고, (4) 이를 제대로 학습할 수 있는 인공지능 기술을 접목해야 한다. 이 모든 것을 만족해야 콜센터에 상담을 요청하는 고객들이 인간 상담원과의 기계간의 괴리감을 적게 느낄 수 있기 때문이다.인공지능 상담 영역은 CS가 가장 활발히 이루어지는 업계 중 하나인 금융, 특히 보험 업계에서 많이 적용 중이다. AIA생명 한국지점은 인공지능을 도입해 고객과 상담하는 챗봇과 전화로 응답하는 로보텔러 서비스를 실시한다. 고객이 자주하는 문의에 대해서는 채팅 형태로 24시간 365일 인공지능 챗봇이 1차 상담을 진행하고, 대기시간 없이 바로 연결할 수 있어 생산성과 효율성, 정확도 등을 높일 수 있다. 또한, 고객에게 판매된 보험계약에 대해 로보텔러가 직접 전화를 걸어 완전 판매를 모니터링하는 업무도 진행한다. 여기는 인공지능 상담사가 학습한 대화를 기반으로 고객과 대화를 진행해 계약정보를 확인하고 계약을 확정하는 음성서비스를 적용했다.이번 평창 동계올림픽을 통해 인공지능은 그 범위를 가리지 않고 곳곳에 적용될 수 있다는 새로운 잠재력을 평가 받고 있다. 사실 최근 몇 년 사이에 IT 뿐만이 아니라 유통, 제조 등을 막론하고 기업들은 사활을 걸고 인공지능에 투자 중이다. 고도의 기술을 축적하고, 이를 적용해 새로운 사업 모델로 확장하거나, 단순반복적인 일을 대체해 비용을 줄일 수 있다는 점은, 인공지능을 하나의 패러다임으로 이끌고 있다. 물론, 이번 평창 동계올림픽에서 선보인 인공지능 기술들은 여러 기업들이 사업적인 측면을 고려한 사안일 것이다. 하지만, 인간이 주체가 되어 열리는 올림픽이라는 축제 속에서 인공지능이 한자리를 차지한다는 것은, 이제 더이상 놀랄 일은 아닐지 모른다. 결국, 인공지능도 인간의 삶을 이롭게 하기 위해 탄생된 기술이라는 것을 잊지 말자.이호진, 스켈터랩스 마케팅 매니저조원규 전 구글코리아 R&D총괄 사장을 주축으로 구글, 삼성, 카이스트 AI 랩 출신들로 구성된 인공지능 기술 기업 스켈터랩스에서 마케팅을 담당하고 있다#스켈터랩스 #기업문화 #인사이트 #경험공유 #조직문화 #인공지능기업 #기술기업
조회수 2006

야놀자 기술 블로그 만들기

Hello world!저는 CX서비스실에서 기획을 담당하고 있는 강미경입니다. R&D 그룹의 기술 블로그, 그 영광의 첫 포스트로 개발의 보람을 대신할 수 있어 기쁩니다. 오늘은 ‘기획자가 어쩌다가’ 기술 블로그를 만들게 되었는지 얘기해보려고 합니다.왜 기술 블로그인가제가 야놀자에 입사한 지 만 1년이 되었습니다. 입사하면서 가진 개인적인 목표 중의 하나는 블로그를 운영하는 것이었습니다. 저는 오래전부터 개인 블로그를 운영하고 있고, 외부 커뮤니티 활동에서도 팀 블로그를 운영합니다. 그래서 개발자에게는 기술 블로그에 쓸 글을 작성하는 것보다 코딩을 하는 게 더 쉬울 정도로, 글 쓰는 고통이 남다르다는 것도 알고 있지요.하지만 ‘알고 있다’고 생각하는 정보를 정리하고 그것이 잘 전달될 수 있도록 하는 것은 개발실력과는 약간은 다른 영역의 것이기도 합니다. 그래서 테크 스웩이 넘치는 블로그가 아니더라도, 꾸준히 스토리를 전달하면 그게 개인과 조직의 히스토리로써의 가치가 충분하다고 생각했습니다. 무엇보다 조직 자체의 성장에 큰 밑거름이 되고요.블로그를 시작해보자기술 블로그를 하자는 말에, 놀랍게도 한결같이 ‘관심만’ 주더군요(…) 평소 업무가 많고 바쁨을 떠나서, 보람보단 책임만 남아 유지보수 대상이 되어버릴 가능성이 무궁하지 않겠습니까. 하지만 목마른 사람이 우물을 파라고, 개발자의 도움 없이 블로그를 만들 각오를 하기에 이르렀습니다.(과거의 나를 규탄…#야놀자 #개발팀 #블로그 #인사이트 #경험공유
조회수 1368

모바일 데이터 분석의 시작: AARRR (해적지표)

모바일 분석의 중요성은 익히 들어 알고 있지만, 모바일 데이터를 실제 비즈니스에 어떻게 활용해야 하는지 모르겠다고 말씀하시는 고객 분들이 많으신데요. 모바일 분석 툴을 이용하여 아무리 많은 데이터를 쌓더라도, 그것이 실제 비즈니스 목표 달성에 도움이 되지 못한다면 무용지물일 것입니다.오늘은 유명한 분석 프레임워크 AARRR에 따라 비즈니스 목표를 달성하기 위한 모바일 데이터 분석 활용법을 알아보겠습니다.* AARRR: 미국의 스타트업 엑셀러레이터 500 Startups의 창립자 데이브 맥클루어(Dave McClure)가 개발한 분석 프레임워크. 스타트업이 시장 진입 단계부터 서비스/제품을 홍보하고 사용자를 확보하기 위해 단계별로 집중해야 할 지표를 정리한 성과측정모델. (1) Acquisition (사용자 획득)  모바일 앱을 출시하고 마케팅을 진행할 때, 어떤 광고 채널/캠페인이 가장 효과적인지 파악하기 위해서 어떤 데이터들이 필요할까요? 흔히 가장 많은 앱 설치수나 방문수, 페이지뷰를 일으킨 광고 채널/캠페인이 효과적이라고 생각할 수 있는데요. 하지만 데이비드 맥클루어에 따르면 해당 비즈니스에 의미 있는 이벤트 수를 가장 많이 발생시킨 채널/캠페인에 예산을 집중해야 한다고 합니다. 예를 들어, 특정 채널에서 유입된 사용자들의 앱 설치수나 방문수가 높다고 하더라도 비즈니스에 핵심적인 회원가입수, 주문수가 낮다면 효과적인 채널이라고 볼 수 없겠죠. 이 때문에 와이즈트래커에서는 마케팅 채널/캠페인별 앱설치수, 방문수, 페이지뷰 뿐 아니라 비즈니스별 맞춤 성과(회원가입수, 예약수, 리뷰수, 공유수 등) 전환 데이터를 제공합니다.→ 해당 데이터에서 Facebook과 Adwords 광고를 통한 App 설치수는 비슷하지만 주문수(페이스북: 205, 구글: 3)는 크게 차이가 납니다. 이러한 경우, Adwords 보다는 Facebook에 예산을 집중해야 합니다.  이 뿐 아니라 마케팅 채널 별로 앱 재사용율 및 삭제율을 Retention 리포트를 통해 제공하기 때문에 어떤 마케팅 채널이 고객 획득과 활성화에 효과적인지 파악할 수 있습니다.→ Facebook으로 유입된 사용자의 Retention 리포트입니다. 앱 설치 이후에 재사용율보다 삭제율이 높아 개선이 필요한 상황입니다.  마지막으로 위의 내용을 통해 가장 효과적인 채널을 확인했다면, 그 채널로 유입된 사용자들이 어떤 사람인지 파악해 보다 효과적인 타겟 마케팅을 진행할 수 있습니다. 와이즈트래커의 다차원 세그먼트 기능을 이용하면 해당 채널에 유입된 사용자의 성별, 연령, 사용국가, 기기 플랫폼 등을 파악할 수 있습니다.→ WISETRACKER 다차원 세그먼트 설정 화면. 광고를 통해 유입된 사용자들을 설정한 세그먼트에 따라 일차원 또는 다차원으로 나누어 볼 수 있습니다. 위와 같이 기기 플랫폼(iOS vs Android)과 성별로 다차원 세그먼트를 설정하면 아래와 같은 데이터가 나타납니다.   (2) ACTIVATION (사용자 활성화)사용자들이 앱을 설치했다 하더라도 첫 방문 시 사용 경험이 나쁘다면 앱을 삭제하거나 다시 방문하지 않을 확률이 높습니다. 우리 서비스가 유저들에게 만족스러운 경험을 제공하는지 확인하기 위해서는 아래와 같은 데이터를 확인해야 합니다. 우선 화면 이동경로 리포트를 통해 사용자들이 첫 화면 이후에 기획 의도 처럼 문제없이 이동하고 있는지를 확인할 수 있습니다. 예를 들어, 메인화면 이후에 서비스/상품 페이지가 아닌 엉뚱한 화면으로 이동하는 비율이 높다면 앱 UI/UX 개선이 필요하겠죠.→ WISETRACKER 화면 이동경로 리포트 또한 전환 퍼널 분석을 통해 각 화면 경로 별 전환율과 이탈율을 분석할 수 있습니다. 4단계로 이루어진 회원가입 전환 경로 분석 시,  2단계에서 이탈률이 높다면 해당 단계에서 고객에게 너무 많은 정보를 기입하게 하거나 민감한 개인 정보를 요구하는 것일 수도 있습니다.→ WISETRACKER 전환 시나리오 화면. 회원가입의 2단계(가입인증)에서 이탈율이 38.8%로 가장 높기 때문에 해당 단계를 간소화 하기 위한 작업이 필요합니다.   위의 정보들을 통해 우리 서비스가 고객들에게 긍정적인 사용자 경험을 주고 있는지 지속적으로 확인하고 서비스를 개선해나가는 작업이 필요합니다. (3) RETENTION (사용자 유지)사용자가 지속적으로 앱을 방문한다는 것은 그 서비스에 관심이 많다는 의미이므로 추후 구매 전환으로 이어질 가능성이 높습니다. 와이즈트래커의 Retention 리포트를 통해 사용자들이 앱을 지속적으로 사용하는지, 그렇지 않고 1~2일 내에 삭제하는지를 확인 할 수 있습니다. 만일 앱 설치수는 꾸준히 늘어나는데, 앱 유지율 및 삭제율 또한 점차 높아진다면 처음 방문자들에게 앱 서비스가 크게 매력적이게 다가오지 않는다는 의미로 볼 수 있겠죠.→ WISETRACKER의 Retention Report. 1월 12일부터 15일까지 앱 설치수는 크게 늘어나고 있지만, 설치 다음 날(+1d) 앱 삭제율도 증가하고 있기 때문에 소비자들이 지속적으로 앱을 사용하도록 서비스 개선이 필요한 상황입니다.     이 뿐 아니라 방문 횟수, 방문 분포 리포트를 통해 사용자들이 어떤 빈도로 앱에 방문하는지 확인할 수 있습니다. 매일 들어오는 사용자의 수가 가장 많다면 서비스의 충성고객이 많다는 의미로 볼 수 있습니다. 반대로 15-30일 주기로 들어오는 사용자가 많다면, 이들의 방문을 촉진할 수 있는 이벤트나 프로모션을 푸시 메시지로 안내하는 방안을 생각해 볼 수 있습니다.→ WISETRACKER의 방문간격 Report. 방문간격이 0일(매일 방문)인 사용자 비율이 높은 것으로 보아 충성고객 비율이 높은 것을 알 수 있습니다.  앱 사용자 분석을 통해 고객의 특성을 파악했다면 특정 사용자 그룹을 대상으로 타겟 마케팅을 진행할 수 있습니다. WISETRACKER의 오디언스 타겟팅을 이용하여 데모그래픽, 행태정보, 관심사에 따라 사용자의 ADID/IDFA를 추출하고 해당 사용자에게만 광고를 노출하거나 푸시 메시지를 보내는 것이 가능합니다.→ WISETRACKER의 Audience Targeting 설정 페이지. 위와 같은 설정으로 1월에 앱을 설치한 iOS 그룹의 IDFA만 추출하여 광고 노출 및 푸시 메시지 전송에 이용할 수 있습니다.  또한 전송된 푸시 메시지의 응답률, 실행수, 전환분석이 가능하기 때문에 사용자 방문수와 전환수를 높이는 효과적인 메시지를 파악할 수 있습니다.→ WISETRACKER 푸시 메시지 분석 리포트 (4) REVENUE (매출)매출 향상을 위해 어떤 사용자들이 매출에 많은 기여를 하는지를 파악해 유사 사용자들을 대상으로 마케팅을 진행하는 방법도 있습니다.와이즈트래커의 주문/매출액 리포트에 다차원 세그먼트 기능을 적용하여 주문 고객들의 성별, 연령대, 방문유형, 유입 채널들을 파악해 비즈니스의 가치 고객군을 파악할 수 있습니다.→ 주문/매출액 리포트를 회원 연령대로 세그먼트를 나누면, 아래와 같이 주문한 사용자들의 연령대에 따른 주문 데이터를 알 수 있습니다.  또한 고객들의 구매 횟수 분포 및 구매 행동 패턴을 파악하여 앱 내 프로모션 진행 시 활용할 수 있습니다. 예를 들어, 구매 주기가 7일인 사용자가 다수라면, 해당 주기에 맞춰 할인 쿠폰을 푸시로 보내거나 신상품을 소개하는 이메일을 보낼 수 있겠죠마지막으로 매출 측면에서 가장 인기가 많은 상품과 컨텐츠를 파악해 앱 내 관련 컨텐츠/상품을 빠르게 업데이트하고 종류를 늘려간다면 같은 기간 내 보다 높은 매출을 기대할 수 있습니다.→ WISETRACKER 상품별 주문/매출액 리포트. (5) REFERRAL (추천)비즈니스의 빠른 성장을 위해서는 제품/서비스에 무심한 고객 10,000명을 만드는 것보다 충성도가 높은 고객 100명을 만드는 것이 더 효과적이라고 하죠. 왜냐하면 그 100명은 자신들의 친구와 지인들에게 서비스를 적극적으로 홍보하기 때문에, 장기적인 네트워크 효과로 인해 10만명, 100만명의 고객을 획득할 잠재력을 가지게 됩니다.우리 비즈니스가 사용자에게 매력적으로 느껴지도록 하는 것이 가장 중요하고, 그 다음엔 사용자들이 온라인에 쉽게 공유할 수 있도록 서비스를 개선해야 합니다.만약 SNS 공유수가 낮다면, 이들에게 적절한 보상을 제공하는 마케팅 방안도 생각해 볼 수 있습니다.마무리하며AARRR 단계별 중요 지표를 데이터로 파악하고, 개선점을 찾아 빠르게 업데이트한다면 비즈니스 목표를 보다 수월하게 달성해 나갈 수 있습니다.아직까지 많은 기업들이 추측이나 감을 통해 중요한 의사결정을 내리고 있습니다. 와이즈트래커의 목표는 이러한 고객들에게 데이터를 기반으로 보다 현명한 의사결정을 내릴 수 있도록 돕는 것입니다. 비즈니스 목표를 보다 빠르고 쉽고 달성하고 싶다면, 오늘부터 우리 비즈니스에 핵심적인 지표들부터 데이터 분석을 시작해보는 것이 어떨까요?
조회수 835

스타트업을 시작하며...3

Phase 11. 살짝 암초에 걸리다.주로 사용하게 될 5ml 향수병 샘플을 중국에 있는 회사들에 요청하였는데.. 3개 회사 것이 도착하였으나, 아직 맘에 드는 것이 없다. 이런 된장. 그러던 중 관계가 있다던 fragrance house의 샘플 바틀을 보고 "바로  이거야"라는 느낌이 들어 급하게 메일을 써본다. 30ml 알루미늄 바틀은 좀 많이 비싸지 않을는지? 5ml 바틀은 사이즈가 없는 것은 아닐는지? 걱정 걱정에 잠 못 드는 밤들 이 살짝 생겨난다.Phase 12. 부정적인 의견들을 만나다.. 하지만 그것을 극복해보자!!이 서비스가 머릿속에서 잘 그려지지 않는데? 많은 사람들은 본인의 입장에서 feedback을 주는 경우가 많다.  그중에서 걸러서 들어야 할 것도 있고, 새겨 들어야 할 내용들도 있을 것이다. 구체적인 occasion을 더 제공해주지 않고 단순히 매월 향수를 보내주는 것에 대한 부정적인 의견이 있었고.. 이것을 6개월 box (보석상자 콘셉트)으로 개선해 가는 방향을 잡아 보았다. 6개월 치 향수 통을 담을 수 있는 box를 제공하면 collection이 완성될 것이고, 빈 자리들을 채워가고 싶은 욕심과 다음엔 어떤 것들이 올까? 에 대한 호기심을 만들어 낼 수 있지 않을까?phase 13. 현장이 답이지 말입니다.packaging design이 꽤나 중이요한 요소임을 처음부터 인지하고 있던지라, 굉장히 다양한 의견들을 만들어 보았다. 담뱃갑 모양, CD case 모양, 리본 형태, 파우치 형태, 등등. 만들어 보고 고민했는데.. 방산 시장을 가면서 새로운 월드를 발견하게 되었다. 참고할 것들이 많이 있었고, 현실적인 가격을 들을 수도 있었다. 아이디어를 mock up으로 만들다 보니.. 과대포장은 벌금을 내게 될 수도 있다는 사실도 알게 되었다. 그러다가 이젠 직접 디자인을 해서, 종이를 자르고, 접고, 접착을 해서 박스를 만드는 단계까지 오게 되었다. 이젠 다시 견적을 뽑아야 할 상황이다.Phase 14. 실마리가 될 수 있는 것들은 조금씩이라도 당겨보자..페이스 북에서 예전부터 알고 있던 디자이너 분이 "파워포인트"처럼 쉽게 웹 페이지를 만들 수 있는 서비스를 기획하고 진행하고 있다는 사실을 발견하고, 바로 연락을 하였다. 일단 만나보자고.. 만났더니 오히려 나에게 더 필요한 서비스를 소개해 주었다. Six Shop! 모든 사람들이 6분 만에 커머스를 만들 수 있도록 해주는 목표를 가진 서비스다. 이전에 고려하고 있던 WordPress + Woo-commerce 조합보다 훨씬 간단하게 사이트를 제작할 수 있다!! 코딩에 대한 부담과 시간에 대한 제약이 사라진다. 일단 사람을 만나고 나에 대해서 설명을 하고 도움을 요청하면 새로운 길들 이 나타나는 것을 느낀다.Phase 15. 투자를 받을 것인가?요즘 start up들이 투자받는 규모는 꽤나 크다. 몇 십억에서 몇백억까지 이젠 규모도 제법 된다. 부럽다.. 그런데 고민을 해본다. 투자를 왜 받아야 하지? 투자를  받는다는 것은 내가 갈 수 있는 속도보다 빠른 속도로 목표에 도달하기 위해 인재를 구하고, 마케팅을 하고, 개발에 힘을 쓸 수 있다는 것이다. 나에게 투자가 필요할 것인가? 나에게 1억이라는 투자금이 들어온다면 무엇을 해야 할까? 과연 필요할 것인가?#파펨 #스타트업 #창업가 #창업자 #마인드셋 #인사이트

기업문화 엿볼 때, 더팀스

로그인

/