스토리 홈

인터뷰

피드

뉴스

조회수 845

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

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

스타트업 견문록(2)

 어느 날 번뜩인 아이디어로 몇 날 며칠 흥분의 나날을 보내고, 창업 결심을 했을 때, 우리는 무엇을/어떻게/어디서 시작하여야 할까? 출퇴근하는 지하철에서 이 아이템으로 성공하는 상상도 해보고, 뭔가 남들이 모르는 비장의 카드 하나를 얻은 듯 나 자신이 대견하게 느끼는 순간이 있었어. 최근에는 정부와 민간의 투자사들의 주도로 창업 자금과 공간도 지원해 주고, 조금이라도 더 젊을 때, 도전해 보자는 혈기왕성, 넘치는 열정을 발산할 수 있는 기회라고 생각할 수도 있어.      그런데 말야. 한 걸음만 더 현실적으로 따져보자구. 세상 일은 그리 쉽게 생각대로 되지 않는 법이거든. 그냥 감으로, 순간의 순발력으로 이룰 수 있는 일은 복권이나 도박 정도랄까? 그렇기에 아이디어 수준에서 진짜 창업을 하기까지는 세세하게 준비하고, 하나하나 점검해야 하며 신경 써야 할 일들이 많아. 그럼에도 불구하고, 나름 준비하고 창업해도 그 이상으로 생각하지 못했던 문제들이 일어나는 게 다반사인걸. 그렇기에 더욱 준비를 더 잘 해야겠지?     준비물 1. 지도(사업계획서) 아이디어에 대하여 맹신하지 마! 이것은 마치 서쪽으로 가면 황금의 땅, 엘 도라도가 있을 거란 가설과도 같아. 무슨 말이냐면 아이디어는 말 그대도 추상적이고, 실체화되지 않은 상상 속 정보의 조합일 뿐이야. 설령 신박하거나 기똥찬 아이디어일지라도 구체적이거나 실현 가능성이 없다면, 아무런 가치가 없는 거야. 다시 말해, 아이디어를 “사업계획서”라는 이름으로 사전조사와 구현 방법, 필요자원과 기간 등에 대한 계획이 논리적이고 타당한 근거 위에 준비되어야 해. 마치 미지의 바다를 항해하기 위해 지도(해도)를 준비하는 것과 같아. 단지 서쪽으로 가자 수준이 아니라 서쪽이면 지브랄 협해를 언제 거치고, 대서양을 항해하기 위해 알려진 상선들이 다니던 루트를 갈 것인지, 새로운 루트로 갈 것인지, 별을 기준으로 삼을 것인지, 선원은 얼마나, 식량은 얼마나 필요할 것인지, 유망한 항해사를 데리고 올 것인지, 참고할 수 있는 사례가 있는지 등에 대한 스토리가 정리되어 있어야 하지.  아이디어 수준에서 상대방을 설득하는 것과 사업계획서 수준과 비교하면 어느 쪽이 더 현실적일까? 물론 사업계획서도 꾸준히 수정되고, 보완되어야 하기에 완벽하지 않아. 오히려 계획했던 것과 다른 일들이 빈번하고, 일정이나 방향이 예상외의 상황으로 빠져들곤 해. 그렇지만 적어도 사업계획서라는 큰 틀이 있어야 무엇이 오류였고, 어떻게 고쳐가야 할지 파악할 수 있어. 그렇게 점차 완성형으로 바꿔가는 최초의 기준점이 바로 사업계획서야.       준비물 2. 나침반(회사의 목표/미션/핵심가치 그리고 선행활동) 지도는 있는데 나침반이 없으면 우리가 어디에 있고, 어디로 가고 있는지 알 수 없듯이 계획대로 일이 만들어지려면, 그때 그때 점검할 수 있어야 하고, 때에 따라서는 유연성을 가지고 수정해야 하지. 그 능력은 리더에게 있어. 물론 큰 회사나 어느 정도 자리를 잡은 회사는 시스템 또는 조직이 수행하지만, 궁극적으로 선택과 결단을 내리는 점에서는 리더의 역량이 중요한 위치를 차지하지. 가장 먼저 창업을 한 목적과 회사가 달성하려는 목표가 명확해야 해. 그리고 미션, 핵심역량에 대한 충분한 고민이 필요해. 이것은 방향이야. 우리가 엘 도라도에 가려면 서쪽으로 가야 할 것인지, 동쪽으로 가야 할 것인지 정도는 알아야 항해를 하지. 그리고 설정된 방향으로 나아가기 위하여 나침반이 필요해. 경험에서 우러나올 수도 있고, 전문지식을 기준으로 삼기도 해. 사전 고객 조사, 해당 업종의 인프라나 전문가 멘토링을 통해 수시로 우리가 제대로 방향키를 잡고 있는지 확인할 수도 있어. 창업 전에 이러한 부분을 염두해서 미리 세팅을 해두면, 보다 효과적인 항해가 될 거야.     준비물 3. 항해사와 선원들(팀 빌딩) 정말 뛰어난 능력자라면, 1인 창업자라는 타이틀로 이 험난한 길을 헤쳐 나갈 수 있겠지만, 우리 중 대다수는 부족한 점이 많기에 서로 다른 능력의 조력자들 또는 팀원들이 필요하지. 사람은 아는 만큼 보인다고 해. 나 홀로 보는 범위와 시각보다 다수의 관점으로 바라보면, 미처 내가 생각하지 못하는 감추어진 부분들을 알아낼 수 있지. 단거리라면, 창업자만의 폭발적인 속도전으로 치고 나갈 수 있을 수도 있지만, 대부분의 사업은 장거리라 금방 지칠 수 있고, 한계에 빨리 도달할 거야.    그럼 어떤 기준으로 팀원들을 모을 수 있을까? 단지 친하니까, 쿵짝이 잘 맞는 사람들이라서 함께 역경을 이겨내기에는 불충분한 조건이야. 오히려 가까운 사이라서 더 상처받고, 실망하고, 할 말 못 하는 상황에서 등 돌리는 경우가 많거든. 때문에 우리는 몇 가지 고려할 사항들이 있어.       먼저, 사업에 필요한 사람인지가 중요해. 만약 IT 쪽의 사업이라면, 당연히 개발 능력이 있는 팀원이 있어야겠지. 셋이서 창업했는데 셋 다 기획자라던가, 어플(앱)을 만들겠다고 뭉쳤는데 개발자가 아무도 없다던가 하면 정상적이겠니?  상황에 따라서는 투자나 재무관리의 능력이나 마케팅에 탁월한 사람도 필요해. 여기는 동아리 모임이 아냐. 비록 작지만 회사라는 걸 늘 인지해야 해. “하하호호 우리는 행복해요~ 우리는 즐거워요~” 하는 식의 스타트업 놀이하다가 고꾸라지는 사례를 많이 보게 되지. 냉정하게 회사는 수익을 지향하는 집단이야. 목적을 위해 그에 상응하는 능력들을 갖춘 사람들이 모이는 게 효과적이야. 스타트업은 가볍게, 빠르게 가야 하는 조직이야. 그러려면, 디자이너인데 마케팅도 할 줄 아는 사람, 기획이면서 개발을 할 수 있는 사람, 재무를 보면서 영업을 할 수 있는 사람 등과 같이 기본적인 능력에 부가적인 업무 수행이 가능해야 해. 초기에는 한정된 인적자원이기에 영업이든, 기획이든, 마케팅이든 다 해내야 하거든.      두 번째로는 창업자와 다른 시각을 가진 사람이어야 하지. 마음 맞는 친구들과 창업하면 의사결정에 있어서 만장일치로 빠르게 결정이 될 수도 있지만, 다른 시각, 다른 관점에서 문제나 상황을 파악할 수 있어야 보다 정확한 결정을 이끌 수 있어. 무조건 창업자의 의견에 동조하는 사람들이 모여 있으면, 사방을 주의하면서 항해하는 것이 아니라 오로지 앞만 보고 돌진하는 항해가 될 거야. 여기서 중요한 점은 비관적이고 부정적인 사람 또는 무조건 반대를 외치는 사람을 찾으라는 게 아냐. 모두가 “예스”라고 말할 때, “노”라고 말할 수 있는 사람이 필요한 게 아니라, “왜?”라고 말할 수 있는 사람이 필요하단 말이야.       세 번째로, 배고픔을 아는 사람들이 필요해. 대표자만 절실함이 있다고 사업이 되는 건 아니거든. 동료들 역시 목적과 필요가 명확해야 해. 스타트업은 항상 불확실한 환경에서 고군분투 살아남아야 하는데 악조건에서도 포기하지 않는 끈기는 성공을 향한 갈망(배고픔)이어야 하지.     준비물 4. 배와 식량(공간과 자금) 다른 준비물에 비해서 가장 난감해하는 공간과 자금에 대한 이야기야. 창업을 하는 데 있어 사업자등록증을 낼 때, 지정된 공간이 필요해. 정보통신 분야(IT) 벤처기업 붐이 일어나던 시절에 SOHO(small office home office)라는 공간이 생겨났어. 쉽게 말해서 살고 있는 집 주소를 활용하거나 작은 사무실 하나 구해서 공간으로 활용하는 것인데 최근에는 코워킹 스페이스라는 형태로 공간은 많이 있어. 보증금이나 임대료/관리비 등에 큰 비용들이지 않고 일정기간을 창업공간으로 활용할 수 있지. 최근에는 디지털 노마드(Digital nomad)라고 꼭 장소에 국한되지 않는 업종이라면, 창업카페라던가 도서관에서 자리 잡기도 해.  자금이 필요한 이유는 굳이 하나하나 설명하지 않아도 체감하게 될 거야. 문제는 우리에게 충분한 자금이 없다는 거지. “자본금 없이 창업하는 노하우를 전수해 주겠다”라는 컨설팅업체들이 있는데, 현혹되지 말자. 사실 많은 자금 지원 제도가 있어 자금조달에 대한 이야기는 따로 이야기를 Keeping 해 두었어. 융자/투자/정부지원 등 자금의 종류가 워낙 다양하고 다 정리하기에는 분량이 꽤 많아서 따로 정리해서 좀 더 깊이 이야기하자. 어쨌든 초기에 자금이 적더라도 필요해. 우리 회사의 경우, 처음 법인 설립할 때, 100만 원으로 시작했어. 그리고 엄청 고생했지. 중간중간 필요한 자금을 자체 조달하며 증자하고, 투자 유치하고 이래저래 에피소드가 많이 생기더라고. 그래서, 가급적이면 초기 자본금을 좀 여유 있게 준비하라고 권하고 싶어. 창업하는 순간부터 움직이는 게 다 돈이고, 증빙이고, 기록이거든. 동료들의 열정에도 상한선이란 게 있어. 설령 모두 무급여로 시작했다 하더라도 교통비, 식비, 잡비 등 비용들을 자부담하게 하면, 빠르게 식어 버리는 게 열정과 비전이야. 회사라는 조직이 지속되기 위해서 규정이 있고, 관리가 있고, 지원이 있어야 하는데 아무리 초기 스타트업이라는 이름으로 시작하더라도 이 모든 걸 개개인에게 부담시키면, 시간이 흐를수록 갈등과 원망이 커지고 팀이 깨지게 되지. 이상과 꿈이 있는 선원들이 굶주리고, 살을 깎아 먹고 있으면, 선장에 대한 반란을 일으키듯이 말야.      여기까지 창업을 위해 가장 기본적으로 준비해야 하는 사항들을 나열해 보았어. 업종에 따라서는 인프라도 사전에 준비하고, 거래처도 미리 세팅하고, 할 수 있는 한 최대한 준비하는 것을 추천해. 아무리 준비를 잘 해도, 늘 부족하고, 아쉬운 것이 창업이야. 그 조차 준비 없이 창업을 하면, 우리는 세상 끝 낭떠러지를 만나게 될 거야. 조금이라도 더 성공 확률을 높이고, 보다 안전하며, 빠른 길로 항해하도록 창업자는 더욱 만반의 준비를 해야 한다구. 다들 준비되었으면, 모험을 해 볼까? 돛을 올려라~!                         (역주)* 코워킹 스페이스(co-working space): 예비창업자 또는 초기창업자들에게 공동으로 업무를 수행할 수 있도록 구성된 공간으로 오픈형 테이블, 개별 테이블(또는 개별 공간), 공용회의실 등이 구비되어 있는 형태의 창업공간. 정부나 지방자치단체에서 운영하는 무상 지원 공간과 저렴한 임대료/관리비로 제공되는 민간 코워킹 스페이스가 있으며, 일부는 투자자가 공간을 무상 또는 현물투자 형태로 지원하기도 한다.
조회수 1157

jekyll의 메커니즘을 이해하고 커스터마이징하기

