스토리 홈

인터뷰

피드

뉴스

조회수 1831

내 나이는 스무살 스타트업 마케터다

여태 살아온 여정을 풀고 싶어서 쓰게 되었습니다.주식을 팔아버렸다15살 워렌버핏의 가치투자에 대해 책을 읽으며, 돈에 대해 조금 알게 되었다. 그래서 부모님께 말씀드려 소액의 금액을 가지고 한국전력 주식을 샀다. 그리고 고등학교 때 팔았다. 워렌버핏은 주식을 10년 보유할 자신이 없으면 사지 말라고 했는데, 결국 팔아버렸다. 배당금 꽤 나오는데.. 건포어가 주식을 팔았던 이유를 한번 알아보자고딩 CEO = 폐업고등학교 1학년 겨울방학 온오프믹스에서 청소년 기업가 정신 교육이 있었다. 주최사는 이그나잇스파크 최환진 대표님께서 진행을 해주셨다. 나와 나이가 비슷한 또래 친구들과 교육을 듣고 스타트업에 대해서 공부를 했었다. 와우! 너무 좋았다. 그래서 거기에 나와 마음이 비슷한 친구와 창업을 해보기로 했다 소셜벤처기업으로 시작했었다. 회사 이름은 (주)훌림목 판매 물품은 일산에 있는 홀트학교 장애아동학생들이 그린 그림을 포스트잇에 프린팅 한 다음 판매를 하면 그 수익금을 학교에 주는 방식이었다. 나름 성공적인 판매를 했었다.2차 제품을 생각했다. 유아, 초등부 아이들의 기부에 대한 인식을 바꾸기로 해서 저금통을 모델로 했다. 저금통 생산을 위해서 금형 가격을 알아봤는데 엄청 싸게 해도 500만 원 정도였다. 그래서 학교에 있는 3D 프린트로 저금통을 만들었다. 판매처는 유치원, 초등학교였다. 내 모교를 찾아가도 저금통을 안 사줬다. 사업을 하면 할수록 떨어지는 성적, 그리고 나름 사업한다고 양재역에 오픈한 소호사무실, 사무실 임대료가 밀리기 시작하자 급히 부모님께 돈을 빌리고, 주식을 처분하고(흙..) 주말 레스토랑 알바를 하면서 빚을 갚아갔다. 난 왜 망했지?라고 생각해봤는데 무턱대고 사업을 했었다. 그냥 회사 놀이를 했다고 생각된다.디캠프로 오게 되었다.고등학교 3학년이 되며, 마케팅에 대해 많은 관심이 생겼다. 너무 매력 있는 분야였다. 그래서 정말 열심히 준비해서 스타트업에 들어와서 일을 하게 되었다. 처음 입사한 회사는 디자인 플랫폼 스타트업이었다. 줄곧 근무하다가 디캠프의 '오누이'팀에 들어가게 되었다. 입사 당시 회상을 하면 대표님이 참 열정이 넘치셨다. 그리고 나와 다르게 철저한 준비를 하셨고, 눈을 보면 정말 이글이글 뜨겁게 느껴졌다. 여기 있으면 정말 많은 성장을 할 수 있다는 느낌을 확실히 받았다.오누이는오누이는 문제풀이 질의응답 서비스이다. 중고등학생들이 모르는 문제가 생기면 사진을 찍어 올리면, 튜터들이 풀이과정을 사진으로 찍어 보내준다. 또한 학생이 이해를 못하면 대화방을 열어 계속 질문할 수 있고 평균 10분 내외로 양질의 답변을 받을 수 있다. 물론 튜터들은 검증된 사람만이 참여를 할 수 있다.나는야 오누이 마케터 아직 많은 부족함을 느낀다. 앞으로 하고 싶은 건 퍼포먼스 마케팅의 능력자가 되는 것이다. SQL, 쿼리 등 데이터를 분석하는 데에 능숙하지는 않지만 앞으로의 오누이를 생각하면 능숙하게 만들어겠다. 중고등학생 600만 명이 오누이를 쓰는 그 날, 고액과외와 같이 돈으로 인해 불평등한 교육 환경을 바꾸고 나 자신의 성장을 위해서 더욱 노력하여 원하는 목표를 꼭 이룰 것이다. 실시간 질문앱 오누이에서 마케팅을 하고 있는 건포어입니다. 2017년 11월 13일의 저는 어떻게 변해있을지 궁금하네요.#오누이 #마케터 #마케팅 #인사이트 #성장 #퍼포먼스마케터 #퍼포먼스마케팅
조회수 1678

스타트업! 투자 유치의 갈림길

빠른 성장이라는 단어에서매출 가능성과 매출은 큰 차이를 가져온다.매출 가능성이 높다는 것은투자자에게 매우 유의미한 마일스톤이다.매출 자체는 창업자에게매우 가치 있는 마일스톤이다.동지들인 스타트업 대표들과 대화 중,투자를 유치하려는 이유에 대해 나누다 보면1) 지금 당장 자금이 부족하기 때문에,2) 앞으로 투입돼야 할 자금을 조달하기 어려워서,3) 투자를 통해 회사 규모를 빨리 키우고 싶어서...라는 대답을 듣는다.여기에 질문을 더해서...만약 매출이 어느 정도 있다면투자를 받고 싶은가라고 물었을 때,다들 가능하다면 투자 없이자기자금으로 회사를 이끌고 싶어 한다.다시 질문을 달리해서,만약 매출 가능성을 보이는 지표가뚜렷한 상황일 경우,투자를 안 받고돈을 빌리는 게 낫지 않을까 물으면...설령 매출 가능성은 보이더라도융자는 왠지 감당할 자신이 없다고 말한다.(물론 저금리 융자도 받기 쉽지 않지만...;;;)요약하자면,이왕이면 자기 자금으로 하고 싶은데 돈이 없다.사업성이 높더라도 융자에 관한 리스크는 싫다.그래서 투자를 유치하고 싶다.이러한 의견들은...매우 공감은 하지만,꽤 이기적이다.다시 한번 만약이라는 전제하에,내가 만약 투자자라면...대표가 와서 사업성은 있다고 설명하며돈을 투자해 달라고 한다.융자는 받기 싫다고 한다.사업하다가 망하면, 내 돈만 까먹는 셈이다.그래서 이런저런 제약과 조건을 계약에 삽입한다.조건이 많아질수록 대표의 안색이 안 좋아진다.그리고 서로의 입장이 평행을 달리게 된다.이런 스토리... 너무 흔한 일이지 않나?내가 좋아하던 만화책에등가교환의 법칙이라는 것이 있다.(강철의 연금술사에서 자주 언급되던...)(출처: 구글, 만화 강철의 연금술사 중)무언가를 얻기 위해서는무언가를 잃어야 한다.리스크를 분담하고자 한다면그에 상응하는 대가를 지불해야 한다.그러지 않으려고 하는 대표라면투자자 입장에서는참 이기적이고, 한심해 보이겠지.역으로 대표 입장에서는너무 많은 대가를요구하는 투자자들이 야속하겠지.이러한 Gap(차이)을 어떻게 줄이느냐가 관건이다.어떤 대표에게는 투자가 생존의 기회이고어떤 대표에게는 투자가 정체성의 혼란이 된다.우리 회사의 경우는...투자유치가확장의 기회로 될 것이라 믿고 있다.우리는 투자자와 미팅에서"투자가 유치된다면,계획한 이상으로 빠르게 확장할 수 있습니다.하지만 투자가 안된다면,조금은 더디게 천천히 확장할 수 있습니다."라고 언급한다.우리 멤버들의 속마음은 투자에절실하지 않은 편이다.우리는 돈이 궁해서 투자 유치를 받으려기보다는파트너가 더 필요해서 투자가 필요한 케이스이다.재무와 운영에 있어서꽤 미흡한 우리의 아킬레스건을투자자라는 파트너를 통해 보완하고자 하는 의도가 크다.(주)클린그린은 지금 성장통을 겪고 있는 회사이다.나름대로 너무 빠르지 않게,기초를 다지면서 성장하자는 모토로스타트업 업계에 발을 들이밀었는데....생각보다 꽤 빠르게 성장했다.내년에 달성해야 할 마일스톤을올해 8월에 달성해 버려서...모든 계획을 앞당기고 있는 중이고,성장통을 겪고 있다."이봐! 이건 기회야! 이럴 때 더 몰아쳐야 한다고.""나라면 지금 승부수를 던질 거야. 물들어왔을 때, 배 띄우라고.""답답하게 왜 이리 소심해졌어? 이런 기회가 다시 올 줄 알아?"주위에 대표님들은 오히려 나를 더 몰아붙인다.어쩌면 난 다가온 기회들을 방관하고 있는지도 모른다.훗날 아쉬운 마음을 가질지도 모른다.(출처: 구글, 영화 타짜 중)하지만 신념이 있다.사업은 도박이 아니라 생존이라는 거.스타트업은 모래성과 같다.결국은 바람이나 파도에 의해 순식간에무너질 수 있다.우린 그런 존재이다.그리고 극히 적은 수만이굳어져 사암이 되고, 암석이 된다.그러려면 적어도 쉽게 무너지지 않도록펀더멘탈을 키워야 한다.모래성 쌓기를 할 때,모래를 올리고, 물을 붓고, 잘 다져주어야 튼튼해진다.지금 우리 회사가 그렇다.모래와 물을 뿌렸고...다져주는 단계가 아닐까.그리고 나야 다음에 더 많은모래의 중력과 물의 침식을 버틸 수 있다.최근 (주)클린그린은2곳의 VC와 1곳의  AC, 2개의 기업을따로 만나 투자를 비롯한여러 논제들에 대한 미팅을 진행 중이다.물론 그전에 IR을 통해 만남이 진행되고,인연이 이어지고 있는 곳들도 있다.지금 투자를 받기보다는앞으로 투자를 받을 때를 위해사전에 교류하고 배우기 위해서이다.만남을 가질수록 우리가 무엇을 준비해야 할지,우리가 나아가는 방향은 적합한지,우리가 수정할 부분이 무엇인지우리가 미처 발견하지 못한 어두운 부분들을찾아주고, 깨닫게 해주어 매우 도움이 된다.단도직입적으로2017년 하반기쯤에는투자유치가 필요할 것으로 예상된다.그러기 위해,지금 좋은 투자자들을 만나가면서,우리를 보여주고, 신뢰를 쌓아가야그때에 맞춰서 자금 수혈이 가능할 것이라고 본다.올해는 그동안 축적한 자금을 자본으로 전환하여재무구조를 더 탄탄하게 하였고,2016년에다사다난, 수없이 많은 수정을 거쳤던마일스톤 목표 달성을 마무리하고 있다.나 역시 사실 매출이 더 좋다."매출이 깡패"라는 말이 진리랄까?(출처: 구글, 마동석 형님 영화사진 중)제조업 기반의 스타트업에게는사용자 유입 빈도라던가핵심 고객지표 같은 것이 적용되지 않는다.결국은 가장 큰 영향력은 매출이다.다 갖추었다고 하더라도결국은 유의미한 매출이 있어야 한다.물론 기술력이 정말 뛰어나거나팀 빌딩이 퐌타스틱하거나누가 봐도 사업성이 높은 스타트업은매출이 없어도 투자를 유치한다.그 범주안에 들어가지 않는다면,일단 매출을 발생해야 한다.용역으로 만들어지는 매출이 아니라본 아이템으로 만들어지는 매출!유의미한 매출이라 함은...꼭 많은 매출을 말하는 것이 아니다.소량을 출시하더라도그것이 완판 되거나,시장 반응을 확증할 근거가 될 만큼의매출을 말한다.투자를 받으려니 매출 증빙을 하란다.매출이 잘 나오면뭣하러 투자를 받겠나 라는 식의논리는 매우 극단적이다.투자자 역시 리스크를 피하고 싶은 모험가이다.그래서 투자를 진행하기 위해 근거가 필요하다.막연한 사업계획이 아니라,실증적인 근거가 있어야 한다.많은 매출이 생기는 스타트업에투자하고자 하는 건어쩔 수 없는 투자자의 본능이다.우리 창업자들은 투자자와타협점을 만들어야 한다.투자자도 매출이 많이 나는 스타트업을붙잡기 까다롭다는 것을 알고 있다.창업자는 우리 회사가투자할 가치가 있다는 근거를제시할 수 있어야 한다.그래야 그것을 근거로 투자자에게설득을 이끌어 낼 수 있다.투자자가 인공지능이라던가 로봇이 아니다.사람이기에 타협을 할 수 있고,상상을 할 수 있다.그 소스를 스타트업이 제공해 주어야 한다.이 부분은내 개인적인 주관이고,개인적인 기준이다.우리가 잘 판단해야 할 것은1) 자금이 왜 필요한가2) 왜 투자여야 하는가3) 언제/얼마나 필요한가4) 우리가 줄 수 있는 것은 무엇이고, 어느 정도인가5) 투자를 받기 위해 무엇이 필요한가(우리는 투자를 받을 준비가 되어있는가)6) 투자자와의 약속을 어떻게/언제쯤 다 지킬 수 있는가최소한 위의 질문에 해답을 가지고 있어야 한다.그리고 내가 투자자라면,우리 회사에 선뜻 투자할 수 있을까 하는객관적인 판단이 들어야 한다.우리 회사는...투자자와 인연은 이어가지만몇 가지 물음에 대해 두리뭉실한 것이 있어좀 더 베이킹이 필요하다.(출처: 구글, 닭이 먼저냐 달걀이 먼저냐)매출과 투자의 관계는닭이 먼저냐, 달걀이 먼저냐 하는 문제일까?이러한 논리는 선택의 판단 근거가 없다.내가 생각하는 논리는닭을 늘려서 달걀 생산량을 늘릴 것이냐,달걀을 잘 부화시켜서 닭을 늘릴 것이냐이다.이것을 무엇을 판단하든 그 근거는팔릴 수 있는 좋은 달걀 또는 부화시키기 좋은 달걀이존재할 때 선택할 수 있다.좋은 달걀인지 보여줘야투자를 받을 수 있다.좋은 달걀인지 보여줘야사람들이 사려고 줄을 설 것이다.그래,힘든 길이다.정말 힘들고 고된 일이다.그놈의 좋은 달걀을 증명하는 게...말처럼 쉽지 않다.그래서 우리는 오늘도 좋은 달걀을만들어가는 중이다.#클린그린 #스타트업 #초기창업 #스타트업창업 #투자유치 #IR #조언
조회수 578

