스토리 홈

인터뷰

피드

뉴스

조회수 1295

I/O Diary 19. 의지보단 환경

매주 화,목 점심시간에 큐티를 한다. 성경의 한 구절을 묵상하고 의견을 교류하는 생산적 토론이다. 대화의 마지막은 항상 오늘 배운 내용을 삶에 구체적으로 적용하는 다짐으로 장식한다. 큐티를 한지 한 달이 조금 넘은 것 같은데 이 짧은 30분 덕분에 내 삶을 어떻게 점진적으로 개선해 나갈 수 있을지 계속 의식할 수 있게됐다.큐티를 하면서 문득 “어떤 목표를 달성하기 위해서 의지력을 기르는 일도 중요하지만 일이 잘 돌아가는 최적의 환경을 구성하는 일도 중요하다.”는 사실을 깨달았다. 요근래까지 어떻게하면 아침에 쉽게 일어날 수 있을까 고민해 왔다. 매일 아침 5분만 10분만 중얼거리며 그렇다고 다시 자는 것도 아니면서 아침을 설치는데. 해가 잘 들지 않는 어둑한 이전 자취 방에서는 유독 심했다. 의지가 부족한 스스로를 자책을 하며 지내오다 이번에 새집으로 이사오면서 자존감을 다시 회복할 수 있었다.요즘은 알람 울리기 한시간 전에 가벼운 몸상태로 일어난다. 처음에는 이사온 집이 낯설어서 그런가 생각해봤는데 답은 다른 곳에있었다. 햇빛이다. 올해 3월부터 살고 있는 지금 집의 침실엔 한 벽면 너비를 꽉채우는 큰 창이있다. 비록 북향이지만 주변에 건물이 없어 새벽부터 볕이 잘든다. 직전에 살았던 작은 원룸은 빌라들이 다닥다닥 붙어있어 지금 집과는 채광량이 비교할바가 못될 정도로 적다. 빛이 수면중 호르몬(멜라토닌?)에 영향을 준다는 이야기는 익히들어왔는데 이토록 아침잠을 쉽게 물리칠줄은 몰랐다. 이 채광량을 높이는 환경 구성 덕분에 나는 요즘 아침에 쉽게 일어난다. 물론 늦게자면 몸이 조금 무겁긴하다. 그치만 아침인지 밤인지 구분안되는 이전 자취방보다는 훨씬 더 적은 의지로 일어날 수 있게됐다.손정의는 10대시절 미국 유학에 성공하기 위해 일본학교를 자퇴했다고 한다. 그의 말에 따르면 이러한 결정을 배수의 진이라고 표현 했는데. 퇴로를 스스로 차단하는 환경이 자연스럽게 절박함을 만들어 냈다고 한다. 덕분에 엄청난 엄청난 속도로 고등학교를 졸업하고 버클리까지 입학했으니 성공적인 환경조성이라 할만 하다.결국 모든걸 초월하는 의지란 없다. 만화주인공처럼 말하는대로 척척 이루기란 어렵다. 내가 처한 환경에 따라 어떤일은 쉬울 수도 어떤 일은 지극히 어려울 수 있다. 그러니 어떤 목표를 달성하기위해서는 최고의 효율을 낼 수 있는 환경부터 갖추지 않았나 돌아보는 일도 중요하지 않을까? 물론 일단 시작해보는 것도 중요하다. 그러나 일이 잘 안풀릴 경우 자신의 실행력과 의지력을 자책하며 몰아붙이기 보다 일의 효율을 높이는 환경을 섬세하게 설계하는데에도 시간을 쏟는 시도도 의미 있다는 생각이 든다. 왜냐면 환경을 바꾸는 일은 의지력을 기르는 일보다 의외로 쉽기 때문이다.다짐: 2018년 블로그 꼭 20편 이상 쓰자.instagram: continueingfacebook: facebook.com/profile.php?id=100011882362436email: [email protected]#스위처 #Switcher #다짐 #각오 #마인드셋
조회수 75

그것이 시작이었다

“일어났어?”“응. 자고 있어... “"지금 몇 신데 아직도 자? 얼른 일어나서 나와. 네가 좋아할 만한 곳을 찾았어.” “응? 뭐라고?”“잔말 말고 그냥 나와. 거기가 어디냐면, 나 한 번밖에 말 안 할 거니까 잘 들어. 알았지? 일단 지하철을 타. 그리고 을지로역 4번 출구로 나와. 거기서 500미터를 걸어가면 횡단보도가 나오거든? 그 횡단보도를 건너. 그리고 300미터쯤 가다 보면 두 갈래 길이 나오는데, 왼쪽 골목이야. 알겠지? 오른쪽 아니고 왼쪽이다! 그 골목으로 들어가면 길이 점점 좁아지거든? 그럼 제대로 찾은 거야. 그렇게 700미터쯤 가잖아? 그러면 바닥에 흰 글씨로 희미하게 간판이 새겨져 있거든. 이거 잘 안보이니까 정말 섬세하게 봐야 돼. 그 간판이 보이면 다 찾은 거야. 그럼 그 위쪽으로 계단이 보이거든? 거기로 올라가면 돼. 그럼 문이 보일 거야. 알겠지? 거기서 3시 반에 만나는 거다! 이따 봐!!”“응??? 야! 잠깐만!!” 뚜뚜뚜... 그렇게 전화가 끊겼다. 어제 늦게 잤는데 이렇게 찝찝하게 잠이 깨버리다니... 짜증이 확 밀려왔다. '아 얘 뭐지.. 미쳤나..'  '대체 이걸 찾아오라고 말한 게 맞는 거야?' '아니 무슨 약속을 이렇게 일방적으로 하고 난리야.' "아 씨!! 안가. 안 간다고!!"잠이 덜 깬 채 씩씩대다가 소리를 빽 지르고는, 다시 이불을 덮어쓰고 잠을 청했다. 그런데 한편으로 궁금증이 몰려왔다. '뭐지.. 왜 거기서 만나자는 거지.. 내가 좋아할 만한 곳이란 건 뭐지?''얘가 제멋대로 긴 해도 헛소리할 애는 아닌데... 아 뭐지? 괜히 궁금하잖아!!'   "어휴. 그래 간다, 가." 이불을 박차고 일어나 시계를 봤다.  "지금이 열한 시니까 지금부터 천천히 준비하고 나가면 되긴 하겠는데..” “아.. 근데, 을지로에서 뭐 어쩌라고?” 뭐라 했더라 기억을 다시 되짚어보려는데, 띵동 문자가 울렸다.    내가 특별히 문자로 알려준다. 잘 찾아오라고 ㅋㅋ을지로역 4번 출구. 거기서 500미터 횡단보도, 건너서 300미터 두 갈래 길. 왼쪽 골목, 길이 점점 좁아짐. 700미터 직진. 바닥에 흰 글씨 간판. 그리고 계단. 세시 반! 늦지 마!!그것이 시작이었다.
조회수 1130

화장실의 브랜딩: 업무분장의 함정