편집자 주-PHP 기반의 서비스를 기준으로 설명했다.-서버의 프로그램은 ‘서버 스크립트’로 표기했다.-HTML/html: 약어로 사용할 경우엔 대문자, 파일명으로 사용할 경우엔 소문자로 표기했다.목차jekyll이 어렵게 느껴지는 이유 jekyll은 모든 화면을 미리 만들어둔다.서버 스크립트 없이 검색 기능을 어떻게 만들까?이미지 캡션 추가이미지 사이즈 대응부록: 글 반영 과정, 도메인 연결 방법, 추가 옵션에 대하여Overview기술 블로그인 브랜디 랩스를 관리하기에 jekyll은 안성맞춤인 도구입니다. 1년 넘게 탈 없이 잘 사용하고 있죠. 물론 커스터마이징을 하려면 고생이 이만저만이 아닙니다. 그 과정은 jekyll을 이용한 Github 블로그 만들기에도 잘 나와있습니다. 도대체, jekyll은 왜 이리도 어려운 걸까요? 브랜디 랩스를 사례로 설명하겠습니다.jekyll이 어렵게 느껴지는 이유일반적인 웹서비스는 정적 리소스와 동적 스크립트의 조합으로 이뤄집니다. 예를 들어 PHP 서비스에서는 정적인 부분을 아파치 웹서버로, 동적인 부분을 PHP 스크립트로 작동합니다.하나의 게시글이 생기면 PHP 스크립트가 데이터베이스에 row 생성을 요청합니다. 게시글 등록 요청을 마치고, 글 목록 화면 요청을 한다면 데이터베이스에서 등록된 글목록을 정리해 HTML 양식으로 응답값을 만들어줄 것입니다.PHP 기반의 블로그 프로그램하지만 jekyll은 컨셉부터 다릅니다. 아주 생소한 메커니즘을 갖고 있습니다. 파일 기반의 데이터를 정적인 리소스로 빌드해서 서비스하죠. 게시글마다 md 파일이나 html 파일을 생성합니다. 글을 작성하고 배포하기 위한 빌드를 진행하면 응답할 html 화면을 만들고, 파일로 저장해 준비합니다. 이 상태에서 유저가 특정 화면을 요청하면 미리 생성한 html 파일을 찾아 꺼내주기만 하면 되죠. 다시 말해, 데이터베이스를 조회하고 HTML 양식으로 응답값을 만드는 과정이 생략되는 것입니다.실제로 Github page가 아파치 서버를 쓰는지는 알 수 없지만 개념 설명을 위해 동일하게 그렸다.jekyll은 모든 화면을 미리 만들어둔다.jekyll은 유저가 요청할 수 있는 모든 화면을 미리 빌드하는 방식을 씁니다. 앞서 다뤘던 브랜디 랩스의 gnav 영역의 회사소개, 채용 화면도 미리 빌드해둬야 합니다. 저자를 소개하는 프로필 페이지도 마찬가지죠. 글이 많아지면서 점점 길어지는 글 목록 화면도 예외는 아닙니다. 글 목록을 보여주는 화면이 많아지만 페이지 수만큼 미리 만들어야 합니다.위의 이미지는 jekyll이 동작하는 메커니즘을 간단히 정리한 것입니다. jekyll을 커스터마이징하려면 완전히 새로운 관점으로 접근해야 합니다. 지금부터는 브랜디 랩스의 검색 기능 구현 과정을 살펴보면서 커스터마이징을 자세히 알아보겠습니다.서버 스크립트 없이 검색 기능을 어떻게 만들까?검색을 하려면 작성된 모든 글의 제목과 내용에 원하는 키워드가 있는지 찾아야 합니다. 하지만 검색어는 변동값이므로 미리 빌드하는 방식으로는 커버할 수 없습니다. 검색어마다 화면을 미리 만들 수 없기 때문입니다.이럴 때는 클라이언트 스크립트는 활용해야 합니다. 서버 스크립트를 쓸 수 없기 때문에 어쩔 수 없는 선택이기도 합니다. 검색에 필요한 정보를 json 파일로 빌드시키고 자바 스크립트를 이용해서 검색하도록 했습니다.먼저 최상위 경로에 search.json을 만듭니다. 파일 시작점에 아래와 같은 패턴이 있다면 빌드 대상으로 인식됩니다.--- --- 이전에 쓴 jekyll 문서를 PDF로 배포하기에서 pdf.html 파일을 만들 때도 비슷한 방법을 사용했습니다.--- --- [ {% for post in site.posts %} { "title" : "{{ post.title | escape }}", "category" : "{{ post.category }}", "tags" : "{{ post.tags | join: ‘, ’ }}", "url" : "{{ site.baseurl }}{{ post.url }}", {% if post.author %}{% for author in site.data.authors %}{% if post.author == author.name %} "author" : "{{author.koname}}", "email" : "{{author.email}}", {% endif %}{% endfor %}{% endif %} "date" : "{{ post.date }}", "content" : "{{ post.content | strip_html | replace: "\", ‘’ | replace: ‘"’, ‘\"’ | replace: ' ‘,’ ' | replace: ' ‘, ’ ' }}" } {% unless forloop.last %},{% endunless %} {% endfor %} ] ▲서머리 데이터를 만드는 json 파일search.json은 모든 페이지의 제목과 내용을 정리해 json으로 만들어야 하기 때문에 site.posts변수를 이용해 만들었습니다. post내용에는 글의 저자, 작성일, 제목, 내용 등 필요한 정보가 있으니 출력하면 됩니다. json을 만드는 것이므로 내용에 “가 들어가면 안되 "으로 치환시켰습니다. 마지막으로 HTML 태그는 검색에 필요하지 않기 때문에 luqid strip_html 함수를 이용해 제거했습니다.http://labs.brandi.co.kr/search.json위의 URL을 클릭하면 브랜디 랩스에서 검색에 사용하는 json을 볼 수 있습니다. 빌드하면 search.json이 만들어지는 것을 확인할 수 있습니다. 이제 json을 로딩하고 해당 키워드를 가진 글을 찾아내기만 하면 됩니다. json 내에 제목과 내용에 입력한 키워드가 있을 때 아래와 같은 UI로 표현했습니다. 기능 구현은 Simple-Jekyll-Search를 이용했습니다. 1)이미지 캡션 추가블로그는 이미지를 많이 사용하고, 상황에 맞게 노출도 해야 합니다. 아래 이미지는 최종적으로 적용한 이미지와 캡션의 결과 화면입니다. {% include figure.html file="/assets/20190415/05.png" alt="05" caption="커스터마이징한 gnav 영역" width="fitcontent" border="true" %} 위와 같이 구성하려고 html과 css를 다음과 같이 구성했습니다. 커스터마이징한 Gnav영역 ▲캡션 html 소스figure { margin: 1em auto; } figcaption { text-align: center; font-weight: bold; color:#999; } ▲캡션에 관련된 css 소스이미지는 가운데 정렬했고, 캡션 텍스트도 옅은 회색으로 가운데 정렬했습니다. 하지만 편집을 담당하는 장근우 대리는 개발자가 아니므로 태그를 입력해달라고 하기엔 무리가 있었습니다. 좀 더 편리한 방식이 없을지 고민하다가 liquid 템플릿의 include 기능을 쓰면 되겠다는 생각이 들었죠. 아래는 브랜디 랩스 원고에 이미지를 넣을 때 쓰는 liquid 문법입니다.{% include figure.html file="/assets/easydebug/5.png" alt="07" caption="커스터마이징한 Gnav영역" %} liquid 템플릿 엔진에서 include할 때 추가 파라미터를 전달할 수 있습니다. file, alt, caption은 파라미터로 전달하고, include되는 파일에서 전달할 내용을 바탕으로 프로그램을 구현할 수 있습니다. {{include.caption}} ▲ /_includes/figure.html이미지 사이즈 대응작은 이미지를 확대하면 이렇게 된다.대부분은 이미지는 화면에 꽉 차지만, 어떤 이미지는 사이즈가 너무 작아 원래의 사이즈로 보여줘야 했습니다.{% include figure.html width="fitcontent" border="true" file="/assets/easydebug/5.png" alt="07" caption="커스터마이징한 Gnav영역" %} ▲사이즈와 외곽 테두리 선에 스펙을 추가했다.추가 전달 인자를 넣고, figure.html 파일에서도 사이즈 대응을 했습니다. {{include.caption}} ▲완성된 /_includes/figure.html 파일figure { margin: 1em auto; } figure.percent100 { width: 100%; } figure.percent90 { width: 90%;} figure.percent80 { width: 80%;} figure.percent70 { width: 70%;} figure.percent60 { width: 60%;} figure.percent50 { width: 50%;} figure.percent40 { width: 40%;} figure.percent30 { width: 30%;} figure.percent20 { width: 20%;} figure.percent15 { width: 15%;} figure.percent10 { width: 10%;} figure.percent5 { width: 5%;} figure.fitcontent { width: fit-content;} figcaption { text-align: center; font-weight: bold; color:#999; } ▲완성된 css이제 원하는 사이즈를 지정해 이미지 상황별 적절한 대응을 할 수 있게 되었습니다.Conclusionjekyll은 브랜디 랩스를 운영하기에 아주 유용한 도구입니다. 기본 템플릿도 훌륭하지만 상황과 편의에 맞게 변경하면 개성 있는 기술 블로그를 만들 수 있을 겁니다. 물론 커스터마이징이 어려울 수 있지만 jekyll의 메커니즘을 이해한다면 금방 적응할 수 있을 겁니다. 이제 블로그를 만들 모든 준비가 끝났습니다. 자, 도전해봅시다!부록1.글 반영 과정jekyll을 이용해서 글을 작성했나요? 이제 Github 저장소에 push하면 글이 반영될 겁니다. push하는 과정을 보면 빌드된 파일을 push하는 게 아니라, 원본에 해당하는 md파일 또는 html 파일을 push하는 걸 알 수 있습니다. push하면 Github page에 바로 반영되지 않고, 몇 분 정도 걸립니다. 이것을 통해 작성한 글이 저장소에 push되면 스케줄러나 트리거에 의해 빌드된다는 걸 유추할 수 있습니다. 아마도 빌드 결과를 위한 저장소가 따로 있고, 빌드된 결과가 저장되는 것이라 예상합니다.2.도메인 연결 방법jekyll 서비스에서는 구매한 도메인을 간편하게 연결할 수 있습니다. 프로젝트의 가장 위쪽에 CNAME 파일을 만들고 push하면 금방 적용됩니다.CNAME 파일3.추가 옵션에 대하여자료를 조사하던 중에 공식 사이트의 빌드 추가 옵션을 찾았지만 0.2초 정도로 큰 차이가 없었습니다. 만약 별도의 옵션이 없다면 빌드 결과는 _site 폴더로 모일 겁니다.공식 사이트 빌드 옵션옵션을 넣어 빌드옵션을 넣지 않고 빌드참고1) GitHub - christian-fei/Simple-Jekyll-Search: A JavaScript library to add search functionality to any Jekyll blog.글천보성 팀장 | R&D 개발2팀[email protected]브랜디, 오직 예쁜 옷만
조회수 1958