자신만 모르는 자신의 비밀

녹음된 자신의 목소리를 들어본 사람이라면 알 것이다. 얼마나 어색하고 때론 거북하기까지 한지 말이다.다른 사람의 목소리는 직접 듣는 것과 녹음된 목소리 사이에 큰 차이를 느끼지 못하는 걸 보면 내가 알고 있는 나와 다른이가 인식하는 나와의 간극이 있다는 것을 미루어 짐작 할 수 있다.당연히 목소리 뿐만이 아닐 것이다.심지어 취미로 운동을 배우더라도 내가 의도하며 취하는 나의 자세와 실제 나의 모습 사이에는 꽤 큰 차이가 존재하는 걸 경험한다. 이 차이를 받아들이지 않는다면 일정 수준 이상의 실력이 늘지 않는다. 그 차이를 인식하고 간격을 조정하는 과정이 실력을 늘리는 방법이다.다시 목소리로 가보자.아니 소리가 아니라 언어로 가보자.내가 얘기하는 말들이 남들에게도 그대로 들릴까?소리가 아니라 '의미' 말이다.자신이 말하는 의도가 남들에게도 동일한 의도로 읽혀질까?언어는 우리가 사회생활을 영위하기 위한 가장 기초 도구이기도 하지만, 가장 전문적이고 강력한 무기이기도 하다.업무로 다양한 사람을 만나면서 느끼는 점은 상대방의 전문성은 특정 기술이나 행위를 통해서가 아니라 그 영역을 어떻게 표현하고 묘사하느냐의 차이에서 느껴진다는 것이다. 누구든 10분 정도 이야기해보면 상대방의 내공과 실력을 가늠할 수 있다.거꾸로 이야기하면 자신이 던지는 말 한마디 한마디가 나를 판단하는 중요한 단서라는 것이고, 자신이 전달하려는 의도와 상대방이 인식하는 내용이 일치하지 않다면 이건 매우 곤란한 상황을 야기할 수 있다. 아주 미묘한 차이이지만 그 차이가 누적될 경우에는 인생 자체가 잘 풀리지 않게 된다.주변에 이런 동료가 있었다. 사람이 워낙 좋고 업무에서도 경험도 많은 친구였는데, 직급이 올라갈 수록 조직에서 인정을 받지 못하는 것이었다. 일을 직접 같이 하지 않았던 타 부서 동료였는데, 실제로 같이 일할 기회가 생겨서 업무로  엮이게 되면서 문제가 무엇인지 알 수 있었다.아는 것은 많은데 이걸 명료하게 표현하지 못하는 것이다. 말이 길어지고 꼬리에 꼬리를 물며 부연설명이 계속 되는 것이다. 본인은 친절하게 자세히 얘기하고 있다고 느끼겠지만 듣는 사람은 도무지 무슨 이야기인지 이해가 안되는 것이다.세상 일은 항상 복잡하고 얽혀있게 마련이다. 문제를 해결한다는 것은 복잡한 현상을 명료하게 구분하고 이걸 일 단위로 나누어서 처리하는 과정이다. 말이 꼬인다는 것은 생각이 복잡하다는 것이고, 문제를 정확히 정의하지 못하기 때문에 해결책도 효과적으로 찾아내기 어렵다. 이런 리더와 함께 일하면 삽질의 연속일 가능성이 높아진다.이런 경우 특히 어려운 점은 보고의 순간이다. 요점 정리가 안되고 핵심을 집어내지 못하기 때문에 의사결정자에게 올바른 리포팅이 어렵다.더 심각한 문제는 자신의 문제를 잘 인식하지 못한다는 것이다. 자신은 최선을 다하는데, 상대방이 알아주지 못한다고 생각한다. 나는 충분히 얘기하는데 상대가 이해하지 못한다고 치부한다. 자신의 꾀꼬리같은 목소리가 상대에게 두꺼비같이 들린다는 것을 받아들이지 않는 것이다.사실 남의 얘기가 아닐 것이다.여전히 말은 어려운 영역이다.왜 국어시간이 중요한지 요즘 다시 깨닫게 된다.말은 평생 공부해야 하는 분야인 것 같다.나도 깊이 반성해 본다.
조회수 3151

#인턴일기_어반베이스 첫 출근 그리고 한달

 안녕하세요, 어반베이스 인턴으로 1달째 거주(?)하고 있는 홍성민이라고 합니다.기웃기웃 어리둥절 보낸 시간이 벌써 한달이 되었네요. 누군가에겐 잔잔해 보였을 지 모르는 이 한달이 저에게는 가슴 쿵쾅, 의욕 충만했던 시간이었는데요.한 달간 어반베이스에 몸 담으며 겪었던 썰?을 풀어보려고 합니다 ㅎㅎ※ 주의 ※이 글은 나의 솔직한 인턴 생활과 솔직하게 쓴 후기가 찔려 정직한 말들이 앞뒤 구분없이 뒤섞여 있사오니, 이 점 양해 해 주시기 바라며(그래도) 모든 말들은 사실임을 밝힙니다.   (제가 누군지는 보여드려야 할 것 같아서... 쑥스럽지만 저의 사진 투척)#첫 출근첫 출근 길에 지옥철을 경험했어요...가끔씩 페이스북에서 직딩의 삶을 다룬 짤들을 보곤 했었는데 내 눈앞에 짤 속 모습들이 현실로 와있다니!지옥철을 뚫고 나와 역삼역 8번출구로 오면 된다고 하길래 8번 출구쪽으로 걸어가니 '아니 이게 왠 걸!' 8번출구랑 연결 되어있는 통로가 나왔어요 #역과_건물이_연결되어있다는#앞으로_비_맞을일없다 편리한 지하통로와 지옥철의 단(맛)쓴(맛)을 겪으며드디어 어반베이스 입성! #첫 사수입사하면 제일 궁금한 것이 ‘제 사수가 누구일까’(…) 였는데요.제 첫 사수는 CRO를 맡고 계신 강록님으로 키도 크시고 외모도 훈훈하신 데다가(시킨거 아님) 개그감이 넘치는 (아니아니) 개그욕심 넘치시는 분입니다 (아, 참고로 이곳은 모두 ‘님’으로 호칭합니다.)너무 바쁘셔서 대화를 많이 못하는 아쉬움을 느낄 때 즈음이면 (어찌 제 마음을 아시고) 미팅 끝내고 들어오시면서 저에게 음료수를 투척하시는 분이시죠 #나의존재 #아직살아있어 (강록님 모습, 살짝 의식하심)#스타트업저는 취업을 준비할 때부터 대기업보단 스타트업에서 일해보고 싶은 마음이 컸어요. 세상에 변화를 일으키는 일에 더 깊게, 그리고 그 일에 코어가 되어 일해보고 싶었거든요. 사실 스타트업만의 자유롭고 재미있는 분위기를 느껴보고 싶기도 했구요 ㅎㅎ어반베이스는 제가 상상했던 스타트업의 모습과 약 85% 정도 일치되는 모습이었어요.경력자이건 신입이건 모두의 역할이 있고 그 역할을 서로 존중하며서 협력하는 분위기에요. 무엇보다 좋은 건 업무시간과 여가생활을 스스로 조율하면서 출퇴근할 수 있는 플렉서블(Flexible) 근무제도를 시행하고 있답니다!*플렉서블 근무제도* 임직원 개인이 일일근무시간 자율 결정 (주 5일  40시간 근무, 일일 근무시간 최소 4시간에서 최대 12시간 사용 가능)#아침잠_많은_저에게는_엄청난_꿀복지 학교 생활할 때도 점심먹는 시간이 하이라이트였다면 직장 생활에서도 점심시간은 매우 소듕한 시간이에요. 어반베이스는 역삼역 1m 거리에 있는데요. 역삼역은 특히 맛집이 많아요. 맛집을 좋아하지만 맛집 알아보는 건 질색하는 저는 다행이도 이곳은 막내가 맛집 알아보는 문화가 아니라서 맛집을 많이 알고 계신 분 옆으로 쪼르르 따라다니며 점심을 즐기고 있습니다.#이게바로_귀차니즘_미식가의길   (특히 좋아하는 건 집밥 갬성의 백반집들)  #첫 업무제가 인턴으로 입사해서 맡은 첫 업무는 어반베이스 투자 유치를 위한 IR 자료를 서포트하고 분석하는 업무였어요. 이 업무를 통해 ‘어반베이스에 왜 투자했으며, 앞으로 왜 투자해야 하는가?’에 대한 답을 찾는 것이였죠.아시는 분들은 아시겠지만, 어반베이스는 사람들이 생활하는 모든 공간의 가치를 증강현실(AR)과 가상현실(VR)을 통해 보다 쉽게 그리고 재미있게 전달하기 위한 플랫폼을 개발하고 있는 회사에요.세계 최초 가상화 플랫폼을 구축하는 것이 이 어반베이스의 궁극적인 목표이기도 하구요.사실 사전 지식이 없으면 이해하는데 진입장벽이 높은 분야이긴 해요. 저도 처음엔 이해하는데 시간이 걸리긴 했지만 관심있게 자세히 들여다보니 4차산업혁명에 맞춰 세상이 변하고 있고 어반베이스 같이 기술을 선도하는 회사들이 변화를 움직이고 있는 것이 보이더라고요.  #4차산업혁명에_눈떴드아 #첫 발표 투자 유치를 위해 자료를 모으고 분석한 결과물을 C레벨 분들 앞에서 발표하기로 했습니다. 사실 투자 유치를 위한 메인 분석자료 라기보다는 베이스가 되는 자료들을 발표하기로 했죠. #쿵쾅쿵쾅 #심장아_나대지마제가 어느 정도 자료를 파악하고 공부하면서 눈에 들어온 것은 계신 분들이 자기 분야에서 업력을 오랫동안 쌓은 분이라는 점이었어요, 대부분의 모르는 문제는 모두 답변해주시고, 참고자료나 관련 정보도 많이 알려주셨어요!가장 기억에 남는 것은 영업을 총괄하는 이사님께 건축계 종사하는 대표님을 만나뵙고 인터뷰 할 수 있을까요? 라고 부탁을 드렸는데 1주일 안에 일정 잡아주시고 인터뷰를 하게 해주신 적이 있......  '인턴이 이런 부탁을 해도 들어주는 회사구나'란 생각에 회사를 매우 긍정적으로 보게 된 계기였답니다인턴도 회사를 평가할 수 있자나요? (..라고 쓰고 열심히 일한다)어느덧 시간이 흘러 발표하는 날 !  한 분 한 분의 의견을 모두 듣고 답변하니 30분 정도 시간이 흘렀는데, 제가 보았던 문제와 해결점의 범위를 훨씬 넘어서는 고민을 하고 계셨다는 걸 알 수 있었어요.CEO인 진우님이 영화에 비유해 말씀해 주셨는데, 원작보다 나은 후속작은 없는 것처럼 후속작과 신작 모두에 대한 이해가 필요한 시점이라고 하셨던 게 기억에 많이 남습니다.CTO이신 현우님의 이야기를 들으며 플랫폼의 정의를 더욱 넓게 볼 수 있는 계기가 되었구요,CMO이신 현주님의 이야기를 들으며 제가 봐야할 영역을 더 넓히고, 고민의 방향도 다양하게 보는 시간이 되었습니다. 경영진 분들의 다양한 시선과 고민, 앞으로의 방향에 대해 많은 것을 배운 시간이 되었다고 생각합니다.어떻게 보면 지난 한 달보다 더 많이 배운 30분이었던거 같아요. 저의 한달 인턴생활을 두서없이 막 써보았는데긴 글을 한줄로 요약하면, 어려운 학습 난이도를 극복하면서 많은 것을 배울 수 있는 회사라고 말하고 싶어요!현재 저는 사업계획서와 CS 채널에 대한 as-is 분석/to-be설계를 하고 있어요. 지난 한 달보다 더 회사를 알 수 있는 기회와 일을 주셔서 감사하게 생각하며 일하고 있습니다!  이 글이 어반베이스 인턴에 대해 궁금하신 모든 분들에게 도움이 되는 글이길 바라면서 ~이만 다시 일하러 갈게요 :)출처: https://blog.naver.com/urbanbaseinc