일을 할 때는 반드시 업무분장이란 것을 합니다. 각자 일정파트의 업무를 담당하고 그것에 책임을 진다는 얘기이지요. 매우 행복하고 아름다운 얘기입니다. 그 큰 업무를 어떻게 다 해. 그러니 너는 디자인, 너는 발표, 너는 자료조사, 나는 글을 쓰는 것이죠. 어디서 많이 본 그림입니다. 그렇죠. 조별과제.조별과제전 대학교를 중퇴하고 때려쳤으니, 1년 좀 넘게 경험했고 여러분들은 4년 내내 경험하셨으니 더욱 잘 아시리라 생각됩니다. 조별과제. 공산주의가 망한 이유를 몸으로 체득할 수 있는 또 하나의 교양과목이자, 모두의 할머니 할아버지가 여러 번 돌아가시는 예토전생의 술법이죠. 이 조별과제가 나이를 좀 먹고 장소를 직장으로 옮기게 되면 '업무분장'이라는 이름으로 재탄생하게 되는데, 자꾸 지난 4년간 겪었던 호구의 추억이 되살아나는 듯한 기시감은 떨쳐내기가 힘듭니다.  오늘은 이 업무분장에 대해 알아보도록 하겠습니다. 브랜딩업무는 혼자 할 수 있는 수준의 업무량이 아닙니다. 게다가 그래서도 안되는 것이구요. 브랜딩은 기획단계부터 디자인, 실행, 회계까지 다양한 팀과 업무영역을 아우르게 됩니다. 그도 그럴 것이 브랜딩은 전사적인 단위의 액션이고, 단기적인 프로모션 따위가 아니기 때문입니다. 정체성에 관련된 문제이니 모두가 각 영역에서 하나의 가지를 담당해야 합니다. 그러니 전체직원이 30명이라면 30명이 함께하는 조별과제라고 볼 수 있겠네요. 우리의 경험상 4,5명만 단톡방에 있어도 그 중 한 두명은 반드시 잠수를 탑니다. 더불어 다른 한 명은 도무지 속도를 못 따라오고, 그나마 괜찮은 아이는 자꾸 집안에 무슨 일이 생깁니다. 나를 제외한 모두의 집안에 큰 우환이 생기는 무시무시한 프로젝트죠. 일단 이러한 집안의 큰 변고가 어째서 생기는 지 알아보도록 합시다.업무분장은 왜 항상 폭망인가.1. 방관자이론은 어디에나 적용된다. 내가 아니어도 누군가는 할 겁니다. 이거 못해도 월급은 받습니다. 혼나면 됩니다. 우리 중에 마피아가 있는거야..날로 먹2. 업무역량이 제각각이다.내 기대만큼 일을 잘하는 사람은 세상에 그리 많지 않습니다. 그리고 내가 생각하는 수준의 프로일잘러들은 이미 개인적으로 다 사업을 하고 있거나, 재야에 숨어있거나, 일하느라 바빠서 찾기 힘듭니다.고수들은 산 속에 숨어있다. 채용공고는 비둘기로 날리자.3. 누가 무슨 일을 하는 지 몰라.분명 회의시간엔 서로 나눈 것 같긴 한데 누가 무슨 일을 어떻게 맡고 있는 지를 정확하게 모릅니다. 옆 사람의 업무진행이 어디까지 되었고, 거기에 맞춰 나는 어느 수준까지 해야하는 지 등, 분장의 목표는 집단지성과 다수의 분업을 통해 효율적이고 높은 수준의 결과물을 내는 데에 있지만, 대부분 목표와는 다르게 집단게으름과 한 사람이 만든 것보다도 못한 혼란스럽고 괴이한 혼종이 탄생하는 경우가 많습니다. 느와르 영화 찍는 것도 아니고 도대체 왜 다들 자기 일을 숨기는 걸까요?그래서 나오는 괴이한 혼종...4. 사실은 커뮤니케이션을 못한다.사실은 숨기는 게 아니라, 말을 못하는 겁니다. 어떻게 말해야 할 지도 모르고, 서로 보고하는 것도 눈치보입니다. 솔직히 수평적관계라고 톰, 제임스, 하비 등 영어이름을 붙였지만 몸에 밴 수직적 마인드는 어쩔 수 없습니다. 1년차와 5년차인 내 명함에 똑같이 manager 라고 되어있는데다가 1년차가 자꾸 자기와 동등한 수준의 프로젝트를 맡는다면? 5년 차인 선배의 입장에선 각자의 역량의 차이가 있으니 당연하다. 라고 받아들이기는 여간 어려운 일이 아닐 것입니다. 그런데 자꾸 밖으로는 쿨한 척 해야하고, 속으론 '내가 니 위야' 라는 모순이 발생하면 입은 닫히고 가면만 늘어갑니다. 자꾸 가벼운 얘기들만 오고가고 진지한 싸움과 논쟁을 피하게 됩니다. 화를 내면 진다라는 묘한 명제는 분노의 진실성을 역설하고 있습니다. 먼저 진실을 내비친 사람이 패배하는 것이다라는 체면과 격식의 아이러니죠.눈치만 보는게지.5. 업무분장의 기준이 엉망이야.업무는 케이크쪼개듯 정확히 몇 등분으로 쪼개지지 않습니다. 반드시 많은, 중요한, 급한 일들이 발생하고 누군가는 그것을 떠맡아야 합니다. 업무분장의 기준은 대부분의 회사에서 '잘 하는 사람' 에게 집중되고, '손 빠른 사람'에게 과중됩니다. 직급높은 사람에게 책임직을 맡기고, 일 없는 사람들에게 자잘한 업무들을 던집니다. 그냥 상식선에서 이루어지는 분장이죠. 분장과정에서 이 사람의 역량이나 성향, 관심사나 이전 경험, 인맥과 인사이트가 고려되지 않습니다. 조장님 말씀6. 하던 사람이 계속 하는일이란 것이 참으로 그렇습니다. 사람뽑기가 세상에서 가장 힘든 것이 사업이죠. 그래도 회사에 나를 제외한 내 오른팔과 같은 존재가 한 명 정도는 있기 마련입니다. 대표도 사람인지라 당연히 열 손가락 깨물면 더 아픈 것이 있기 마련입니다. 그런데 대부분 그 아픈 손가락이 굉장히 일을 잘하는 사원이고 믿음이 간단 말이죠? 그러면 배려해주고 쉬게 해주는 것이 아니라, 더욱 많은 일을 맡깁니다. 이것은 상대적인 불신때문입니다. 이 사람이 잘하니까 일을 줘야지! 라고 생각하기 보단 실상 다른 직원에게 주려고 하다보니...고려할 사항이 너무 많습니다. 검증되지도 않았고 애매한 거죠. 그런데 일은 매번 중요한 것들입니다. 그르치면 손해가 막심할 것 같으니 믿음직한 사람에게 고개를 다시 돌립니다. 아이러니하게도 그 믿음직한 사람은 일이 과중되고 지쳐가기 시작합니다. 곧 그 믿음은 실수와 사고로 이어지기 마련이죠.7. 이해를 못함일을 잘하고 못하고를 떠나서 이것은 업무이해도의 문제입니다. 전체그림을 볼 수 있느냐의 문제죠. 브랜딩에 대해 얘기할 때 1화에서 '모든 직원이 내용을 알고 있어야 한다' 라고 꼭 찝었던 것은 이 때문입니다. 업무이해도가 떨어지면 레시피만 보고만든 믹스호떡처럼 괴생명체가 탄생하거나 도무지 처치곤란한 혼종이 등장하게 됩니다. 기껏 일은 일대로 하고 손해는 손해대로 보는거죠.뭐라는 거지...?8. 편가르기, 편애, 미운털, 관계가 망치는 업무특수한 경우라고 믿고싶지만, 은근히 많더군요. 이해는 갑니다. 사람 모인 곳에 어찌 당파가 없을 수 있겠습니까. 라인도 있고, 야당도 있고 여당도 있고 제3당도 있고 많죠. 문제는 자꾸 이러한 인간적관계가 업무에 영향을 미친다는 것입니다.  예를 들어 우리 팀장이 좀 호구같다고 칩시다. 난 오히려 옆 팀의 이사겸 팀장님이 더 좋습니다. 그래서 우리 팀장이 준 일은 미뤄놓고 옆 팀에서 부탁한 일 먼저 처리하고 있습니다. 우리 팀장이 나를 혼냅니다. 난 빡쳤습니다. 그래서 옆에 이대리랑 옥상에서 담배를 피며 말했죠."아 진짜 존나 일도 못하면서 성깔은..아놔"이대리는 거듭니다. 왜냐면 나와 친하니까요"진짜 저 사람은 어떻게 일할려나 모르겠음.. 이번 것도 분명 말아먹을 기센데." 우린 한 당파가 되어 팀장을 깝니다. 그리고 그의 지시를 자꾸 누락하고 미루고 안하죠. 대강하거나. 취합해야 하는 입장에선 자꾸 공백이 생긴 결과물들이 올라옵니다. 하지만 일을 만들긴 만들어야 하니 또 야근을 해야하죠. 야근을 하고 혼자 취합을 하게 되면 실수가 생깁니다. 실수는 문제를 야기하고 문제는 손해로 이어지죠. 손해의 책임은 간부가 1차 타격을 입습니다. 이것도 어불성설입니다. 사실. 수평적 문화라면 책임도 동등하게 가져가야 하는 것이 이치상 맞습니다.  내 기여도만큼의 보상을 받는 만큼, 내 손실분에 대한 타격을 입는 것 또한 수평적 문화의 특징입니다. 특히 성과지표가 분명한 프로젝트 기반의 업무에선 더욱 그러하죠. 어쨋든 팀장은 멘붕이 되고 윗 선에게 심하게 깨집니다. 직원들은 그걸 또 팀장의 탓으로 돌립니다.  물론 이 과정에서 팀장이 잘했다는 얘긴 아닙니다. 애시당초 팀 관리에 문제가 있기도 했겠죠. 하지만 그것을 마냥 팀장이나 간부에게 당신의 리더쉽 탓입니다라고 전가시키기엔 직원들도 결국 마찬가지 수준이었습니다.  업무분장은 어떻게 할까.업무분장의 문제가 해결된다면 전세계 모든 대학교의 조별과제의 악몽이 해결되는 기적이 일어날 수 있을 것입니다. 또한 대부분의 기업의 효율성이 개선되고 생산성이 극대화되어 이 지긋지긋한 장기침체가 끝날 지도 모르겠습니다. 심지어 저도 팀원들과 일을 했을 때, 직원이 있었을 때, 협력업체와 일할 때 등등... 여러 케이스를 겪어봤지만 정확한 정답을 찾지 못했습니다. 다만 소기의 성과와 부작용들을 체험하면서 이건 이럴 때 좋고 이럴 때 좋지 않구나...라는 정도를 짐작할 따름입니다. 그러니 업무분장의 옳은 방법이라기 보단, 뻔하지 몇 가지 유의사항을 중심으로 적어보겠습니다.1. 적어도 분장회의는 심각하게.프로젝트플랜을 짜고, 각자 업무를 나누는 회의를 할 텐데. 전 개인적으로 이 회의를 대충하지 말자는 주의입니다. 조금 과장해서 하루 전체를 그 업무분장 회의에만 써도 괜찮습니다. 하루는 정말 고생하겠지만, 이 후의 확인, 취합, 업무상황 진행 등 모든 전반의 업무효율이 극단적으로 올라갑니다. 다들 그 시트의 데드라인을 맞추기위해 노력하고, 모두가 어떤 상황이 어떻게 돌아가는 지 이해하고 있는 상황이 됩니다. 단, 그 하루동안 해야 할 일이 있습니다. 직원들의 성향파악현재 업무 재정리각자 업무속도 계산프로젝트 기간 내 개인사, 사내일정 스케쥴링정/부 인원 지정보고체계 확립프로젝트 개괄 프레젠테이션상세 업무공유개인별 목표설정 및 평가지표 설정개인별 업무일정 짜기취합 후 프로젝트 플랜시트 제작완성된 플랜시트 피드백적어도 이 부분들은 순서대로 아주 치밀하게 결론을 내는 회의시간이었으면 합니다. '너 일 뭐 있지? 너가 이거 할래?' 이런 식의 분장이 되지 않았으면 좋겠습니다.2. 미달성의 책임은 분명히실무자를 위한 것이기도 합니다. 방관자의 심리의 주된 원인은 책임의 분산입니다. 다수가 존재하는 만큼 해당 이슈에 대한 책임이 분산되며 나에겐 피자 위에 뿌려진 올리브만큼의 책임감만이 스윽 주어지게 되는데 그 정도는 그냥 자기합리화나 집안일핑계로 거뜬히 쳐낼 수 있는 수준의 것들입니다. 이런 식으론 어떤 것도 이루어지지 않습니다. 위 회의에서 개인별 목표설정, 평가지표 설정은 정말 중요한 데 해당목표의 미달성시 어떤 핸디캡을 받고 어떤 책임을 질 것인지도 명확하게 지정하는 것이 좋더군요. '반드시 해내야 한다'는 적당한 압박감은 실패시의 합리화나 책임전가를 막고 외부요인으로 부터 그 핑계를 찾는 사태를 줄여줍니다. 아킨(R.M.Arkin)과 바움 가드너(A.H.Baumgaerdener)의 셀프핸드캐핑 실험에서 증명된 것과 같이 말이죠.3. 업무량은 내 처리수준의 +15%, 데드라인은 항상 -1일긍정적인 마인드와 열정, 화이팅, 돈독한 애사심은 훈훈한 분위기에는 좋을 지 몰라도 업무처리능력과는 별개의 문제입니다. 업무를 완성시키고 직원들을 고무시키고 싶다면 편하고 쉬운 일을 주는 것이 아닙니다. 항상 내가 해결할 수 있는 한계치의 적당량 이상의 어려운 과제, 적당히 급한 데드라인의 선을 지키는 것이 중요합니다. 일의 속도감과 성취감은 '일을 끝냈다!' 에서 오는 것이 아니라 '그 일을 해냈다!' 에서 오는 것이기 때문이죠. 에드워드 데시와 리차드 라이언의 자기결정이론중 인지평가이론(Cognitive Evaluation Theory)을 참조해보면 좋을 듯 합니다.4. 일관성!!1번에서 그렇게 심각하게 회의를 했으면, 중간에 그걸 엎지마세요. 회사 일이란 게 워낙 심각하고 급박하게 돌아가는 것이 많으니 변동과 이슈가 많은 것은 사실입니다. 하지만, 급하니까 너 그거 다 멈추고 이것부터 해! 라고 하는 것은 그냥 파국급행열차 티켓을 끊어 손잡이에 매달린 채 목적지까지 달려가렴. 이라는 소리와 같습니다. 어차피 업무분장회의에서 나왔던 그 일도 해야 하잖아요?? 중간에 일이 들어오면 차라리 경매를 붙여서 스스로 업무량을 조절할 수 있게 하던가, 아니면 다시 전사회의를 거쳐 양해를 구하고 전체플랜에 대한 수정을 전사공지합니다. 정보의 제한과 이해의 부족은 아주 사소한 실수와 그냥 던지는 작은 일조차도 '불신의 씨앗'으로 변하게 합니다. 적어도 우리가 그 날 열심히 만들었던 그 회의는 결코 변하지 않는다라는 일관성과 고집이 있어야 추후에 평가, 책임, 보상 때도 신뢰감이 있는 것입니다. 중간에 자꾸 말바뀌고, 일 틀어버리고, 맡기겠다고 했으면서 계속 간섭하고, 불필요한 과정을 자꾸 삽입해서 보고를 위한 보고를 만들어내면 추후에 그 모든 책임은 다 관리자 본인이 지셔야 합니다. 5. 모든 과정은 결과후에 복기한다.불만이 쌓이는 것은 무서운 일입니다. 그러나 그 불만을 그 때 그 때 터뜨리는 것도 업무에선 그리 좋은 방향은 아닙니다. 물론 순간순간 해결될 수 있는 사안이라면 당장 커피와 함께 멱살을 잡든 엎어치면 되겠지만 대부분의 업무방향은 시스템적인 수정을 필요로 합니다. 때문에 실시간으로 문제해결을 하다간 일이고 나발이고 흐르는 물 막느라 아무것도 못하는 상황이 됩니다. 일단 프로젝트를 끝내는 게 급선무입니다. 단, 일 하나가 끝나고 업무분장된 결과물이 등장하고 난 후 반드시 평가회의를 하시길 추천드려요. 그리고 그간의 모든 일들을 하나하나 정리하면서 복기하셔야 합니다. '아 모두 수고했구요, 참치먹읍시다아~' 이게 아니고... 처음에 하루종일 회의하듯 정말 냉철하고 싸울 듯한 회의가 되어야 해요. 단 회의의 결과는 뭔가 명확한 솔루션을 들고 끝나야겠죠. 안 그러면 감정싸움만 될테니까요.업무분장은 대표입장에서도, 실무자입장에서도 정말 어려운 일입니다. 서로가 서로에 대한 이해가 없이는 일을 할 수도 나눌 수도 합칠 수도 없으니까 말이죠. 자유롭게 서로의 일을 그냥 알아서 하면 얼마나 좋을까요? 각자 일을 찾아서 하는 유토피아같은 사무실 말입니다. 인간은 자유라는 환경이 주어졌을 때 함께 공포를 느낀다고 합니다. 아무런 책임이 없는 상태에선 본능이 가장 먼저 튀어나오고, 애사심이나 업무에 대한 객관적인 판단보단 내 자존심과 타인에 대한 경계심, 심리적관계가 더 먼저입니다. 회사에 들어와서 책상에 앉아 일을 하고 있다고 해서 뭔가 갑자기 일하는 로봇이 되는 것은 아니니까요. 업무분장은 이러한 사람들의 특성을 충분히 고려해야 합니다. 배려할 부분을 배려하고 억압할 부분은 강력하게 억압해야 합니다. 책임과 도전에 따른 보상과 벌도 있어야 합니다. 납득할 만한 이해와 협의도 거쳐야 하며 먼 발치에서 어떤 식으로 누가 무슨 일을 하는 지 확인도 종종 해야합니다. 그냥 '너가 화장실 청소 해.' 라며 던진다고 끝날 문제는 아니라는 것이죠.우리 사무실의 화장실청소는 어떻게 분장되어 있나요? 누가 하고 있나요? 어떻게 그것을 담당하게 되었나요. 만약 그 사람이 청소를 하지 않는다면 한 달 뒤 화장실의 모습은 어떻게 될까요. 회사와 비즈니스는 모두의 손을 거쳐 만들어집니다회사와 비즈니스는 모두의 손을 거쳐 만들어집니다. 사무실부터 작은 앱아이콘, 메뉴텍스트까지 누구 하나의 손이 닿지 않은 곳이 없죠. 모두가 사람이 만들어야 하는 것입니다. 과연 우리 회사엔 누구의 어떤 손길이 얼마나 닿아있는 지 한 번쯤 돌아보는 시간을 가져보는 것도 의미있을 것 같습니다. :)
조회수 4083