영업, 이런 일도 겪어봤다(1)

 오늘은 가볍게, B2C 영업 중에 어떤 일들을 겪었는지, 개인적으로 재미있고 기억에 남았던 일들을 중심으로 소개하려고 한다. 오늘을 시작으로 가끔 생각날 때 마다 글을 쓰려고 하니, 라디오 사연 방송을 듣는 느낌으로 심심풀이 삼아 읽으면 될 것 같다.  ...물론 일본에서 겪었던 일이므로, 한국에서도 이런 일을 겪을 것이라는 건 아니다. 영업은 아주 신나고 익사이팅한 직군이다. 다만 하다보면 이런 일도 저런 일도 있는 법이니, 오해는 않으시길 바란다. 일본의 경우, 증권사에 입사해 지점에 배치받은 후 처음으로 신입사원으로서 시작하는 일은, 보통 '롤러 영업' 내지는 '신규 영업'이다. 지점의 관할 구역을  신입사원들에게 쪼개서 나누어 준 후, 정말 아무 생각 없이 1번지부터 n번지까지, 시간이 허락하는 한 무작정 벨을 누르고 나오는 사람과 대화를 해서 나의 '신규 고객'으로 만들면 되는 아주 심플한 일이다. 개인적으로는 '벨튀'와 무엇이 다른가 싶지만. 이런 밑도 끝도 없는 일을 시키는 이유는 여러 가지가 있지만, 기본적으로는 신규 고객의 지속적인 확보와 신입사원의 고객 응대 경험 축적을 위해서라고 보면 된다. 노무라 증권의 경우 50이 넘은 과장한테도 고객 확보를 위해 신규 영업을 시킨다고 하는데...증권업계 1위가 되려면 이 정도로 사람을 쥐어짜내야 하는구나. 아무튼, 시간이 시간이니만큼 어르신이나 전업주부, 자영업자를 만나게 되는 경우가 대부분이고, 한낮의 평온함을 즐기고 싶은 시간대에 예고도 기척도 없이 현관벨을 누르고 나타나는 시커먼 양복 차림의 남자...기본적으로 환영받을 수 없는 포지션이다. 이렇게 환영받지 못하는 일을 계속 하다 보면, 정말 별의 별 일을 다 겪게 된다. 지나가다가 왠지 기분좋아보이는 사람에게 말을 걸었더니 덜컥 고객이 되어준다던가, 정말 아무 기대도 안 했던, 다 쓰러져가는 허름한 집에 사는 사람이 1000억대 자산가였다던가, 현실은 때로 픽션보다 드라마틱하다는 말을 실감하게 된다. 오늘은 그 드라마틱한 일들 중에서도 특히 손에 꼽는 몇 가지를 뽑아서 소개할 생각이다.1. 최악의 타이밍 지점 배치를 받은 지 한 달이 안 되어, 도쿄도 에도가와구의 한 주택가를 방문했을 때의 일이다. 언제나처럼 골목 끝에서 끝까지 벨을 눌러가며 '저희는 그런 거 안 사요'라는 말을 듣던 차에, 작은 정원이 딸린 소박한 단독주택의 문이 활짝 열려있는 것을 발견했다. 잘 꾸며진 정원, 공들여 다듬은 듯한 정원수, 예쁘게 피어있는 정원화...이런 집은 가드닝이나 가지치기 같은 것을 화제로 삼으면 이야기가 잘 풀리는 경우가 많다. 그렇지, 돌격이다. 문 앞에서 큰 소리로 '실례합니다!'를 외치자마자 상당히 기분이 좋지 않아 보이는 초로의 여성이 얼굴을 보였다. 어...분위기가 좀 이상한데."안녕하십니까! 미즈호 증권 우에노 지점의 신입사원 '한'이라고 합니다! 이 근방을 담당하게 되어 인사 드리러 왔습니다!""네에, 안녕하세요. 그런데 지금은...""뭐? 증궈어언?!" 갑자기 집 안에서 커다란 목소리와 함께 러닝셔츠에 사각팬티 차림의 남성이 뛰쳐나왔다."우린 주식따위 사지 않으니 돌아가!""아, 그런 것이 아니라 그저 앞으로 잘 부탁드린다는 인사를 드리고자...""인사고 뭐고, 이런 시간에 방문하다니 몰상식하구만! 썩 꺼져!" 이런 시간...? 확실히 오후 2시가 영업사원이 방문하기에 좋은 시간은 아니었다. 왜냐하면, 그런 시간은 없기 때문이다. 그렇다고 그대로 꼬리를 말고 도망칠 순 없었다. 이쪽도 돈 받고 일하는 입장 아닌가."지금 시간대가 불편하시다면 편하신 시간에 다시 인사드리겠습니다. 실례가 안 된다면 언제가 괜찮으실지 여쭈어도 될런지요?""뭐? 이 자식이 어디서 장난질이야!!" 태어나서 처음 멱살을 잡혀봤다. 내심 '여기서 한 대만 맞으면 합의금 대신에 실적을 올릴 수 있지 않을까'라는 생각을 했던 것 같다. 뒤이어 '이래서 증권맨들이 욕을 먹는건가'하는 생각도 들었지만. 그 때, 옆에서 불쾌한 표정을 짓고 있던 여성이 말을 시작했다."봐봐, 당신의 이런 다혈질에 과격한 모습이 잘못된 거라고 아까부터 얘기했잖아요!""그러니까 42년을 같이 살아놓고 이제와서 이혼이라는 게 대체 무슨 소리냐고!" ...그랬다. 둘은 부부싸움 중이었다.  그것도 아주 심각하고, 무거우며, 부부생활의 종지부를 찍느냐 마느냐 하는 주제로. 핏대를 올리며 2라운드를 시작한 노년의 부부를 남겨두고 나는 최대한 조용히, 기척 없이, 들키지 않도록 사라져야만 했다. 이후 다신 그 집 근처에도 얼씬거리지 않았지만, 모쪼록 잘 화해하셨길 빈다.2. 무엇을 도와드릴까요? 무더운 여름날, 역시 에도가와구의 '신 코이와'라는 역을 중심으로 신규 영업을 돌 때의 일이다. 신규 영업을 할 때는 기본적으로 그 때 그 때 회사에서 판매하는 신규 채권 상품이나 펀드 상품의 홍보물을 잔뜩 들고 돌아다니는데, 벨을 눌러서 반응이 없으면 우편함에 넣어놓기도 한다. 어떻게든 조금이라도 고객을 늘릴 가능성을 높이려는 방법이지만, 가끔 지점에 돌아갈 시간이 가까워졌는데 이 자료가 생각보다 많이 남게 되는 경우가 간혹 생긴다. 나의 경우, 그럴 때는 주변의 맨션이나 아파트에 들어가 닥치는 대로 우편함에 한 장씩 넣는 식으로 소비를 다 한 후 회사에 복귀하는 편이었다. 그리고 그 날은 이 '찌라시'가 화근이었다. 에도가와구 외곽의 허름한 아파트(일본의 '아파트'는 싸구려 집단주택을 의미한다) 우편함에 홍보물을 쑤셔넣고 돌아서는 찰나, 반대편 골목에서 왁자지껄한 소리가 나는 것을 발견했다. 사람 두 명이 나란히 설 수 있을까 말까한 좁은 골목이었는데, 즐거운 연회를 하는 듯한 소리가 나는 것이다. 거기다 골목 입구에는 차양을 쳐서 안쪽이 안 보이도록 해놓고, 고기 굽는 냄새도 좀 나는 것 같고. 야 이거, 동네 사람들이 작은 파티라도 하고 있나보구나. 이렇게 분위기가 달아오른 상황에 슬쩍 끼어들어 고기 한 점, 잘하면 못 이기는 척 술 한 잔도 얻어먹고, '신입사원인데 사정이 여의치 않아 고생이 많습니다'하면서 동정표를 좀 사면 되겠구나, 하는 생각이 번개같이 떠올랐다. 일부러 옷차림을 좀 흐트러뜨리고, 젤을 발라 넘겨놓은 머리도 살짜기 헝클어 놓고, 최대한 불쌍한 표정으로 '찌라시' 한 장을 손에 쥐고 골목 앞을 어슬렁거리며 동태를 파악하기 시작했다. 그 때였다."무슨 일이쇼? 뭐 도와드릴까요?" 골목 차양이 걷히더니 웃통을 벗어제친 남자 한 명이 걸어나왔다. ...온 몸에 문신을 새긴. 분명히 오른손에 들고있던 게 고기 굽는 집게였던 것 같은데, 왜 그게 회 뜨는 칼처럼 보였는지는 아직도 의문이다. 0.1초도 안 되는 찰나에 많은 생각이 지나갔다. 일단 오른손에 든 홍보물을 살살 구겨 뒷주머니에 쑤셔넣었다. 변명은 궁색했다. 아니 궁색할 수 밖에 없었다. 그런 상황을 접해보면 느끼겠지만, 마동석같은 인상에 체격은 한 둘레쯤 더 큰 데다가 오른팔에 잉어가 파닥거리고 왼팔에 용이 꿈틀거리는 사람을 갑자기 맞닥뜨렸는데 제대로 된 말이 나오는 게 더 이상한 것이다. 하지만 여기서 세상에 하직인사를 할 순 없었다."아, 그, 영어...ㅂ이 아니라, 그, 뭔가 즐거운 듯한 분위기가 느껴져서...하하하하하하""아, 저희 식구들끼리 고기 좀 구워먹고 있었습니다 핫핫핫. 근방에서 못 보던 분 같은데, 영업 도는 분이신가? 미즈호?" -자켓 라펠에 회사 휘장을 단 것이 이토록 후회되는 순간이 있었던가."아, 예, 네. 미즈호....증권입니다.""오오, 미즈호는 우리같은 극도를 걷는 놈(야쿠자가 스스로를 칭하는 명칭)들한테도 돈을 빌려주고, 아주 좋은 회사지. 고기 한 점 먹고 갈랍니까?" -이놈의 회사는 왜 야쿠자한테 돈을 빌려줘서 뉴스 첫 머리에 나고 XX이야!"아하하하하....사실 제가 회사에 곧 들어가야 하는지라, 이거 죄송합니다. 다음에 꼭 인사드리겠습니다.""그래요? 아 여기 버스 잘 안 다니니까 저쪽으로 나가시면 됩니다. 다음에 또 오쇼." ...인정한다. 솔직히 비굴했다. 하지만 가치있는 비굴함이었다. 일단 살고는 봐야하지 않겠는가. 무슨 게임 속 주인공도 아니고 거기서 당당하게 버팅겨서 내가 얻을 것이 무엇인가. 내 선택은 옳았다고 생각한다. 내가 가오가 없지 돈이 없나. 아 둘 다 없구나. 일본은 야쿠자, 마피아 등과 관련된 인물을 '반사회적 집단'으로 규정하고, 일체의 금융거래를 할 수 없도록 법으로 지정하고 있다. 계좌를 개설할 때 이런 사람인지 아닌지 체크하는 시스템이 있는데, 여기서 얼럿이 뜨면 'Yellow' 지정으로 분류되어 개설이 중단된다. 몇 년 전, 우리 계열사였던 미즈호 은행에서 이런 야쿠자들에게 조직적으로 돈을 빌려준 게 적발되어 아주 큰 사회문제가 되었던 일이 있었다. 그게 날 살린 건지, 죽일 뻔 했는지, 아직도 잘 모르겠다.3. 10년만 일찍 만났더라면... 입사 2년차, 슬슬 선배의 선배, 그 선배의 선배들이 쌓은 고객들을 조금씩 물려받는 시기가 왔다. 뭐 그래봤자 대부분 트러블로 거래가 끊겨있거나, 주소불명으로 되어있거나, 뭐 하여간 쉬운 일이 하나도 없는 그런 고객들이지만, '벨튀'를 안 한다는 것만으로도 충분히 가치있는 일이다. 이 분들은 여러 이유가 있어 거래를 끊은 고객들이라 보통은 쉽게 만나주지도 않는다. 수십 번을 통화해서 사정사정해야 한 번 만나줄까 말까. 그렇다고 거래를 다시 터주는 것도 아니다. 할 테면 해보라는 증권사의 육성 방식, 이제와서 말하지만 이거 참 사람 힘들게 뽑아놓고 다 버려놓는 일이다. 여튼, 내가 물려받은 고객은 72세의 여성이었다. 아무 기대 없이 전화를 걸었는데, 의외로 대응도 상냥하게 해주시고, 내 소개도 관심있게 들으시고...당장 만나서 인사를 드리겠다고 했다. 물론 흔쾌히 승낙을 하셨다. 이야 이거 한 건 했구나. 케이세이 전철역 근처에 사신다고 했다. 마침 지점이 우에노이니 그리 멀지 않고, 금방 갈 수 있겠다고 생각했다. 그런데, 갑자기 이런 말씀을 하신다."시집도 안 간 여자 집에 젊은 남자가 들락거리는 거...남사스러우니 전철역에 있는 카페에서 만나기로 해요.""네? 아...예. 알겠습니다. 근처에서 전화드리겠습니다." 뭐 확실히 배우자가 계신 건 아니었고, 고객님이 그렇게 생각하신다는데 '아닙니다, 댁에서 말씀드리겠습니다'라고 말할 이유도 없는 일이다. 고객이 편안하게 느끼도록 해주는 것도 영업직의 업무 중 하나 아니겠는가. 그렇게 전철역으로 향했다. 실제로 만나뵌 고객님은 아주 온화한 인상에, 성격도 매우 좋은 분이었다. 인사드리는 김에 가져간 펀드상품에 대한 설명도 관심있게 잘 들어주시고, 최근 고민 얘기도 하시며 상당히 밀도있는 대화를 하셨다. 솔직히 왜 이런 좋은 고객을 내게 물려주었는지 하는 의문마저 들었다. 그 분이 내 손을 지그시 쥐고 그윽한 눈빛으로 날 바라보기 전까지는. 분위기가 묘하게 흘러가기 시작했다. 그러고보니 왜 집앞 카페에 나오는데 저렇게 악세사리며 화장이며 옷차림까지 엄청나게 신경쓰고 오셨는지 잠깐 생각했던 게 떠올랐다. 그래도, 집 앞 슈퍼에 갈 때도 풀 메이크업하고 머리까지 세팅하고 가는 사람들, 있지 않는가. 그런 분이겠거니, 수줍음이 많으시겠거니 했다. 여자 집에 젊은 남자 운운하신 것도 사생활을 밝히고 싶지 않다거나, 집 정리가 잘 안 되어 있다거나, 뭐 그런 거겠거니 생각했었다. "한 군은 정말 친절하고 좋은 사람인 것 같아요. 이런 컨설턴트가 내 담당자가 되어줘서 나 너무 기뻐." "아...저...손이....그, 아니, 네...기뻐해 주신다니 저도 기쁘네요..." "정말? 사실 이 나이가 되도록 시집도 안 가고 혼자 살다보니 같이 이야기할 사람도 없고, 많이 외로워요. 이 근방에 자주 와? 전화해주면 내가 집이 요 근처니까 바로 나올게. 종종 들러서 얘기도 하고, 같이 맛있는 것도 먹어요. 응?" "......그....아.....네...노력하겠습니다..." 노력은 대체 뭘 노력하겠다는 건지. 갑자기 집에서 '우리 아들 일본 생활 잘 하고 있을까'하며 걱정하던 엄마가 너무너무 보고 싶어졌다."이 상품, 안정형 펀드라고 했나? 일단 200만엔 정도 사고싶어. 나 이 나이 먹도록 혼자 살아서 돈은 정말 쓸 데도 없고, 우리 한 군 실적이나 올려줘야지. '수익'이 괜찮으면 3천만엔 정도 더 살까봐요.""아, 예. 좋은 상품입..그..저기 제 허벅지에...손이..." 왜 '수익'이란 단어에 묘한 눈빛으로 힘을 주면서 내 허벅지께에 손을 올리시는 건가. 입술은 또 왜 핥으시는 건가. 청운의 꿈을 품고 일본으로 건너가기 전날, 묵묵히 담배를 피우시다가 '일본 놈들한테 지지 마라.'라고 툭 던지며 나름 애정을 표현하셨던 아버지 얼굴은 또 왜 떠오르는지. 아버지, 아들이 지금 뭔진 모르겠는데 인생의 엄청난 위기를 맞고 있습니다. 제발 도와주세요..."나...나이 먹은 게 너무 후회돼. 한 군이랑 10년만 일찍 만났더라면 좋았을텐데." 그 때가 2015년이었으니 10년만 일찍 만났으면 그 분은 62세, 나는 19세. 미성년자다."아.........감사합니다..저기 저는 죄송하지만 다른 고객님과 약속이 있어서...""어머, 바쁜 사람 붙잡고 내가 너무 오래 얘기했나봐요. 미안해요. 그런데 이 펀드, 정말 좋은 상품이라면 한 500만엔 정도 살까봐.""아...그 제가 목론견서라고 하는 아주 중요한 자료, 그, 상세 설명을 하려면 꼭 고객님께 전달해야 하는 아주 중요한 자료를 건네드려야 해서요. 이 이상 설명을 드리기 위해서는 그 자료가 꼭, 절대로 필요합니다. 다음에 그 자료를 드리고 다시 찾아뵙겠습니다." 내 인생 최고의 거짓말이었다. 목론견서는 고객에게 꼭 전달해야 하는 자료가 맞지만, 150페이지가 넘는 책으로 되어있어서 그냥 전달만 하면 되는 서류이다. 그리고 사실 펀드는 목론견서가 없다. 하지만 그 날의 나에게는 실제로 존재해야만 하는, 아니 존재하는 서류였다. 사람이 식은땀을 이렇게 흘릴 수가 있구나, 나는 그 때 처음 알았다. 물론 그 뒤로 그 고객과의 일을 설명하고 여자 동기로 담당자를 교체했지만, 아직도 못마땅한 얼굴로 날 바라보며 야멸차게 이 말을 내뱉던 그 때의 상사가 기억난다."실적을 내려면 적당히 기분 맞춰주면서 고객하고 어울릴 줄도 알아야지. 근성이 없어, 자네는." 과장님, 그거 어울리다간 뉴스에 날 것 같았습니다. 전 증권사 영업맨이지 가부키쵸 호스트가 아닙니다. 지금까지 늘어놓은 3개의 경험담은, 아주 놀랍게도, 한 치의 과장이나 거짓이 섞이지 않은 있는 그대로의 사실이다. 대화의 디테일한 부분에서 조금씩 기억나지 않는 부분들도 있지만, 내 인생에서 너무나도 선명한 경험이었기에 거의 모든 부분을 세밀하게 기억하고 있다. 인간의 기억력이란 참으로 오묘한 것이다. 이렇듯, 영업 일을 하다보면 정말 별 일을 다 겪게 된다. 나중에 시간이 되면, 생각나는 대로 2편을 적어보려고 한다. 이것 또한 하나의 '커리어'라고 할 수 있으니까... 3번의 고객님을 떠올리니 갑자기 독한 소주를 마셔야 할 것 같은 기분이 든다.#더팀스 #THETEAMS #영업 #경험공유 #고생담 #실패담
조회수 1530

iOS Graphic Interface 살펴보기 (1/2)