조회수 926

'넵'병을 심층탐구 해보았다(feat.아무말대잔치)

들어가기 전에 사과의 말을 먼저 드립니다.본문중에 독자분들에게 불편할 수 있는 비속어가 있었습니다. "넵! 네엡! 등을 쓰는 것이 명백한 병신같은 짓이다." 라는 구문이었는데, 저의 경솔한 단어선택으로 독자분들에게 불편과 불쾌함을 끼쳐드린 점 거듭 사과의 말씀을 드립니다. 지금은 해당부분을 삭제한 상태이나, 없었던 것처럼 몰래 지우는 것이 또한 오해를 살까하여 이렇게 먼저 말씀드리게 되었습니다. 해당 글을 삭제하고 사과문으로 대체하려고 하였습니다만 공유해주신 분들이 다수 있는 터라, 본문 컨텐츠는 유지한 채로 사과문을 서두에 첨가하게 된 점 양해부탁드립니다. 앞으로는 좀 더 신중하고 성숙한 태도로 좋은 컨텐츠를 보여드리도록 하겠습니다. 죄송합니다.직장인들 뿐 아니라 모든 '을'의 손가락에는 '넵'이 함께 하고있다.  '네'는 너무 단호하고 '넹'은 장난스러워 보이니 넵을 써야한단다. 이 무슨 소리인지 모르겠지만, 가만히 나의 카톡창을 보니 나 또한 넵의 굴레에서 벗어나지 못함을 발견하곤 소름이 두 번 돋고 말았다. 물린 적도 없고, 공기로 전염되는 것도 아닌데, 나는 왜 넵을 쓰고 있는가!? 사태의 심각성을 인식한 나는 어디서부터 유래했는지도 모르지만 모든 이의 대답을 '넵'으로 만든 넵병에 대해서 심층탐구해보기로 하였다.멀쩡한 대답인 '네' 를 놔두고 넵을 쓰고있는 이유를 분석해보니 3가지 정도로 압축이 되었다.1. 일단 우린 네/아니오로 대답해야하는 일들을 하고 있다. 지시받는 을의 입장이랄까..2. 사노비와 비슷한 입장이다보니, 예이~와 같은 고대로부터 내려온 을의 대답을 물려받게 되었다.3. 그것이 시대에 따라 변하면서 'ㅂ/ㅁ첨가'를 거쳐 친근함과 복종을 동시에 표현할 수 있는 '넵'으로 진화하였다.여기서 'ㅂ/ㅁ첨가' 법칙에 대해 알아보겠다. 물론 이건 내 맘대로 지어낸 개소리이다. 그러나 일리가 있는 것 같으니 들어보도록 하자. 다음의 예문을 보자.1. 사랑해2. 사랑햄1. 안녕하세요2. 안녕하세욤1. 그렇구나!2. 그렇구납!보통 2번문장처럼 ㅁ/ㅂ첨가가 이루어지면 입을 꾹 다문 상태로 문장이 끝나게 된다. 아래와 같은 표정이 되는 것이다. 엄맘물론 위 사진은 귀여운 아기이니 귀여운 것이다. 당신이 한다고 귀여워지리란 보장은 없지만, 어쨋든 입을 꾹 다물게 되면 볼살이 뿌우하게 부풀어 오르면서 귀여워보이려는 안간힘을 어필할 수 있다. 그러니까 이 ㅁ/ㅂ첨가는 발음상에 볼살크리티컬을 유도하면서 귀요미를 시전할 수 있는 방법인 것이다. 인간이 귀여운 것을 좋아하는 이유는 일단 귀엽기 때문이고(뭐라?), 매우 약하고 오물오물거려 보이기 때문에 1도 위협을 느끼지 않기 때문이기도 하다. 힘의 우위를 느낄 수도 있기 때문에 귀여운 것을 보고 있을 때는 무의식적으로 굉장히 우월해지는 느낌이다. 이것을 반대로 해석해보면 귀여워 보이려고 하는 행동은 '나는 당신에게 1도 위협을 주지 못하는 랫서팬더같은 존재입니다.' 라는 메시지를 주는 것과 같다. 물론 사람에 따라서 그런 귀요미의 시전이 오히려 위협처럼 느껴지는 사람도 있을 수 있다.귀요미의 시전의 잘못된 예이러한 이유로 우리는 '귀여움'과 '복종'의 의미를 담은 ㅁ/ㅂ첨가를 적용해 '네'를 '넴 or 넵' 으로 변형하여 사용하고 있는 것이다. 개서글픈 일이 아닐 수 없다. 웃통까고 배만 안보여줬지 완전 이건 턱 긁히는 수준과 비슷하잖아.이렇게 시전된 넵은 다양한 문장부호나 수식어와 결합하면서 함축적인 의미를 포함하게 된다. 다음을 통해서 넵의 사용법과 다양한 의미에 대한 정의를 내려보도록 하자.서로 넵을 쓰고있는 경우1. 넵: 그저 일반적인 경우이다. 상황에 따라서는 무관심해보일 수 있다. 일반적으로 동료나 가까운 팀장정도급과의 소통에 쓰이는 넵이다. 담백하고 깔끔한 맛이 있으며, 친분이 있으나 위아래가 존재하는 경우에 주로 쓰인다.2. 넵!: 팀장 이상의 차장, 부장 또는 중요한 클라이언트 등에 쓰이는 넵이다. '느낌표'는 충성/단결/필승과 같은 경례구호의 느낌을 주는데, 나는 당신의 말을 아주 감도5상태로 무사히 입감하였다는 느낌을 준다.3. 네엡: 보통 이것은 넵, 넵, 네엡 순서로 쓰인다. 넵만 계속하면 이상하므로 한 번 정도는 길게 빼주어 강약중강약의 리듬감을 살려주는 느낌이다. 3개의 음소로 이루어진 '넵'과 달리 5개의 음소를 쳐야하므로 거의 2배가까운 노력과 정성이 들어가는 작업이다.4. 넵~: 3번의 네엡을 기호로 표현한 예이다. 쉬워 보이지만, 무려 특수기호를 누르고 물결을 찾아야 하므로 네엡과 동일한 정성이 들어간다고 할 수 있다.5. 네?: 싸우자는 거다.6. 네!: 넵병에 전염되지 않은 사회초년생임을 알 수 있다. 하지만 느낌표를 붙임으로써 그 예를 다했다. 무난한 방어전략이라고 할 수 있다.7. 넵.: 점의 갯수에 따라 크게 의미의 차이가 있다. '넵.'은 단호함을 보여주는 것으로써 나는 반드시 이 일을 해내고야 말겠다는 필승의 의지를 표현한다.8. 넵..: 두 개가 되었을 땐 조금 얘기가 달라진다. 뭔가 잘못한 것이 있거나, 또는 하기 싫은 일에 휘말렸다는 느낌을 어필한다. 보통 5,000만원 이상의 프로젝트를 맡아야 하거나 또는 연차가 반려되었다는 통보, 보고서를 다시 써오라는 등의 지시에서 주로 나오는 반응이다.9. 넵...: 점이 세 개인 경우는 매우 어려운 경우이다. 점점점을 일일이 쳐야하는 수고로움을 감수하면서도 유감의 뉘앙스를 드러낼 정도로 중대한 사안인 것이다. 1억 이상의 프로젝트나, 대체휴무일에 출근을 해야하거나, 남자친구와 1주년인데 야근을 해야하는 등의 심리적 타격이 50%이상 되는 강력한 데미지에 대한 리액션이다.10. 넵....: 점이 네 개 이상부터는 그냥 '시발 넌 사람도 아니다.' 라는 뉘앙스가 담겨져있다. 점 4개는 모스부호로 H를 뜻한다. 한글로는 'ㅜ' 를 뜻한다. 그러니까 합쳐보면 '후우.....' 정도가 될 것이다. 겨우 참고있단 뜻이다.11. 넵?: 5번의 싸우자는 의미와 비슷하지만 조금 순화되어 있는 물음이다. 다시 한번 말해보세요. 라는 느낌인데, 아직까진 너의 반응을 지켜본 뒤 죽탱이를 날려주겠다..라는 관대한 관용의 정신이 살아숨쉬는 단계이다.12. 넵ㅋ: 드디어 ㅋ가 나왔다. 뭔가 지시를 하면서 좀 애원한 케이스이다. "미안한데, 이것 좀 내일까지 보내 줄 수 있어?" 등의 지시가 나왔을 때, 뭐 귀찮긴 하지만 이 정도는 그냥 해줄 수 있다. 라는 너그러운 이타심의 표현이다.13. 넵ㅋㅋ: 지시자가 뭔가 아재개그 및 다양한 농담을 던졌을 경우이다. "이거 해주는 사람은 킹왕짱 나의 구세주야." 라는 6년전 유행어들이 동반된 경우랄까. 보통 저 ㅋㅋ는 무표정으로 치게 된다.14. 넵ㅋㅋㅋ: ㅋ가 3개가 되었을 때는 무려 지판을 6번이나 눌러야 하는데, 이 경우는 모두가 ㅋㅋㅋ 를 하고 있는 환경일 경우가 크다. 그러니까, 다들 웃는 분위기라면 나도 3개정도는 쳐줘야 하지 않을까 싶은 것이다.15. 넵ㅋㅋㅋㅋㅋㄱㅋㅋㄱㅋㄱㅋㅋ: 짤이 동반된 경우다. 근데 그 짤이 굉장히 웃겨서 현웃이 터진 경우다 가끔, '네ㅂㅋㅋㅋㅋㄱㅋㄱㅋ' 로 표현되기도 한다. ㅋ사이에 ㄱ이 섞여있는 경우가 많다. 또는 ㄱ이 현저하게 많은 경우를 현웃으로 간주할 수 있다.16. 넵ㅎ: 탐탁지 않은 경우다. ㅋ는 좀 경박해 보인다. 그래서 ㅎ를 쓴 것이다. 하지만 ㅋ에서 ㅎ로 넘어가는 것은 그 관계의 서먹함을 의미하기도 한다.17. 넵ㅎㅎ: 13번과 같이 ㅋㅋ와 비슷한 느낌이지만, 조금 진중한 느낌을 준다. 평소에 조용한 직원분들이 자주 사용하는 제스쳐이다.18. 넵 :): 저 웃음은 공식적인 웃음이다. 그냥 끝내기는 뭐하고 ^^를 쓰자니 아재같고, ㅋ나 ㅎ를 쓰긴 싫으나 너와 원만한 관계를 유지하고 싶을 때 쓰는 공적인 관계의 웃음을 뜻한다. 그러니 호감으로 착각하지 말자.19. 넵^^: 좀 더 더 공식적인 관계이다. 예를 들면 후원사와 주관사정도? 또는 협력업체나 외부업체와의 메일에 주로 쓰인다. 평소에 자주 왕래가 없었거나 말조심을 해야하는 경우 ㅋ나 ㅎ보다 ^^등을 통해서 나는 당신을 공격하지 않는다라는 것을 어필하는데, 자칫 아재로 비칠 수 있으니 조심해야 한다.20. 넵~~~: 알았으니 그만하란 얘기다.21. 넵!!!: 벌써 몇 번을 얘기하느냐? 란 뜻과 같다.22. 넵ㅜ: 점점점과 비슷하지만, 적극적인 부정의 표시이다. 또는 지시된 업무의 종류가 내가 이미 싫다고 어필한 것일 경우가 많다. 특이한 경우로 팀장이 "내가 아파서..이걸 처리 못하게 되었는데..." 등의 슬픈 사연을 통한 신파적 업무지시를 했을 경우 "그래 당신이 아프군요 저런..ㅠㅠ" 이라는 의미로 쓰이기도 한다. 물론 진짜 슬프지는 않을 것이다.23. 넵ㅜㅜ: 진짜 하기 싫은 것이거나 팀장이 장염에 걸렸다고 했을 경우이다.24. 넵ㅠ: 이것은 개인차가 있다. ㅜ와 ㅠ는 눈물의 정도가 다르긴 하지만, 어차피 무표정으로 치는 거라 별 의미는 없다.24. 네뷰: 넵ㅠ를 빨리 치면 이렇게 되는데, 보통 지시자가 사정이 있는 경우에 해당하는데 별 관심없을 때 무성의하게 치는 경우이다. 그러나 네뷰를 시전한 후엔 바로 정정해서 넵ㅠ를 두번 적어주기도 한다.25. 넵넵/네넵: 네넵과 넵넵은 비슷한 효력이 있다. 네엡과 같이 넵을 여러번 썼을 때 또는 대화의 마무리에 주로 쓰인다. 보통 이것은 네넵 수고하세요! , 넵넵! 등으로 응용되서 쓰이는 것이 보통이다.26. 넵;;;: 땀이 등장했다. 넵과 땀의 결합은 이건 뭔 개소리임? 이라는 뜻인데 별 말 같지도 않은 지시를 내렸을 때의 리액션이다. 또는 지시자도 윗사람에게 개소리를 듣고 그것을 전달하는 경우이다. 보통 후자의 경우엔 헐..넵;; 이라는 응용어구로 많이 사용된다.27. 넵+_+: 특이한 케이스인데, 쓰는 사람만 쓰는 감정표현이다. 뭔가 자신에게 이득이 되는 경우이다. 이번 연차는 너가 먼저 쓰도록 해. 라는 등의 행복한 지시일 경우 성은이 망극한 심리를 드러낸다.28. 넵 ㅇㅅㅇ: 응슷응을 쓰는 것은 여러가지 의미가 있지만, 주로 "흠..." 의 뜻에 가깝다. 하긴 하는데 내가 좋아서 해주는 건 아니다? 라는 것의 간접적 표현과 같다.29. 네네네넵: 이것은 급한 경우이다. 진짜로 급하다기 보단 급해보이는 리액션이다. 꼭 오늘중으로 처리해주셔야 해요!!! 라는 지시가 왔으니 나도 함께 다급하게 대답해보자! 라는 심산이다. 그래서 네네넵 또는 네네네넵을 시전해주는 것이다.30. 넨ㅁ: 쓰다가 지쳤다.이상으로 다양한 넵의 쓰임새와 의미에 대한 심층탐구를 해보았다. 이게 뭔 헛짓거리인지 모르겠다. 그냥 다 집어쳐버리면 안되는건가? 제기랄.에효..제기럴막간코너 끝.
조회수 1694