[H2W@NL] 이런 문화를 만들고 이런 사람을 찾습니다, People팀

네이버랩스에서 가장 즐거운 팀은 People팀이라는 소문이 있습니다. 인사, 채용, 조직 문화 등을 담당하는 이들이 먼저 즐겁게 회사를 다니고 있습니다. People팀 이두성 리더는 네이버랩스에 관심을 갖고 있거나, 채용 지원을 고려하는 이들에게 전하고 싶은 이야기도 많습니다. 가감없이 솔직한 1문1답을 해보았습니다.Q. 네이버랩스는 박사급 인력만 채용한다는 이야기가 있습니다. 그런가요?채용 활동 중에 정말 자주 받는 질문이에요. 가장 해소하고 싶은 오해이기도 하죠. 결론부터 말하자면, 채용 과정과 결과 모두 학력은 고르게 분포되어 있습니다.왜 그런지를 말씀드릴게요. 채용을 진행하는 팀들이 함께 일을 잘 할 수 있는 사람이라는 본질 외에는 크게 관심을 두지 않기 때문입니다. 어느 팀이든 비슷해요. 핏(fit)이 잘 맞는 분을 찾는 것이 학위보다 더 희소하고 귀합니다. 학력은 참고 자료이지 필수 요소가 아닙니다.Q. (그 핏(fit)이라는 것이 무엇인지는 잠시 후 질문하고) 처우는 어떤가요?실제로 채용 인터뷰를 하는 과정에서 상세하게 말씀을 드릴 수 있다는 걸 전제로 이야기하자면, 고수하고자 하는 원칙은 '우수한 인재는 놓치지 않는다'입니다. 우리의 기술 목표를 어디에 설정하고 있느냐를 생각해보면, 당연한 이야기입니다.Q. 채용 인터뷰 과정 중엔 어떤 이야기를 나누시나요?우리 회사의 단단한 토대와 성장의 방향성을 잘 확인하시라고 합니다. 일에 있어서도, 실제로 그 역량을 잘 펼칠 수 있는 합리적 조직 문화가 뒷받침된 회사인지가 중요할 수 있습니다. 정말 자신에게 괜찮은 회사인지 종합적으로 꼼꼼하게 따져 보길 권합니다.Q. 그런 면에서 네이버랩스는 지원할만한 회사인가요?굳이 이런 말씀을 드렸던 건, 자신이 있기 때문이죠.Q. 좀 더 구체적으로 말씀해주세요.얼마 전, 입사자 한 분이 제게 해주신 말인데요.“네이버랩스에서는, 미팅에서 이견이 있으면 누구든 스스럼없이 말해요. 그러면서 건전한 회의가 이어지는 것이 인상적이에요.”수평적 조직 문화가 일종의 트렌드죠. 그런데 실제로 정착시킨 곳이 많진 않습니다. 애초에 의지가 없었거나, 시행착오 비용을 소모하지 않으니까요. 우리는 그 과정이 이미 끝난 상태입니다. 네이버랩스에 오시는 분들은, 미팅이나 협력 상황에서 좋은 경험을 하게 됩니다. 의견을 자유롭게 개진하더라도, 상대방이 그것을 자신의 권위에 대한 챌린지로 받아들이지 않기 때문이죠. 호칭도 서로 ‘~님’으로 부릅니다. 그래서 네이버랩스 대표는 ‘대표님’이 아니라 ‘상옥님’입니다. 이런 문화가 그저 형식적인 것이 아니기 때문에 아주 자연스럽죠. 각자가 전문가라는 존중, 스스로에 대한 자신감, 더 나은 결과물을 위한 경계없는 협력이 네이버랩스의 조직 문화입니다.Q. 그게 다인가요?계속 고민하고 노력하죠. 제가 속한 People팀의 기본적인 방향성은 단순합니다. 지금 다니는 회사가, 지금 일하는 환경이 만족스럽나? 이 질문에 동료들이 'No'라고 할 것들이 있다면, 'Yes'로 변화시키는 것입니다.복리후생을 예로 들어보겠습니다. 현재 대한민국을 대표할만한 회사들은 대체로 상향평준화 되었습니다. 본인 및 가족 상해보험, 리프레시 휴가, 대출이자지원, 교육/문화 지원, 어학/운동 지원, 종합검진, 어린이집, 휴양시설, 심리상담지원 등등, 다른 곳과 비교해도 비슷합니다. 정해진 출퇴근 시간이 없는 자율적 근무 제도 역시 지금은 많은 회사에 정착되어 있죠. 그런데 정말로 느껴지는 만족감은 디테일에 있습니다. 동료들을 진심으로 신경을 쓰고 있는지에 대한 것입니다.일례로 우리는 실제 일하는 공간에 많은 신경을 기울였습니다. 집 다음으로 가장 많은 시간을 보내는 장소입니다. 편하면서도 마음껏 일에 몰입할 수 있도록 설계와 인테리어, 동선과 시설을 꼼꼼하게 만들었습니다. 혼자 있을 때 집중이 더 잘되는 분들을 위한 Holo방(1인룸)이나 심신을 릴렉스하는 Yolo방(안마의자), 쉐프님의 훌륭한 레시피를 매일 맛볼 수 있는 키친, 최고의 원두로 바리스타님이 커피를 내려주시는 사내 카페테리아, 전문 트레이너님이 상주하며 세심하게 건강을 관리해주는 GYM과 운동 프로그램, 원어민 강사님들의 1:1 영어 클래스 등은 동료들 뿐 아니라 당장 저부터 정말 좋다고 느끼는 것들입니다.공유와 성장도 네이버랩스에서 아주 중요하게 생각하는 가치입니다. 특히 내부 커뮤니케이션에 더 신경을 씁니다. 우리는 매주 금요일 네이버랩스 전직원이 모여서 회사의 아젠다를 공유하는 all-hands meeting을 합니다. 이 자리에서 각 프로젝트 경과나 회사의 중요 이슈를 공유합니다. 단순한 공지가 아닌 설명회 방식으로 진행하죠.또한, 사내 세미나도 활발합니다. 뛰어난 외부 전문가를 선별해 모시고 최신의 트렌드나 연구 결과 등을 공유하는 SLED가 연중 끊임없이 진행됩니다. 참고로 SLED는 공유(share), 배움(learn), 토론(discuss)의 약자입니다.Q. 네이버랩스와 핏(fit)이 맞는 인재는 어떤 사람일까요?지금까지 말씀드린 네이버랩스의 조직 문화는 뭔가 이상적인 것 같죠? 실제로 모두에게 좋은 환경일까요? 아닙니다. 자유롭고 편할 것 같지만, 실제로는 스스로 방향을 잡지 못하거나 헤맬 수도 있는 환경이라고 생각합니다. 그만큼 스스로 주도할 수 있어야 합니다. 게다가 팀이 없는 것처럼 협업하기 위한 유연함도 필수입니다. 경계없이 서로의 분야를 이해하며, 시너지를 높이기 위해서입니다. 우리가 인재상으로 규정하고 있는 ‘self-motivated team player’가 바로 이런 의미입니다. 이를 위해 신규 입사자의 온보딩 프로그램에도 당연히 많은 신경을 쓰고 있습니다.Q. 채용 절차와 방법은 어떤가요?홈페이지의 Career 페이지에서 현재 모집 현황을 확인하거나 채용 문의를 하고, 지원도 할 수 있습니다. 일반적인 절차는 서류 검토, 전화 면접 (필요시 코딩 테스트 진행), 1차 면접, 2차 면접, 처우 협의와 채용 검진, 채용 순으로 진행됩니다. 지원 직무를 잘 수행할 수 있는지를 확인하기 위해 경험 및 경력을 검증하는 기술 인터뷰 위주로 진행하고, 이때 우리의 조직 문화와 잘 맞는지도 면밀하게 파악합니다. 지원자 역시 네이버랩스가 어떤 곳인지 파악할 수 있는 기회이기도 하고요.Q. 마지막으로 외부의 우수한 인재들에게 전하고 싶은 이야기가 있다면?우리는 각자가 온전히 일에 몰입할 수 있도록 모든 지원을 집중하고 있습니다. 좋은 문화를 만들어 왔습니다. 그보다 좋은 건, 여전히 계속 변화하려 노력한다는 점입니다. 네이버랩스가 모든 이에게 최고의 선택은 아닐 것입니다. 다만 치열함과 열정을 잃지 않으면서도 수평적이고 자율적인 분위기에서 새로운 도전에 몰입할 수 있는 회사를 찾는 분이라면, 그곳이 네이버랩스입니다.네이버랩스의 인재상은 passionate self-motivated team player입니다. 어쩌면 '자기주도적 팀플레이어'라는 말은 형용모순(形容矛盾)일 지도 모릅니다. 하지만 우린 계속 시도했고, 문화는 계속 쌓여갑니다. 다양한 분야의 전문가들이 경계없이 협력하고 스스로 결정하며 함께 도전하는 곳의 이야기를 전합니다. How to work at NAVER LABSH2W@NL 시리즈 전체보기
조회수 921

PC/모바일 웹에서 앱 설치 유도 및 성과 측정하기