1.intro: 애정하는 iOS, 애증의 Xcode프론트엔드 개발자가 가장 기쁠 땐 언제일까요? 여러 가지가 있죠. 직접 만든 스무스한 애니메이션을 볼 때, 고생해서 작업한 하드코어 고난도 레이아웃이 잘 작동할 때, 작업한 화면을 사람들이 ‘예쁘다ʼ고 말해줄 때 등등. 그러므로 iOS는 모든 프론트엔드 개발자가 동경하는 OS라고 말할 수 있습니다. 대부분의 굵직한 Transition들을 알아서 Animate해주고, 프레임레이트가 복잡한 레이아웃 효과도 부드럽게 표현해주기 때문에 ‘예쁘다ʼ, ‘쾌적하다ʼ는 말이 절로 나오는 OS이기 때문이죠. 물론 그만큼 손도 많이 갑니다. 사실 iOS는 신기한 점이 많습니다. Xcode를 사용하다 보면 Interface Builder에서 ctrl+드래그를 사용하여 Code로 Reference를 가져오는 방법부터 String값으로 찾아가는 Xib/StoryBoard 파일까지.. 다른 플랫폼 및 IDE에서는 겪어보지 못한 새로운 경험들을 만나죠. 덕분에 다년차 개발자의 멘탈도 Xcode-iOS를 만나면 탈탈 털립니다. 시간이 지나면 이 독특하고도 불편한 Xcode를 사랑하고, 저주하는 상황까지 생깁니다.그래서 오늘은 많은 iOS 루키들이 겁내고 괴로워하는 iOS의 Graphic Interface를 살펴보고자 합니다. 맨땅에 헤딩할 때 헬멧이라도 쓰고 있으면 그나마 덜 아프니까요.2.Point, PixelAndroid에서는 다양한 기종의 스크린을 지원하기 위해 자체적으로 dp라는 수치 개념을 만들어 사용합니다. 파편화된 디바이스들을 모두 지원하는 레이아웃을 구성하려고 고안한 효율적인 방법이죠. iOS에도 이와 같은 개념이 있습니다. 바로 포인트(Point)인데요. Xcode의 ImageAsset 파일을 열면 이런 것을 찾을 수 있습니다. 1X, 2X, 3X바로 이 화면에서 볼 수 있는 1x,2x,3x라는 문구가 포인트 개념을 설명하고 있습니다. 포인트는 디바이스의 물리적 픽셀을 2배, 3배로 압축해 사용하는 iOS 만의 독특한 단위입니다. 이 개념이 처음 쓰인 건 iPhone 4, 즉 레티나 디스플레이가 등장하면서부터 인데요, 기존의 iPhone 3Gs와 물리적 화면 크기는 동일한데, 4배의 픽셀 수를 가지는 레티나 디스플레이에 기존의 앱들을 그대로 보여주자니 픽셀 단위로 정의된 기존의 모든 이미지/레이아웃이 절반 크기로 줄어드는 문제가 발생했습니다. 따라서 별도의 작업 없이 디스플레이하기 위한 방법으로 고안된 게 바로 포인트입니다.포인트는 픽셀을 2배, 3배로 압축해 1포인트라는 단위로 규정하고, 그 단위를 Nib(Xib) 에디터 및 개발 과정에서 사용합니다. 앞으로 여러분이 iOS 개발을 하면서 접할 기본 단위는 바로 포인트가 될 겁니다. 2X 혹은 3X는 단어는 픽셀을 2배, 3배로 압축했다는 의미입니다. 개발자의 편의를 위해서 만들어진 개념이 오히려 개발자에게 혼동을 주는 아이러니한 상황이 펼쳐졌습니다. 사실 이 픽셀-포인트의 개념이 처음 등장했을 때는 꽤 편리했을 겁입니다. 당시만 해도 iPhone4와 iPhone3Gs의 해상도를 구분하지 않고 작업할 수 있는 획기적인 방법이었으니까요. 하지만 지금은 iPhone5, iPhone7 Plus, iPhone X 등 다양한 장비들이 등장했습니다. 그래서 iOS 개발자는 포인트를 단지, 픽셀의 또 다른 이름처럼 느낄 뿐입니다. 애플도 자신들이 이렇게 다양한 해상도의 iPhone을 출시하게 될 줄은 몰랐을 겁니다.애플의 해상도 춘추전국시대 / 출처: paintcodeapp3.Storyboard, Nib (Xib)iOS UI 디자인의 꽃이 무엇인지 묻는다면 그것은 단연 Storyboard와 Xib일 것입니다. Storyboard는 기획자들이 사용하는 그것과 유사한 개념입니다. 하나의 큰 틀에 화면 단위로 여러 장의 기획안을 놓고, 그것들의 시퀀스를 한 눈에 알아볼 수 있도록 하는 보드입니다.Storyboard는 Segue와 같은 시퀀스 설정을 직접 할 수 있고, 연결된 하나의 Flow를 시각적으로 펼치기 좋습니다. 프로토타이핑을 위한 적절한 툴인 셈이죠.UIStoryboard 예시 - 브랜디 iOS의 Main StoryboardNib(혹은 Xib, 이하 Xib로 지칭)는 조각조각 단위의 화면이나 재활용을 많이 하는 CollectionViewCell 등의 화면 작업에 적합합니다. 이 점이 Storyboard와는 다르죠. (CollectionViewCell에 대한 자세한 포스팅은 여기를 클릭하세요.)물론 Storyboard에서 할 수 있는 작업은 대부분 Xib로도 가능하지만, 각각의 용도를 다르게 해서 사용하는 경우가 많습니다. 예를 들어, 브랜디 iOS 프로젝트는 Storyboard에선 큰 틀의 화면을 다루고, Xib에서는 CollectionView Cell과 ReusableView, Custom Component등을 다루고 있습니다. UICollectionViewCell.xibStoryboard와 Xib로 인터페이스 작업을 할 때는 파일의 컨텐츠가 너무 비대해지지 않도록 조심해야 합니다. Storyboard가 비대해지면 많은 작업자가 동시에 파일을 수정할 수도 있는데, VCS를 사용하면서 Storyboard나 Xib 파일의 충돌이 발생하면 병합하는 과정이 매우 고통스럽습니다. 그러므로 Storyboard는 서로 충돌하지 않도록 더 큰 그림을 그리고, 해당 Storyboard를 Senior 개발자가 관리할 수 있도록 안전장치를 두도록 합시다. 야 이거 소스 건드린 사람 나와 Storyboard와 Xib는 기본적으로 XML 기반의 파일입니다. 혹시라도 충돌이 발생하면 UI로 확인이 불가능하기 때문에, Xcode에서 해당 Storyboard, Xib 파일을 우클릭한 후 Open As > Source Code 메뉴를 클릭하면 XML 형식으로 브라우징할 수 있습니다. 해당 충돌 부분을 찾아가서 수정하고 다시 확인하면 UI로 볼 수 있습니다.소스코드로 스토리보드 보기4.From Storyboard, to CodeStoryboard와 Xib에서 구현한 컴포넌트들을 ViewController의 SourceCode에서 다룰 일이 분명 생길 겁니다(언제나 그렇죠). 그럴 땐 Outlet이라는 개념을 이용해서 Storyboard 와 SourceCode를 연결하는데요.네, 코드가 아닙니다. 포토샵하는 기분으로 ctrl + 마우스 좌클릭 드래그를 해주시면 됩니 다. 이 기능은 다른 IDE에서 보기 힘든 건데요. 나름 쓸만합니다. 익숙해지면 여러 가지 컴포넌트, 유닛들을 Outlet으로 처리할 수 있습니다. 코딩을 자유롭게 할 수도 있고요. 예를 들어, LayoutConstraint를 Outlet으로 처리하면 해당 Constraint를 코드 시퀀스에 따라 자유자재로 변경할 수 있게 되는 것처럼 말이죠.물론 이보다 선행되어야 할 작업은 Storyboard에서 해당 ViewController가 연결될 ViewController를 지정하고, 해당 ViewController의 파일을 미리 만들어야 합니다.5.Extraction of ViewControllerStoryboard에서 ViewController A를 연결했는데, ViewController B 에서 ChildViewController로 ViewController A 를 사용하고 싶다면 어떻게 할 수 있을까요? (간장공장공장장) 당연한 이야기지만 코드를 통해 구현 가능합니다. 필요한 것은 Storyboard 파일명과, Storyboard에서 미리 지정한 ViewController A 의 Identifier, 두 가지입니다. Storybo/rd에서 ViewController A를 연결했는데, ViewController B 에서 ChildViewController로 ViewController A 를 사용하고 싶다면 어떻게 할 수 있을까요? 당연한 이야기지만 코드를 통해 구현 가능합니다. 필요한 것은 Storybo/rd 파일의 이름과, Storybo/rd에서 미리 지정한 ViewController A 의 Identifier, 두 가지입니다. instantiateViewController From Storyboard/**  현재 화면에 디스플레이중인 UIWindow 객체로부터 UITabBarController를 반환받는 메  소드  - parameter window: UIWindow  - returns: UITabBarController */ fileprivate func tabBarControllerFromStoryboard() -> BRTabBarController {  let storyBoard = UIStoryboard(name: "mainStoryboard", bundle: nil let viewController = storyBoard.instantiateViewController(withIdentifier: "mainTabBarController") return viewController as! BRTabBarController  // 잘못된 viewController를 추출한 경우 nil exception } 비슷한 방법으로 Xib에 작성된 View도 추출할 수 있습니다. Xib파일 하나에 여러 View가 정의되어 있다면, 각각의 View를 필요에 따라서 사용할 수도 있습니다.Extraction From Xiblet nib = UINib(nibName: NSStringFromClass(BRDropdownSelector.self) let components = nib.components(separatedBy: ".").last!, bundle: nil) let view = components.instantiate(withOwner: nil, options: nil).last as! BRDropdownSelector  // 잘못된 view를 추출한 경우 nil exception 6.LayoutConstraints For Flexible UI더 유연한 레이아웃 동작을 원한다면, Static하게 선언된 수치보다는 LayoutConstraint로 제한적 범위 안에서 유동적으로 동작할 수 있도록 View를 주물러 주는 게 좋습니다. 예를 들어, 어떤 두 컴포넌트 사이의 최대 너비를 100으로 지정하되, 컨텐츠 사이즈에 따라 더 작아질 수도 있도록 하려면, LayoutConstraints의 Less than or Equal기능을 사용하는 것처럼 말이죠.Less than or equalLess than or Equal뿐만 아니라 Greater than or Equal도 존재합니다. 상황에 맞게 사용하는 지혜가 필요하죠. LayoutConstraint에는 Multiplier라는 개념도 있습니다. 만약 컴포넌트 A 절반 너비의 컴포넌트 B를 작성하고 싶다면, 그리고 이 조건이 화면 크기와 관계없이 동일하게 적용되기를 원한다면, 컴포넌트 B의 너비를 컴포넌트 A와 동일하게 Constraint로 지정하고, Multiplier를 0.5로 지정하면 됩니다. Multiplier는 단어 그대로 ‘배수ʼ라는 의미입니다.이처럼 화면 해상도에 구애받지 않는 유연한 UI를 작성하고 싶다면 LayoutConstraint 의 사용은 필수입니다. 브랜디 iOS 앱이 다양한 해상도의 iOS 디바이스에서 동일한 비율 로 출력되는 것도 이러한 LayoutConstraint를 사용했기 때문이죠.7.View를 핸들링할 그곳앞서 정리한 방식들을 사용해서 Storyboard, Xib 파일을 훌륭하게 작성했다면, 이제는 ViewController의 소스코드로 돌아올 차례입니다. View Size를 이벤트에 따라 변경하거나, 숨겼던 View를 보여주는 등의 작업들을 할 차례입니다.Storyboard나 Xib에서 작업한 View를 코드 상에서 다룰 일은 많습니다. 99.78% 이상 ViewController에서 View를 다루어야만 하죠. 무조건입니다.viewDidLoad() 에서 View는 대부분의 초기화 작업을 합니다. 그것은 소스코드를 다루는 개발자에게도 마찬가지죠. Storyboard에서 연결한 Outlet들도 이 Function에서부터 nil값이 아니게 됩니다. 따라서 뷰에 필요한 초기화 작업 (Button의 Title 지정, ImageView의 이미지 지정 등) 을 viewDidLoad()에서 모두 하면 됩니다. viewDidLoad()는 그 이름처럼 ViewController가 생성되었을 때 단 한 번 호출됩니다. 다시 거치지 않는 코드이기 때문에 ViewController에서 사용할 변수들을 초기화하는 등의 작업도 이 자리에서 할 수 있습니다. viewDidLoadoverride func viewDidLoad() {      super.viewDidLoad()     /* do 초기화 in 여기 */ } 다만 여기서 아무리 해도 안 되는 작업이 있습니다. View 사이즈를 해상도에 맞게 변경하는 작업 같은 것 말이죠. LayoutConstraint를 통해 지정된 사이즈를 가져올 때, 화면을 꽉 채우도록 Constraint를 지정해도 로그를 찍으면 엉뚱하게 더 적은 값 이나 큰 값이 나올 수도 있습니다. 이런 경우에는 아무리 viewDidLoad()에서 열심히 Constraint의 값을 가져와도 결과가 똑같을 겁니다.개미지옥override func viewDidLoad() {      super.viewDidLoad()     // 백년동안 코딩해도 화면 해상도가 다르게 나와요 } viewWillAppear() 에서는 viewDidLoad()에서 작동하지 않던(?) 코드를 적용할 수 있는 자리입니다. Constraint들로 지정된 사이즈들은 viewWillAppear()에서부터 각 디바이스의 해상도에 맞게 적용됩니다. 여기서부터는 화면 크기에 맞춘 SubView들의 사이징이나 Constarint들로부터 추출한 값이 의미가 있습니다.viewWillAppearoverride func viewWillAppear() {     super.viewWillAppear()     // 이제 아마 화면이 나올 차례인가봐요 } viewDidAppear()는 출력된 화면에 실행할 코드를 작성하는 자리입니다. 화면이 등장한 이후 보여줄 팝업창이나, 튜토리얼을 출력하는 건 여기서 해야 합니다. viewWillAppear()는 예상되는 출력 화면에서 호출되기 때문에, 실제로는 화면이 없는 상황에서도 호출될 수 있습니다. 만약 해당 viewController의 출력이 확실히 완료된 후 에 실행되어야 하는 이벤트라면, 이 Function에서 코드를 작성해야 합니다. viewDidAppearoverride func viewDidAppear() {     super.viewDidAppear()     // 화면 출력이 끝났답니다. 마음껏 코딩하세요! } 네, 지금까지 루키들을 위한 GUI 만들기의 기본 과정은 다 알려드렸습니다. 많은 개념과 기능, 방법론이 존재하지만 일단 이 정도면 알아도 첫 번째 iOS 앱 UI를 만들 준비는 어느 정도 마친 겁니다. 그럼 마지막으로 UI를 구성하면서 유용하게 사용할 수 있는 팁을 알려드리겠습니다. 8.Little Tricks1) Clip it, or not Clip it.ImageView를 다루다 보면 자주 발생합니다. 지정된 ImageView의 사이즈보다 이미지가 크면 이미지가 ImageView의 영역을 빠져나가버리는 건데요. 이것은 Label이나 View에서도 동일합니다. 작성한 컨텐츠가 부모 View보다 큰 경우 부모 View의 프레임을 벗어납니다. 이런 경우, 재부팅하세요. clipsToBounds 값을 true로 지정해주면.. view.clipsToBounds = true 매-직! 이 작업은 코드뿐만 아니라 Storyboard상에서도 가능합니다. Xib에서도 동일합니다. Storyboard에서 클리핑2)Circular View요즘 많이 사용하는 동그라미 모양 프로필 이미지 때문에 고생하는 고심하는 개발자들이 많을 겁니다. iOS에서는 이 작업을 view의 Layer를 편집하는 방식으로 아주 간단하게 처리할 수 있습니다.self.layer.cornerRadius = self.frame.size/2.0 self.layer.masksToBounds = true self.clipsToBounds = true 위의 코드를 사용하면 아래와 같은 이미지를 출력할 수 있습니다.둥글게 클립핑된 최신 트렌드의 ImageView를 간단하게 출력했습니다. 물론 위에서 언급한 clipsToBounds 값을 true로 지정해주는 것도 잊지 마시고요. 이 코드를 응용하면 모서리가 둥근 직사각형 뷰도 만들 수 있습니다. 원하는 곡률을 적용할 수 있죠. view의 Layer를 다루는 방법을 공부한다면 다양한 상황에서 유용하게 사용할 수 있을 겁니다.3)NSAtrributedString 클라이언트가 다양한 형태의 Font, Color의 텍스트를 한 문장에 넣어달라고 한다면 어떻게 작업해야 할까요? 스타일마다 Label 묶음을 만들어서 각각의 단어를 지정해주는 방법이 있습니다. 하지만 텍스트 또는 문장 구성이나 스타일이 서로 다른 묶음으로 변경된다면 어떨까요? 또 다시 새로운 기준으로 Label 묶음을 만들어야 할까요? 이럴 때 사용하기 좋은 녀석이 바로 NSAttributedString입니다. 볼드체, 보통체가 혼합된 텍스트에 색상이 다른 텍스트가 혼재되어 있는 Attributed String이렇게 다양한 형태의 텍스트를 한 문장에 담을 수 있고, 변경되는 내용이 있더라도 코드로 간단하게 수정하면 됩니다. 브랜디 앱에서도 NSAttrributedString을 많이 사용하고 있습니다. 브랜디 iOS 앱의 간지나는 UI 속 요소요소를 차지하고 있는 중요한 녀석이죠. 4)Debug Wirelessly 각종 케이블이 난잡하게 널부러진 책상을 보면 한숨이 나옵니까? 걱정하지 마세요. 이제 하나는 줄일 수 있을 겁니다. Xcode로도 무선 디버깅을 할 수 있기 때문이죠. 먼저 디바이스를 맥에 연결하고, Xcode가 활성화된 상태에서 Window > Devices And Simulators 항목을 클릭합니다. Devices and Simulators그런 다음 출력된 화면에서 원하는 디바이스를 선택하고 Connect via Network를 체크 합니다. (디바이스에 암호가 설정되어 있어야 합니다.) 지구본 모양이 디바이스 오른쪽에 있다면 무선 디버깅이 가능한 상태입니다. 무선디버깅체크9.Outro: 긴 글을 마무리하며아장아장 걸음마 시절이던 첫 개발 프로젝트 작업이 생각납니다. 클라이언트는 끝도 없이 요구를 하는데 구현하는 방법을 몰라 막막했던 적이 많았습니다. 여러 실수를 겪고 나서야 많은 것을 알게 되었죠. 그때를 생각하면 이제 막 iOS 개발을 시작하는 분들께 하나라도 더 도와주고 싶답니다. 지금 막 iOS 개발자가 되었나요? 그렇다면 이 포스팅은 분명 당신의 검색 한 번, 실수 한 번을 줄여줄 수 있을 겁니다.글이정환 과장 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발자 #개발팀 #인사이트 #경험공유 #iOS
조회수 1249

빠르게 성장하는 옐로모바일, 이익을 내는 기업이 되자

CFO인터뷰어제 옐로모바일의2015년 실적 발표가 있었죠.약3,200억원의 매출과470억원의 영업손실을 기록하며 한 해를 마무리했는데요,연 단위의 적자이긴 했으나 마지막4분기에 매출1,000억원과 소폭이지만 영업이익 흑자전환을 이루어낸 것에 대해서는 긍정적인 여론이 형성되고 있는 것 같습니다.국내외 다양한 유니콘 및 독보적 스타트업들이 수익성 확보에 어려움을 겪고 있는 것을 감안할 때,이 정도 규모의 분기 매출 및 흑자전환은 옐로모바일의 재무 성장성 및 건전성에 대해 새로운 시각을 갖게 하는 기회가 될 수도 있을 것 같다는 생각이 들었는데요,이와 관련하여 이상훈CFO와 간단하게 몇 마디 나누어 보았습니다.드디어 분기 영업이익이 흑자로 돌아섰는데요,감회가 새로우시겠어요.하하 실은 예상된 시나리오대로 진행 중이라 실적에 대한 긴장과 감동이 있지는 않습니다만, 그래도 영업적자대신 영업이익이라는 단어를 쓰게 되니 기분은 좋네요 :) 많은 분들께서 잘 모르고 계시는 사실이 있는데요, 옐로모바일은 2014년 상반기까지 영업이익 흑자를 기록하던 회사입니다. 2014년 하반기부터 사업 규모 확장 및 성장 촉진을 위해 다방면의 투자를 시작했고, 2014년 포메이션8 (Formation8)의 투자 이후 2015년 상반기에는 투자 규모를 보다 확대했죠. 이로 인해 2014년과 2015년 각각 영업손실로 한 해를 마무리하긴 했지만,애당초 옐로모바일은 수익을 충분히 낼 수 있는 체력을 확보한 상태였습니다. 수익의 규모를 늘리는 것이 관건이었죠.특히 이번 2015년 연말 실적은 3분기까지 회사 자체적으로 진행했던 가실적 발표가 아닌 금융감독원이 지정한 지정 감사인의 공신력 있는 감사를 통과한 성과라 더 의미가 있습니다. 감사인의 판단 기준에 따라기존 발표내용보다 분기별 영업손실 기준이 조정되어 4분기 영업이익이 20억원대 후반 수준까지 갈 수 있었는데 가지 못한 점은 좀 아쉽지만요.그럼2016년은 영업이익 흑자를 기록할 수 있을 것으로 보시나요?물론입니다. 2015년 투자의 많은 부분이 쿠차에 집행되었는데,쿠차는 이미 월 단위의 흑자전환을 이루었고,계속해서 성장할 플랫폼입니다.또 다른 집중 투자 대상이 미디어 사업을 이끌고 있는 피키캐스트인데,피키캐스트는 올해부터 본격적으로 수익화를 준비하고 있습니다.올 해 안에 연 단위의 흑자 달성은 무리일 수 있지만,적어도 연 내에 월 단위의 흑자는 낼 수 있을 것으로 기대하고 있습니다.이에 더해 광고,여행, O2O사업은 원래도 흑자를 내 온 사업들이기에, 2016년은 무리 없이 연 단위의 영업이익 흑자를 기록할 것으로 예상되며, 2017년이 되면 다섯 개 사업 그룹 모두가 각자 흑자를 달성할 것입니다.그렇군요.그럼 조금 다른 방향에서 질문을 드려볼까 합니다.실은 옐로모바일은 아직 스타트업이고 비상장사인데,왜 이익을 내는데 집중하고 계신가요? 여타의 주목받는 스타트업들도 아직 적자를 기록하고 있는 것으로 알고 있지만 여전히 이익보단 성장에 초점을 맞추고 있는 것 같은데 말이죠.저희가 이익에만 집중하고 있는 것은 절대 아닙니다.성장하는 회사에게는 어찌 보면 매출 성장(Top-line Growth)이 더 중요할 수 있고,그렇기에 저희도 지속적으로 외형적 성장을 이어가고 있습니다.네이버, 카카오, 옐로모바일의 2015 분기별 매출 비교다만,결국 외형적 성장의 끝에 있는 목표는 수익이죠. 국내의 주요 스타트업들 역시 궁극적으로 훌륭한 수익 기반을 마련하기 위해 전략을 수립하고 실행하고 있을 것이라 생각합니다.유니콘의 단계를 넘어선 기업이 수익성을 확보하지 못했을 때 생기는 문제가 조금씩 드러나고 있는 곳이 오늘날의 실리콘밸리인 것 같아요.최근 타임지(TIME)에서도트위터(Twitter)의 수익성 문제를 지적한 적이 있죠.트위터는 상장 이전에 이미4억 달러 이상의 누적 적자를 기록하고 있었고,상장 이후 상황이 극적으로 호전되지 못하고 있는 실정입니다.최근3년 연속 영업손실을 기록하고 있죠.옐프(Yelp)역시 고전을 면치 못하고 있는데요, 2015년4분기에2,200만 달러의 적자를 보이며 네 분기 연속 적자를 기록,주가 관리에 어려움을 겪고 있습니다.물론 상장사이기 때문에 이러한 문제에 더 노출되어 있는 것은 맞습니다.그렇다고 해서 비상장 기업이 성장을 위해 수익성을 간과해도 된다고 생각하지는 않습니다.제가 꼭CFO여서 그러는 것이 아니라,안정적인 수익에 기반하여 성장할 수 있는 회사가 가장 이상적이지 않을까요?그런 의미에서 옐로모바일은 오늘도 성장과 수익이라는 두 마리 토끼를 잡는 쉽지 않은 길을 계속해서 걸어가고 있습니다.기업의 존재 이유가 이윤 추구만은 아닐 것입니다.그러나 동시에 기업의 생존과 지속 가능성을 위해 필수적인 요소가 수익인 것은 부정할 수 없는 사실이죠.스타트업이 언제부터 수익을 내야 하는지에 대한 정답은 없는 것 같습니다.또한 성장성과 수익성이 항상 상반되는 개념도 아닌 것 같고요.빠르게 성장하는 회사가 이익까지 낼 수 있다면,정말 더할 나위 없는 상황이겠지만,설령 둘 중 하나가 조금씩 정체되더라도 꾸준히 나아지는 모습을 보이는 것이 가장 중요한 것이 아닐까 싶습니다.옐로모바일이 어제보다 오늘,오늘보다 내일이 나은 회사가 될 수 있기를 기대해 보며,이상Y였습니다.
조회수 200

나를 위한 여유라는 것은

나를 죽일 것만 같았던 더위가 언제 그랬냔듯이 사라지고 어느새 찬바람이 부네요. 달력을 보니 벌써 8월이 막바지에 이르렀습니다. 늘 이맘때쯤 드는 생각이 있죠. 뭐?! 벌써 올해가 4달 밖에 안 남았다고? 그리고 이 생각도 함께 들 겁니다. 내가 올해 초에 어떤 계획을 세웠더라...나는그동안 뭘 한 거지......라는 생각. 다들 그런 생각했던 거 맞죠? (나만 한 거 아니죠...)저는 올해 여유 있게 살자는 결심을 했습니다. 누군가는 그것도 결심이냐며, 그 정도의 결심이면 못 지키는 게 더 이상한 게 아니냐 하는 생각이 들 수도 있겠습니다만, 제게는 절실하고도 절절한 결심이었습니다.제 일을 시작하고 나서는 출근도 따로 없었지만, 퇴근은 더더욱 없었습니다. 머리 속에 해야 할 일들이 가득해서 뭐라도 하고 있지 않으면 금세 불안해졌기 때문입니다. 노느니 일하는 게 더 마음이 편한 그런 이상한 상태. 2년 전 2016년 크리스마스이브, 그날도 역시 그런 날들 중의 하루였습니다. 남들은 커플과 신나서 놀러 다닐 바로 그 시간에 저는 사무실에 혼자 남아서 열심히 일을 하고 있었는데요. 그런데 갑자기 그런 생각이 들었습니다.회사를 만들고 하나부터 열까지 모든 것들을 혼자서 맨땅에 삽질하며 하나씩 배워나가며 일궈오느라 고생 고생해서 이제 먹고살 수는 있을 것 같긴 한데, 그러나 그렇다고 아직 안정적이지는 못하고, 성공한 거라고는 더더욱이나 말할 수 없고, 뭔가 조금만 더 하면 될 것도 같은데, 그렇다고 무엇이 어떻게 되어야 하는 건지는 모르겠는,,, 그래서 뭐가 될지 모르니 뭐라도 더 해보자고 더 가열차게 일만 계속하고 있는 그런 상태..... 와... 근데 이러다 죽으면너무 억울하겠는데?저는 할머니가 될 때까지 스트레스컴퍼니를 하면서 세상을 이롭게 하는 게 꿈입니다. 그런데 할머니가 되기도 전에 혼자서 일만 하다가 어느 날 갑자기 이 세상에서 사라져 버리면 어쩌나 하는 생각이 든 겁니다. 그럼 정말 너무 억울할 것 같더라고요. 그래서 그런 생각이 들자마자 바로 짐을 챙겨 나오며, 내년에는 좀 더 여유를 가져야겠다고 다짐했습니다. 이렇게 계속 달리기만 해서는 결승점까지 가보지도 못하고 쓰러져버릴지도 모르니 좀 쉬면서 가야겠다고. 그래서 내년엔 꼭 여행도 다니고 남들처럼 보란 듯이 좀 놀아보겠다고 결심을 했습니다. 그때부터 저의 매년 새해 결심은 여유를 갖는 것이 되었습니다.   정말 즐거웠어! 부산아~그러나 여유라는 게 막 가져야지! 한다고 해서 막 손에 잡히고 그러는 건 아니더라고요. 뭘 하면서 쉬어야 하나 손가락을 굴리며 고민하던 때 제 손에 잡힌 포스터 한 장, 부산에 있는 친구가 올린 연말 파티 초대장이었어요. 그걸 보자마자 아! 이거다. 싶었죠. 그날로 짐을 싸서 내려갔어요. 나 가요! 부. 산. 으.로!! 그렇게 부산에서 새해를 맞으면서 산책도 하고 울산에 있는 좋아하는 친구도 만나고, 새로운 사람들도 만나서 수다도 떨고 맛있는 것도 먹으면서 빈둥거리며 며칠을 쉬다가 서울로 올라왔는데요. 다시 몇 달간 버틸 수 있겠다 싶은 새로운 에너지가 생기더라고요. 뿜뿜!  그런데 그 후로 왠지 쉬어야 한다는 강박이 머릿속에 자리를 잡아버렸는지 서울을 떠날 기회가 생기면 어떻게든 그 기회를 잡으려고 애를 쓰고 있더라고요. 덕분에 작년 가을엔 일본, 겨울엔 제주로 여행을 떠났습니다. 아자!!응?친구들과 함께 수다떨며 바라보던 강... 이름은 까먹었네...내 마음의 무게만큼 푹푹 파인 발자국인가....내가 이 걸 보려고 그 먼 길을 간 겁니다!!근데 저는 그렇게 신이 나서 제주를 다녀온 후에 앓아누웠더랬습니다... 끙. 저는 대학원을 다니고 있는데 그 시기가 딱 기말고사 시즌이었거든요. 그럼에도 불구하고 어떻게든 여행을 가야 할 것만 같아서 전공책과 노트북을 싸 짊어지고 비행기에 올랐었는데 가서 안 먹던 고기를 잔뜩 먹고, 밤늦게까지 안 자고, 새벽에 일어나서 레포트를 쓰는 투혼을 발휘하고는 결국 집에 돌아와서 뻗어버렸습니다. 아... 아..... 무작정 여행을 간다고 해서, 서울을 떠났다고 해서 모두 재충전이 되는 것은 아니라는 사실을 병원을 순례하며 깨달았습니다. 털썩.이 중에서 제일 바보는 나인가 보오...Q : 사람이 변하려면 사는 곳이 바뀌거나, 만나는 사람이 바뀌거나 시간을 쓰는 방법이 바뀌어야 한다고 하더군요. 그렇다면 바쁘게만 살아온 내 마음에 여유를 가지려면 무엇이 필요할까요?A: 여행을 떠나는 한 번의 이벤트가 잠시 동안의 행복을 가져다줄 순 있겠지만, 그보다 훨씬 더 긴 나머지의 시간들을 오로지 잠깐 동안의 여행만을 기다리며 보낸다는 건, 다른 사람들은 몰라도 저에게는 그다지 행복하지 않은 선택이더라고요. 덕분에 저는 평범한 일상에서 갖는 나를 위한 작은 여유가 더 중요한 사람이라는 걸 깨달았습니다  Q : 그럼 나를 위한 작은 여유는 어떻게 가질 수 있는 거죠?  A : 그냥 내가 좋아하는 것을 하는 시간을 늘리면 되지 않을까요? 근데 그러려면 내가 무엇을 좋아하는지 싫어하는지 알고 있어야 해요. 그걸 모르면 아무것도 할 수가 없으니까요. 내가 무엇을 좋아하는지 알아야 오로지 나만을 위한 시간과 여유를 선물해줄 수 있어요.내가 좋아하는 것들 저는 좋아하는 사람들과 이야기하면서 에너지를 충전하는 사람이에요. 그래서 저랑 비슷한 에너지를 가진 사람들과 한참을 떠들고 나면 기분이 좋아진답니다. 제 도움이 필요한 사람들에게 경험을 나눠주는 것도 좋아해요. 사람들이 제 이야기를 듣고 마음이 움직이고 변화하는 모습을 보면 그렇게 기쁠 수가 없더라고요. 그래서 저는 사람들과 감정을 나누는 모임을 계속 열고, 그들의 위한 또 새로운 것을 만드는 것을 즐기고 있나 봐요.그렇게 관계 속에서 얻는 즐거움도 좋아하지만, 나이를 먹으면서 좋은 것 중에 하나는 혼자서도 잘 놀게 되었다는 거예요. 저는 이제 식당에 가서 혼자 밥도 잘 먹는답니다. 얼마 전에는 팝콘이 먹고 싶어서 혼자 영화도 보러 갔다니까요. 후후. 생각해보니 옛날엔 혼자서 10km 마라톤을 뛰었던 적도 있었는데요. 정말 힘들더군요.. 이제 그런 짓은 하지 않으려고요.. ; 그렇지만 운동을 지속하는 건 진짜 중요해요. 그래서 필라테스를 끝내고 무슨 운동을 할까 하다가 거의 10년 만에 스윙댄스를 다시 시작했는데, 제 몸이 스텝을 기억하고 있더라고요. 이렇게 기특할 수가! 한참을 스텝을 밟으며 몸을 움직이고 나면 정말 기분이 좋아진답니다.한강에 나가서 강물을 한없이 바라보는 것도 좋아하고요. 차 안에서 혼자 노래 부르는 것도 좋아해요. 집이 서울이 아니다 보니 이동거리가 기본 한 시간이 넘거든요. 그래서 그 시간에 노래를 들으면서 신나게 소리를 지르는데요. 그럼 기분이 나아진답니다. 서점에 가서 책 표지를 보는 것도 좋아하고요. 책 사는 것도 좋아해요. 예전에는 좋아하는 책들을 잔뜩 사서 책꽂이에 꽂아놓고 언젠가는 저 것들이 다 내 머릿속에 들어가 있겠지 싶어서 뿌듯해하고 그랬는데요. 어느 순간 다 부질없다 싶더라고요. 그래서 싹 다 헌책방에 보내버렸어요. 그 후로는 꼭 읽을 책들만 사고 있는데요. 지금은 심리학대학원에 다니다 보니 제 책꽂이엔 거의 다 심리학 책들 뿐인데 그래도 안 읽은 것보다 읽은 것들이 더 많네요. 나중에는 스트레스컴퍼니 사무실을 제 상품들과 함께 심리학 책들이 함께 있는 서점으로 꾸며도 좋겠다는 생각이 들어요. 그래서 오시는 손님들께 상품과 함께 책도 추천해드리고 같이 앉아서 수다도 떨고 모임도 열고 분노캔들도 태우고 그러면 참 재밌겠죠! 내년쯤엔 이렇게 도란도란 이야기를 나눌 수 있는 예쁜 공간을 만들어볼게요!저는 이렇게 가만히 앉아서 상상하는 것도 참 좋아해요. 다음엔 뭘 만들어 볼까? 이런 걸 만들면 어떨까? 이렇게 하면 더 재밌지 않을까? 틈만 나면 이러고 있는 걸 보면 저는 천상 생산자인가 봐요. 이렇게 생각한 걸 현실로 만들어낼 수 있는 디자이너가 되어서 참 다행이랍니다. 헤헷 얼마 전에 어느 사이트에 회원 가입을 하는데 존경하는 사람 이름을 적으라고 하더라고요. 그걸 보자마자 버틀란드 러셀이라고 쓸까. 아니면 빅터 프랭클을 쓸까 하고 잠시 동안 고민을 하다가 빅터라고 적었어요. 빅터 프랭클의 죽음의 수용소에서 라는 책을 참 좋아하거든요. 그의 로고테라피 이론도 정말 좋아한답니다.고레다 히로카즈 감독의 영화를 좋아해요. "그렇게 아버지가 된다"라는 영화는 모든 30대가 꼭 보아야 하는 영화라고 생각해요. 안 보셨다면, 꼭 한번 보시길 추천해요. 이번에 개봉한 어느 가족을 못 봐서 아쉬워하고 있는 데 어떻게든 시간 내서 꼭 챙겨보려고요. 음악은 가리지 않고 듣지만, 쾅쾅거리는 음악은 별로예요. 노래를 들을 땐 음색에 영향을 많이 받는 편이라 케빈오의 부드러운, 커피소년의 조곤조곤한, 치즈의 청량한 목소리를 좋아해요. 에릭남이나 애즈원의 달콤한 목소리도 좋고, 우효의 담담한 목소리, 벤의 낭랑한 목소리도 좋아합니다. 이렇게 써놓고 보니 저는 꽤 소리에 민감한 사람이네요. 아, 민감한 거 또 있는데. 날씨! 더운 건 그래도 잘 참는 편인데, 추운 건 정말 못 참아요.. 그래서 선풍기 바람도 싫어하는데, 올해 폭염은 좀 힘들긴 하더라고요. 근데 올 겨울은 더 춥다면서요? 벌써부터 걱정이라니까요. 추운 겨울에는 따뜻한 나라에 가서 살다가 날씨 풀리면 다시 돌아오고 그렇게 살 수 있으면 얼마나 좋을까요.그리고 단순 노동하는 것도 좋아해요. 아무 생각 없이 손을 움직이다 보면 머릿속이 좀 비워지는 느낌이 들거든요. 그래서 저는 굳이 노동집약적인 분노캔들을 만들었나 봐요. 감정카드는 또 어떻고요. 카드들을 쭉 늘어놓고 하나씩 모아서 50개를 채우는 일도 만만치 않답니다. 게다가 작년에는 극복양말 1,000개를 엄마랑 둘이서 포장한 적도 있다니까요. 스트레스컴퍼니는 리얼 가내수공업을 실천하고 있습니다. (어머니 사랑합니다.)그렇지만 뭐니 뭐니 해도 좋아하는 음악을 틀어놓고 조용한 공간에서 혼자 글도 쓰고, 작업도 하다가, 노래도 부르다가, 책도 읽다가, 디자인도 하다가, 빈둥거리기도 하는, 누구에게도 방해받지 않는 평화로운 시간을 좋아해요. 어쩌면 그래서 저는 크리스마스날도 사무실에 있었는지도 모르겠군요....험;;;  내가 뭘 좋아하는 지 알아야 오로지 나만을 위한 여유를 선물해줄 수 있어요.당신은무엇을 좋아하는 사람인가요?자, 이제 당신의 차례예요. 당신은 무엇을 좋아하는 사람인지 찬찬히 생각해보세요. 한 번도 깊게 생각해본 적이 없다면, 처음엔 생각이 잘 생각이 안 날 수도 있어요. 그래도 그렇다고 포기하지 말고 계속 자신에게 질문을 던져봤으면 좋겠어요. 이건 그럴만한 가치가 있는 일이니까요. 부모님이 원하는 것, 남들이 좋아하는 것, 사회가 해야 한다고 말하는 것이 아닌, 온.전.히.당.신.이.좋.아.하.는.것.말이예요. 그것을 찾으세요. 당신이 좋아하는 것들이 당신을 더 당신답게 만들어줄 거예요. 자신을 믿으세요. 당신은 지금 그대로도 충분히 아름다우니까요. 저는 가끔 기분이 다운되면 커피소년 노래를 들으면서 그래도 괜찮다고 나를 위로해주곤 하는데요. 오늘은 이 노래를 들어야 겠네요. 노래를 틀어놓고 눈을 감고 가사를 들어보세요. 분명 당신도 좋아하게 될 거예요. -그냥 거기에 있어요-커피소년  1.내 마음이 조급할 때모두 날 앞서가는 것 같을 때모든 것들이 다 사라지는 것 같을 때특히 아무 일 없을때무언가 꼭 해야 할 것 같을 때여전히 사라지지 않는 이 불안한 마음(후렴)당신은 당신 그대로 있으세요변한 건 아무것도 없는걸요더 잘하려거나 조급해 마요있는 그대로 그냥 두세요당신은 여전히 아름다워요그들도 아름답지만 그건 다른 문제예요당신이어서 할 수 있는 건그 누구도 따라 하지 못해요그냥 거기에 있어요2.유독 우울했던 날내 삶에 어떤 기대도 없던 날사람들 속에서 외로웠던 그 날에다들 어떻게 사는지나는 잘살고 있는 건지창에 비친 내 모습 초라해 보일 때(후렴)당신은 당신 그대로 있으세요변한 건 아무것도 없는걸요더 잘하려거나 조급해 마요있는 그대로 그냥 두세요당신은 여전히 아름다워요그들도 아름답지만 그건 다른 문제예요당신이어서 할 수 있는 건그 누구도 따라 하지 못해요그냥 거기에 있어요스트레스컴퍼니는 당신과 나의 스트레스를 해소하기 위해 태어났습니다.당신이 스트레스에 굴복하지 않고, 즐겁게 극복할 수 있도록 세상에 없던 상품을 만들고활용해서 교육 프로그램을 진행합니다.www.stresscompany.net 스트레스컴퍼니의 모든 상품은 스트레스컴퍼니샵에서 구매 가능합니다.ⓒ스트레스컴퍼니 - 무단 전재-재배포 금지#스트레스컴퍼니 #심리스타트업 #스트레스관리 #서비스소개 #제품소개
조회수 2042

인턴에서 지사장까지. 잔디 대만 총괄책임자 KM을 만나다.

맛있는 인터뷰 : 대만지사장 KM 편집자 주잔디와 함께 하는 멤버는 총 35명. 국적, 학력, 경험이 모두 다른 이들이 어떤 스토리를 갖고 잔디에 합류했는지, 무슨 일을 하고 있는지 궁금해하는 분들이 많습니다. 잔디 블로그에서는 이 궁금증을 해결해 드리고자 ‘맛있는 인터뷰’를 통해 ‘잔디’ 멤버들의 이야기를 다루고 있습니다. 이번 맛있는 인터뷰는 스페셜 에디션으로 대만의 멤버 KM(이하 : K)를 인터뷰해보았다. 인턴으로 시작해서 어떻게 대만 지사장이 되었는지, 그에 대해 조금 더 자세히 알아보자.KM을 모르는 한국 사용자를 위해 소개 부탁한다.K: 잔디 대만 지사를 총괄하고 있는 KM (Kaimin)이라고 한다. 대만에서 세일즈, 마케팅, CX(Customer Experience), 재무 업무를 모두 담당하고 있다. 엄청 바쁠 것 같다. 대만 비즈니스는 어떠한가? 바쁜 거 보니 잘 되는 것 같은데.K: 대만에서만 연 매출이 3배 증가했고 그래서 그런지 바빠도 기쁘게 일하고 있다. 3배라니! 대단하다. 어떻게 회사를 키워 나갔는지 궁금하다!K: 오늘 모든 걸 다 말해주겠다!! 시작하기 전에, 인터뷰 제목이 맛있는 인터뷰이다. 인터뷰이가 가장 좋아하는 맛집에서 인터뷰를 진행하지만, 물리적인 이슈가 있기에. KM이 소개하고 싶은 음식을 가지고 왔는데, 어떤 걸 가지고 왔는지? (featuring 대만 버블티)K: 가장 보편적으로 먹는 대만식 아침이다. 빵과, 부리또 같이 생긴 랩과 두유다. 랩 안에는 계란과 돼지고기, 밥이 들어있다. 나는 자주 먹어서 그런지 먹고 나면 마음이 편안해지고 생각보다 배가 부르다. 꼭 먹어보길 추천한다.  인턴으로 시작했다가 이제 대만의 비즈니스를 총괄하고 있는데. 엄청난 변화다. 어떤 일이 있었나?K: 처음에 비즈니스&재무 인턴으로 잔디와 함께하고 몇 개월 후 정식 멤버가 되었다. 그 당시에는 비즈니스 멤버들과, UI/UX 매니저, 그리고 BX 매니저 이렇게 총 8명의 멤버와 함께 일을 했었다. 첫 1년간은 멤버가 한 명씩 커리어를 바꿀 때마다 비즈니스 업무를 조금씩 더 담당하게 되었다. 그 이후 결국에는 약 1년간 혼자 일하게 되었다. 당시 책임감도 막중했을 것 같은데. 무섭진 않았나?K: 솔직히 뭘 해야 할지도 잘 몰랐다. 인수인계를 받으면서 ‘뭘 어떻게 해야 되겠다’라는 감은 있었지만, 이전에 한 번도 못 해본 일도 있었고 그 자리에서 바로 도움 받을 상황도 아니었기 때문에 막막했다. 하지만 재무와 비즈니스 등 여러 방면에 늘 관심있었고 한국 본사 멤버들이 꾸준히 응원해줬다. 오히려 절호의 기회로 생각했다. 항상 잔디에서 온라인 상태이던데 온종일 일하는 게 맞는지.K: 맞다. 특히 글을 쓰는 일은 주로 조용한 밤에 잘 되더라. 모든 비즈니스가 마찬가지지만 고객 관리가 생명이라고 생각한다. 고객은 일반적으로 기다리는 것을 싫어하기 때문에 응대는 최대한 즉각 하려고 한다. 그렇다 보니 거의 온종일 일에 집중하게 되는 것 같다. 혼자서 일하는 것과 다른 멤버와 함께 일하는 것의 가장 큰 차이는 뭔지? 선호하는 방식이 있는지?K: 각 방식에 장단점이 있지만, 아무래도 함께 일하는 것이 더 좋은 것 같다.혼자 일할 때는 모든 의사 결정을 내가 해야 하는 만큼 책임과 자율이 공존했다. 이런 자유를 선호하고 스스로 동기부여 하는 사람이라면 더할 나위 없는 환경인 것 같다. 하지만 가끔은 모든 책임에 조금 부담을 느끼기도 하고 무엇보다도. 외로워지게 된다. 그럴 때면 다시 동기 부여 모드로 돌아가기가 어려울 때가 있긴 하다.멤버들과 함께 일하게 되면서 각자 다른 방식으로 의사소통 한다는 부분을 가장 크게 느꼈다. 각 멤버의 의사소통 방식을 존중해줘야 하고 지금도 계속 찾아가는 중이다. 미팅을 할 때 서로에게 피드백을 많이 주려고 하는데 의사 결정에 있어 큰 도움이 되는 것 같다.사실 인턴들보다 내가 더 많이 배우고 있는 것 같다. ^^;  대만 팀 일하는 방식을 조금 더 자세히 알고 싶다.K: 모든 멤버가 원격으로 일을 하고 있기 때문에 대부분 잔디로 공유하고 있다.매주 월요일에는 미팅을 진행하고 1:1로 만나 한 주의 계획, 그 전 주 업무에 대한 피드백을 주고받는다. 미팅 내용을 토대로 자세한 업무 사항을 각 인턴에게 공유하고 중간중간 현황을 공유 받는다. 매주 금요일에는 편하게 점심을 먹으며 (약간의 업무 얘기와 함께) 서로 개인적인 일도 공유하고 수다를 떤다. ^^ 잔디와 함께한 지 꽤 되었는데, 어떤 게 가장 많이 달라졌는가?K: 잔디 서비스가 많이 성장한 것 같다. 처음 조인했을 때만 해도 메시지와 파일 영구 저장, 그리고 약간의 연동 기능만 제공되고 있었지만 지금은 할 일 관리, 조직도, 그리고 더 다양한 연동 서비스까지 생겨났다.이보다 더 많이 달라진 게 있다면 대만 고객들의 인식이다. 잔디를 사용해본 고객이라면 “꼭 필요한 서비스다!”라며 주변에 많이 소개해주고 있다. 대만은 아직 협업툴이 많이 알려지지 않았고 대체제가 많지 않아 ‘잔디’의 성장 가능성이 매우 높다. 스타트업을 넘어 최근에는 중소기업, 대기업 고객들도 협업툴에 관심을 갖기 시작했다. 그럼 변하지 않은 것도 있는지?K: 아시아 시장을 타겟한 글로벌 서비스라는 점은 변하지 않았고, 내가 잔디와 함께 하기로 결심한 또 다른 이유이다. 아시아권에는 수십개의 국가와 문화가 존재한다. 메신저라고 해도 현지 고객이 좋아하는 것, 원하는 것이 다르다. 쉽게 말해, 카톡, 라인이 동양권에서 현지화에 성공한 이유일 것이다.잔디가 꾸준히 아시아권 확장에 노력하고 있다는 것에는 변함이 없는 것 같다. 혹시 스타트업에서 꾸준함이 얼마나 중요하다고 생각하는지?K: 스타트업이 아니더라도 꾸준함은 모든 분야에서 제일 중요한 요소인 것 같다. 요즘엔 많은 사람이 똑똑하고 열정이 있다. 하지만 그 열정과 성과를 얼마나 오랫동안 유지하느냐에 따라 결과가 갈린다고 생각한다. 지금까지 수많은 사람을 만나오면서 의욕과 열정만 너무 앞서 뭔가 해보기도 전에 제풀에 꺾이는 경우를 많이 봤다. 또, 물론 긍정적인 태도도 중요하지만, 긍정적인 태도 자체는 아무것도 해주지 않는다. 그 긍정성과 비전이 빛을 발한다는 것을 증명하기 위한 행동이 반드시 따라야 한다. 잔디에서 가장 기억에 남은 경험이 있는지?K: 한국 출장 중 IT/스타트업 종사자를 위한 파티에 초대받은 적이 있다. 한국어를 잘 못 하니 굉장히 낯설었는데 지나가면서 사람들이 이것저것 물어보더라. 회사와 대만에 대해 말을 하게 되고, 나중에는 나도 모르는 사이에 내가 처음 본 사람과 막 수다를 떨고 있더라. 나에게는 문화 충격이었다. 대만에서 그런 파티를 가보지도 않았고 굉장히 수다스럽고? 오픈 마인드인 사람들과 얘기할 수 있는 신기한 경험이었다. 시간 날 땐 무엇을 하는지?K: 사실 시간이 잘 나지 않는다. 하하. 주로 밤에 짬이 나면 주로 조깅하거나 산책을 한다. 아, 산책하면서 포켓몬을 잡는다. 조깅을 하거나 걸으면서 할 수 있는 게임이라 포켓몬 고를 좋아하는 것 같다. 지금까지 641마리를 잡았고 앞으로 한 10마리만 더 잡으면 내 컬렉션을 완성 시킬 수 있다. 어디서 덕질의 향기가…. KM의 꾸준함이 여기서 보이는 것 같다.K: 나도 당연히 쉬면서 일을 한다. 다만, 내 목표를 달성하기 위해 일에 조금 더 몰두하게 되는 것 같다.  목표가 무엇인가?K: 단기적으로는 대만에서 잔디를 협업툴 1위로 만드는 것이다. 나아가서는 대만뿐만 아니라 아시아에서 1위로 만들고 싶다. 국가, 문화 상관없이 다른 아시안들도 잔디의 효용을 알게 되었으면 좋겠고, 충분히 할 수 있다고 본다. 이런 내 목표를 이루기 위해 다른 대만 기업들과 제휴하는 것으로 첫 발자국을 뗐다. 한국은 이미 구루미의 화상채팅, 그리고 사이냅소프트의 문서 바로 보기 기능을 제휴를 통해 이루어냈다. 그 제휴 결과로 꼭 연동 서비스가 추가되어야 하는 건 아니지만, 주변 기업들과 상생하면서 그 영역을 넓혀가고 싶다. 끝으로, 전 인터뷰이였던 Gary가 남긴 질문이다. 지금 먹고 있는 음식을 같이 먹고 싶은 멤버는 누구인가?K: 음…. Onion(어니언)과 함께 하고 싶다. 직접 만나보진 못했지만 뭔가 재미있고 스토리가 많은 사람 같다. 어니언과 수다 떨면서 하루를 시작하면 뭔가 엄청난 에너지를 받을 것 같다. 다음 인터뷰이에게 묻고 싶은 질문이 있다면?K: 처음 한국에 갔을 때 즐거운 추억들이 많다. 외국에 가본 경험이 있다면 가장 기억에 남는 경험이 뭐였는지 궁금하다. 마지막으로 하고 싶은 말이 있는지?K: 작년에 개인적으로 힘든 일을 겪었는데, 그때 업무에 다시 집중할 수 있을 때까지 충분한 시간을 주었고, 멤버들이 응원해주었다. 멀리 떨어져 있지만, 그 거리가 느껴지지 않을 정도로 큰 위로를 받았고 너무 감사했다는 말을 전하고 싶다.#토스랩 #잔디 #JANDI #팀원소개 #팀원인터뷰 #팀원자랑 #기업문화 #조직문화 #원격근무 #리모트 #디지털노마드 #재택근무
조회수 2517

React + Decorator + HOC = Fantastic!!

React + Decorator + HOC = Fantastic!!지난 포스팅에서는 ES7의 Decorator 문법을 이용해 선언된 클래스와 그 프로퍼티들을 디자인 시간에 변경하는 법을 알아보았습니다. 그렇다면 리액트 컴포넌트와 Decorator가 만나면 어떤 시너지가 발생할까요?만약 ES7의 Decorator에 대해 모르신다면 지난 포스팅을 읽고 오시는 걸 권장합니다. 이 포스팅은 독자들이 Decorator에 대해 이미 알고 있다고 가정하고 작성됐습니다.Higher Order Component리액트 공식 문서를 보면 Higher Order Component(이하 HOC)를 다음과 같이 설명하고 있습니다.리액트 컴포넌트 로직을 재활용할 수 있는 고급 기법리액트에서 공식적으로 제공하는 API가 아니라 단순히 아키텍쳐이 설명으로는 HOC가 어떤 역할을 하는지 이해하기는 역부족이기 때문에 간단한 예제를 통해 HOC를 어떻게 작성하는지 알아보겠습니다.function withSay(WrappedComponent) {     return class extends React.Component {     say() {       return 'hello'     } render() {       return (                   {...this.props}           say={this.say} />       )     }   } } withSay 함수는 WrappedComponent를 인자로 받아 원하는 속성들을 결합해 새로운 컴포넌트를 반환합니다. 이렇게 만들어진 withSay 함수는 아래와 같이 사용 가능합니다.@withSay class withOutSay extends React.Component {     render() {     return (               {this.props.say()}           )   } } withOutSay 컴포넌트는 say 메소드를 가지고 있지 않습니다. 하지만 withSay 함수를 사용하니 say 메소드를 사용할 수 있게 됐습니다. 이처럼 컴포넌트를 인자로 받아 입맛에 맞게 바꾼 뒤 새로운 컴포넌트로 반환하는 기법을 HOC라고 부릅니다.그렇다면 HOC는 리액트에서 어떻게 사용을 해야 효율적일까요?Cross Cutting Concerns개발을 하다 보면 다음과 같은 상황에 직면하는 경우가 종종 있습니다.개발 전반에 걸쳐 반복해서 등장하는 로직그럼에도 불구하고 모듈화가 쉽지 않은 로직예를 들어 방명록 작성, 게시글 작성, 게시글 스크랩을 하는 컴포넌트들에서 유저 인증과 에러 처리의 과정이 필요하다고 했을 때 어떻게 코드를 디자인해야 할까요? 컴포넌트와 직접적으로 연관이 없는 기능들이 컴포넌트와의 결합이 너무 강해 쉽게 모듈화를 시키지 못합니다.그림 1. Cross Cutting Concerns의 예시이렇듯 코드 디자인적인 측면에서 공통적으로 발생하지만 쉽게 분리를 시키지 못하는 문제를 Cross Cutting Concerns라고 합니다. 이 문제를 끌어안고 가면 프로젝트의 코드는 쉽게 스파게티가 되고 나중에는 유지 보수를 하기 힘들어집니다.하지만 우리게에는 HOC와 Decorator가 있고 이를 이용해 이 문제를 쉽게 해결할 수 있습니다.유저 인증 문제를 HOC로 해결아래는 인증이 안된 유저에게 다른 페이지를 보여주는 코드입니다.class TeamChat extends React.Component {     constructor() {     super()     this.state = {       unAuthenticated: false     }   } componentWillMount() {     if (!this.props.user) {       this.setState({ unAuthenticated: true })     }   } render() {     if (this.state.unAuthenticated) {       return     }     return I'm TeamChat   } } 유저 인증을 전통적인 if-else 구문으로 구현했습니다. 당장 이 컴포넌트를 본다면 문제가 없어 보입니다. 어떻게 보면 정답처럼 보이기도 합니다. 하지만 유저 인증이 필요한 컴포넌트가 많아지면 상황이 달라집니다.100개의 컴포넌트에서 위와 같은 방식으로 유저 인증을 하고 있는데 유저 인증을 하는 로직이 변경된 상황을 생각해 봅시다. 100개의 컴포넌트 모두 유저 인증 코드를 바꿔야 하는 상황에 직면하게 됩니다. 전부 다 바꾸는 것도 일이지만 실수로 몇 개의 컴포넌트를 수정하지 않을 확률이 농후합니다. 당장에는 간단하지만 잠재적 위험을 안고 있는 위 코드는 아래와 같이 수정되어야 합니다.function mustToAuthenticated(WrappedComponent) {     return class extends React.Component {     constructor() {       super()       this.state = {         unAuthenticated: false       }      } componentWillMount() {       if (!this.props.user) {         this.setState({ unAuthenticated: true })       }     } render() {       if (this.state.unAuthenticated) {         return       }       return     }    } } HOC를 이용해 확장이 용이한 유저 인증 로직이 탄생했습니다!! 이렇게 만들어진 HOC는 아래와 같이 적용이 가능합니다.@mustToAuthenticated class TeamChat extends React.Component {     render() {     return I'm TeamChat   } } @mustToAuthenticated class UserChat extends React.Component {     render() {     return I'm UserChat   } } 기존의 코드와 비교했을 때 코드가 훨씬 간단해진 것을 확인할 수 있습니다. 비단 코드만 간단해진 것뿐만 아니라 아래와 같은 추가 효과를 기대할 수 있습니다.유저 인증 로직이 컴포넌트와 분리가 되어 자신이 맡은 역할에만 집중할 수 있습니다.유저 인증 로직이 바뀌어도 코드를 수정해야 할 곳은 하나의 컴포넌트뿐입니다.예시로 작성한 HOC는 최소한의 코드로만 작성된 예시입니다. 실제 제품에서 사용되기 위해서는 몇 가지 고려해야 할 사항이 있는데 이는 리액트 공식 문서를 참고해주세요.i18n 컴포넌트를 HOC로 작성채널 서비스는 한국어, 영어, 일본어를 지원하기 때문에 번역 기능이 필요했습니다. 초기에는 번역 서비스를 아래와 같이 구현했습니다.@connect(state => ({   locale: getLocale(state) }) class Channel extends React.Component {     render() {     const local = this.props.locale     const translate = TranslateService.get(locale)     return (               {translate.title}         {translate.description}           )   } } 처음에는 위와 같은 방식으로 번역 서비스를 구현하는 것이 괜찮았습니다. 하지만 번역을 제공해야 하는 컴포넌트가 많아지면 많아질수록 중복되는 코드가 많아지는 것을 보고 아래과 같이 HOC를 이용해 코드의 중복을 제거했습니다.function withTranslate(WrappedComponent) { @connect(state => ({     locale: getLocale(state)   }))   class DecoratedComponent extends React.Component {     render() {       const locale = this.props.locale       const translate = TranslateService.get(locale) return (                   {...this.props}           translate={translate} />       )    }   } } 이렇게 작성된 HOC는 아래와 같이 사용이 가능합니다.@withTranslate class Channel extends React.Component {     render() {     const translate = this.props.translate     return (               {translate.title}         {translate.description}           )   } } HOC의 작성 방법은 예시로 작성한 두 개의 HOC에서 크게 벗어나지 않습니다. 이를 응용해 자신의 프로젝트에 맞는 코드를 작성해보세요.중첩 가능한 HOCHOC는 여러 개를 중첩해서 사용할 수 있습니다.. 예를 들어 유저 인증과 i18n 서비스를 동시에 제공하고 싶을 때 두 HOC를 중첩해서 사용하면 됩니다.@mustToAuthenticated @withTranslate class Channel extends React.Component {     render() {     return (               {`Hello!! ${this.props.user.name}`         {translate.title}         {translate.description}           )   } } 마무리이상으로 리액트에서 HOC를 사용할 수 있는 상황과 작성 방법을 알아보았습니다. 본 포스팅에서 다루지는 않았지만 만능처럼 소개한 HOC에도 몇 가지 단점은 존재합니다.Component Unit Test를 할 때 문제가 있을 수 있습니다.HOC를 몇 개 중첩하면 디버깅이 힘들 수 있습니다.WrappedComponent에 직접적으로 ref를 달 수 없어 우회 방법을 사용해야 합니다.비동기 작업과 같이 사용하다 보면 예상치 못한 결과를 만날 수 있습니다.하지만 이러한 단점에도 불구하고 상속을 제공하지 않은 리액트에서 HOC는 많은 문제를 효율적으로 해결해주는 단비와 같은 존재입니다. 유명한 리액트 라이브러리들(react-redux, redux-form 등)은 이미 예전부터 HOC를 사용해 사용자들에게 편의를 제공해 왔습니다. 이러한 라이브러리들과 자신의 프로젝트가 직면하고 있는 문제에 맞는 HOC를 작성해 같이 사용한다면 우아하고 아름다운 설계에 한층 더 다가간 프로젝트를 발견할 수 있습니다.마지막으로 한 문장을 남기고 본 포스팅을 마치도록 하겠습니다.React + Decorator + HOC = Fantastic!!본 포스팅은 2017 리액트 서울에서 발표한 내용입니다. 발표 자료와 발표 영상을 확인해보세요.#조이코퍼레이션 #개발자 #개발팀 #인사이트 #경험공유 #일지
조회수 1852

도떼기마켓 Sell 성장 스토리

쇼핑보다 더 쉽고 즐겁게 판매할 수 있을까요?2015년 3월, 도떼기마켓은 당신의 입지 않는 옷을 직접 구입하기 시작하였습니다.그리고, 1년 9개월여 간 관심과 사랑으로 이렇게 성장했습니다.# 도떼기마켓 판매자 & 판매 물품2016년 12월 1일을 기준으로 접수 물품 10만 건, 접수 판매자 2만 8천여 명을 돌파하였습니다.중고 거래라고 하면 평화로운 그곳을 이용하거나, kg당 몇 백원으로 넘겨 버리는 것이 전부라고 생각했다면 착각!도떼기마켓으로 쉽고 편하게 중고 의류를 판매하시는 분들이 꾸준히 증가하고 있습니다. # 도떼기마켓 판매 트렌드도떼기마켓 판매 현황을 보면, 중고 의류 거래에 대한 트렌드를 읽을 수 있습니다. 도떼기마켓을 통해 가장 많이 판매한 상품은 티셔츠였습니다. 매입된 전체 상품 중에 16.5%가 티셔츠였다는 사실!남녀 공용으로 가장 캐주얼하게 입는 아이템이기 때문이겠죠.가장 많이 판매된 브랜드는 글로벌 SPA 브랜드 간의 경쟁이었습니다.  ZARA가 11.8%의 비율로 11.4%의 H&M을 근소한 차이로 누르고 1위를 차지한 것.대표적인 패스트패션으로 꼽히는 두 브랜드가 도떼기마켓을 통해 새로운 의미와 가치를 만들어 내고 있답니다. 최다 판매 지역은 더욱 놀라운 결과를 보여주었습니다. 서울 강남구 13.1%, 서울 송파구 5.5%, 서울 서초구 4.7%로 도떼기마켓에 판매된 옷 중 23.3%가 강남 3구에서 들어온 것으로 나타났기 때문입니다.강남 중고 의류가 헌 옷 수거함에 간다는 것은 옛말, 놀라운 컨디션의 상품들은 모두 도떼기마켓에 판매되고 있습니다.# 도떼기마켓 판매 기네스북입지 않는 옷을 담아 보내는 클린업백에는 가벼운 티셔츠라면 20벌 이상, 두툼한 겨울 코트라도 3~4벌 이상 여유 있게 들어갑니다. 판매한 브랜드와 컨디션 등에 따라 놀라운 판매 금액을 제안받을 수 있죠. 최대 판매 금액은 무려 159만 원! 1개의 클린업백은 아니지만, 여러 차례 이용하시면서 가장 많이 판매한 분의 누적 금액은 무려 325만 원에 달했습니다.옷장 정리도 하고, 용돈도 버는 일석이조의 효과.# 도떼기마켓 누적 클린업백 이야기전국 방방곡곡에서 도착한 클린업백의 무게와 크기를 더하면 어마어마합니다.클린업백을 통해 접수된 아이템의 무게는 무려 8,000 kg! 8톤! 귤 박스로 환산시 1,600박스에 해당하는 엄청난 무게입니다. 이렇게 들어온 클린업백을 펼치면, 잠실야구장 2개 크기에 육박하죠.# 도떼기마켓 X 굿윌스토어판매자분들이 보내주신 옷들 중 판매되지 않는 옷들이 있습니다. 이런 옷들은 돌려받거나 기부를 선택할 수 있고요.기부를 선택할 경우, 국내 최대 오프라인 기증품 판매점이자 장애인 직업 재활 시설인 굿윌스토어를 통해 기부합니다. 2015년 11월부터 매달 기부가 진행되어 누적 수량이 2만 점을 돌파하였습니다. 금액으로 환산 시 1억 1천만원에 해당하는 어마어마한 양이죠. 도떼기마켓을 이용하는 고객이 늘어날수록 기부에 참여하는 고객들도 함께 늘어나 그 의미가 더욱 깊습니다.집에 안 입는 옷 많으시죠?사놓고 몇 번 입지 않은, 상품택조차 그대로 있는 옷장 속 아쉬움들.더 이상 버리지도, 낯선 사람과 중고 거래하지도 마세요.도떼기마켓에 그저 보내주세요. 바로 현금으로 바꿔드리겠습니다.#유니온풀 #도떼기마켓 #서비스 #서비스소개 #고객가치
조회수 1529

대한민국 취업문화, 이대로 정말 괜찮은가?

1.취업과 창업은 다르지않다.2.취준생들은 투자자와 같다.3.창업과 더불어 취업은 진실된 진정성을 가질때 비로서 빛을 발한다.이 3가지 주제를 다룰 예정이다.A:형 , 요즘에 사람들 보통 지원서 몇 개나 써요?B:보통 10~30개는 기본으로 쓰지. 아는 사람 중에 100개 넘게 쓰는 사람도 있어이 말을 들을 때는 "와... 어떻게 100개나 쓸 수 있지?" 생각하면서 나중에는 이것이 굉장한 문제 의식으로 나의 내면에 자리 잡았다.주위에 보니 너무나도 그런 사람이 많다는 사실. (물론 몰랐던 건 아니지만 회사 문화에 대해 특히나 요즘 많이 고민하고 있는 나로서는 특별한 감정으로 다가왔다.)아니 어쩌면 대한민국의 취준생들은 100명중에 90명은 그럴 것 같다는 사실. 과연 정말 수십 개 지원서를 쓰고 하나 얻어걸려서 되는 취업이 옳은 걸까? 내 인생에 더없이 행복할 수 있는 유일한 선택인 걸까? 그런 생각이 들었다.필자는 대학교 2학년을 끝마치고 휴학 중에 있다. 근데 회사 경험은 4곳이다. 학교 다니면서 2군데에서 일했고, 방학때 1군데에서 일했고 휴학하고 1군데에 취업했다.필자는 22살 군대에서부터 계속 창업을 준비하며 프로토타입을 만들고 실험해보고 꼭 회사를 설립하겠다는 일념으로 모든 나의 시간을 쏟아부었다.나의 진짜 비즈니스를 만들기 위해 오로지 전념했다.그런데, 내 실력이 부족하다는 것을 알고 그때마다 우연한 기회로 회사를 다닐 기회가 있어 실무를 더 배웠다.창업을 준비했던 것들이 아주 귀중한 자산이 되어 면접때 나의 포트폴리오가 되었다.그리고 나서 나의 느낀 점은 창업을 준비하다보면 취업이 어렵진 않네?물론 사업을 제대로 해본 적은 없다. 생각한 아이디어를 구현해보고, 그것을 실험해보고 scaleup할 수 있는지를 검증하고 고객에 대해서 공부해본 그 정도이다. 근데 이 과정조차도 엄청난 걸 공부하게 되고 많이 배운다.그래서 내가 풀려고 했던 문제와 관련된 카테고리에서는 취업을 일반적으로 준비하는 친구들보다 더 깊이있고 더 넓은 지식을 가질 수 밖에 없다. 즉 필자가 말하고자 하는 것은 취업과 창업이 따로 아니라는 것을 말하고 싶고 이것 둘의 차이점은 같은 본질적인 카테고리인데 유일한 차이점이 문제 해결의 난이도 차이라는 것이다. 그렇기 때문에 창업을 준비하다 보면 취업은 꽤나 쉬운 문제가 된다. 내가 특정 고객의 특정한 문제를 풀려고 남들보다 치열하게 노력하고 고민하는 과정 속에서 나는 엄청나게 성장되어 있다는 것을 느꼈다.문제 해결력이 어떤 임계점을 넘어가면 나의 비즈니스가 되는 것이고, 문제 해결력의 임계점을 넘기지 못한다면 취업을 하게되는 것이라고 생각했다.우린 이런 관점이 정말로 필요하다고 생각한다.다시, 처음에 꺼냈던 지원서 얘기로 돌아가보자.인간의 한계는 존재한다. 그렇게 많은 지원서를 쓰다보면 상대적으로 깊이 있는 지원서의 수는 당연히 줄어들 수 밖에 없다. 스스로에게 물어봐야된다. '취업 그 자체'가 목표인 것인지,'취업해서 성장'이 목표인지. 진실되게 자신의 내면의 목소리를 들어봐야된다. 취업하면 답답했던 많은 인생의 부분들이 풀릴 것 같지만 그런 취업의 마음가짐으로 취업해서는 조직에서 살아남을 수도 없을 뿐더러 폭발적인 성장을 하지 못한다. 왜? 내가 공감하는 비전의 회사가 아니고 내가 제일 잘할 수 있는 일이 아니고 내가 제일 좋아하는 일이 아니기 때문이다.정말 가슴뛸 수 있는 곳. 내가 최종적으로 도달하고자 하는 꿈을 도와줄 수 있는 업이 현재 무엇인지를 생각해야되고 그 업을 가장 업계에서 잘하는 기존의 플레이어들과 다르게 하는 곳으로 가야된다. 그래야지 폭팔적인 성장을 통해 세상에 영향력을 끼칠 수 있고 그 영향력에 따라 내가 브랜딩되고 나의 몸값이 올라가고 나의 포트폴리오가 된다.top3를 정해놓고 회사 지원서 쓰는 것도 사실 많다.진짜 가고 싶은 회사를 진짜 제대로 파헤치고 준비하면 사실 1~2개도 벅차다.이들을 철저히 분석하고, 회사에서 요구하는 역량에 대해서 내가 어떤 길을 걸어왔는지 단순히 나열하는데에서만 끝나지말자.더 깊이 있는 지원서를 쓰려면 그 회사가 못하고 있는 것이 무엇인지, 즉 그 회사의 pain point를 분석해보고 그것을 해결할 수 있는 자신의 아이디어는 무엇이 있는지 제시해보자. 그들이 원하는 사원의 역량에 대해서 미리 프로젝트를 만들어서 제휴 제안서를 만들어보고 그러나 가장 중요한 것은 "정말 당신 회사에서 내 비전을 불태우고 싶다"라고 정성과 진정성을 전달하자.진실되게 말이다.취준생들은 '학생'이 아니다. 졸업하고 취업 못해서 준비하는 학생들이 아니다. 그들은 투자자다. VC들이나 엔젤투자자들이 어떤 회사에 얼마를 투자할지처럼 학생들도 투자자의 관점으로 취업을 접근해야된다. 취업을 하면 우리는 우리의 시간을 투자한다.즉 [돈,시간]을 투입하는 재화의 종류가 다를 뿐이지 투자자의 시각으로 접근해야 하는 것은 변하지 않는 사실이다. 그 회사의 비전을 봐야되고 그 회사의 문화를 봐야되고 그 회사가 그 이전에 걸어온 길 앞으로의 성장률들을 분석해야된다. 그리고 그 회사에 나의 꿈을 매칭시켜보고 가슴이 뛸 수 있는지 내가 기여할 수 있는 일이 많을 수 있는지 그 회사와 함께 파트너가 될 때 더욱 세상에 영향력을 행사할 수 있을지 진심으로 생각해봐야된다.한달~두달 지원서만 수십 개 쓰는 시간만 모아도 100시간이 넘을 것이다. 그 시간도 내 짧은 인생에서 정말 소중한 시간이다. 근데 그 시간에 페이퍼만 하고 있다는 것은 정말 의미없는 행위일 수도 있다. 차라리 정말 내 가슴이 뛸 수 있는 회사 소수만 정하고, 그들의 요구하는 역량이 부족한게 있다면 주어진 시간내에서 그 단점을 더 개선하는게 훨씬 낫다. 뭐가 걱정이고 뭐가 두려운가. 죽이지 못하는 것은 강하게 할 뿐이며 이 짧은 인생 하루 하루 불태워도 모자를 판인데 안그런가 ?끝마치며취업 문화와 창업문화는 대한민국의 발전, 글로벌한 국가로 더욱 발돋움하기 위해서 심도있게 재고되어야 하는 것들이다.대한민국은 현재 유례없는 창업 생태계가 만들어졌다.근데 어느 부분에 있어서는 창업 문화는 좀비화되가고 있다. 정부 지원금을 타다가 빼돌려 돈세탁을 한다든지 지원금 받으려고 페이퍼하다가 사업이 망한다든지,뭔가 이 때가 돈 벌 타이밍인 것 같아서 돈을 많이 벌어보고자 창업하는 그런 상황들이 만들어지고 있다.취업 문화 또한 좀비처럼 되가고 있다. 토익의 기술,자격증의 기술,자소서의 기술. 취업의 기술 그리고 그 어른들이 만들어놓은 돈의 세계에서 답을 끼워맞추느라 스트레스 받아가며 지원서 수십장씩 써나가는 우리들.이 글은 취준생들을 비판하고자 쓴 글이 아니다.우리나라의 문화를 비판하고자 하는 것이다.왜 대한민국이 세계적인 기업이 안나올까? 왜 글로벌한 인재들이 한국으로 오지 않을까? 필자가 내린 결론은 문화에 대한 문제다.좋은 문화를 만들면(창업이든 취업이든) 세계 인재들이 빨려 들어오고 한국의 회사들은 더욱 글로벌하게 진출하고 성장할 수 있다.이것은 좋은 창업 문화로 좋은 회사들이 만들어져야 되는 것과 더불어 좋은 취업 문화. 정말 내가 원하는 회사에서 세상에 영향을 끼쳐보겠다는 그런 인재 그런 주니어들이 많이 나와주고 그런 의식이 더 확산되어야지 진짜 좋은 회사가 나오고 이 회사들이 더욱 대한민국을 세계적인 국가로 키울 수 있다.이 이슈는 어떤 계층의 유일한 문제가 아니다. 문화의 문제이고 이 문화에 종속되어있는 모든 사람들이 이런 인식에 목소리를 모으고 힘을 합쳐야된다. 같이 이 문제를 해결해 나가야된다.이런 관점과 이런 인식이 확산되고 점진적인 변화들이 만들어지고 그를 통해 혁신적인 변화들이 만들어져야 한다.각자의 위치에서 이런 변화를 촉진시킬 수 있는 노력을 하면 더욱 좋은 회사들을 만들어낼 수 있다.내가 진짜 원하는 것이 무엇인가. 내가 진짜 이 세상에 끼치고 싶은 영향력은 무엇인가. 나는 살아가면서 누구의 의사결정을 도울 것인가. 내 일이 어떤 재미를 가지고 그것이 어떻게 사회적인 의미를 가지게 할 것인가. 인생은 짧으면서도 길다.짧기에 우리는 하루 하루 최선을 다하고 정성을 다해야 한다. 길기에 우리는 인생을 좀 더 장기적으로 바라보며 긴 호흡을 가지고 살아야 된다. 꼭 급하게 가지 않아도 서둘러가도 된다.빨리가지 않아도 뒤로 가지 않으며 앞으로 꾸준히 나아가면 된다. 어차피 정상에서 다 만나는 것 아닌가진실된 진정성을 가지고 취업과 창업에 접근하는 것. 다른 긴 글 다 필요없이 이 하나만 모두가 각자 위치에서 기억해준다면 얼마나 더욱 아름다운 대한민국을 만들 수 있을까.#페오펫 #peopet #스타트업 #창업 #창업자 #창업가 #마인드셋 #신념 #목표 #비전 #인사이트 #조언

기업문화 엿볼 때, 더팀스

로그인

/