Docker, NodeJS, Nginx! 너로 정했다!

편집자 주아래와 같이 용어를 표기하기로 저자와 협의함Docker, NodeJS, NginxOverview안녕하세요. 칼 같은 들여쓰기에 희열을 느끼는 브랜디 개발자 강원우입니다! 서버를 운영해본 개발자라면 Fatal 에러, 아웃오브메모리 에러, 또는 전날 흡수한 알코올로 인해 손을 떨다가 한 번쯤 서버를 요단강 너머로 보내봤을 겁니다. 만약 테스트 서버였다면 잠시 마음을 가다듬으면 되지만, 현재 상용 서비스 중인 서버라면 얘기는 달라집니다.님아, 그 강을 건너지 마오!이런 간담이 서늘해지는 경험은 저 하나로 족합니다. 그래서 고군분투했던 지난 날을 되돌아보면서 빠르고 안정적이며, 죽어도 죽지 않는 좀비 같은 서버 구축 방법을 쓰려고 합니다.준비물서비스를 운영할 때 가장 중요하게 여겨야 하는 건 역시 안정성입니다. 이번 글에서는 오래 전부터 개발 세계의 뜨거운 감자였던 Docker와, 단일 스레드와 이벤트 루프로 태생적으로 심플하고 민첩한 NodeJS, 마지막으로 고성능을 목표로 개발된 Nginx를 활용하겠습니다.1. DockerDocker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 대표적으로 LXC(Linux Container)가 있습니다. 화물 컨테이너처럼 어떠한 일련의 기능을 완전히 격리된 소프트웨어 환경에서 작동하게 만드는 기술을 말합니다.OS 가상화와 별반 다를 게 없는 것 같지만 소프트웨어적으로 작동한다는 차이가 있습니다. 다시 말해, 현재 OS의 자원을 그대로 사용하기 때문에 하이퍼 바이저가 가상환경을 위해 가상의 커널을 만드는 오버헤드가 거의 없다는 것이죠.이미지와 속도도 차이를 보입니다. 완벽하게 구성한 세팅을 그대로 이미지화할 수 있고, 해당 이미지는 Docker 위에서 완벽히 동일하게 동작하는 걸 보장합니다. 해당 이미지로 컨테이너를 제작할 땐 1~2초면 새로운 컨테이너가 생겨날 정도로 엄청나게 빠른 속도도 자랑합니다. 1)또한 Docker는 자주 사용되는 다양한 이미지를 퍼블릭 레포지토리에 공유해 사용할 수 있기도 합니다. 양파도 아닌데 특징이 계속 나오죠? 다음 글에서 Docker의 특징을 더 자세히 다루겠습니다.Docker는 리눅스만 지원했었지만, 요즘은 Docker for Windows와 Docker for Mac으로 거의 모든 OS에서 사용할 수 있습니다. 2) Docker 설치 링크는 윈도우와 맥으로 나뉘어져 있습니다. 리눅스는 아래를 참고하세요.curl -fsSL https://get.docker.com/ | sudo sh 2. NodeJSNodeJS는 구글이 구글 크롬에 사용하려고 제작한 V8 오픈소스 자바스크립트 엔진을 기반으로 제작된 자바스크립트 런타임입니다. NodeJS에는 몇 가지 특징이 있습니다.단일 스레드입니다.비동기 방식입니다.이벤트 루프를 사용합니다NPM이라는 끝내주는 동반자가 있습니다.비유하자면 예전엔 낡은 곡괭이로 큰 돌을 캐내려고 수십 명의 인부가 달라 붙었는데, 지금은 육중한 포크래인으로 거대한 돌을 쑥! 뽑아버리는 것과 비슷합니다. 굉장히 효율적이죠. NodeJS는 단일 스레드의 장점을 극대화하려고 이벤트 루프를 통해 모든 처리를 비동기로 수행합니다. 서버 사이드의 묵직한 CPU들이 빠르게 일을 처리하고 이벤트 루프에 등록된 일을 감지해 다음 작업을 빠르게 수행하는 방식입니다.마지막으로 NPM(Node Package Manager)은 NodeJS에서 사용할 수 있는 다양한 모듈을 관리해주는 프로그램입니다. 도커와 상당히 유사합니다. NodeJS에서는 무언가 기능을 만들기 전에 NPM을 먼저 뒤져보라는 말이 있을 정도로 풍부한 모듈 생태계가 구성되어 있습니다. 이는 로깅이나 날짜 계산 등 생각보다 까다로운 것들을 가져다 사용할 수 있게 도와주기 때문에 개발이 빨라집니다. NodeJS 설치링크는 여기를 클릭하세요. 이 글의 예제에서는 NodeJS의 현재시점 LTS인 codename Carbon버젼을 사용합니다!8.x 버젼이 Active LTS 상태입니다.LTS은 Long Term Support의 약자로 가장 오랜기간 지원하는 버전입니다.우선 서비스 구성을 위해 간단한 NodeJS 어플리케이션을 작성해보겠습니다.첫째, packge.json를 작성합시다.{   "name": "nodejs_tutorial_server",   "version": "0.0.0",  "private": true,   "scripts": {     "start": "node nodejs_tutorial_server.js"   },   "description": "NodeJS Tutorial Server",   "author": {     "name": "WonwooKang"   },   "dependencies": {     "express": "^4.16.3",     "uuid": "^3.2.1"   } } nodejs_tutorial_server.js 파일을 메인으로 실행합니다. HTTP Request를 처리하려면 express를 사용해야 하며, 서버를 구분하려면 uuid모듈이 필요합니다.둘째, package.json의 의존 파일들을 설치합시다.npm install npm install 전npm install 후셋째, 간단한 웹 어플리케이션을 작성합시다.var express = require('express'); var app = express(); const port = 3000;  var server = app.listen(port, function () {     console.log("Express server has started on port : "+port);  });  app.get('/', function (req, res) {     res.send('Hello?');  }); 넷째, package.json의 script start 구문을 실행하여 서버를 로드합시다.npm start 3000번 포트로 서버가 시작되었습니다!접속해볼까요?잘 접속됩니다.그런데 수정할 때마다 서버를 매번 다시 띄우면 귀찮을 겁니다. 이럴 땐 nodemon 모듈을 사용합시다. nodemon은 Nodejs의 파일이 수정되는 걸 감지해 자동으로 리로드해주는 편리한 도구입니다.nodemon설치npm install nodemon -g package.json script 변경"scripts": {     "start": "nodemon nodejs_tutorial_server.js"   }, nodemon 실행확인을 위해 약갼의 수정//nodejs_tutorial_server.js 수정 app.get('/', function(req, res) {     res.send('Hello Nodemon');  }); nodemon을 통해 어플리케이션이 실행된 모습파일수정 후 저장했을 때 자동 감지한 모습서버 잘 떴습니다!성공적으로 단 하나의 GET 요청을 처리할 수 있는 심플한 NodeJS 기반 웹 어플리케이션을 완성했습니다. 이제 웹 어플리케이션을 Docker Container위에서 구동해봅시다!3. Docker로 NodeJS Express 서버 구동하기이제 Docker Container위에서 NodeJS서버를 구동할 건데요. 그러려면 우선 Dockerfile을 작성해야 합니다. 물론 Docker의 이미지를 당겨 받고, 컨테이너를 생성하고, 또 컨테이너를 실행해서 Attach하고, 필요한 파일들을 밀어넣는 등 귀찮은 방법도 있습니다. 하지만 개발자에게 이것은 힘든 작업이므로 Dockerfile을 적극 활용합시다. (Dockerfile의 D는 대문자여야 합니다! 꼭이요)Node 도커 이미지에 어플리케이션 파일을 추가해 실행하는 Dockerfile 작성하기FROM node:carbon MAINTAINER Wonwoo Kang [email protected] #app 폴더 만들기 - NodeJS 어플리케이션 폴더 RUN mkdir -p /app #winston 등을 사용할떄엔 log 폴더도 생성 #어플리케이션 폴더를 Workdir로 지정 - 서버가동용 WORKDIR /app #서버 파일 복사 ADD [어플리케이션파일 위치] [컨테이너내부의 어플리케이션 파일위치] #저는 Dockerfile과 서버파일이 같은위치에 있어서 ./입니다 ADD ./ /app #패키지파일들 받기 RUN npm install #배포버젼으로 설정 - 이 설정으로 환경을 나눌 수 있습니다. ENV NODE_ENV=production #서버실행 CMD node nodejs_tutorial_server.js Dockerfile 내용은 node:carbon에서 :carbon이 NodeJS의 이미지 버전 Tag 입니다.Dockerfile을 통해 docker image 빌드하기docker build –tag 레포지토리명: 태그 Dockerfile 경로docker build --tag node_server:0.0.1 [Dockerfile이 위치하는 경로] 호오... 게이지가 마구마구 차오르는군요?build가 완료된 화면입니다. Dockerfile의 내용 순서가 각 Step별로 진행된 것을 알 수 있습니다.빌드 결과 생성된 이미지 확인하기docker images 빌드 명령어에서 입력했던 버전 태그까지 잘 입력된 것을 알 수 있습니다.NodeJS Carbon 이미지를 기반으로 한 node_server 이미지를 제작했습니다. 사이즈는 둘이 합쳐 1Gb가 넘을 것 같지만 실제로는 변경된 부분만 저장됩니다. 그러므로 node_server 이미지의 크기는 6~10Mb 정도입니다.생성된 이미지로 컨테이너 만들기컨테이너 생성 명령어는 아래와 같습니다.docker create --name [서버명] -p [외부 포트:컨테이너 내부포트] [이미지명:버전태그] 주의할 점이 있습니다. 포트번호 바인딩 중 왼쪽은 우리가 접속할 실제 포트이고, 오른쪽은 컨테이너 내부의 NodeJS서버 할당 포트가 된다는 것입니다. 공유기의 포트포워딩 설정과 같습니다.docker create --name NODE_SERVER_0 -p 3000:3000 node_server:0.0.1 알 수 없는 코드가 생성되었습니다. 응?컨테이너 확인하기생성한 컨테이너를 확인해볼까요?docker ps 어.. 없잖아?옵션을 추가합니다.docker ps -a 나타났다!docker ps 명령어는 현재 실행 중(STATUS:Up)인 컨테이너의 목록을 보여줍니다. -a 옵션은 실행하지 않는 모든 컨테이너를 보여줍니다. 위의 이미지에서 node_server:0.0.1이미지로부터 NODE_SERVER_0 이라는 이름으로 2분 전에 생성되었다는 걸 알 수 있습니다. 3)컨테이너 실행하기docker start NODE_SERVER_0 다시 확인하기docker ps 19초 전에 Up상태가 되었다는 걸 알 수 있다.외부 3000번 포트 -> 내부 3000번 포트로 연결되었습니다. 서버도 실행되었고요! 이제 접속해볼까요?내용도 안 바꾸고 새로고침도 빨라서 뜬 건지 잘 모르겠군요. 내용을 수정해서 다시 확인하겠습니다.//nodejs_tutorial_server.js 수정 app.get('/', function (req, res) {     res.send('Hello I\'m In Docker Container Now!');  }); 파일 변경해서 다시 확인하기//버전 태그도 0.0.2로 업해주고 docker build --tag node_server:0.0.2 [Dockerfile위치] 잘 생성되었습니다.//이미지가 잘 생성되었는지 확인하고 docker images 0.0.2가 나타났습니다.//기존 컨테이너를 삭제합니다. -f 옵션은 실행중인 컨테이너도 강제로 삭제하겠다는 뜻입니다.  docker rm -f NODE_SERVER_0 // 잘지워졌나 확인하고  docker ps -a 잘 지워집니다.//0.0.2 버젼 이미지로 컨테이너를 다시 생성합니다.  docker create --name NODE_SERVER_0 -p 3000:3000 node_server:0.0.2   //서버를 실행합니다. docker start NODE_SERVER_0 잘 실행됩니다.이제 다시 접속해봅시다.안녕! 나 지금 Docker 안에 있어!이제 Docker로 여러 개의 서버를 띄우겠습니다. NodeJS는 싱글 스레드이기 때문에 하나의 CPU를 여럿이 나눠 갖는 건 비효율적입니다. 따라서 CPU 숫자에 맞춰서 서버를 띄워보겠습니다.제 맥북엔 CPU가 4개뿐입니다.CPU수에 맞춰 추가로 생성하기추가로 컨테이너를 생성하고, 서버를 실행합니다. 서버 목록도 확인해야겠죠.서버 생성서버 실행서버 목록 확인포트번호는 같은 포트를 쓸 수 없기 때문에 3001, 3002, 3003으로 매핑합니다. 브라우저로 접속해서 확인해보겠습니다.각 포트별 접속 화면미리 만들어둔 이미지 덕분에 서버 3대를 띄우는 데에 5분도 안 걸렸습니다. 하지만 Docker 서버를 여러 개 띄워도 결국 사람의 손이 닿아야 합니다. 따라서 이번에는 NodeJS의 Cluster를 활용해 적은 수의 Docker Container를 이용하면서도 다수의 CPU를 사용하겠습니다. 또 죽은 워커를 다시 살려 서버가 다운되는 것을 막아 안정적인 서비스도 구축해보겠습니다.4. 멀티코어대응 NodeJS Cluster 구성2컨테이너용 NodeJS Cluster서버 어플리케이션 작성하기var cluster = require('cluster'); var os = require('os'); var uuid = require('uuid'); const port = 3000; //키생성 - 서버 확인용 var instance_id = uuid.v4();  /**  * 워커 생성  */ var cpuCount = os.cpus().length; //CPU 수 var workerCount = cpuCount/2; //2개의 컨테이너에 돌릴 예정 CPU수 / 2  //마스터일 경우 if (cluster.isMaster) {     console.log('서버 ID : '+instance_id);     console.log('서버 CPU 수 : ' + cpuCount);     console.log('생성할 워커 수 : ' + workerCount);     console.log(workerCount + '개의 워커가 생성됩니다\n');        //CPU 수 만큼 워커 생성     for (var i = 0; i < workerCount>         console.log("워커 생성 [" + (i + 1) + "/" + workerCount + "]");         var worker = cluster.fork();     }        //워커가 online상태가 되었을때     cluster.on('online', function(worker) {         console.log('워커 온라인 - 워커 ID : [' + worker.process.pid + ']');     });        //워커가 죽었을 경우 다시 살림     cluster.on('exit', function(worker) {         console.log('워커 사망 - 사망한 워커 ID : [' + worker.process.pid + ']');         console.log('다른 워커를 생성합니다.');                 var worker = cluster.fork();     });  //워커일 경우 } else if(cluster.isWorker) {     var express = require('express');     var app = express();     var worker_id = cluster.worker.id;         var server = app.listen(port, function () {         console.log("Express 서버가 " + server.address().port + "번 포트에서 Listen중입니다.");     });        app.get('/', function (req, res) {         res.send('안녕하세요 저는 워커 ['+ cluster.worker.id+'] 입니다.');     });  } CPU 숫자를 받아 CPU 수(4)를 컨테이너 수(2) 로 나눠 워커를 생성하는 NodeJS 클러스터 구성입니다. 이렇게만 해도 운영에는 무리가 없지만 컨테이너 2개의 구분이 안 되서 확인할 수가 없습니다.그러므로 마스터와 워커의 통신을 이용해 마스터의 uuid를 얻겠습니다. (워커와 마스터 간의 데이터 이동은 통신 말고는 메모리DB 등의 데이터 저장소밖에 없습니다)마스터의 아이디를 알아오는 로직이 추가된 어플리케이션 작성var cluster = require('cluster'); var os = require('os'); var uuid = require('uuid'); const port = 3000; //키생성 - 서버 확인용 var instance_id = uuid.v4();  /**  * 워커 생성  */ var cpuCount = os.cpus().length; //CPU 수 var workerCount = cpuCount/2; //2개의 컨테이너에 돌릴 예정 CPU수 / 2  //마스터일 경우 if (cluster.isMaster) {     console.log('서버 ID : '+instance_id);     console.log('서버 CPU 수 : ' + cpuCount);     console.log('생성할 워커 수 : ' + workerCount);     console.log(workerCount + '개의 워커가 생성됩니다\n');         //워커 메시지 리스너     var workerMsgListener = function(msg){                    var worker_id = msg.worker_id;             //마스터 아이디 요청             if (msg.cmd === 'MASTER_ID') {                 cluster.workers[worker_id].send({cmd:'MASTER_ID',master_id: instance_id});            }      }        //CPU 수 만큼 워커 생성     for (var i = 0; i < workerCount>         console.log("워커 생성 [" + (i + 1) + "/" + workerCount + "]");         var worker = cluster.fork();                //워커의 요청메시지 리스너         worker.on('message', workerMsgListener);     }        //워커가 online상태가 되었을때     cluster.on('online', function(worker) {         console.log('워커 온라인 - 워커 ID : [' + worker.process.pid + ']');     });        //워커가 죽었을 경우 다시 살림     cluster.on('exit', function(worker) {         console.log('워커 사망 - 사망한 워커 ID : [' + worker.process.pid + ']');         console.log('다른 워커를 생성합니다.');                 var worker = cluster.fork();         //워커의 요청메시지 리스너         worker.on('message', workerMsgListener);     });  //워커일 경우 } else if(cluster.isWorker) {     var express = require('express');     var app = express();     var worker_id = cluster.worker.id;     var master_id;        var server = app.listen(port, function () {        console.log("Express 서버가 " + server.address().port + "번 포트에서 Listen중입니다.");     });        //마스터에게 master_id 요청     process.send({worker_id: worker_id, cmd:'MASTER_ID'});     process.on('message', function (msg){         if (msg.cmd === 'MASTER_ID') {             master_id = msg.master_id;         }     });        app.get('/', function (req, res) {         res.send('안녕하세요 저는 ['+master_id+']서버의 워커 ['+ cluster.worker.id+'] 입니다.');    });  } Docker Container에 올리기 전 로컬 테스트를 먼저 진행합니다. 서버 구동!두 개의 워커가 실행되었습니다.똑같은 localhost:3000번 접속이지만 워커의 번호가 다릅니다.이제 워커로 CPU 수만큼 워커를 생성할 수 있게 되었습니다. 이제 워커가 어떻게 안정적으로 서비스되는지 테스트하겠습니다. 워커 킬링 테스트하기워커 킬러 로직 작성//워커 킬링 테스트     app.get("/workerKiller", function (req, res) {         cluster.worker.kill();         res.send('워커킬러 호출됨');     }); 실험에 앞서 똑같은 상황 재연 마스터 아이디를 유심히 봐주세요. 워커 킬러를 실행하겠습니다.워커 킬러 호출아래는 호출된 결과입니다. 하나의 워커가 죽자마자 곧장 다른 워커가 태어나(?) 3000번을 Listen하기 시작했습니다. 워커 킬러가 호출된 화면이제 워커 킬러를 여러 번 호출해보겠습니다. CMD+R을 꾸욱 눌러 연속으로 킬링해봤는데 아래 화면처럼 바로 살아납니다.접속해서 현재 워커를 확인합니다.위의 화면처럼 마스터의 UUID가 그대로인데 워커만 교체되었습니다. 준비는 끝났습니다. 이제 Docker를 이용해 2명의 워커를 가진 2개의 NodeJS서버를 실행하고, 4개의 귀여운 CPU를 불살라봅시다! 5. Docker로 NodeJS Cluster 서버 실행하기docker build --tag node_server:0.0.3 /Users/kww/eclipse-workspace/nodejs-for-article docker create --name NODE_SERVER_0 -p 3000:3000 node_server:0.0.3 docker create --name NODE_SERVER_1 -p 3001:3000 node_server:0.0.3 docker start NODE_SERVER_0 docker start NODE_SERVER_1 cluster가 적용된 2개의 컨테이너 start0.0.3번 이미지로 생성된 2개의 컨테이너 서버가 무사히 로드되었습니다. 이제 접속해서 확인해볼까요?cluster가 적용된 2컨테이너 4서버 구동화면WOW! 2개의 URL, 2개의 UUID, 각 2명의 워커까지. 완벽한 2.2.2입니다. 마치 홍진호를 보는 듯한 서버 현황입니다. 이제 워커 킬러로 습격해보겠습니다.워커 킬러 습격 후위의 이미지를 보면 3000번 포트서버에서 13명, 3001번 포트서버에서 22명의 워커가 사망했습니다. UUID를 통해 2개의 서버에서 일정량의 워커가 매우 안정적으로 서버를 지키고 있는 걸 알 수 있었습니다.지금까지 2개의 컨테이너로 4개의 서버를 구성해보았습니다. CPU 숫자와 나눠지는 수에 따라 컨테이너의 수, NodeJS 클러스터 서버의 수를 유동적으로 조정할 수 있습니다. 전에 운영하던 API서버는 16코어 서버였고, 로드벨런서 및 기타 작업용 1코어의 여분을 남기고 15코어 / 3 으로 5개의 워커를 가진 3개의 NodeJS서버를 도커 컨테이너로 운영했었습니다.여기서 문제점이 생깁니다. 우리는 어떤 서비스를 할 때 하나의 도메인을 쓰는데 포트번호가 2개죠? 어떻게 해야 할까요. 여기서 바로 한참을 기다렸던 불곰국의 Nginx가 등장합니다.6. Nginx로 로드밸런싱 하기Nginx은 “더 적은 자원으로 더 빠르게”를 지향합니다. 러시아의 이고르 시쇼브(Игорь Сысоев)는 Apache에서 10,000개의 접속을 동시에 다루기 힘든 걸 해결하려고 Nginx를 개발합니다.Nginx는 NodeJS와 유사하게 싱글 스레드 방식에 이벤트 드리븐 구조 사용하는 오픈소스 HTTP서버로 최근 아파치의 점유율을 상당히 뺏고 있는 서버입니다. 다운로드 링크를 아래에 써두었습니다.Nginx 설치WindowNginx 다운로드Macbrew install nginx Linuxapt-get install nginx or yum install nginx Nginx 설치 성공Nginx 기본 접속 화면서버 조작방법서버 시작 : nginx 서버 중지 : nginx -s stop 서버 재시작 : nginx -r reload (맥에선 이건 안되는듯?) 기본 설정은 8080포트로 되어있습니다. 원하는 포트르 로드벨런싱 설정을 해보겠습니다. Nginx 로드밸런싱 설정아래는 Nginx의 로드밸런싱입니다.#http블럭 내부에 추가     #NodeJS 서버 로드밸런싱     upstream nodejs_server {         #least_conn;         #ip_hash;         server localhost:3000 weight=10 max_fails=3 fail_timeout=10s;         server localhost:3001 weight=10 max_fails=3 fail_timeout=10s;     }        #3333번 포트 NodeJS 서버로 연결     server{         listen               3333;         server_name  localhost;                location / {             proxy_pass http://nodejs_server;         }     } 로드밸런싱이 잘 적용되었는지 확인해보겠습니다. 로드밸런싱 적용 이후모든 브라우저에서 3333번으로 접속했는데 서로 다른 2개의 서버가 번갈아 접속되고, 워커가 가끔 바뀌는 걸 확인할 수 있습니다. 이번엔 로드밸런서로 워커 킬러를 호출하겠습니다.로드밸런싱 포트인 3333번 포트로 여러 번 호출결과 확인Nginx 로드밸런서가 확실하게 작동하는 걸 확인할 수 있었습니다. 위의 이미지에서 서버가 자꾸 바뀌는 모습을 볼 수 있는데, 이는 세션이 유지되지 않기 때문입니다. 실제 서비스에서는 세션의 유지를 위해 ip_hash 옵션이 꼭 필요합니다.ip_hash : 동일한 IP의 접속은 같은 서버로 접속하도록 하는 옵션입니다.  least_conn : 가장 접속이 적은 서버로 접속을 유도하는 옵션으로 ip_hash와 같이쓰입니다. Conclusion자, 고생하셨습니다. 여기까지 Docker와 NodeJS, Nginx를 이용해 관리하기 쉽고, 일부러 죽여도 죽지 않는 안정적인 서비스 환경을 구축해봤습니다. 한 가지 주의할 점이 있습니다. NodeJS의 Cluster는 죽은 워커를 바로 살리는데 싱글스레드여서 그런지 그 속도가 정말 어마어마합니다. 따라서 NodeJS Cluster를 사용할 땐 여러 핸들링에 신중하세요. 모든 promise에 반드시 catch를 달아 핸들링하고, 오류가 날 것 같은 로직엔 반드시 try - catch를 달아 핸들링을 해야 합니다. 그렇지 않으면 다시 살아나는 워커에 의해 서버의 자원이 고갈될 수 있습니다.예전에 16코어 서버를 운영할 땐 서버 자원에 비해 사용자가 적어서..(눈물) 5워커 2개의 서버만 구동하고 여유를 두었습니다. 그리고 서버 패치가 있을 때 3번째 서버를 대기시켰습니다. 앱에서 업데이트가 완료되는 시점에 Docker Container를 바꿔치기 하는 방식으로 Non-Stop서비스를 운영했죠. 혹시 코어가 빵빵한 여유 서버가 있는데 재빠르고 좀비 같은 서비스를 구성해야 한다면 위와 같은 환경 구축을 강력히 추천합니다. 지금까지 긴 글을 읽어주셔서 감사합니다.ps. 글 쓰다 보니 해가 떴네요. 하하.참고1) 가상 머신은 작은 이미지라도 기가바이트 단위의 사이즈와 Load되기까지 상당한 시간이 소요된다.2) 그러나 Windows의 경우, Hiper-v위에 리눅스를 띄워 도커를 구동한다. Mac에서도 가상 머신 위에서 구동된다. 따라서 성능적인 강점은 리눅스에만 적용된다.3) 도커에서는 NAME 속성을 지어주지 않으면 알아서 이름을 지어주는데 romantic한 단어가 많다.글강원우 과장 | R&D 개발2팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발팀 #개발자 #개발환경 #업무환경 #인사이트 #경험공유
조회수 1094