PC 웹과 모바일웹은 앱 유저를 늘리는데 매우 효과적인 채널입니다.아직까지 많은 사람들이 원하는 서비스에 대한 정보를 찾기 위해 웹 서치엔진(구글, 네이버)를 이용합니다. 서치엔진을 통해 접속한 많은 사용자들을 앱으로 전환시킬 수 있다면 앱 사용자수를 빠르게 증가시킬 수 있을 것입니다.웹 트래픽을 앱으로 전환하기그렇다면 어떻게 사용자들을 웹에서 앱으로 전환시킬 수 있을까요?상품을 구매하기 위해 웹에 방문했을때, 앱 사용하면 받을 수 있는 혜택을 알려주는 것이 가장 쉽고 확실한 방법입니다. 와이즈트래커의 클라이언트인 홈앤쇼핑도 홈페이지 접속 시 배너와 팝업을 통해 앱에서의 추가 할인과 적립 혜택을 알려주고 있습니다.(홈앤쇼핑 모바일웹)혜택을 강조하지 않는 경우라면, 다음과 같이 웹사이트의 빅배너를 활용해 앱 다운로드를 유도할 수 도 있을 것입니다..(뉴발란스 PC 웹페이지)웹투앱 성과값 측정하기이처럼 웹에서 앱으로 이동할 수 있는 경로를 통해 실제로 얼마나 많은 이동과 앱 설치가 발생하는지를 분석하여 효과를 측정해 볼 수 있습니다. 이러한 분석은 다음과 같은 과정을 거치게 됩니다.웹 광고에 트래킹 URL을 설정광고 클릭 후 도착한 랜딩 페이지에 분석 스크립트 삽입랜딩 페이지에서 앱 다운로드 버튼 클릭 시 트래킹 URL을 리퍼러로 넘김설치된 앱의 분석 SDK가 트래킹 URL을 검출위와 같이 트래킹 URL, 웹용 분석 스크립트, 앱용 분석 SDK로 웹을 통한 앱 설치수와 전환 분석이 가능합니다.웹투앱 성과 분석 서비스 이용하기하지만 자체 개발로 이러한 분석을 진행하기에는 어려움이 많아 다수의 서비스에서 와이즈트래커와 같은 서드파티 툴을 이용해 앱분석을 진행하고 있습니다.  예시의 홈앤쇼핑 또한 와이즈트래커를 통해 웹을 통해 유입되는 앱 설치수 분석과 그 중 의미있는 이벤트를 일으키는 사용자수를 파악하고 있습니다.웹페이지가 얼마나 효율적으로 앱 설치를 이끌어내고 있는지, 웹에서 앱으로 유입된 사용자가 어떻게 행동하는지를 측정하는지 궁금하다면 웹투앱 전환분석으로 마케팅 성과를 최적화해보세요.
조회수 1759

네이버 신디케이션 — Rails

블로그에 새 글이 올라올 때, naver에 사이트 등록을 한다. 네이버 신디케이션 API를 이용하면 자동으로 등록된다.Wordpress에는 네이버 신디케이션 plugin이 존재한다. Rails gem을 찾아보니 애석하게도 없었다. 직접 만들면서 알게 되었다. 딱히 gem을 만들 만한 일도 아니더라.네이버 신디케이션을 이용하려면 우선 네이버 웹마스터 도구를 이용해야 한다. 해당 url이 자기 것이라는 인증과정만 거치면 바로 사용할 수 있다.작동방법은 대강 이렇다.네이버 신디케이션 API를 이용해서, 새로운 글이 생성되었음을 알린다. (혹은 글이 지워졌음을)네이버 크롤링 봇, Yeti가 와서 크롤링 해간다.API를 이용할 때 미리 약속된 format으로 만들어야 되는데, ATOM feed와 구조가 거의 같다. 다만 네이버가 정한 룰 때문에 (꼭 이름/저자/업데이트날짜 이런 순서를 지켜야 한다.)Rails에서 제공하는 atom_feed helper를 그대로 이용할 수 없다. 그러나 format만 살짝 바꾸면 되기 때문에 atom_feed helper를 이용해서, feed를 만드는 방법을 알려주는 Railscast가 늘 그렇듯 엄청 도움이 된다.(요즘 새로운 episode가 안올라오고 있는데… 힘내시라는 의미에서 예전에 유료결제 해드렸다)atom_feed helper의 코드를 그대로 가져와서 formating만 바꾼 naver_atom_feed helper를 만들었다. 별다른 건 없고, feed option 초기화 부분과 제일 마지막에 나와야 되는 link 부분을 주석처리한게 전부다.module NaverSyndicationHelper def naver_atom_feed(options = {}, █) ... feed_opts = {} //feed_opts = {"xml:lang" => options[:language] || "en-US", "xmlns" => 'http://www.w3.org/2005/Atom'} ... xml.feed(feed_opts) do xml.id... // xml.link... // xml.link... yield ActionView::Helpers::AtomFeedHelper::AtomFeedBuilder.new(xml, self, options) end end end새로만든 naver_atom_feed helper를 이용해서, feed부분만 완성한 code이다.naver_atom_feed({xmlns: "http://webmastertool.naver.com", id: 'http://ikeaapart.com'}) do |feed| feed.title "이케아아파트" feed.author do |autor| autor.name("이케아아파트") end feed.updated Link.maximum(:updated_at) feed.link(:rel => 'site', :href => (request.protocol + request.host_with_port), :title => '이케아아파트')이제 entry쪽을 만들어야 되는데, 네이버가 지정한 순서에 맞아야지만 신디케이션 서버에 전달할 수 있다. 정말 이상한 형식이다. 아무튼 그래서 Rails에서 제공하는 entry method를 사용하지 못한다. 이번엔 AtomFeedBuilder class에 naver_entry method를 만들었다.#config/initializers/feed_entry_extentions.rbmodule ActionView module Helpers module AtomFeedHelper class AtomFeedBuilder def naver_entry(record, options = {}) @xml.entry do @xml.id... # if options[:published]... # @xml.published(...) # end # if options[:updated]... # @xml.updated(...) # end # @xml.link(..) ...이번에도 순서 때문에 주석처리 한 것 밖에 없다. naver_entry method를 이용해서 완성된 코드가 아래 코드이다.# views/links/show.atom.buildernaver_atom_feed({xmlns: "http://webmastertool.naver.com", id: 'http://ikeaapart.com'}) do |feed| feed.title "이케아아파트" feed.author do |autor| autor.name("이케아아파트") end feed.updated Link.maximum(:updated_at) feed.link(:rel => 'site', ...) feed.naver_entry(@link, {id: link_url(@link)}) do |entry| entry.title(@link.title) entry.author do |author| author.name("이케아아파트") end entry.updated(@link.updated_at.xmlschema) entry.published(@link.created_at.xmlschema) entry.link(:rel => 'via', :href => (request.protocol + request.host_with_port)) entry.content(@link.contents) end end이제 새 글이 만들어 질 때, 이 atom 파일 주소를 네이버 신디케이션 API로 보내주면 된다. 참고로 Rails에서는 어떤 view파일을 사용할지 알아서 해주니, controller에 따로 ‘response_to’ 를 이용해서 format을 나눠줄 필요는 없고, 이름만 잘 맞춰주면 된다. (위 파일명은 show.atom.builder 이다)네이버 신디케이션 API에 핑을 보내는 code이다. 네이버가 지정해 놓은 header를 설정해 줘야 되고, 신디케이션 인증 토큰을 받아서 header에 넣어줘야 된다. 신디케이션 토큰은 네이버 웹마스터 페이지에서 볼 수 있다.require 'net/http' ... header = {"User-Agent"=>"request", "Host"=>"apis.naver.com", "Progma"=>"no-cache", "Content-type"=>"application/x-www-form-urlencoded", "Accept"=>"*/*", "Authorization"=>"Bearer " + ENV["NAVER_SYNDICATION_TOKEN"]} uri = URI.parse('https://apis.naver.com/crawl/nsyndi/v2') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true args = {ping_url: link_url(link_id, format: "atom")} uri.query = URI.encode_www_form(args)request = Net::HTTP::Post.new(uri.request_uri, header) http.request(request)네이버 신디케이션 페이지에서 핑이 제대로 도달하는지 바로 확인해 볼 수 있다.#티엘엑스 #TLX #BA #BusinessAnalyst #비즈니스애널리스트 #꿀팁 #인사이트 #조언
조회수 4631

오픈소스 라이브러리를 사용해보자, CocoaPods! (KOR)