채널 데스크 프론트엔드 기술 스택

오프라인 고객 분석 솔루션 워크인사이트를 개발해 온 조이는 최근 온라인 접객 서비스 채널을 런칭했습니다. 이 글은 채널과 관련된 기술 블로그의 첫번째 글로 채널 데스크 프론트엔드(웹, 윈도우, OSX)의 기술 스택 및 개발 환경을 소개하도록 하겠습니다.React채널 개발을 처음 시작할 당시 (지금으로부터 1년 전) 에 워크인사이트 대시보드 및 기타 사내 툴에서는 AngularJS 1을 사용하고 있었습니다. 비교적 적은 코드로 복잡한 애플리케이션을 빠르게 만들 수 있는 점에는 만족했지만 퍼포먼스면에서는 아쉬운 부분이 많았습니다. 따라서 새로운 프레임워크 및 라이브러리를 리서치 했고 매우 가볍고 렌더링 퍼포먼스 면에서 AngularJS 1 대비 우위에 있던 React 를 사용하기로 결정했습니다.컴포넌트의 설계 패턴은 Redux를 만든 Dan이 제안한 Container 와 Presentational 컴포넌트를 구분하는 방식으로 설계하고 있습니다. 따라서 Container 가 data fetch 및 update 등의 액션을 실행하고 Presentational 컴포넌트들을 조합하여 렌더링을 하게 됩니다.React를 실제 1년째 사용해 본 결과 저를 비롯한 팀원들은 매우 만족하고 있습니다. 구조, 스타일, 동작을 한 컴포넌트로 묶어 재사용성이 매우 높아졌으며 React의 휴리스틱한 Dom diff algorithm 덕분에 렌더링 퍼포먼스에서도 많은 이득을 얻을 수 있었습니다.Facebook Flux Utils아키텍쳐는 페이스북이 제안한 flux 철학에 따라 설계되었습니다. flux를 구현하기 위한 기본적인 유틸리티 기능을 제공하는 Flux Utils을 사용합니다. Flux의 많은 구현체 중에 요즘 가장 인기인 Redux도 고려했었습니다. 저희가 프로젝트를 시작할 당시에 Redux는 5~6개월밖에 되지 않은 프로젝트였고 거의 Dan의 1인 프로젝트였기 때문에 향후 메인터넌스를 장담할 수 없다고 판단했습니다. 그보다는 페이스북이 만든 Flux Utils가 그런 면에서는 더 안전할 거라고 생각했던 것이죠.약 1년 정도 Flux Utils로 개발해오며 몇 가지 문제를 겪게 되었습니다. 애플리케이션이 커지면서 관리해야할 State가 많아지고 그들 사이의 의존성 관리 때문에 Store의 복잡도가 빠르게 증가했습니다. 그에 따라 테스트가 어려워지고 올바른 유닛테스트를 위해서는 테스트 코드 역시 매우 복잡해지는 문제가 있었습니다.그래서 Redux를 다시 리서치하게 되었고, 결론적으로 “단일 Store, 다수Reducer” 라는 Redux의 철학을 통해 State 관리 로직(Reducer)을 단순하고 테스트도 쉽게 유지할 수 있겠다는 생각을 하게 되었습니다. 뿐만 아니라 그 동안 설계와 관련되어 고민하고 필요한 경우 저희 스스로 개발해서 사용하던 많은 부분이 Redux의 서브 프로젝트 형태로 (redux-actions, redux-thunk, reselect 등) 개발되어 사용되고 있는 것을 발견해서 Redux로의 마이그레이션을 결정했고 현재 진행 중에 있습니다.Electron이 글의 도입부에서 이야기한 것처럼 채널 데스크는 윈도우용, OSX용 애플리케이션으로도 제공됩니다. 채널 개발 초기 당시 윈도우, OSX 각각 네이티브로 만들 리소스가 부족했기 때문에 웹 기술 기반으로 네이티브 앱을 만들 수 있는 다양한 솔루션들을 리서치했고 그 중 Electron을 선택하게 되었습니다.Electron은 제가 정말 좋아하는 제품인 Slack, Simplenote에서 사용하고 알려져 있고 국내에서는 Remember 등에서 사용하고 있습니다. 초기 개발 당시에는 안정성에 의문을 제기하는 개발자들도 많았고 저희도 여러 문제와 삽질(인증, 패키징, 이슈 레포팅의 어려움, 메모리릭 등등)을 많이 겪긴 했습니다만 개인적으로는 충분히 프로덕션에 쓸 수 있을 정도 수준이라고 생각합니다. 무엇보다 프론트엔드 개발자가 매우 적은 노력으로도 네이티브 데스크탑 앱을 만들 수 있는 장점이 다른 모든 문제점을 상쇄하고도 남습니다.언어개발 언어로는 자바스크립트 ES6를 사용합니다. 언어를 선택할 당시에도 여러 옵션이 있었는데 가능하면 실험적이지 않고 표준을 사용하는 것이 미래 유지보수에 안전하다고 판단했습니다. 또한 다른 자바스크립트 대안 언어를 사용하지 않더라도 ES6 (일부 ES7 포함) 스펙도 충분히 효율적인 개발이 가능하다고 생각했습니다.코딩 스타일은 기본적으로 Airbnb의 코딩 스타일 가이드라인을 따르며 조이의 상황과 맞지 않는 부분은 엔지니어들과 상의 후 수정해서 사용하고 있습니다. 스타일 체크는 ESLint로 자동화한 뒤 Circle CI와 붙여서 모든 풀리퀘스트에 대해 점검하고 있습니다.테스트초기 개발할 때는 테스트 코드를 별도로 붙이지 않았습니다. 고객의 요구와 기타 상황에 따라 기획과 설계가 크게 변경되기도 했고 그 때마다 기민하게 반응하기 위해서, 어느 정도 확립된 제품이 되기 이전에는 테스트 코드는 작성하지 않는 것이 좋다고 판단했습니다. 이제는 많은 부분이 확정되었고 안정성이 중요해지기 시작했으며 애플리케이션이 커지면서 자동화된 테스트는 필수가 되기 시작했기에 최근에 도입을 하고 있습니다.테스트를 위한 도구는 Jest, Enzyme 등을 사용합니다. Presentational 컴포넌트에 대한 테스트는 props에 따라 원하는 형태로 렌더링이 이루어지는지, 이벤트에 따라 콜백이 잘 실행되는지 등의 Spec 을 작성합니다. Container 컴포넌트에 대한 테스트는 각종 이벤트 및 동작을 시뮬레이션하고 그에 따라 Action이 잘 발생하는지 또는 내부 state가 잘 변경되는지를 테스트합니다. 또한 Store (또는 Reducer), Action Creator, Model, Util 등 모든 구성 요소에 대한 테스트를 붙이려고 노력하고 있습니다. 유닛 테스트가 아닌 e2e 테스트 혹은 css 스타일 테스트 등은 하지 않고 있습니다.빌드 및 배포현재 채널 데스크는 Client-side rendering을 합니다. 초기 로딩 속도가 느리다는 단점이 있어서 Server-side rendering으로의 전환도 고려하고 있습니다. 이미 Node.js 를 사용하고 있어서 Isomorphic Javascript의 형태로 어렵지 않게 전환이 가능합니다.작성된 자바스크립트는 Babel로 컴파일되고 Webpack으로 번들화됩니다. css를 포함한 각종 리소스들 역시 Webpack을 통해 처리됩니다. 웬만한 작업은 npm과 Webpack으로만 자동화하려고 했으며, Electron과 관련된 작업(패키징, 인증 등)들만 gulp를 이용해 자동화됩니다. 모든 리소스들은 Node.js + express 서버로 Serving 되고, Node.js 앱은 Docker로 빌드되어 AWS EC2로 배포됩니다.마무리이상으로 채널 데스크 프론트엔드의 기술 스택을 소개해드렸습니다. 앞으로 각 부분 별로 저희 팀이 고민해 온 문제들과 해결 방법을 공유하고자 합니다. 뛰어난 개발자 분들의 많은 관심과 피드백 부탁드립니다!#조이코퍼레이션 #개발자 #개발팀 #인사이트 #경험공유 #일지
조회수 1542