Overview개발 도중 내용이 복잡하거나 소스가 길면 종종 오픈소스 라이브러리를 사용합니다. 쉽게 원하는 기능을 구현할 수 있기 때문이죠. 그렇다면 오픈소스 라이브러리는 어떻게 앱에 가져와서 사용할까요? 바로 ‘CocoaPods(이하 코코아팟)’을 쓰면 됩니다.What is CocoaPods?코코아팟의 공식 웹사이트에서는 코코아팟을 이렇게 소개하고 있습니다.“CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects”“코코아팟은 스위프트와 오브젝티브-C 코코아 프로젝트를 위한 의존성 매니저(dependency manager)다.”즉, ‘개발자가 편리하게 사용할 수 있게 오픈소스 라이브러리를 프로젝트와 연결해주는 환경 또는 도구’를 말합니다. 이로 인해 다양한 장점을 가지고 있는데요. 우선 코코아팟은 개발자가 개발한 앱에 라이브러리를 추가, 삭제, 업데이트 등의 관리를 할 수 있습니다. 예를 들어, 네트워크 관련 라이브러리를 개발자가 직접 개발하지 않고, Alamofire 라이브러리를 코코아팟으로 앱에 연결해 사용하는 것입니다. 둘째, 라이브러리 버전을 직접 지정하여 사용할 수 있어 업데이트 버전이 나와도 지정한 버전을 계속 사용할 수 있다는 점입니다. 만약 새로운 버전에 맞춰 개발할 준비가 되면 그때 업데이트를 하면 됩니다.CocoaPods에서 facebook을 검색하면 관련된 다양한 라이브러리가 나옵니다.How to use Cocoapods?1.코코아팟 설치하기개발한 앱에 사용할 오픈소스 라이브러리를 찾았다면 코코아팟을 설치해 앱과 연결해봅시다. 먼저 코코아팟을 설치하고 터미널 프로그램을 열어 아래와 같은 명령어를 입력합니다.$ sudo gem install cocoapods 그리고 CocoaPods Master Specs repository에 있는 Podspec file를 컴퓨터에 다운로드합니다. –verbose 명령어를 이용해 현재 진행 상황을 터미널에서 볼 수 있게 합니다.$ pod setup --verbose 이제 코코아팟을 사용할 준비가 되었습니다. Xcode에서 간단한 프로젝트를 만들고 끝냅니다. 이번 글에서는 관광명소를 보여주는 목록 앱을 예제로 만들겠습니다.2.라이브러리 연결하기터미널 프로그램을 이용해 방금 전 만든 프로젝트 경로로 이동하고, Podfile을 만들어 앱에 필요한 라이브러리를 설정합니다. Podfile을 만드는 방법이 두 가지입니다. 첫 번째는 pod init 명령어를 이용해 코코아팟이 기본 틀이 있는 파일을 생성하게 하는 것입니다. 두 번째는 개발자가 직접 빈 파일을 만들어 설정하는 방법입니다. 이번 글에서는 pod init 명령어를 사용하겠습니다. (편리합니다.)$ pod init podfile이 생성된 것을 확인할 수 있습니다.이제 Podfile을 열어 우리가 사용할 라이브러리를 세팅하고 코코아팟 공식 사이트에 접속합니다. 사용하고자 하는 라이브러리를 검색하고 이름 옆 클립보드 아이콘에 마우스 포인터를 올려보세요. Podfile에 복사할 텍스트가 나타날 겁니다. 이 텍스트를 복사하여 Podfile에 붙이고 저장합니다. 이 글에선 URL에서 가져올 이미지를 다루기 위해 SDWebImage 라이브러리를 사용하겠습니다.완성된 Podfile의 모습위의 Podfile을 잠시 설명하자면 프로젝트의 배포 타겟은 iOS 9.0 입니다. ‘use_frameworks!’ 은 코코아팟을 통해 프로젝트에 추가할 라이브러리가 스위프트로 작성되어 있고, 프레임워크를 사용할 것이기 때문에 꼭 추가해야 하는 문장입니다. 라이브러리 옆의 숫자는 4.3 그리고 4.4 이전까지 라이브러리 버전을 사용하겠다는 뜻 입니다. 최소한의 설정을 맞췄으니, 저장하고 다음 명령어를 실행합니다.$ pod install --verbose pod install 완료 후 xcworkspace 파일이 추가된 것을 확인할 수 있습니다.Pod 설치가 완료되면 xcworkspace 파일이 생성된 것을 확인할 수 있습니다. Xcworkspace 파일은 쉽게 말해서 프로젝트들의 컬렉션(collection of projects)입니다. 기존에 제작한 프로젝트(Original project)와 pods 프로젝트(Pods project)를 함께 묶는데, 이 pods 프로젝트 하나로 모든 라이브러리를 관리할 수 있습니다. 기존 프로젝트는 이 pods 프로젝트를 의존하기 때문에 xcodeproj 파일을 열면 연결된 라이브러리들에 대한 정보가 없어서(혹은 발견하지 못해서) Xcode 프로그램이 에러를 발생시킵니다. 그러므로 코코아팟으로 pod을 설치했을 때, 프로젝트는 xcworkspace 파일을 열어 개발해야 연결한 라이브러리들을 잘 사용할 수 있습니다.3.라이브러리 사용하기이제 연결한 라이브러리를 사용해봅시다.1) 예제에서는 SDWebImage 라이브러리를 이용해 URL 이미지 주소로 ImageView에 이미지를 설정하도록 코드를 추가하겠습니다.테이블뷰(UITableViewController) 컨트롤러를 이용해 목록으로 관광명소 이름, 설명, 이미지를 보여줄 것입니다. 관광명소 이름, 설명, 이미지에 맞게 데이터 모델을 만들고 스토리보드에서 UI를 디자인합니다. 테이블뷰 컨트롤러 파일을 새로 생성해서 이 소스 파일에서 라이브러리를 연결해서 기능을 구현해봅시다. 먼저 라이브러리를 이 소스에 연결하도록 import 명령어를 입력합니다.AttractionTableVC.swift import SDWebImage 그리고 아래와 같이 tableView(tableView:cellForRowAtIndexPath:) 함수에 코드를 작성합니다.2)override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> AttractionTableViewCell {         // Table view cells are reused and should be dequeued using a cell identifier.         let cellIdentifier = "AttractionTableViewCell"         guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? AttractionTableViewCell else {             fatalError("The dequeued cell is not an instance of AttractionTableViewCell.")         }         let attraction = attractions[indexPath.row]                  // . . .         cell.attractionLabel.text = "\(indexPath.row). \(attraction.nameWithDescription)"         cell.attractionImage.sd_setImage(with: attraction.photoURL, completed: nil)                 // . . .                 return cell     } SDWebImage 라이브러리를 쓴 이유는, URL 이미지 주소를 이용해서 관광명소 이미지를 보여주고 싶었습니다. 하지만 UIImage에 바로 URL 주소를 사용할 수 없었고, Data 형식으로 변환한 다음 사용해야 했습니다. 라이브러리를 안 쓴 다면 아래와 같은 소스를 작성해야 했을 겁니다.// return UIImage which is set from url data     private func imageFromUrl(url: URL) -> UIImage {         var photo = UIImage()          do {             let imageData = try Data.init(contentsOf: url)             photo = UIImage(data: imageData)!             return photo         } catch {             print(error.localizedDescription)             return photo         }     } 하지만 위에서 만든 소스를 SDWebImage 라이브러리를 이용하면 아래처럼 딱 하나의 명령문으로 줄일 수 있습니다.cell.attractionImage.sd_setImage(with: attraction.photoURL, completed: nil) 소스 길이가 확연히 줄어들었습니다. 이외에도 GIF 지원, asynchronous image downloader 등 SDWebImage 라이브러리 GitHub 페이지로 접속하면 자세한 기능들을 만날 수 있습니다.CocoaPods Error브랜디의 앱 프로젝트를 클론해서 작업하면 종종 코코아팟 관련 오류로 당황했던 적이 있습니다. 몇 가지 에러의 해결 방법들을 소개하겠습니다.1.“/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sqlite3.h” not found”-> 대부분의 오류들은 코코아팟을 다시 설치하면 거의 다 해결됩니다.$ sudo gem install cocoapods$ pod install –verbose2.“Could not build module firebase core” Error-> project’s temp file 삭제 (~/Library/Developer/Xcode/DerivedData — Xcode->Preference->Location에 위치함)우선 위의 폴더 경로를 먼저 찾아 Finder로 여세요. 그 다음에 Xcode를 종료해 안전하게 삭제해야 합니다.-> ProjectName, .xcworkspace 삭제-> Podfile.lock 파일과 Pods 폴더 삭제-> $ pod install –verbose-> 새로 생성한 ProjectName.xcworkspace 실행하여 다시 빌드하기-> 그래도 안 된다면?—> $ pod update(or) —> $ pod –version 체크(or) —> $ pod repo update—> Podfile에 ‘Firebase’ 주석 처리—> $ pod install (old Firebase가 제거된다)—> Podfile에 ‘Firebase’ 주석 해제—> $ pod install (new Firebase 설치)—> 해결 완료!Conclusion이제는 새로운 기능을 개발하거나 소스를 수정할 땐 코코아팟에서 관련 라이브러리를 찾아봅니다. 마음에 드는 라이브러리는 곧바로 개발하고 있는 앱 프로젝트에 연결해 적용하기도 하고요. 자신의 언어로 순수하게 소스를 개발하는 것도 좋지만, 좋은 도구를 활용하는 것도 업무에 도움이 될 겁니다. 혹시 마음에 드는 라이브러리 찾으셨다면 저에게도 알려주세요. 코코아팟을 사용하는 iOS 개발자가 되신 걸 축하드립니다!주석 1)각 라이브러리의 GitHub 페이지에서는 소스를 연결하는 자세한 방법들을 소개하고 있다.2)attractions 배열에 미리 만들어 놓은 관광명소 데이터들을 저장한다. 배열에서 선정한 하나의 관광명소 데이터 정보를 이용해 각 테이블 뷰 셀에 알맞게 설정한다. 여기서 테이블 뷰 셀에 있는 attractionImage(UIImageView)에 URL 주소로 이미지를 설정하면 된다.참고문헌 swift3 - Error: Could not build Objective-C module ‘Firebase’ - Stack OverflowGoogle 그룹스An Introduction to CocoaPods (Route 85) - YouTube글김주희 사원 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발문화 #개발팀 #업무환경 #인사이트 #경험공유
조회수 12637

Jekyll을 이용하여 github에 블로그 만들기

티스토리에서 여러 불편함들을 느껴 깃헙 블로그로 갈아타려고 한다. 자유도가 높아보여 티스토리에 블로그를 개설했으나 오히려 글이 노출되는 디자인이나 (줄간격, 글씨 크기 등등) 기존 테마를 변경하기에 불편했다. 결정적으로 gist 스크립트를 삽입했을 때 미리보기가 안돼서 고민 끝에 깃헙 블로그를 선택했다. 워드프레스도 개설해봤지만 왠지 모르게 마음에 안들어서 깃헙 블로그로 갈아타기로 마음먹었다. 그 후에 이것저것 알아보니 내 마음에 쏙 드는 요소들이 많았다.마음에 드는 부분git을 이용해 커밋, 푸시로 글을 포스팅함. 그 덕분에 블로그에 대한 모든게 로컬에 있고 모든 글들을 로컬에서 관리 할 수 있음.마크다운을 이용하여 글 작성. 글과 html을 마음대로 오갈 수 있어서 좋음. 마크다운 에디터가 없었다면 불편했겠지만 세상은 넓고 좋은 에디터는 많다..! 다만 이미지 삽입에서는 좀 불편.다른 웹 프로젝트처럼 웹스톰에서 블로그 관리 가능. 인텔리 제이를 사랑하는 나로서는 이 부분 또한 큰 장점.아무튼 이런 이유로 깃헙 블로그로 갈아타기로 결정. 구글링을 통해서 깃헙 블로그를 개설하는 방법에 대해 잘 정리해놓은 블로그를 찾았다. 놀부 블로그를 참고하여 깃헙 블로그를 개설했다. 아래에는 내가 보기 편하도록 더 간략하게 정리해보았다.깃헙 블로그 만들기 (Mac OS X)1. Jekyll 설치터미널에서 아래 명령어 입력으로 설치. $ sudo gem install jekyll2. 설치한 Jekyll을 이용하여 블로그 생성블로그를 만들고자 하는 위치에서 아래 명령어로 생성.$ jekyll new [github사용자명].github.com블로그 생성후 생성된 위치로 이동하여 아래의 명령어 실행 후 브라우저에서 http://localhost:4000으로 접속하면 로컬에 생성된 블로그를 볼 수 있음.$ jekyll serve --watch3. github에 온라인 저장소 만들기위에서 생성한 블로그 이름과 동일한 이름([github사용자명].github.com)으로 github에 온라인 저장소를 생성. 그 후 로컬에 있는 블로그와 만들어준 저장소를 remote 해주면 끝.$ git init$ git remote add origin [저장소URL]$ git add .$ git commit -m "Initialize Blog"$ git push origin master생성된 블로그는 http://[github사용자명].github.com으로 접속하면 볼 수 있다. 처음 생성하는 경우 몇 분의 시간이 걸리는 경우도 있다고 함.포스팅하기글은 _post 파일 안에 YYYY-MM-DD-[글 제목].markdown 형식으로 파일명을 지정하여 생성한 후 커밋, 푸시하면 업로드됨.테마 적용하기테마를 직접 만들기에는 시간이 너무 많이 소요되니 인터넷에 공유되어있는 테마를 사용하면 좋다. 테마를 적용하는 부분에서 여러모로 애를 먹었는데 제일 쉬운 방법은 테마가 올라가있는 저장소를 포크하여 [github사용자명].github.com으로 이름을 바꾸는게 제일 쉽다. 내 블로그는 심플한 테마를 적용하였다.다른 테마들은 Jekyll Themes 사이트에서 찾아볼 수 있다. 훨씬 이쁘고 좋은 테마들도 많음.Jeykll 더 알아보기Jeykll 공식 번역 사이트에서 몇 개의 문서를 읽어보면 더 다양하게 활용해 볼 수 있다. _config.yml파일이나 _post, _include, _layout 파일 정도는 기본으로 살펴보아야 함.#트레바리 #개발자 #안드로이드 #앱개발 #Jeykll #백엔드 #인사이트 #경험공유
조회수 686

기획자, 당신은 무엇을 하는 사람인가?

가장 애매한 전문가 : 기획자나는 기획자다.아마도 다양한 타이틀을 달고 있는, 나 같은 기획자들을 주변에 많이 볼 수 있을 것이다.특히, 대기업으로 갈 수록 업무가 세분화되어 있다보니, 상품기획, 서비스기획, 개발기획, 디자인기획, 광고기획, 사업기획 등등 왠만한 기능들의 뒤에 '기획'이라는 접미어를 붙여 마치 각 기능들을 앞에서 이끌 것 같거나, 아니면 각 기능들의 뒤치닥거리를 할 것 같은 그때 그때 다른(조직마다, 업종마다, 기능마다)느낌의 Job이다.사실, 가장 가까이에 있는 xx 기획자에게 한 번 물어보아라. "당신의 역할은 무엇인가요?" 한 마디로 쉽게 설명할 수 있다면, 그 사람은 꽤 유능한 기획자일 것이다.기획자의 역할 정의실제로 기획자의 역할은 대단히 폭넓고 다양하다. 당연히 어떤 산업에 종사하느냐, 어떤 부서에 누구와 일하느냐에 따라서 달라진다.어떤 곳에서는 핵심 '전략'을 담당하기도 하고, 어떤 회사에서는 '운영'을 담당하기도 하고, 어디에선 '리더'의 역할을, 다른 곳에선 '시다바리'의 역할을 맡기도 한다.어떻게 보면, 특정 기능(예를 들어 개발자, 디자이너, 영업, 재무 등 전문영역)을 전문적으로 수행하는 업무를 제외한 나머지 업무 모든것을 커버하는 Generalist 를 총칭한다고 볼 수도 있다.나는 디자인 기획자이다.대기업에서 상품을 구상할 때 필요한 신제품의 컨셉을 발굴하고, 디자인의 방향을 설정하고 사용자에게 유용한 기능들이 조화를 이루는지 꼼꼼히 확인하여, 디자인 목업과 프로토타입을 일정 내에 나올 수 있도록 매니징 하는 일을 하고 있다. (음... 뭔가 복잡하고 딱히 뭘 하는지 잘 이해가 안간다면...그게 바로 기획자의 실제 업무 들인 것이다 -_-)좀더 일반화해서 기획자의 업무를 크게 5가지로 구분해보겠다.정보 파악 기능 (searching): 팩트를 파악하고, 현황을 분석하여 올바른 판단을 할 수 있는 근거를 마련하는 업무문제 정의 기능 (defining) : 현황에 근거하여, 현재의 문제를 정확하게 파악하고 정의하는 업무자원 할당 계획 기능 (planning) : 과제를 언제, 얼마의 비용으로, 누구와 어떻게 하겠다는 계획을 수립하는 업무방향 설정 기능 (directing) : 목표를 명확히 정의하고, 집중 해야 할 방향을 선택하고 제안하는 업무운영/매니징 기능 (managing) : 설정된 계획에 차질없도록 관리 및 운영하고 커뮤니케이션 하는 업무기획자의 핵심은 '컨셉' 이다위에 나열된 업무들을 보면, 대게 경험이 쌓이면 조금씩 숙련도가 올라갈 법한 일들처럼 보인다. 자료를 조사하거나, 현황을 분석하거나, 자원을 할당하여 스케쥴과 예산을 산정하고, 무엇을 포기하고 어디에 집중할 것인지에 대해 제안하고, 차질없이 목표를 수행하는 기능들은 마치 직장인들이라면 마땅히 누구나 해야 하는 당연한 일쯤으로 보인다.하지만, 기획의 성공과 실패는 어디에서 나뉘어지는지 생각해보면, 위의 5가지 영역을 무리없이 처리한다고 하더라도 업무를 성공적으로 이끌긴 어렵다.창의력이 발휘되어야 하는 업무이기 때문이다.문제를 정의하고, 자원을 할당하고, 방향을 설정하는 단계가 창의적이거나 혁신적이지 않다면, 아마도 뻔~한 결과물로 일을 마칠 가능성이 높다. (그 일을 수행하는 전문가의 역량을 동일하다고 본다면...말이다)다시 말하면, 문제를 남다른 관점에서 정의하고, 전혀 다른 방식으로 방향을 이끌어 갈 수 있을 때, 새로운 해결책과 'wow' 요소가 나올 수 있다.하지만, 다시 현실로 돌아와보자.나와 한팀으로 같이 일하는 개발자, 마케터, 디자이너에게 우리가 상식적으로 알고 있는 상황을 전혀 새롭게 인식시키고, 전혀 다른 관점으로 문제를 풀어가자고 설득하는 일은 (게다가, 그들이 내 선배 또는 전문성과 경험으로 무장한 사람들이라고 한다면...-_-) 결코 만만치 않을 뿐만 아니라, 자칫 '그건 네 생각이고~', '난 아닌 것 같은데...' 몇 마디면, 보통 기획자들은 찌그러지게 되어 있다.기획자가 조직에서 '맨날 자기 세계에 빠져있는 자', 또는 '회의 소집하고, 회의록 정리하고 문서 작성하는 staff' 정도로 치부되는 경우가 적지 않은 이유이다.이 때 필요한 것이, 전체를 엮어나갈 '컨셉' 이다.현상을 다르게 바라보고, 문제를 새롭게 보고, 전혀 새로운 방식으로 해결책을 이끌어낼 수 있도록 하는 힘은 이것을 해야하는 '본질적인 이유'에 대한 질문과 그 답을 표현하는 '컨셉'에 달려있는 것이다.스티브잡스는 가장 위대한 기획자가만 보면, 주변에 꽤 뛰어난 개발자, 감각적인 디자이너, 열정적인 마케터, 지치지 않는 영업맨 들이 많다. 각 기능별로 뛰어난 훌륭한 전문가들은 마음 먹으면(비용은 좀 들겠지만...) 찾을 수 있다.만일 그런 전문가들로 구성된 드림팀을 만들면, 과연 세상을 깜짝 놀라게 하는 무언가가 자연스럽게 나올 수 있을까?그렇지 않다는 것을 직, 간접적으로 우리는 많이 보아왔을 것이다. 그런 논리라면 미국의 뉴욕 양키스 팀이나 스페인의 레알 마드리드 팀은 항상 우승을 해야하겠지만, 사실 어떤 감독과 어떤 작전을 펼치냐에 따라서 전혀 다른 결과물이 나온다.핵심은 전체를 한 방향으로 엮을 수 있는 리더쉽과 문제의 '본질'을 꿰뚫어 볼 수 있는 '컨셉'을 만들 수 있는 능력이다. 이 '컨셉'이라는 것은 총체적인 경험의 총합이어야 하며, 같은 팀원들에게 공유될 수 있도록 표현될 수 있는 무엇이어야 한다.그것이 기획자의 핵심 역량이어야 한다.Parameter Optimizer오케스트라의 다양한 악기들을 (각자 내로라하는 음악의 명장들이 포함된) 지휘자가 위대한 하모니를 만들 듯이, 각 기능의 전문가들이 때로는 양보하고 절제하고, 때로는 선두에서 힘을 발휘할 수 있도록 최적화 하는 일은 지휘지나 감독, 그리고 기획자들이 갖춰야 할 능력이다.단순히 보고서를 잘 정리하고, 꼼꼼하게 프로젝트의 일정을 챙기고, 문제가 발생하면 상부에 보고하고 프로세스를 잘 지키는 것이 중요한 것이 아니라, 이 프로젝트가 어떤 의미가 있고, 왜 이 문제를 해결해야 하는지에 대한 총체적인 질문에 답할 수 있고, 공감시킬 수 있어야 한다는 것이다.때로는 강력한 카리스마가 필요할 수도 있으며, 때로는 감성적인 부분으로 공감을 이끌어낼 수도 있어야 하며, 치밀한 숫자와 논리, 또는 은유와 비유로 총체적인 경험을 표현하는 '컨셉'을 공유할 수 있어야 한다.그런 측면에서 스티브잡스는 누구도 이루지 못했던 혁신적인 제품을 경영자이면서 동시에 '창의적 기획자'로서 세상에 선보일 수 있었다고 생각한다.쓸만한 기획자, 전략가가 없다요즘 linkedIn에 올라온 구직, 구인 정보들을 보면, 구체적인 직능을 수행하는 Expert들을 찾거나 또는 그런 Job을 찾는 내용들을 많이 볼 수 있다.특정 SW를 다룰 수 있는 소프트웨어 엔지니어를 찾거나, 5년 이상 IT 분야에서 종사한 UX 디자이너 또는 편집쪽 업무 경험이 있는 그래픽디자이너 등등 특정 기능을 수행하는 인력을 찾는 내용들은 많지만, 창의적인 사고와 남들과 다른 관점을 가진 '기획자'를 찾는 구인정보는 사실 흔치 않다.문제는 창의적인 사고를 평가할 수 있는 기준도 모호할 뿐만 아니라, 기획자의 입장에서도 자신의 '똘끼'나 창의력을 보여줄 수 있는 '포트폴리오'가 상당히 제한될 수밖에 없기 때문이다. 실제 직접 일을 하면서 과정을 같이 하지 않는 한, 훌륭한 기획자나 창의적인 사고를 구인/구직 시장에서 제대로 판별하기란 여간 쉬운 일이 아니다.설사 자신이 정말 창의적이고, 본질을 꿰뚫는 촌철살인의 혜안을 가지고 있다고 주장하더라도, 그것을 단시간 내에 입증하기도 사실 매우 어려운 것이 사실이다.물론, 이미 각 분야에서 성공적인 사례를 남긴 훌륭한 혁신가, 리더들이라면 이미 그 생각이 미디어를 통해 공유되고 성공사례를 통해 입증될 수 있다고 볼 수 있지만, 그런 인물은 소수일 수 밖에 없고, 이미 몸 값이 감당할 수준이 아닐 가능성이 높다.아마 회사의 터닝포인트를 가지고 싶거나, 혁신의 jump up을 모색하고자 한다면, 좋은 기획자를 다방면에 물색하여 찾으려는 노력이 반드시 따라야 할 것이며, 그 가치를 인정할 수 있는 내부의 안목 역시 뒷받침 되어야 할 것이다.기획자는 표현할 수 있어야 한다기획자는 오케스트라의 지휘자이어야 한다.바이올린과 첼로의 소리를 구분하고 조율할 수 있어야 하지만, 그렇게 만들어지는 소리가 전체적으로 어떤 '음악'이 되어야 하는지에 대한 Big Picture가 머리에 있어야 한다. 그래야, 그 큰그림을 나침반 삼아서 다양한 악기를 조율할 수 있는 것이다.다만, Big Picture가 자신의 머릿속에만 존재한다면, 같이 일하는 파트너들은 큰 그림을 볼 수 없는 상태에서 작은 지시와 조율된 내용만으로 전체 하모니를 만들어 낼 수 없다. 따라서, Big Picture, 즉 전체 스토리 '컨셉'을 파트너들에게 소개하고 공유하고 공감을 이끌 수 있도록 표현하고 설명할 수 있어야 한다.그것이 설득력 있는 보고서이건, 뛰어난 화술이건, 직관적인 비유이던 자신의 생각을 공유하고 소통할 수 없다면, 훌륭한 기획자를 기대하긴 어려울 뿐만 아니라, 하루라도 빨리 자신이 sales 할 수 있는 특정 기술(기능)을 배우는 것이 도움이 될 것이라고 생각한다.기획자는 그리 만만한 Job이 아니다.
조회수 770

창업자의 일기장(5)-놀고먹는 착각

----이전 이야기------실업급여와 퇴직금으로 6개월간창업 준비를 하기로 마음먹었다.퇴사를 하면,여행도 가고,하루 종일 잠만 자보기도 하고,늦은 밤에 야시장을 거니는 꿈을 꾸겠지만적어도 생계 걱정을 해야 하는 가장에게는상상 속의 이야기일 뿐.부양해야 할 가족이 있음은허투루 시간을 보내는 것이죄책감으로 되돌아온다.몇 번은 결혼하기 전에 창업을 했으면 하는 생각도 했지만,여전히 결혼하고 창업하길 잘 했다는 마음이 더 크다.그 책임감과 중압감이나를 더 몰아쳐왔고,한 번 더 고민하게 만들었으니까.실업자(백수)가 하루를 시작하는데늦잠 잔다는 것은 현실 자각이 없는 소리다.슬로 라이프, 여유 있는 아침,느긋한 스케줄이라는 것은 낭만적 일지 몰라도,굳이 이쁘게 포장하고 싶지 않다.(비추천 하나 드립니다.)놀고먹는 착각이 현실화되기 위해서는수익이 창출되는 시스템이 있어야 한다.내 노동력이 들어가지 않더라도알아서 돈이 불어나는 시스템.그런데 갓 퇴사한 사람이 그런 시스템을 가지고 있을 리 만무하고그렇다면 빠르게 다음 수를 준비해야 한다.일단 아침에는 무조건 일찍 일어나서세수하고, 정리하고, 나갈 준비를 한다.몸이 나태해지면,마음도 나태해지고,하루라는 시간도 낭비돼버린다.그 하루들이 모여서 내 일생이 되기에퇴사하더라도 부지런하고 꾸준함은 절대 계명처럼 지켜야 한다.그래!그동안 수고했으니까,고생했으니까,나 자신을 위해서시간을 한정해서 보상을 해 줄 수는 있다.1주일 또는 2주일 정도만제한된 스케줄 안에서여행이든, 쉼이든 가질 수 있다.딱 거기까지!!!그게 습관이 되어버리면,점차 돌이키기 힘든 후회의 시간들이 늘어갈 것이다.그러니까 쉬더라도시간을 정해 놓고 쉬어라.퇴사한 다음 날에나는 아내와 인사동에 놀러 갔다.그다음 날에는 파주 헤이리에 갔고,그다음 날에는 집에서 놀았다.딱 그렇게 일주일을 쉬었다.그리고는 도서관으로 출퇴근하였다.도시락도 챙겨가고,가끔은 구내식당도 이용하고,아침에 나갔다가 밤에 돌아왔다.백수의 시간들 동안열심히 살았고, 꾸준했음에도...기대했던 만큼의 성과나,가시적인 레퍼런스를 만들지는 못 했다.그러나 그때에 공부하고, 준비했던 것들이나중에 창업하고, 회사를 운영하는데큰 힘이 되어주었다.실업급여와 퇴직금에 안심하지 마라.진짜 금방 사라진다.추가적인 수입이 없기에통장의 숫자가 줄어드는 것에 민감해진다.시간과 돈에 쫓기기 시작하면,마음이 분주해지고, 성급해진다.그리고 작은 유혹에도 흔들리게 된다.섣부르게 행동하게 되고,날림으로 판단하게 된다.요즘은 퇴사도 잘 해야 한다고,퇴사 준비를 시켜주는 교육도 있더라.나라고 무작정 퇴사하지는 않았다.분명 나름 확신을 가졌고,계획은 몇 번이고 시뮬레이션해서자신 있었다.회사 다니면서점심시간을 굶어가면서토익학원 다녀서 점수도 만들어놓고,퇴근하고 도서관 열람실에서가득 채운 두꺼운 노트만 2권이다.(다이어리 미포함)주말에는 알라딘 서점과 공립도서관에서 읽은 책 또는 빌린 책이매주 3권 씩이다.그러나,막상 퇴사하고 나면,그래도 부족했고, 허점이 많았다는 걸 알게 된다.퇴사준비가 부질없다는 이야기가 아니라잘 준비해도 생각지 못한 문제들이 많이 생긴다는 거다.쉽게 재취업하거나쉽게 창업할 수 있다고 착각하지 마라.퇴사 후에 새로운 일을 시작하기까지의 시간은놀고먹는 시간이 아니라 준비하는 시간이다.그 공백의 시간이 늘어날수록,훗날 그 시간에 대하여 해명해야 할 날이 온다.
조회수 1564

비트윈의 멀티티어 아키텍처를 위한 프레젠터 이야기

블로그 첫 글에서 비트윈의 시스템 아키텍처에 대해 다룬 적이 있습니다. 시스템 구성의 미래에 대한 계획으로 멀티티어 아키텍처에 대해 언급했었는데, 이는 프로토콜을 단순화시키고 배포 자동화를 가능하게 하기 위해서 클라이언트와 비즈니스 로직을 담당하는 서버 사이에 일종의 게이트웨이를 두는 것이었습니다. 그 외에도 여러 가지 필요성이 생겨 해당 역할을 담당하는 프레젠터라는 것을 만들게 되었고 비트윈의 채팅 시스템에 적용하게 되었습니다. 만드는 과정 중에 여러 기술적인 문제들이 있었고 이를 해결하기 위한 노력을 하였습니다. 이 글에서는 비트윈 시스템에서의 프레젠터에 대해 이야기 하고자 합니다.프레젠터¶프레젠터는 일종의 게이트웨이 입니다. 기존의 시스템에서는 클라이언트들이 ELB를 통해 채팅 서버에 직접 TCP 연결을 하였습니다. 하지만 비트윈 PC버전과 자체 푸시 서버를 만들면서 ELB로는 해결할 수 없는 부족한 점들이 생겼고, ELB의 부족한 점을 채워줄 수 있는 시스템이 필요하게 되었습니다. ELB를 대체하는 역할 외에도 다른 여러 필요했던 기능들을 제공하는 프레젠터를 만들기로 하였습니다.프레젠터는 ELB의 역할을 할 뿐만 아니라 여러 다른 기능들도 제공합니다.프레젠터의 기능¶패킷을 적절한 샤드로 중계¶비트윈에서는 커플 단위로 샤딩하여 같은 커플의 채팅 요청에 대해서는 같은 채팅 서버에서 처리하고 있습니다. Consistent Hash를 통해 커플을 여러 채팅 서버로 샤딩하고 ZooKeeper를 이용하여 이 정보를 여러 채팅 서버 간 공유합니다. 프레젠터 또한 ZooKeeper와 연결을 하여 어떤 채팅 서버가 어떤 커플을 담당하는지에 대한 정보를 알고 있도록 설계되어 있습니다. 따라서 프레젠터는 첫 연결 시 보내는 인증 패킷을 보고 해당 채팅 연결에서 오는 요청들을 어떤 채팅 서버로 보내야 할지 판단할 수 있습니다. 어떤 채팅 서버로 보낼지 판단하는 과정은 처음 한 번만 일어나며, 이후 패킷부터는 자동으로 해당 채팅 서버로 중계합니다.프레젠터의 이런 기능 덕분에 클라이언트는 더 이상 어떤 채팅 서버로 붙어야 하는지 알아내는 과정 없이 아무 프레젠터와 연결만 맺으면 채팅을 할 수 있게 되었습니다. 기존에는 클라이언트들이 여러 채팅 서버 중 어떤 서버에 붙어야 하는지 확인하는 작업을 한 후에 할당된 채팅 서버로 연결 맺어야 했습니다. 그래서 클라이언트가 채팅 서버와 연결을 맺기 위해 다소 복잡한 과정을 거쳐야 했지만, 이제는 클라이언트가 프레젠터의 주소로 연결 요청만 하면 DNS Round Robin 통해 아무 프레젠터와 연결하는 방식으로 프로토콜을 단순화할 수 있었습니다. 덕분에 새로운 채팅 서버를 띄울 때마다 ELB를 Warm-Up 시켜야 했던 기존 시스템의 문제가 없어졌습니다. 그래서 비트윈 개발팀의 오랜 염원이었던 채팅 서버 오토스케일의 가능성도 열렸습니다.많은 수의 연결을 안정적으로 유지¶PC버전과 푸시 서버를 만들면서 기존의 채팅 연결과 다르게 많은 수의 연결이 장시간 동안 유지 되는 경우를 처리할 수 있어야 했습니다. 기존에는 TCP 릴레이를 하도록 설정된 ELB가 연결들을 받아주었습니다. 한 머신당 6만 개 정도의 Outbound TCP 연결을 맺을 수 있는데, ELB도 트래픽에 따라 여러 대의 머신에서 돌아가는 일종의 프로그램이므로 이 제한에 걸린다고 생각할 수 있습니다. 따라서 많은 수의 연결을 맺어놓고 있어야 하는 경우 ELB에 문제가 생길 수 있다고 판단했습니다. (과거 ELB가 연결 개수가 많아지는 경우 스케일아웃이 안되는 버그 때문에 문제가 된 적이 있기도 했습니다) 또한 클라이어트 연결당 내부 연결도 하나씩 생겨야 하면 클라이언트가 연결을 끊거나 맺을 때마다 서버 내부 연결도 매번 끊거나 연결해야 하는 오버헤드가 발생합니다.이를 해결하기 위해 프레젠터에서는 TCP 연결을 Multiplexing하는 프로토콜을 구현하여 적은 수의 내부 연결로 많은 수의 클라이언트 연결을 처리할 수 있도록 하였습니다. 서버 내부에서는 고정된 개수의 몇 개의 연결만 맺어 놓고 이 연결들만으로 수많은 클라이언트 연결을 처리할 수 있습니다. 이처럼 TCP Multiplexing을 하는 것은 Finagle과 같은 다른 RPC 프로젝트에서도 지원하는 기능입니다.TCP Multiplexing 프로토콜을 통해 많은 수의 클라이언트 연결을 소수의 서버 내부 연결로 처리합니다.또한, 프레젠터는 많은 수의 SSL 연결을 처리해야 하므로 암복호화 로직을 실행하는데 퍼포먼스가 매우 중요하게 됩니다. 채팅 서버 한 대를 제거하거나 하는 경우 많은 연결이 한꺼번에 끊어지고 연이어 한꺼번에 연결을 시도하게 되는 경우가 있을 수 있는데, 이 때 대량의 SSL Handshaking을 하게 됩니다. 기존 서버들로 대량의 SSL Handshaking을 빠른 시간안에 처리하기 위해서는 높은 퍼포먼스가 필요합니다. Java로 작성된 프로그램만으로 이런 퍼포먼스 요구사항을 달성하기 어려우므로, 클라이언트와의 연결을 담당하는 부분은 OpenSSL, libevent를 이용한 C++로 코드로 작성하였습니다. 인증 패킷을 파싱하거나 패킷들을 릴레이 하는 등의 로직을 담당하는 부분은 Alfred라는 Netty를 이용하여 만든 인하우스 RPC 라이브러리를 이용해 작성되었습니다. 연결을 담당하는 부분은 TCP 연결을 유지하는 역할과 들어온 패킷들을 Netty로 작성된 모듈로 릴레이 하는 역할만 담당하므로 매우 간단한 형태의 프로그램입니다. 짧은 시간 안에 어럽지 않게 구현할 수 있었습니다.클라이언트의 연결을 받아주는 역할을 하는 부분은 C++, 실제 로직이 필요한 부분은 Java로 작성하였습니다.여러 네트워크 최적화 기술의 지원¶ELB에는 여러 네트워크 최적화 기술들을 아직 제공하지 않는 경우가 있습니다. 대표적으로 HTTP/2 혹은 SPDY, QUIC, TCP Fast Open 등이 있습니다. 특히 모바일 환경에서는 SSL Handshaking 등 부가적인 RTT로 인한 지연을 무시할 수 없으므로 이런 기술들을 이용한 초기 연결 시간 최적화는 서비스 퀄리티에 중요한 부분 중 하나입니다. ELB는 AWS에서 관리하는 서비스이므로 AWS에서 이런 기능들을 ELB에 적용하기 전에는 이용할 수 없지만, 프레젠터는 직접 운영하는 서버이므로 필요한 기능을 바로바로 적용하여 서비스 품질을 높일 수 있습니다. ELB에서 이미 제공하는 최적화 기술인 SSL Session Ticket이나 다른 몇몇 기술은 이미 적용되어 있고 아직 적용하지 않은 기술들도 필요에 따라 차차 적용할 예정입니다.프레젠터의 구현¶C++ 연결 유지 모듈¶프레젠터는 퍼포먼스를 위해 C++로 작성되었습니다. 이는 Pure Java를 이용한 암복호화는 프레젠터에서 원하는 정도의 퍼포먼스를 낼 수 없기 때문입니다. 처음에는 OpenSSL과 libevent를 이용해 작성된 코드를 JNI를 통해 Netty 인터페이스에 붙인 event4j라는 인하우스 라이브러리를 이용하려고 했으나, 코드가 복잡하고 유지보수가 어렵다는 점 때문에 포기하였습니다. 그 후에는 netty-tcnative를 이용해보고자 했으나 테스트 결과 연결당 메모리 사용량이 큰 문제가 있었고, 이를 수정하기에는 시간이 오래 걸릴 것 같아 포기하였습니다. 결국, 페이스북에서 오픈소스로 공개한 C++ 라이브러리인 folly를 활용하여 프레젠터를 작성하게 되었습니다. folly의 네트워크 API들이 OpenSSL과 libevent를 이용해 구현되어 있습니다.릴레이 로직¶프레젠터는 첫 인증 패킷을 파싱하여 릴레이할 채팅 서버를 판단하며, 이후의 패킷부터는 실제 패킷을 까보지 않고 단순 릴레이 하도록 설계하였습니다. 처음의 Netty 파이프라인에는 Alfred 프로토콜을 처리할 수 있는 핸들러들이 설정되어 있어 인증 패킷을 파싱 할 수 있으며 인증 패킷에 있는 정보를 바탕으로 어떤 채팅 서버로 패킷을 릴레이 할지 결정합니다. 그 이후 파이프라인에 있던 핸들러를 모두 제거 한 후, 읽은 byte 스트림을 Multiplexing Protocol 프레임으로 감싸서 그대로 릴레이 하는 매우 간단한 로직을 담당하는 핸들러 하나를 추가합니다. 덕분에 로직 부분의 구현도 매우 간단해질 수 있었으며, 채팅 서버에 API가 추가되거나 변경되어도 프레젠터는 업데이트할 필요가 없다는 운영상 이점도 있었습니다.Multiplexing Protocol¶프레젠터의 Multiplexing Protocol은 Thrift를 이용하여 직접 정의 하였으며, 비트윈 개발팀 내부적으로 사용 중인 RPC 라이브러리인 Alfred에 이 프로토콜을 구현하였습니다. Thrift를 통해 C++과 Java로 컴파일된 소스코드를 각각 프레젠터의 연결 처리 부분과 로직 처리 부분에서 이용하여 통신합니다. 프레젠터에서는 Multiplexing된 TCP 연결들을 Stream이라고 명명하였으며 이는 SPDY나 HTTP/2에서의 호칭 방법과 유사합니다. SPDY나 HTTP/2도 일종의 Multiplexing 기능을 제공하고 있으며, 프레젠터의 Multiplexing Protocol도 SPDY 프레임을 많이 참고하여 작성되었습니다.수 많은 클라이언트와의 TCP연결을 Stream으로 만들어 하나의 내부 TCP연결을 통해 처리합니다.Alfred에서는 Multiplexing 된 TCP 연결을 Netty의 Channel 인터페이스로 추상화하였습니다. Netty에서 TCP 연결 하나는 Channel 하나로 만들어지는데, 실제 Stream도 Channel 인터페이스로 데이터를 읽거나 쓸 수 있도록 하였습니다. 이 추상화 덕분에 비트윈 비즈니스 로직을 담당하는 코드에서는 Stream으로 Multiplexing 된 TCP 연결을 마치 기존의 TCP 연결과 똑같이 Channel을 이용해 사용할 수 있었습니다. 그래서 실제 비즈니스 로직 코드는 전혀 건드리지 않고 프레젠터를 쉽게 붙일 수 있었습니다.로드 밸런싱¶클라이언트는 Route53에서 제공하는 DNS Round Robin 기능을 이용하여 아무 프레젠터에 연결하여 채팅 요청을 날리게 됩니다. 하지만 무조건 동등하게 Round Robin 하게 되면 새로 켜지거나 하여 연결을 거의 맺지 않고 놀고 있는 프레젠터가 있는데도 연결을 많이 맺고 있는 기존 프레젠터에에 연결이 할당되는 문제가 생길 수 있습니다. 충분한 시간이 흐르면 결국에는 연결 개수는 동등하게 되겠지만, 처음부터 놀고 있는 프레젠터에 새로운 연결을 가중치를 주어 할당하면 로드를 분산되는 데 큰 도움이 될 것입니다. 그래서 Route53의 Weighted Routing Policy 기능을 이용하기로 하였습니다. 현재 연결 개수와 CPU 사용량 등을 종합적으로 고려하여 Weight를 결정하고 이를 주기적으로 Route53의 레코드에 업데이트합니다. 이런 방법으로 현재 로드가 많이 걸리는 서버로는 적은 수의 새로운 연결을 맺게 하고 자원이 많이 남는 프레젠터로 더 많은 새로운 연결이 맺어지도록 하고 있습니다.스케일 인/아웃¶AWS에서는 트래픽에 따라 서버 개수를 늘리기도 하고 줄이기도 하는 AutoScaling 이라는 기능이 있습니다. 프레젠터가 스케일 아웃될때에는 프레젠터가 스스로 Route53에 레코드를 추가하는 식으로 새로운 연결을 맺도록 할 수 있습니다. 하지만 스케일 인으로 프레젠터가 제거될 때에는 Route53에서 레코드를 삭제하더라도 함부로 프레젠터 서버를 종료시킬 수 없습니다. 종종 클라이언트의 DNS 캐싱 로직에 문제가 있어, Route53에서 레코드를 삭제되었는데도 불구하고 이를 업데이트하지 못해 기존 프레젠터로 연결을 시도하는 경우가 있을 수 있기 때문입니다. 따라서 프레젠터 클러스터가 스케일 인 될 때에는 기존의 모든 연결이 끊어지고 충분한 시간 동안 새로운 연결이 생기지 않은 경우에만 서버를 종료시켜야 합니다. AutoScaling Group의 LifeCycleHook을 이용하여 위와 같은 조건을 만족 시켰을 때에만 프레젠터 서버를 완전히 종료시키도록 하였습니다.못다 한 이야기¶프레젠터라는 이름이 이상하다고 생각하시는 분들이 있을 것으로 생각합니다. 멀티티어 아키텍처를 이야기할 때 프레젠테이션 티어, 어플리케이션 티어, 데이터베이스 티어로 구분하곤 하는데 이 프레젠테이션 티어에서 나온 이름입니다. 지금은 실제 프레젠터가 하는 역할과 프레젠테이션 티어가 보통 맡게 되는 역할에는 많은 차이가 있지만, 어쩌다 보니 이름은 그대로 가져가게 되었습니다.프레젠터에서 AutoScaling을 하기 위해 LifeCycleHook을 이용합니다. 이때 프레젠터를 위해 LifeCycleHook 이벤트를 처리하는 프로그램을 직접 짠 것이 아니라 비트윈 개발팀이 내부적으로 만든 Kharon이라는 프로그램을 이용하였습니다. Kharon은 인스턴스가 시작되거나 종료될 때 실행할 스크립트를 작성하고 인스턴스의 특정 위치에 놓는 것만으로 LifeCycleHook을 쉽게 이용할 수 있게 하는 프로그램입니다. Kharon 덕분에 비트윈 내 다양한 시스템에서 별다른 추가 개발 없이 LifeCycleHook을 쉽게 활용하고 있습니다. 후에 Kharon에 대해 자세히 다뤄보도록 하겠습니다.정리¶비트윈 개발팀에서는 오랫동안 유지되는 수많은 채팅 서버 연결들을 처리하고 클라이언트와 서버 간 프로토콜을 단순화시키는 등 여러 이점을 얻고자 ELB의 역할을 대신하는 프레젠터를 만들었습니다. 프레젠터를 만드는 과정에서 여러 기술적 문제가 있었습니다. 이를 해결하기 위해 C++로 연결 유지 모듈을 따로 작성하였고 Multiplexing Protocol을 따로 정의하였으며 그 외 여러 가지 기술적인 결정들을 하였습니다. 이런 과정에서 시행착오들이 있었지만 이를 발판 삼아 더 좋은 기술적 결정을 내리기 위해 고민하여 결국 기존 시스템에 쉽게 적용할 수 있고 쉽게 동작하는 프레젠터를 만들어 이용하고 있습니다.저희는 언제나 타다 및 비트윈 서비스를 함께 만들며 기술적인 문제를 함께 풀어나갈 능력있는 개발자를 모시고 있습니다. 언제든 부담없이 [email protected]로 이메일을 주시기 바랍니다!
조회수 965

콘텐츠와 미디어에 대한 3분 고찰

Overview콘텐츠와 미디어가 중요해지면서 그에 따른 관심도 커졌습니다. 그런데 말입니다. 디지털 문화시대, 초연결시대에서 말하는 ‘콘텐츠’와 ‘미디어’는 과연 어떤 의미를 갖고 있을까요? 무엇인지는 알고 있지만 막상 말하려면 ‘엌!..’ 하고 막히기 마련입니다. 이번 글에선 콘텐츠와 미디어의 명확한 의미를 짧은 글로 되짚고자 합니다.Content VS Contents누군가의 얼굴을 종이에 그렸다고 생각해봅시다. 그렇다면 그 그림은 Content일까요, Contents일까요? 정확하게는 단수형인 Content입니다. 하지만 그림을 사진으로 촬영하거나, 영상으로 녹화하거나, 스캔해서 온라인에 올리면 Contents라고 말합니다. 어떤 차이인지 감이 잡히나요? (느낌 아니까~)당신이 그린 그림을 다른 종이에 다시 그려보라고 한다면 똑같이 그릴 수는 없을 겁니다. 비슷하게 그릴지라도 선의 굵기나 그림의 위치가 미세하게 바뀔 겁니다. 다시 지웠다 그려도 지운 흔적이 남고요. 하지만 그림을 사진으로 촬영하거나, 영상으로 녹화하거나, 스캔해서 온라인에 올리면 1,000명이 보든, 10,000명이 보든 똑같은 품질로 제공될 겁니다. 게다가 PC, 모바일, 태블릿PC 등 가리지 않고 어느 디바이스(Device)에서나 볼 수 있습니다.그렇습니다. Content는 미디어 하나에 딱 한 번만 쓸 수 있습니다. 반면 Contents는 다양한 미디어에서 ‘똑같은’ 품질로 만날 수 있습니다. 심지어 닳아 없어지지도 않고요. 크리에이터가 온라인에 올린 이야기가 Contents라고 불리는 이유입니다.Content와 Contents는 ‘어떤 미디어에 속해있는가’에 따라 결정됩니다. 영화의 대본, 배경음악은 그 영화에서만 쓸 수 있습니다. 다른 영화에서 쓰였다간 큰일납니다. 그러나 상위 미디어로 이동하면 얘기는 달라집니다. 영화가 컴퓨터 파일(File)이 되었다고 생각해보세요. 컴퓨터 안에는 영화도 있고, 게임도 있고, 문서도 있고, 그것도 있…ㅎ~ ‘컴퓨터’라는 미디어 안에는 파일이 엄청 많습니다. 무엇을 볼지 선택할 수도 있습니다. 아무리 많이 봐도 늘 똑같습니다. 이때 영화는 Contents가 되는 것이지요.Media콘텐츠만큼이나 자주 언급되는 게 바로 미디어입니다. 마샬 맥루한(Herbert Marshall McLuhan)은 ‘인간의 오감은 최초의 미디어였고, 미디어의 확장이 곧 감각의 확장’이란 이론을 내세웠습니다. 아주 먼 옛날, 적이 침입했을 때 봉수대에 불을 지폈던 걸 생각하면 고개를 절로 끄덕이게 됩니다. 소리를 꽥꽥 질러도 먼 지역에서 들을 수 없기 때문에 불을 크게 지핀 겁니다. 봉수대는 위험한 상황을 알리는 최고의 미디어였습니다. 그의 이론에 따르면 달리는 말과 굴러가는 바퀴도 인간의 다리를 확장한 것이니 미디어가 됩니다. 말도 미디어라니, 뭔가 웃음이 나오지만 여기엔 중요한 사실이 하나 있습니다. 바로 미디어가 메시지 그 자체가 된다는 것이지요. 봉수대는 ‘위험한 상황’을 알리기 위해 만들어졌습니다. 만들어진 목적과 전하려는 메시지가 일치합니다. 봉수대에 불만 지펴도 누군가 침입했다는 걸 알 수 있었습니다.그렇습니다. 미디어는 표현과 전달을 동시에 합니다. 결국 ‘무엇인가를 담아 전달하는 도구’인 셈입니다. 우리 주변에서 쉽게 찾을 수 있는 책, 달력, 컵, 포스트잇은 사실 모~두 미디어입니다. 앞서 미디어가 메시지 그 자체가 된다고 했는데요, 그렇다면 미디어가 달라졌을 때, 메시지도 달라질까요?봉수대의 불과 가스레인지의 불은 다른 의미를 가지고 있습니다. 이뿐만이 아닙니다. 소설 ⌈해리포터⌋는 상상과 사고의 연속이지만 영화 <해리포터>는 시각과 청각을 열어두는 콘텐츠의 파노라마입니다. 두 예시만 봐도 ‘미디어가 달라지면 메시지도 달라진다’는 걸 알 수 있습니다. 이제 콘텐츠와 미디어의 의미를 정확하게 알았으니 우리 주변의 모든 것들이 콘텐츠와 미디어로 보이게 될 겁니다.Conclusion유럽의 미래학자 피터 힌센(Peter Hinssen)은 그의 저서 ⌈뉴 노멀(New Normal)⌋에서 “콘텐츠는 더 이상 왕이 아니다”라고 말했습니다. 이는 다양한 미디어에서 콘텐츠가 쏟아져 그 가치가 저하됐다고 봤기 때문입니다.그러나 새로운 기술의 등장은 한 사회의 근간인 문화의 틀까지 바꿉니다. 스마트폰이 등장한 이후 오늘날의 모습은 어떤가요. 이모티콘으로 감정을 전하고, 인스타그램의 사진들은 따로 설명이 필요 없을 정도입니다. 콘텐츠와 미디어로 인해 세계공용어가 없어지는 중이라 해도 과언이 아닙니다. 콘텐츠와 미디어의 중요성을 비교할 수는 있어도 ‘결국 둘 다 중요하다’는 의견에는 모두 동의할 겁니다. 그만큼 둘의 본질을 꿰뚫는 건 크레에이터가 꼭 짚고 넘어가야할 일이기도 하지요. 이제 누군가 콘텐츠와 미디어를 설명해달라고 한다면 자신 있게 말할 수 있겠쬬? (도장 쾅쾅)글장근우 대리 | People&Relations [email protected]브랜디, 오직 예쁜 옷만#브랜디 #마케팅문화 #마케팅팀 #업무환경 #인사이트 #경험공유 #콘텐츠

기업문화 엿볼 때, 더팀스

로그인

/