애플, 화제의 프로그래밍 언어 Swift 공개

안녕하세요. 크몽 개발팀 입니다!   지난주에는 개발하기 전 개발환경 셋팅에 필요한 개발도구들을 소개해 드렸습니다.그러나 개발환경을 셋팅하기 전에 먼저 결정해야 할 것이 있습니다.바로 어떤 프로그래밍 언어로 개발을 할것인가 하는 문제 인데요~언어의 종류가 많고 사용하는 언어마다 특성이조금씩 다르기 때문에 결정하는 것이 어려울 때가 많습니다. 오늘은 다양한 종류의 언어 중에서 요즘 개발자 분들사이에서 화제가 되고 있는 'Swift(스위프트)'라는 언어를 소개해보려고 합니다.    2014년 6월 2일 미국 샌프란시스코 모스콘웨스트컨벤션센터에서 열린애플 WWDC(WorldWide Developers Conference)에서발표 마지막에 새로운 프로그래밍 언어 'Swift(스위프트)'를 공개했습니다.Swift는 C와 Objective-C의 중간에 있는 언어로서iOS와 OS X 기반의 애플리케이션 개발을 위한 언어입니다. 간단하게 장점들을 말씀드리면 고성능 앱을 개발 하기 위하여LLVM의 발전된 코드 분석기를 이용해 컴파일과 최적화를 수행합니다. 이 결과 Python 기준으로 오브젝트 정렬 속도는 3.9배,RC4 인크립션 처리속도는 220배나 빠른 처리속도를 가지고 있습니다. 그리고 현대적인 언어에서 지원하는 주요 기능들을 대거 흡수하고,Cocoa 및 Cocoa Touch frameworks의 모든 부분에서 접근이 가능합니다.또한 C와 Objective-C에서 써오던 기존 방식 또한 그대로 도입할 수있기 때문에 기존에 개발하던 업무에 지장을 주지 않습니다.   마지막으로  읽고 쓰기 쉬운 문법으로 코드를 작성하기 때문에유시보수 시 적은 양의 코드가 사용됩니다.그리고 소스를 코딩한 후 그 결과를 실시간으로 볼 수 있습니다. [출처] 애플 스위프트 언어 (Swift) - 앱 개발을 위한 애플의 새로운 언어|작성자 마스터 현재 9월에 애플에서 Swift 정식버전이 출시 되었고Swift로 작성된 애플리케이션의 iOS 앱스토어 승인도 시작되었습니다.또한 Xcode 6 시험판을 내려받아서 사용할수 있고,iTunes Store와 App Store를 통해 Swift 프로그래밍 언어 전자책을 다운받을 수 있다고 합니다.  개발된지 오래 되지 않아서 아직 Objective-C를 함께 사용하고있지만 쉽게 접근할 수 있는 언어이기 때문에점점 Swift를 사용하는 개발자 분들이 많아질 것으로 보입니다 ^^ 이상 포스트를 마치겠습니다. #크몽 #개발팀 #신입개발자 #신입사원 #경험공유
조회수 594

핵심만 말하는 능력

분야를 막론하고진정한 고수들은 공통점을 가지고 있다.무엇이 본질인지 알고 있다중고등학교 시절에어렵고 이해하기 어려운 책들을 접하면나의 지적 능력이 형편 없구나라며 자책했던 적이 많았다.도무지 넘어가지 않는 책장을 보며읽어도 읽어도 이해가 가지 않는 문장들과명확하지 않은 개념들이 나의 탓인줄만 알았다.고등학교 때 만난 수학 선생님과대학때 만난 타이포그래피 교수님은내겐 신선한 충격이었다.수학의 원리를 그렇게 쉽게 이해시킬 수 있다는 것,동일한 문제를 전혀 다르게 바라볼 수 있게 해준 분이셨고,타이포 교수님은 디자인의 감각적인 영역을 이성적으로공감할 수 있게 해준 분이셨다.그렇게 한참이 지나서현학적인 말이나 글이 보여주는 난해함과 모호함은어설픈 자들의 알량한 지식을 그럴듯하게 표현하려는위장전술일 수도 있겠다는 생각을 대학원 논문을쓰면서 뼈져리게 느끼게 되었다.어렵게, 대단한 척, 전문 용어를 난발하며 풀어낸,논문들이 말하고자 하는 내용은딱 한가지였다.어때? 나 전문가 같지?내가 찾아본 수 많은 논문들에는전달하려는 핵심이 명확한 논문은 정말 소수에 불과했다.논문의 형식을 따를 뿐 짜집기로 범벅된 거품 투성이였다.그 후로 난 논문 쓰기를 그만두었다.직장에서도 이런 일은 비일비재하다.말만 그럴듯이 얘기하면서 핵심이 없는 사람들,자기 생각은 없고 남의 얘기만 자기 것처럼 하는 사람들,장황하게 얘기하지만 요점이 없는 사람들...보고서가 30장이 넘어도무엇을 얘기하는지 전달이 안되는 자료들,사례와 근거는 넘치지만 결론을 이끌어내지 못하는 문서들,손에 잡히지 않는 모호한 개념의 형용사만 늘어놓는있어빌리티 문장들...뭘 얘기하고 싶은 건가요?이런 보고서들은 거품을 빼고 걷어내면결국 남는게 별로 없다.보통 이런 자료들이 남발하는 이유는자신이 무엇을 위해 일하는지 이해하지 못한채습관적으로 일하거나, 형식에만 맞춰서 칸 채우기식으로일하기 때문이다.또는 말하고 싶은 내용은 있지만이것을 단어와 문장으로 풀어내지 못하는 기술이부족하기 때문이다.아래 3가지를 유념하면 도움이 될지 모르겠다.1. 문서의 목적을 다시 생각하라. - 무엇을 위해 이 보고서(문장)을 쓰는가?2. 중2 학생도 이해할 수 있게 하라 - 전문지식이 없어도 이해할 수 있는 명확한 표현인가?3. 다르게 해석될 표현은 없는가? - 보는 사람에 따라 전혀 다르게 이해될 단어는 없는가?무엇보다 중요한건작성자 중심이 아니라, 그 말과 글을 전달할 대상을중심으로 정리되어야 한다는 것이다.남의 입장에서 생각해보는 것이결국은  핵심이다.그것만으로도 대단한 일이다!
조회수 1731

배트맨을 통해 배운 리더십

가끔 영화를 보다 보면 영화 속 캐릭터의 대사가 그 어떤 멘토의 조언보다 더 깊은 울림을 줄 때가 있다. 얼마 전엔 내가 정말 좋아하는 크리스토퍼 놀란 감독의 불명의 명작 다크나이트 시리즈의 시작 편인 <배트맨 비긴즈>를 우연히 다시 볼 일이 있었는데, 일전엔 그저 멋있는 말로 느껴졌던 배트맨(브루스 웨인)의 대사가 내 머리를 강타하는 것을 느꼈다.사진 출처: 블로그스팟 영화명대사 모음(MovieQuotes)It’s not who I am underneath – it’s what I do that defines me.정확한 한글 해석이 무엇인지에 대해선 여러 의견이 있겠지만, 회사의 대표이자 리더로서의 정체성에 대해 많이 고민하는 나에게 이 대사는 다음과 같이 들렸다. “진짜 나를 규정하는 것은 보이지 않는 나의 생각이 아니라 지금 보이고있는 나의 행동이다”사업을 하다 보면 사실 대부분의 중요한 일이라는 것이 다양한 이해관계자들의 생각을 이해하고 소통을 통해 조율하는 과정이라는 것을 알게 된다. 그 과정에서 당연하게도 내가 전달하고자 했던 나의 진심을 함께 일하는 동료들이 알아주지 못하는 경우도 생기고, 나아가 파트너사나 주주들이 오해를 하는 경우도 생기기 마련이다. 그렇기에 거미줄같이 복잡한 소통의 과정 속에서 얼마나 효과적으로 진심을 잘 소통할 수 있는지는 리더의 능력을 평가함에 있어 분명 가장 중요한 요소 중 하나일 것이다. 예전엔 ‘사람들이 왜 내 진심을 몰라주지...’, ‘내 생각을 어떻게 하면 더 잘 전달할까.’ 같은 고민을했던 기억이 난다. 하지만 반복되는 소통과 조율 과정에서 내가 느꼈던 가장 단순하면서도 명쾌한 진리는 내 진심을 전달함에 있어서 나의 생각, 나의 원래 마음이 중요한 것이 아니라 내가 그래서 어떻게 행동하느냐, 실제로 나를 둘러싼 사람들이 보게 되는 나의 모습이 무엇이냐, 그것이 더 중요하다는 것이었다. 지각을 하는 것은 팀웍을 망치는 나쁜 일입니다, 라고 내가 아무리 말하더라도 정작 나는 항상 지각을 한다면 그 말이 팀원들에게 공감대를 형성하고 마음을 전달하는 데에는 명확한 한계가 있을 수밖에 없다. 우리 회사는 다양한 아이디어에 귀 기울이고 나에 대한 비판적인 피드백에 대해서도 경청하는 문화를 가져야 합니다, 라고 이야기하는 것 역시 중요하지 않을 수 있다. 내가 백 번 그렇게 이야기하고 마음 속으로 굳게 그것이 옳다고 믿고 있더라도 실제로 나에 대한 동료들의 비판이 있을 때 상기되어 화내는 모습을 보이면, 동료들은 ‘아 우리 회사 대표는 달콤한 소리만 듣길 원하는구나. 우리 회사는 결국 솔직하고 냉정한 피드백은 조심해야 하는 문화구나.’ 라고 판단하게 될 것이다. 진짜 나를 규정하는 것은 다름 나의 행동이다. 나는 원래 이런 사람이다, 나의 마음은 사실 이게 아니었다, 와 같은 변명을 하지 않는 리더가 되어야 하겠다. 나의 행동이 나를 규정한다. 나의 행동이 바로 나 자신이다. 나의 행동이 진심을 전달하는 가장 중요한 시작이자 끝이라는 사실을 다시 한 번 곱씹어본다.#어니스트펀드 #리더십 #마인드셋 #스타트업 #스타트업창업 #인사이트 #조언
조회수 837

앱 데이터 분석 시 사용자 세그먼트의 필요성

사용자 세그먼트(USER SEGMENTATION)란? 모바일 분석 툴을 사용하면 앱 사용자에 대한 많은 정보를 얻을 수 있습니다. 하지만 방대한 데이터는 오히려 의사결정에 혼란을 일으킬 수 있어 비즈니스에 의미가 있는 데이터를 선별해서 보는 것이 중요합니다.‘사용자 세그먼트’란 데이터의 필터 기능으로, 1차 데이터를 하위 기준으로 분류해서 보는 것을 의미합니다. 예를 들어 앱 사용자 전체의 데이터를 성별, 연령, 국가, 플랫폼 별로 나누어서 보는 것도 세그먼트에 해당합니다. 이 기능을 이용하면 ‘우리 사용자는 누구인가?’ 에서 더 나아가, 앱 서비스의 충성고객, 구매고객, 이탈고객 각각의 특성을 파악하고 이에 맞는 비즈니스 전략을 만들 수 있습니다.아래 내용을 통해 앱분석 시 사용자 세그먼트의 방법과 필요성을 알아보겠습니다.사용자 세그먼트 적용하기사용자 세그먼트가 무엇인지 실제 데이터 분석 툴의 예시를 보며 자세히 알아보도록 하겠습니다. 모바일 분석 서비스 와이즈트래커는 기본 세그먼트와 사용자 정의 세그먼트 기능을 제공하고 있습니다.기본 세그먼트기본세그먼트 기능을 통해 플랫폼, 성별, 연령대에 따라 데이터를 분류할 수 있습니다. 비즈니스에 따라 사용자 구분 시 중요한 지표가 있다면, 그것을 기본세그먼트 항목으로 추가하는 것도 가능합니다. 광고채널, 회원여부, 회원등급 등이 이에 해당합니다.[ 와이즈트래커 세그먼트 설정화면 – 필요한 세그먼트를 더블 클릭하거나, 오른쪽 상단의 ‘Drag Here’ 로 세그먼트 항목을 Drop하면 세그먼트가 적용됩니다. 여러가지 세그먼트를 동시에 적용할 수 있습니다 ]아래 데이터는 기본 세그먼트 중 연령대(20대, 30대, 40대) 세그먼트를 이용해 [신규방문 vs 재방문] 리포트 데이터를 하위 분석한 결과입니다.이를 통해 단순히 신규방문/재방문의 수치/비율 뿐 아니라, 각 방문 유형별 연령대 구성을 파악할 수 있습니다. 이 데이터를 통해 처음방문자의 경우, 20대와 30대의 수치가 비슷하게 나타나지만 반복방문자의 경우 30대의 비율이 20대보다 훨씬 높게 나타나, 앱 서비스가 20대보다 30대에게 지속적으로 어필되고 있다는 것을 확인할 수 있습니다.사용자 정의 세그먼트사용자 정의 세그먼트를 통해 기본적으로 제공되는 세그먼트를 조합해 비즈니스에 필요한 맞춤 세그먼트를 설정할 수 있습니다. 예를 들어, 앱 서비스의 주요 고객이 iOS를 사용하는 20~30대 여성이라면 아래와 같이 해당 속성값을 가지는 사용자 정의 세그먼트 ‘iOS_2030_여성’을 생성합니다.위에서 생성한 세그먼트를 위의 [신규방문 vs 재방문] 리포트에 적용하면 아래와 같은 데이터가 나타납니다.이처럼 사용자 정의 세그먼트를 이용하면 앱 사용자를 비즈니스에서 정의한 타겟 고객군과 잠재 고객군으로 분류하여 유의미한 사용자 그룹의 숫자를 파악할 수 있습니다.사용자 세그먼트의 필요성데이터 분석은 분석 자체가 목적이 아니라, 비즈니스의 성장과 목표 달성에 도움이 될 때 의미가 있습니다. 그럼 사용자 세그먼트는 비즈니스의 성장에 어떤 도움을 줄 수 있을까요?1. 의사결정에 필요한 데이터를 선별해 추출할 수 있다. 신규 고객을 위한 이벤트 기획 시, 신규 고객들의 성별, 나이, 플랫폼 등을 세그먼트 기능을 통해 파악할 수 있습니다. 만약, 아래 테이블처럼 신규 고객의 대다수가 20,30대 여성이라면, 이들의 흥미를 끌만한 이벤트를 기획해 이벤트 참여율을 높일 수 있습니다.[ 와이즈트래커 내 처음방문자 방문수 데이터에 연령_성별 사용자정의 세그먼트를 적용한 화면 ]2. 어떤 유저가 우리 비즈니스에 가장 유의미한지 파악할 수 있다. 앱 서비스의 핵심적인 유저는 앱을 주기적으로 방문하고, 구매 빈도/금액이 높은 사용자입니다. 이들의 특성을 세그먼트를 통해 파악하고, 이러한 데이터를 기반으로 해당 사용자들의 충성도와 구매율을 높이기 위한 프로모션을 진행할 수 있습니다.[ 와이즈트래커 내 1회 구매자 방문수 데이터에 여성들의 연령_플랫폼 사용자정의 세그먼트를 적용한 화면 ]3. 오디언스 타겟팅(AUDIENCE TARGETING)에 이용할 수 있다.세그먼트 기능을 통해 파악한 특정 사용자 그룹의 특성을 바탕으로 오디언스 타겟팅을 진행할 수 있습니다. 앱에서 한번도 상품을 구매하지 않은 비구매자 그룹의 특징을 파악했다면, 이를 기반으로 해당 그룹의 ADID/IDFA를 추출해 구매를 유도하는 푸시메시지 또는 광고를 노출할 수 있습니다.[ 와이즈트래커 오디언스 타겟팅 설정화면. 비구매자 그룹의 주요 특징이 회원인 40대 국내 남성이라면 이들의 ADID/IDFA를 추출해 구매를 유도하는 푸시메시지/광고 프로모션을 진행할 수 있다.]비즈니스 성장의 지름길 고객에 대한 이해도가 높을수록 비즈니스는 빠르게 성장합니다. 이 때문에 모바일 비즈니스에서 사용자 세그먼트를 통해 비즈니스 고객군 별 특성을 정확하게 파악하는 것은 선택이 아닌 필수입니다. 모바일 데이터 분석을 이제 시작했다면, 사용자 세그먼트 기능을 통해 데이터에 깊이를 더하고 비즈니스 성장에 핵심적인 데이터를 확인해보세요!

기업문화 엿볼 때, 더팀스

로그인

/