스토리 홈

인터뷰

피드

뉴스

조회수 1191

중독적인 서비스의 2가지 비밀

사람들이 중독적으로 사용하는 제품/서비스를 만드는것은 모든 PM/마케터의 꿈이다. 생각해보라. 내가 만든 앱을 많은 사람들이 하루에도 수십번씩 사용하고, 지하철 이동중에, 화장실에서, 심지어 회의중에도 틈날때 마다 강박적으로 접속하는 서비스가 바로 내가 만든 제품이라는 생각은 상상만해도 흥분된다. 물론 모바일 게임분야에는 이런 중독성을 띄는 제품들이 도처에 널려있지만, 비 게임 영역에서는 이정도 급의 제품들이 많지 않은게 사실이다. 예를들어 주변에 'LoL에 중독됐다'는 사람은 쉽게 찾을 수 있어도, '카카오톡에 중독됐다'는 사람은 찾기가 쉽지 않다. 그만큼 어떤 서비스에 '중독됐다'는 상태는 아무 제품 영역에서나 달성 가능한 것이 아니라 해당 상태를 달성시키기 위한 특정 조건들이 있는데, 오늘 글에서는 그 2가지 비밀에 관한 이야기를 해볼까 한다.제품/서비스에 중독됐다는 것의 의미일단 특정 사용자가 어떤 제품/서비스에 '중독됐다'는 것의 의미를 명확하게 정의내릴 필요가 있다. 제품의 중독성을 어떻게 측정할 수 있을까? 유저 별 하루 평균 세션수를 측정해서 이게 하루에 20회 이상이면 중독됐다고 말할 수 있는건가? Day 30 리텐션이 60%이상을 꾸준히 유지하고 있으면 제품이 중독적이다 라고 말할 수 있을까? DAU/MAU로 측정되는 Stickiness가 항상 50% 이상을 유지하고 있으면 제품이 중독적인 것인가? (제품의 사용성을 측정하는 다양한 분석 지표에 관한 글은 이 전에 쓴 초기 스타트업의 모바일앱 지표 분석 방법론 글을 참고하도록 하자)물론 위와 같은 다양한 지표로 해당 제품의 중독성을 가늠해 볼 수는 있으나 중독된 상태 자체를 증명해 내지는 못한다. 내 제품을 우리 유저들이 정말 중독적으로 사용하고 있는지를 증명해내기 위해서는 위에 언급한 지표들과 함께 유저의 제품 사용 플로우를 함께 들여다 본 후에 다음 명제를 반드시 분석해야 한다.유저가 내 제품/서비스를 필요할때 접속하는가? 아니면 필요치 않아도 습관적으로 접속하는가?이 두가지를 명확하게 구분하는것은 제품이 중독적인가를 판단하는데 매우 중요하다. 예를 들어보자. 국민 메신저라 불리는 카카오톡의 유저 1명당 일 평균 실행횟수는 2016년 7월 App Ape 리포트 기준 거의 30회에 다다른다고 한다. 페이스북이 일 평균 실행횟수가 Verto Metrics의 2016년 9월 기준 11회 정도라고 하는데 카카오톡의 실행횟수가 월등하게 높은 수치임을 알 수 있다. (물론 두 데이터의 소스가 달라서 직접비교는 어렵다는걸 감안해야 한다.)이런 견지에서 카카오톡은 중독적인 서비스라고 말할 수 있는가? 본인은 그렇지 않다라고 주장하는 이유는 해당 앱 실행이 '습관적으로 접속하는게 아니라 필요에 의해서 접속하는것' 이기 때문이다. 사람들이 카카오톡을 사용하는 패턴을 관찰해 보면 누군가에게 메시지를 보내야 하거나 누군가에게 새로운 메시지 알람이 떴기 때문에 접속을 하지, 틈날때 마다 강박적으로 카카오톡을 먼저 켜서 대화를 탐색하고 메시지를 날리는 사람들은 그리 많지 않을 것이다. 즉, 이런 견지에서 내 제품/서비스가 중독적이다의 정의는 다음과 같이 내릴 수 있다.유저들이 내 제품/서비스를 높은 빈도로, 그리고 습관적으로 사용하고 있다.그렇다면, 이렇게 내 서비스를 습관적으로 사용하게 만드는 서비스들에는 그렇지 않은 제품들과 어떤 차이가 있을까? 이 비밀에 대해 제법 명쾌한 해답을 제시하고 있는 책이 하나 있다. 개인적으로 스타트업 하는 사람들이 무슨 바이블처럼 떠 받들고 있는 피터틸의 '제로투원'보다 백배는 더 도움이 되는 책이라고 생각한다. 바로 니르 이얄 (Nir Eyal)의 '훅 (Hooked)'이라는 책이다.개인적으로 제로투원보다 백배는 도움이 되는 내용이 많이 담겨져 있는 책이라고 생각한다.저자인 니르 이얄이 피터틸 처럼 직접 대규모 스케일업을 이뤄본 스타트업 유경험자는 아니고 오히려 학자에 더 가까운 사람이라 그런지 책의 개념에 나와있는 사례들은 사실 별로 공감되지는 않는다. 다만 해당 책에서 제시하고있는 핵심 개념, 즉 '사람들이 습관적으로 사용하는 제품들이 공통적으로 지니고 있는 속성'에 대해 아주 명쾌한 2가지 개념을 제시하고 있는 부분이 있어서 오늘 글에서 간단히 소개하고자 한다.첫째, 보상을 잘 던지는것 보다 중요한 건 보상을 원하는 열망을 잘 해소시키는 인터페이스를 만드는 것이다심리학 교과서에 단골처럼 출연하는 유명한 실험이 하나 있다. 바로 1940년대에 제임스 올즈 (James Olds)와 피터 밀너(Peter Milner)의 쥐 실험이다. 실험 내용은 다음과 같다.두 사람은 실험용 쥐들의 뇌에 전극을 심었고 이를 통해 쥐들이 대뇌 측좌핵 (nucleus accumben)이라는 조그만 부위에 스스로 약한 전기 자극을 가할 수 있게 했다. 그러자 이 쥐들은 얼마 안가 그런 자극에 중독되고 말았다. 쥐들은 음식과 물을 포기하고 심지어 전기가 흐르는 격자판을 통과해야 하는 고통을 감수하면서까지 자극 전달 레버를 계속 누르려 했다.몇년 후에 같은 내용의 실험을 사람에게도 실시했는데 동일한 수준의 결과가 나왔다. 즉, 두뇌에서 즐거움, 열망등과 같은 감정을 관장하는 중추를 발견한 순간이다. 이 둘의 실험에 의하면 그 뇌의 부분을 자극하는 어떤 기작이 존재하면 사람들이 미쳐서 중독될거라고 쉽게 판단해 버릴 수 있으나, 최근에 실시된 한 실험은 더 중요한 비밀에 관해 밝혀내고 있다.스탠퍼드 대학의 브라이언 넛슨 (Brian Knutson) 교수는 기능자기공명영상 기계를 사용해 사람들이 도박을 할 때 두뇌 혈류량에 나타나는 변화를 측정하는 실험을 실시했다. 실험 참가자들이 도박을 하는 동안 두뇌의 어떤 부위가 점점 활성화되는지를 살펴본 것이다. 그런데 보상 (이 경우, 도박으로 돈을 따는 것)을 받긴 하지만 그것이 기대했던 것일 때는 대뇌 측좌핵이 활성화되지 않는다는 놀라운 사실을 발견했다.위의 연구에서 주지해야 할 점은 바로 '우리의 행동을 유도하는 것은 보상 그 자체에서 느끼는 기분이 아니라 그런 보상에 대한 열망을 완화시키고자 하는 욕구'라는 사실이다. 무슨 말이냐면, 우리가 심리적으로 흥분된 상태를 경험하려면 특정 보상을 받고자 하는 열망이 필요한데, 중요한건 이 열망 자체를 제시하는것 보다 중요한게 열망을 완화시켜주는 인터페이스라는게 핵심이다.예를들어 틴더와 같은 데이팅 앱을 생각해 보자. 틴더 앱에서 우리가 원하는 보상은 명확하다. 바로, '맘에 드는 이성과 연결되는 것' 이다. 앱에서 특정 상대와 매칭되는 순간 그 자체가 우리에게는 보상이 되는 것이다. 그렇다면, 틴더는 그 보상만 계속 제공해 주면 유저들이 앱에 중독성을 띌까? 많은 사람들이 이 보상 자체에만 집중하는 경향이 있는데 더 중요한건 그 보상을 받고자 하는 열망이 해소되는 순간에 있다. 틴더에는 매칭이 되서 서로 대화를 나누는 순간이 바로 그것이다. 유저가 틴더에 계속 중독이 되려면 1) 'It's a Match!' 라는 보상을 주는 기작과 함께 2) 매칭이 되어 그 상대와 대화를 나누게 되어 내가 가지고 있던 열망이 완화되는 인터페이스가 잘 작동해야만 유저의 뇌의 대뇌 측좌핵을 흥분시키는게 가능해 지는 것이다. 즉, 유저가 아무리 매치됐다는 알림을 많이 받아도, 해당 상대와 대화로 연결되는 인터페이스가 잘 작동하지 않는다면 '뭐 매치되도 또 묵묵무답이겠지..' 라고 생각하면서 보상에 대한 열망이 완화되지 않고 스트레스로 쌓이게 되어 중독성을 잃게 되는 것이다.틴더가 중독성을 띄기 위해서는 It's a Match!라는 보상기작 보다 매칭 이후에 대화로 연결되는 보상에 대한 열망을 해소시켜주는 단계가 잘 작동해야 한다.반대로 페이스북의 경우를 보자. 페이스북에서 사람들의 중독성을 자극하는 보상기작은 무엇일까? 바로 이 지구본 아이콘에 버블로 달리는 Notification이다. 페이스북은 당신이 사회적으로 관심받고 있는 존재다 라는 보상을 노티피케이션으로 던져준다. 누군가 내 글에 라이크, 댓글 등을 달때라던지, 내가 단 댓글에 누가 또 댓글을 단다던지, '나'라는 존재에 사람들이 관심을 표현하는 모든 종류의 행동을 다 인터페이스화 해서 노티피케이션이라는 훌륭한 보상기작에 담아놓은 것이다.페이스북 중독의 핵심은 이 노티피케이션의 숫자 그 자체의 보상이 아니라, 바로 이 노티피케이션 숫자를 kill하는 순간, 즉 내 보상의 열망이 해소되는 순간에 있고, 페이스북은 이 인터페이스를 자연스럽게 설계해서 페이스북에 어느정도 시간투자를 하는 유저들이라면 누구나 보상 해소가 자연스럽게 이루어지도록 유도하고 있다.페이스북에 중독되는 마법의 순간은 노티피케이션 아이콘에 버블이 뜨는 순간이 아니라, 그 버블을 kill하면서 대뇌 측좌핵을 자극하는 순간에 있다.따라서, 본인 서비스에 유저들이 중독되게 만들고 싶으면 다음 3가지 개념을 꼭 고민해 봐야 한다. 1) 유저들의 어떤 열망을 자극하고자 하는지, 2) 해당 열망을 어떤 보상의 형태로 제공할 것인디, 그리고 가장 중요한 3) 보상에 대한 열망이 해소되는 인터페이스를 구현하는 것이다.둘째, 보상을 반드시 가변적으로 던져줘야 한다인간의 뇌는 '휴리스틱 (heuristic)'이라는 아주 훌륭한 인터페이스가 있어서 수많은 복잡한 감정이나 결정들을 최대한 효율적으로 처리할 수 있게 만든다. 이게 뭐냐면, 인간의 뇌에는 반복적인 절차나 경험을 그룹화해서 미리 저장해 놓는 인터페이스가 따로 있어서 어떤 일이나 감정이 반복적으로 발생하면 그에 대한 대처 역시 자동적으로 발생하도록 저장해 놔서 해당 자극이 발생할 때 마다 힘들게 사고처리를 하지 않아도 대처가 가능하도록 만들어놓은 아주 효율적인 시스템인 것이다. 직장에서 상사한테 깨질때 마다 습관적으로 담배피러 간다던지, 화장실 표지판의 색깔이 파란색이면 남자화장실, 빨간색이면 여자화장실일거라고 자동적으로 생각하고 파란색으로 들어갔다가 봉변을 당한다던지 하는 류의 행동이 모두 휴리스틱에 기반한 행동들이다.우리가 주목해야 하는 점은 바로 본인 서비스에서 제공하고 있는 보상이 반복적이거나 습관적인 패턴으로 제공이 되고 있으면 유저의 뇌에서는 이 자극을 휴리스틱 인터페이스로 처리할 가능성이 다분히 높아진다는 점이다. 즉, 위의 페이스북의 예시에서 노티피케이션의 버블 숫자가 내가 항상 앱에 접속할 때 마다 같은 숫자로 떠 있다던지, 틴더에서 It's a Match!라는 메시지가 너무 반복되는 패턴으로 뜬다던지 하면, 처음에는 해당 보상에 흥분하던 소비자가 점차 그 흥미를 잃고 해당 자극은 휴리스틱 인터페이스로 처리되어 더이상 대뇌 측좌핵을 자극하지 못하게 되는 것이다.하지만, 해당 보상이 최대한 간헐적으로, 예측하지 못하는 패턴으로 제공되면 오히려 유저가 해당 보상을 얻기 위해 더욱 열정적으로 달려드는 패턴을 보이는 경우가 많은데, 이 심리적 행동을 설명하는 아주 유명한 실험이 있다.1950년대에 스키너 (B.F. Skinner)라는 심리학자가 가변성이 동물의 행동에 미치는 영향에 관한 연구를 실시한 적이 있다. 그는 레버를 누를 때 마다 음식물이 나오도록 특수 제작한 상자 안에 비둘기들을 집어넣었다. 올즈와 밀너의 실험용 쥐와 마찬가지로 비둘기들은 레버를 누르는 것과 음식이 나오는 것 간의 인과관계를 학습했다. 다음 단계에서 스키너는 여기에 가변성을 추가했다. 비둘기가 레버를 건드릴 때 마다 음식물이 나오는 것이 아니라 무작위로 정한 횟수만큼 비둘기가 레버를 건드리면 기계에서 음식물이 나오도록 변화를 가한 것이다. 어떤 때는 레버를 누르면 음식물이 나오지만 또 어떤 때는 나오지 않았다. 스키너는 이런 간헐적 보상이 비둘기가 레버를 두드리는 횟수를 급격히 증가시킨다는 사실을 발견했다. 가변성을 추가하자 그가 의도했던 행동의 수행 빈도가 급증했던 것이다.이 스키너의 실험이 의미가 있는 것은, 보상기작을 최대한 간헐적이고 상대방이 예측하기 불가능한 패턴으로 제공하기 시작하면 해당 유저를 거의 미칠정도의 수준으로 중독시키는게 가능해 진다는걸 암시하고 있기 때문이다. 이걸 페이스북의 예시에 적용해 보자. 페이스북은 게시물 노출 알고리즘의 복잡함과 정교함을 통해 이 부분의 목표를 달성하고 있다. 많은 사람들이 페이스북 노출 알고리즘이 대략 이러이러할 경우 노출 확률이 높아진다 정도의 이야기는 하고 있어도 그 누구도 어떤 인풋과 조건값이 있을때 어떤 노출빈도가 형성되어 내 노티피케이션 버블을 만들어 내는지에 대해 알고 있지 못한다. 따라서 수 많은 유저들이 다양한 종류의 포스팅을 올리고 해당 글에 라이크가 얼마나 달리는지를 중독적으로 쳐다보고 있게 만들며, 언제는 라이크가 마구마구 달릴때도 있고, 또 어떤때는 내 예상보다 훨씬 적게 달릴때도 있게 만듦으로써 보상기작 자체를 간헐적으로 제공하고 있다. 이 간헐적 보상을 통해 페이스북은 해당 보상의 가치를 최대한 끌어올려서 유저로 하여금 레버를 미친듯이 눌러대는 비둘기 마냥 중독적으로 노티피케이션을 쳐다보게 만들고 있는 것이다.지금까지의 내용을 간단히 정리해 보면 다음과 같다.내 제품/서비스가 중독적이게 만들기 위해서는 우선 1) 유저가 내 서비스에서 제공하는 보상을 얻고싶다는 열망을 가지게 만들어야 하고, 2) 보상기작보다 중요한 건 보상을 완화시키고 싶은 열망을 해소시키는 인터페이스를 잘 구축해 놓는 것이며, 3) 보상을 반드시 간헐적으로, 예측 불가능한 패턴으로 던져줘야 한다.니르 이얄의 'Hooked' 책에는 이런 내용 외에도 사람들이 습관적으로 사용하게 만드는 서비스들이 공통적으로 지니고 있는 속성들에 대해 잘 정리되어 있으니 한번 읽어보면 많은 도움이 될 것이다. 다만, 앞서 말한바와 같이 저자가 학구파이다 보니 저자가 제시하고 있는 사례들이 크게 설득력 있진 않아서 다 읽고 나면 뭔가 뜬구름만 잡아대는 교과서같은 느낌을 받을 수도 있다. 하지만, 저자가 제시하는 개념 자체를 잘 이해해서 본인만의 사례, 또는 본인 제품에 대입해서 잘 고민해 본다면, 분명 '제로투원'보다 얻어가는게 백배는 많을거라는 본인의 말에 공감이 갈 것이다.** 본 글은 문돌이 PM의 마케터 따라하기 시리즈 입니다.** 1화 보기 - 초기에 할만한 ASO (앱스토어 최적화) 팁** 2화 보기 - 초보 PM이 알아야 하는 초기 모바일앱 분석 101** 3화 보기 - 스타트업 브랜딩: 내가 보는 나와 너가 보는 나의 일치** 4화 보기 - 홍보영상 직접 제작해서 수백만원 절약해보자** 5화 보기 - 바이럴루프, 중요한건 알겠는데 어떻게 적용할래?** 6화 보기 - 인스타그램 노가다 마케팅 101** 7화 보기 - 문돌이도 간지나는 HTML 이메일좀 보내보자** 8화 보기 - 인스타 마케팅 헛수고를 줄이는 10가지 마케팅 방법론** 9화 보기 - 초기 스타트업의 무료 마케팅 채널** 10화 보기 - 프리미엄병에 걸리지 말자** 11화 보기 - 초기 스타트업의 모바일앱 지표 분석 방법론글쓴이는 스팀헌트 (Steemhunt) 라는 스팀 블록체인 기반 제품 큐레이션 플랫폼의 Co-founder 및 디자이너 입니다. 비즈니스를 전공하고 대기업에서 기획자로 일하다가 스타트업을 창업하고 본업을 디자이너로 전향하게 되는 과정에서 경험한 다양한 고군분투기를 연재하고 있습니다.현재 운영중인 스팀헌트 (Steemhunt)는 전 세계 2,500개가 넘는 블록체인 기반 앱들 중에서 Top 10에 들어갈 정도로 전 세계 150개국 이상의 많은 유저들을 보유한 글로벌 디앱 (DApp - Decentralised Application) 입니다 (출처 - https://www.stateofthedapps.com/rankings).스팀헌트 웹사이트 바로가기
조회수 2351

안드로이드와 자동화 툴

모바일은 플랫폼의 생태계와 규모에 비해 개발자들이 처리해야 할 것이 매우 많습니다.서버나 타 플랫폼들 또한 개발자들의 영역이 많지만 그 영역들이 세분화되고 전문화되어 가고 있습니다. 데이터베이스, 백엔드, 프론트웨어, 인프라, DevOps 와 같이 점점 분야별로 심화되고 독립성을 갖추어 가고 있습니다.하지만 모바일은 각 플랫폼의 개발자들이 전체적인 아키텍쳐, 프론트, 내부용 데이터베이스, 리소스 관리, 배포 등이 해당 플랫폼의 소수의 개발자들에게 광범위하게 공존합니다. 다양한 분야가 전문화되기엔 변화가 잦고 규모가 점 형태로 구성이 된 경우가 많기 때문입니다.그렇기 때문에 반복적이고 불필요하게 비용이 소모되는 작업일수록 자동화 해서 최대한 코드 작성 본연에 업무에 집중할 수 있도록 환경을 구성하는 것이 중요합니다.토스랩 안드로이드 팀은 2015년 초부터 조금씩 자동화 환경을 구성하여 현재는 아래와 같습니다.다국어 문자 관리 자동화이미지 관리 자동화CI다국어 문자 리소스 자동화1. 다국어 글로벌 담당자의 원본 문서토스랩은 다국어 지원을 위해 글로벌 번역 문서를 관리하고 있습니다. 문서는 Google Drive 를 통해서 관리되고 있으며 기획/개발 파트에서 다국어 지원을 위한 리소스를 기입하면 각 언어의 담당자들이 해당 언어를 번역하고 있습니다.구성은 아래와 같습니다ABCDEFGH영어한국어일본어중국어-간체중국어-번체웹키ios 키안드로이드 키2. 기존 작업기존에는 해당 언어의 번역 데이터를 추가하기 위해 개발 파트에서 수동으로 각 언어의 리소스 파일에 추가하는 형태로 진행하였습니다.이러한 작업의 단점은 언어별 리소스 파일에 키-값 형태의 문자 리소스를 추가하는 작업을 반복적으로 해야 한다는 것입니다. 또한 반영이 된 후에 수정된 문자에 대해서 반영하기가 매우 어렵고 실수도 빈번하게 발생합니다.이러한 가능성을 최소화 하기 위해 자동으로 문자 리소스를 갱신하는 작업을 진행하였습니다.3. 안드로이드 파트를 위한 별도 필터 파일 추가|A|B|C|D|E|F| |—-|—-|—-|—-|—-|—-| |영어|한국어|일본어|중국어-간체|중국어-번체|안드로이드 키|가급적 원본 파일에 대한 조작을 피하기 위해 안드로이드용으로 Read-Only SpreadSheet 를 별도로 생성하였습니다.해당 작업을 위해 Google SpreadSheet Script 를 사용하였습니다.4. 자동화 툴 작업자동화 툴의 역할은 크게 3가지였습니다.안드로이드용 필터 파일을 다운로드한다.Spread-sheet를 분석해서 다국어용 자료구조로 변환한다.다국어용 자료구조를 XML 파일로 변경한다.툴은 Python 스크립트로 작업하였습니다.5. Gradle Task 로 추가별도의 Python 파일을 실행해도 되지만 Gradle Task 로 추가하여 Android Studio 에서도 Task 를 실행할 수 있도록 하였습니다.개발팀에서 안드로이드 키를 원본 문서에 추가한 후 Gradle Task 실행하면 바로 반영되도록 하였습니다. 기존의 방식과 가장 큰 차이점은 Merge 시 충돌 이슈에 대해서 더이상 관여하지 않아도 된다는 것입니다. 가장 최근 시점을 기준으로 자동화 Task 를 실행하면 모든 리소스가 최신화되기 때문에 충돌이 난다하더라도 무시하고 새로 Task 를 실행함으로써 충돌에 의한 이슈를 완전히 배제하고 작업할 수 있다는 장점이 생겼습니다.더 나아가 현재는 Android 용 리소스 Key를 기획 팀에서 기획시 적용하도록 하기로 현재 논의되고 있습니다. 이러한 논의가 반영된다면 더이상 리소스 관리에 있어서 개발파트에서 관리 할 필요가 없어지므로 다국어 리소스에 반영해야할 리소스 또한 최소화 될 것이라 기대하고 있습니다.이미지 리소스 자동화1. 기존 작업앱에 사용되는 디자인 리소스는 이슈 트래커와 JANDI 의 디자인 토픽을 통해서 전달 받아 작업을 하였습니다.이런 작업 형태는 이미지 관리가 분산 될 뿐만 아니라 일관성 있는 전달 방식이 아니기 때문에 누락건이 언제든지 존재할 수 있습니다.그래서 디자인 리소스에 대한 관리를 디자인 팀이 주도적으로 하며 개발팀에서는 빠르고 편하게 이미지를 전달 받을 수 있도록 하기 위해 자동화 툴을 만들었습니다.2. 개선 작업토스랩의 디자인 팀에서 사용하는 저장소는 권한에 따라 접근이 가능하도록 API 를 제공하고 있습니다. Read-Only 권한을 부여받은 후 API 를 통하여 이미지를 다운로드하도록 툴을 구성하였습니다.툴은 Python 스크립트로 구성하였습니다.3. Gradle Task 로 추가문자 리소스와 마찬가지로 별도로 Gradle 로 툴을 이용할 수 있도록 하기 위해 별도의 Task 를 정의하여 사용하도록 하였습니다.자동화된 리소스의 관리문자와 이미지를 자동화로 관리한다 하더라도 개발자가 필요에 따라 임의로 추가/수정하는 리소스가 존재 할 수 있습니다.이를테면 다운로드한 이미지 리소스를 활용한 Selector-Drawable 과 같은 것들입니다.이에 따라 자동화 처리된 리소스들은 별도의 관리를 위해 추가적으로 ResourceSet 을 만들었습니다. android { // ...중략 sourceSets { main.res.srcDirs += ${별도의_리소스_경로} } } 이러한 방식을 통해서 자동화된 리소스와 추가적한 리소스를 분리하여 발생할 수 있는 문제를 최소화 하였습니다.지속적 통합 (Continuous Integration, CI)자동화와 관련되어서 결코 빠질 수 없는 내용입니다. 빌드, 테스트, 배포, 리포팅에 이르기까지 이 모든 과정에 있어서 자동화 되지 않았다면 상상하기 어려운 작업들입니다.토스랩에서는 Jenkins 를 활용하여 빌드-테스트-리포팅을 하고 있습니다.1. 빌드 대상빌드의 의미는 최소한 컴파일 오류가 발생하지 않는 코드들이 최종 상태로 관리되고 있음을 의미합니다. 그러기 때문에 언제나 중앙 저장소에 반영되었거나 반영될 예정의 소스들은 항상 빌드 대상이라고 볼 수 있습니다.안드로이드 팀은 내부적으로 빌드 대상이 되는 브랜치를 아래와 같이 정의하였습니다.개발된 이슈가 최종적으로 반영된 브랜치 (develop)Github 에서 코드에 변경이 발생하면 이를 Jenkins 로 통보하여 해당 브랜치를 빌드합니다.개발 브랜치에 반영을 위해 코드리뷰 중인 브랜치 (features, fixes)Github 에 새로운 Pull-Request 가 발생하면 Jenkins 로 통보하여 해당 브랜치를 빌드합니다.테스트와 리포팅은 이 시점부터 발생한다고 볼 수 있습니다.2. 빌드빌드를 하는 과정에 기본적인 정적 분석을 사용하고 있습니다. 코드의 Convention 이나 복잡도 등을 측정하고 이를 분석하여 수정할 부분을 파악하기 위해서입니다.3. 테스트안드로이드팀은 작년 중순까지 Robolectric 이라는 Test Framework 을 사용하였으나 여러가지 이슈로 인하여 현재는 Android Test Support Library 를 사용하고 있습니다. ATSL 은 에뮬레이터를 필요로 하기 때문에 Jenkins 서버에 에뮬레이터를 구동하여 Test-Bed 를 구성하였습니다.빌드 과정에서 정적 분석이 완료되면 테스트 코드를 동작 시킵니다.테스트 된 결과는 JUnit Test Report 와 Jacoco Coverage Report 를 받고 있습니다.4. 결과 리포트빌드, 테스트 결과는 Jenkins 에서 별도로 관리되고 있지만 모든 동작들은 자동화 되어 관리되기 때문에 별도의 장치가 없다면 알아채기 어렵습니다.좀 더 빠른 피드백을 받기 위해 JANDI-Webhook 기능을 이용하여 결과 리포팅을 바로 받아 확인 할 수 있도록 하였습니다. 또한 Github Pull-Request 화면에서 Build-Status 연동하여 코드리뷰 하는 과정에서 잠재적 오류를 찾을 수 있도록 하였습니다.※ 빌드된 결과물의 배포는 내부적인 정책으로 현재는 하지 않고 있습니다만, 현재 가용 가능한 리소스 안에서 해결 방안을 찾고 있습니다.총평자동화의 가장 큰 목적은 반복적이지만 시간을 소요하기엔 가치가 떨어지는 작업을 단순화 하기 위함이었습니다. 여기서 오는 가장 큰 의미는 관리에 소요되는 시간을 최소화함으로써 생산성을 향상 시켰다는 데에 있습니다.특히 다국어 리소스와 이미지 리소스를 자동화 하기 위한 작업은 소요된 시간이 극히 미미하지만 그 효과는 매우 긍정적이라 할 수 있습니다.CI 는 초기 설정뿐만 아니라 관리가 매우 어려운 작업입니다. 해당 시스템을 총체적으로 알고 있다는 가정에서 해야 하며 정책적으로 규정해야 하는 것들도 있습니다. 하지만 결과물 그 자체에 대한 관리를 위해서는 없어서는 안되는 도구이며 정적분석과 자동화 테스트 등 다양한 효과를 얻을 수 있기 때문에 많은 개발자들에게 권장하고 싶습니다.#토스랩 #잔디 #JANDI #개발 #효율 #자동화툴 #업무환경
조회수 886

[제일 컬처] 마법사, 빗자루, 촛불… 그리고 #입사식

 마법사 옷을 걸친 사람들, 공중에 떠 있는 빗자루와 촛불, 벽에 걸린 움직이는 액자…지난 3월 27일, 제일기획 본사 11층을 지나던 제일러들은 뜻밖의 풍경에 의아해했는데요. “영화 촬영하나?”, “캠페인 영상 촬영을 사내에서 하나?” 하는 궁금증을 자아내는 풍경이었죠. 이 이색적인 풍경은 바로 신입 제일러들의 입사식 때문이었는데요. 2018년 신입 제일러들의 입사식 현장, 지금부터 같이 구경해볼까요? 이번 입사식 컨셉은 ‘마법’  제일기획 입사식은 매번 신입 제일러들이 스스로 입사식 컨셉을 정하고 영상, 공연 등을 준비하는 것으로 유명한데요. 세계무대로 떠나는 공항 컨셉으로 꾸며지기도 했고, 락페스티벌 컨셉으로 꾸며지기도 했었죠. 처음 선배들에게 선보이는 프로젝트라고 할 수 있어 부담감도 크지만, 똘똘 뭉쳐 준비하다 보면 동기들끼리 친해지기도 하고 아이디어와 재능, 패기를 발산할 좋은 기회가 되기도 합니다. 말하자면 떨리고 설레는 ‘데뷔 무대’인 셈.이번 신입 제일러들은 ‘마법(MAGIC)’을 입사식 컨셉으로 정했다고 하는데요. 조창민 신입 제일러의 말에 의하면 “획기적인 아이디어로 클라이언트의 문제를 해결하는 마케팅 솔루션을 ‘마법’에 비유해 제일기획에서 ‘마법사’로서 첫발을 내딛는 ‘초짜 마법사’들의 꿈과 포부를 보여주고자 했다”고 하네요.▲ 마법(!)을 선보이는 신입 제일러들   천천히 즐기면서 성장하길! 입사식은 지난 6주간의 신입사원 교육 과정과 글로벌 광고업계 현황 등을 담은 영상으로 시작했는데요. 이어서 신입 제일러들이 입사식을 위해 연마(?)한 마술로 무에서 유를 창조하고, 문제 해결을 위한 인사이트를 제공하며, 클라이언트의 마음을 사로잡는 제일기획의 ‘마법’ 같은 능력을 재치있게 소개했습니다. 그리고 마무리는 활력 넘치는 댄스공연!▲ 입사식 마무리는 댄스 공연! 입사식에 참석한 제일기획 유정근 사장은 “무에서 유를 창조하는 ‘마법’과 같은 캠페인을 만들며 느꼈던 자부심과 감성을 다시금 일깨워준 뜻깊은 시간이었다”고 소감을 밝히며 “신입 제일러들 모두 자신의 위치에서 서두르거나, 멈추지 말고 천천히 즐기면서 성장하길 바란다”고 격려했습니다.프로로서 눈부신 활약을 하게 될 신입 제일러들의 모습이 정말 기대가 되는데요. 앞으로 블로그에서 전해드릴 수 있으면 좋겠습니다! 3월, 제일기획 신입 제일러들처럼 새로운 시작을 하신 분들이 많을 것 같은데요. 새로운 출발선에 선 블로그 독자 여러분들도 서두르거나 멈추지 말고 항상 매 순간을 충분히 즐기며 눈부신 하루하루를 보내시길 바랍니다. 제일기획 블로그가 응원해요.♥#삼성 #삼성그룹 #제일기획 #신입사원 #입사식 #사내문화 #기업문화 #조직문화 #기업복지 #신입사원정보 #꿀팁
조회수 2858

iOS 개발을 위한 11가지 노하우

Overview기고 제안을 받자마자 iOS 개발을 시작했을 때가 떠올랐습니다. 신대륙을 마주한 것 같았던 그때의 기분을 아직도 잊지 못하기 때문입니다. 당시까지만 해도 Android 개발만 했기 때문에 iOS는 그야말로 미지의 영역이었습니다. 게다가 개발을 시작하려고 조심스럽게 첫 발을 내딛은 순간, 입이 떡 벌어질 수밖에 없었죠.“이렇게 느린 IDE가 있다니…““개발자 프로그램이 뭐 이렇게 비싸?”XCodeXCode는 그동안 접했던 IDE 중에서도 가장 최악이었고, 개발자 프로그램 등록은 13만 원 상당의 비용을 지불해야 했습니다. 가장 중요한 건 맥 컴퓨터(Macintosh)를 보유해야만 했죠. 처음 개발을 시작하려니 넘어야 할 산이 매우 많았습니다. 맞습니다. 팜므파탈의 대명사 마타하리(Mata Hari)처럼 iOS 개발은 밀당과도 같습니다. 분명 매력적인 일이지만 XCode와 개발자 프로그램 등록은 빙산의 일각이기 때문입니다. iOS는 곳곳에 구덩이를 파고 초보 개발자들을 집어삼킬 준비를 하고있습니다. (예를 들면 리소스를 묶어놓은 R.java 파일 같은 레퍼런스가 없습니다. 흑.)그래서 준비했습니다. 수많은 초보 개발자들이 iOS의 구덩이를 피해갈 수 있는 팁을 말이죠.iOS의 구덩이를 피하는 11가지 방법1.비싼 맥(Macintosh)을 사세요.iOS 개발자에게 MacOS는 필수입니다. XCode가 MacOS만 지원하기 때문입니다. 오픈 소스로 공개된 Swift에는 제약이 없지만 XCode는 MacOS에서만 동작하는 제약이 있습니다. 따라서 맥은 iOS 개발자에게 가장 필요한 준비물입니다. 게다가 하드웨어 리소스를 많이 사용하는 XCode 탓에 더 크고, 더 비싸고, 더 아름다운 맥을 구매하셔야 합니다. Macbook이나 Macbook Air 모두 추천하지 않습니다. 15형 Macbook Pro 모델을 비롯해, Mac Pro나 iMac Pro 등의 고급 모델을 사용하면.. 개발이 잘 됩니다.2.돈을 내세요.iOS를 개발하려면 가장 먼저 Apple Developer Portal에서 연 129,000원의 개발자 프로그램에 등록해야 합니다. XCode를 사용해서 코드만 볼 것이라면 문제가 되지 않지만, 디바이스에 앱을 설치하고, 테스트하며, AppStore에 배포할 거라면 반드시 구매해야 합니다. 이 계정은 앞서 말한 것처럼 1년이 지나면 다시 구매해야 합니다. 만약 기업 개발자로 등록하려면 Enterprise Program이 따로 준비되어 있습니다. 기업을 위해 특화된 In-House 배포 등의 이점이 있습니다. 구매해야할 것이 꽤 많죠? 이제 익숙해져야 합니다.3.XCode를 설치하세요.XCode는 Mac App Store에서 설치할 수 있습니다. 용량이 크기 때문에 설치하기 전에 하드디스크 저장공간부터 확인하는 것이 좋습니다. 처음 실행하면 추가 컴포넌트를 다운로드하는 과정이 실행되고, 그 이후에 XCode를 사용할 수 있습니다. XCode와 관련된 자세한 내용은 아래에서 자세하게 다루겠습니다.4.어려운 것에 대비하세요.1)인증서‘들’XCode 설치 이후에도 몇 가지를 발급 받고, 셋업해야 합니다. 방 탈출 게임처럼 한 단계 한 단계 거치는 과정이 필요합니다. 첫 번째로 인증서‘들’을 발급받아야 합니다. 애플을 대신해 앱을 설치하고, 배포할 수 있는 권한을 위임 받는 과정입니다. 이 인증서들은 Apple Developer Portal의 ‘Certificates, IDS & Profiles’ 항목에서 발급 받을 수 있으며, MacOS의 키체인 앱을 이용해 개인 키를 생성하는 방식으로도 방식으로 발급 받을 수 있습니다. 2)디바이스 등록디바이스-iOS-에 개발한 앱을 설치하려면 애플 개발자 계정에 개발용 디바이스를 등록해야 합니다. 이 과정은 XCode에 신규 디바이스를 연결하고, 빌드 및 배포를 할 때 XCode가 알아서 합니다. 만약 디바이스를 보유하고 있지 않은 상황이라면 해당 디바이스의 UUID를 받아서 개발자 포털에 직접 등록할 수도 있습니다. 3)Bundle IDBundle ID는, 앱의 고유한 ID입니다. iOS가 앱을 식별할 때 사용하는 식별자이며, 보통 ‘com.companyname.appname’ 의 형식으로 회사나 개인의 도메인을 거꾸로 쓰는 것이 보편적입니다. 하지만 Bundle ID는 어디까지나 개발자가 결정하는 영역이므로 인스턴스 이름 지정하듯이 자신만의 고유한 방법을 사용해서 Bundle ID를 지정해도 문제가 없습니다. 4)Provisioning ProfileProvisioning Profile은 디바이스 정보와 앱 정보, 인증서 정보를 매핑해주는 Profile입니다. 최신 XCode에서는 이 Provisioning Profile을 자동으로 관리해주기 때문에 따로 신경쓰지 않아도 좋습니다.5.개발자 포럼에 질문하거나, StackOverflow에 질문하거나!질문하는 사람은 아름답습니다. 궁금하거나, 잘 안 풀리는 코드는 개발자 포럼에서 질문할 수 있습니다. 대신 영어 실력이 좋아야 합니다.크게 기대는 하지 않는 것이 좋습니다. 등록된 discussion에 대한 답글들이 ‘나도 같은 상황이다’, ‘나도 궁금한 점이다’ 등의 다른 개발자들의 답변 정도가 일반적이기 때문이죠.그들의 답변...저는 개발자 포럼보다 StackOverflow를 더 선호합니다. 참여하는 개발자 규모가 다르기 때문에 보다 양질의 정보를 빠르게 찾을 수 있습니다. (하지만 허위 정보도 존재합니다.) Vote 시스템으로 신뢰 높은 정보를 필터링할 수 있으나, 어떤 정보를 선택할지는 당신의 몫입니다.6. iTunesConnect와 친하게 지내세요.앱을 개발했다면, iTunesConnect를 통해 앱을 전 세계의 사용자들에게 배포할 수 있습니다. iTunesConnect는 iOS용으로 개발된 바이너리를 배포하는 등 앱 배포/테스트와 관련된 전반적인 사항들을 관리할 수 있는 포털입니다. AppStore에서 앱을 판매하려면 이 iTunesConnect를 통해 애플과 계약을 해야만 가능합니다. 출시할 앱을 등록하기도 하고, 앱의 사용자들이 어떤 경향을 보이는지 Trend Analysis를 확인할 수도 있습니다.iTunesConnectiTunesConnect에는 다양한 메뉴들이 있고, 앱을 배포하고 관리하는데 필요한 여러 툴이 있으므로 개발 중에 시선을 환기하고자 한다면 iTunesConnect를 한 바퀴 둘러보는 것도 좋습니다. 언젠가는 다 사용하게 될 테니까요.7.앱 개발을 마쳐도 XCode를 사용하세요.앱을 개발하고 iTunesConnect에 업로드하려면, XCode를 통해 간접적으로 바이너리를 업로드하게 됩니다. 서드파티 앱을 사용할 수도 있지만, 제가 주로 많이 사용하는 방식은 XCode입니다. 소스코드가 준비되었다면, XCode 메뉴의 Product > Archive 메뉴를 선택해 XCode가 배포용 앱을 빌드합니다. 빌드가 완료되면, 자동으로 Organizer 창이 열리면서 앱을 업로드할 수 있게 되죠. 이 때 미리 구매한 개발자 계정의 인증서가 준비되어 있어야 합니다. 모든 준비가 완료되고 아카이빙이 완료되면, Organizer의 Archives 탭에서 우측단의 ‘Upload to App Store…’ 버튼으로 바이너리 업로드를 진행할 수 있습니다.8.배포 전에 시험비행을 해봅시다.앱을 개발했다면, 테스트플라이트(TestFlight)를 통해 실제로 앱을 배포하기 전 ‘시험비행’을 할 수 있습니다. iTunesConnect에 관련 테스터들을 등록하고, 등록된 사용자들을 대상으로 미리 앱을 테스트할 수 있도록 요청하는 것이죠. 이 테스트플라이트에 배포된 바이너리를 그대로 AppStore에 배포하게 되므로, 테스트용으로 유용합니다.TestFlight테스트플라이트는 원래 iOS 배포 관리 솔루션을 제공하는 업체였지만 지금은 애플이 인수해 iTunesConnect에서 관리하도록 제공하고 있습니다.9.앱이 죽는다면 Organizer로 확인하세요.iOS는 충돌보고 Crash Report를 Organizer를 통해 오류를 확인합니다. 앱을 설치한 사용자가 동의하면 XCode는 iOS가 앱을 실행하면서 발생한 Crash Report를 애플에 자동으로 업로드합니다. 업로드된 Crash Report들은 XCode의 Organizer를 통해 다운로드하고, 확인할 수 있습니다. Organizer는 XCode > Window > Organizer 항목에서 실행하세요.Organizer와 Crash ReportCrash Report는 Organizer의 상단 Crashes 탭에서 확인이 가능합니다. 또 현재 보고 있는 Crash Report의 어느 부분에서 오류가 발생했는지 알고 싶다면 우측단의 ‘Open in Porject…’ 버튼을 눌러보면 됩니다.10.내 친구 XCode최근 XCode는 메이저 업데이트를 통해 사용성과 퍼포먼스를 향상시켰습니다. 하지만 이만큼 무겁고 느린 통합개발툴 IDE는 이클립스(Eclipse) 이후에 처음입니다. 안드로이드의 경우 IntelliJ 기반의 Android Studio로 쾌적한 개발환경을 제공하고 있는 반면, XCode의 업데이트는 퍼포먼스나 사용성 개선보다는 Swift의 메이저 버전 반영에 더 급급한 느낌입니다. (업데이트 때마다 속지만 ‘혹시 이번에는..’하고 또 속아 넘어갑니다.) XCode 사용을 위한 네 가지 팁을 소개합니다.1)XCode는 모노로그입니다.XCode는 로그를 따로 ‘예쁘게’ 볼 수 없습니다. 검은 화면에 흰 로그가 정리되지 않은 상태로 마구마구 출력됩니다. 개발자들에게는 쥐약같은 상황이죠. 이런 불편한 로그 출력 방식 때문에 저는 별도의 GlobalLogger 모듈을 작성해서 다음과 같은 스타일로 로그를 출력하도록 하고 있습니다.$$ BrandiLogger Error Log ##MESSAGE: Initial Parameter is not exist. ##LOCATION: BRLogPringer.swift @Line: 122 2)iOS개발자를 위한 휴식시간, 빌드 타임XCode의 빌드 타임은 개발자에겐 기나긴 휴식 시간입니다. 소스가 비대해질수록 퍼포먼스는 떨어지며, 담배 한 대를 태우고, 화장실에서 손을 씻고 들어와도 빌드가 절반도 안 된 상황을 마주할 겁니다. 빌드 타임을 줄이고자 구글링을 하면 몇 가지 팁을 발견할 수 있는데, 특히 빌드 타임을 가장 많이 단축할 수 있는 방법이 있습니다.짜잔! 공개합니다!먼저, 프로젝트 셋팅의 ‘Build Settings’ 항목에서 ‘Optimization Level’을 검색합니다. ‘Swift Compiler - Code Generation’ 항목을 찾을 수 있는데요. 여기서 Optimization Level의 Debug 항목을 ‘None’으로 설정하면, 빌드시간이 엄청나게 줄어든 것을 확인할 수 있습니다. Brandi iOS 버전의 소스코드는 원래 컴파일에 7분 이상이 소요되었지만, Optimization Level을 변경한 후 1분 내외로 단축되었습니다. Optimization Setting을 변경할 때는 꼭 Debug 항목만 변경하고, Release 버전은 기존 설정을 유지하는 것이 좋습니다. 그래야 빌드 과정에서의 버그를 막을 수 있기 때문이죠. 만약 이 설정으로 개발하던 도중 소스가 충돌되면 Command+Shift+K 단축키를 눌러 소스를 한 번 클린하고, 재빌드하세요. 충돌이 사라지는 경우가 많습니다. 빠른 빌드를 위해 종종 감수해야 하는 부분이기도 합니다. 3)Derived Data빌드가 자꾸 안되고 꼬일 때는 Derived Data 폴더를 삭제 해 보세요. Derived Data 폴더는 XCode > File > Project Settings(Workspace Settings) 항목에서 ‘Derived Data’ 항목 아래의 폴더 경로에서 접근할 수 있습니다. Derived Data 접근 경로Derived Data 폴더를 삭제하면 거짓말처럼 빌드 오류가 사라지는 기적을 만날 수 있습니다. 4)CocoaPods‘바퀴를 두 번 발명할 필요는 없다’는 격언이 있습니다. 이것을 개발에 적용하면 ‘잘 만들어진 라이브러리를 사용하라’ 정도가 되겠습니다. 개발자의 개발 시간을 현저하게 단축시키는 오픈소스 라이브러리. 이것들을 간편하게 사용하는 방식이 iOS에도 존재하는데, 바로 CocoaPods입니다. 프로젝트 Root 폴더에 Podfile을 생성하고, 원하는 오픈소스 라이브러리들을 명시한 후에 ‘pod install’ 명령어를 입력해주면….CocoaPods오픈소스 라이브러리가 설치되었습니다. 귀찮은 소스 다운로드와 임포트 과정을 거치지 않아도 됩니다. CocoaPods 설치와 사용에 관한 글은 구글링으로 쉽게 찾을 수 있습니다. 꼭 사용하길 권합니다.Mac App Store에서의 XCode 평점XCode는 느리고 불편합니다. 숨겨진 편의기능도 많지만 고질적인 빌드 문제와 사용성 문제를 마주하면 높은 평점을 줄 수가 없습니다. 그런데, 저만 그렇게 생각하진 않더라고요.(위 스크린샷 참조) XCode의 사용법은 기회가 되면 따로 정리하겠습니다.11.어떤 경우에도 대응할 수 있는 화면 구성을 원한다면, AutoLayoutiOS를 사용하면서, 금융권이나 쇼핑 앱들을 사용하다 보면 이런 상황이 발생합니다. 금융권 앱. 화면에 꽉 차지 않는 레이아웃 혹은 비정상적으로 커진 글씨본래 iOS는 단일 디바이스를 지향하는 플랫폼이었습니다. 아이폰 시리즈도 해상도가 변하지 않았기 때문에, 디바이스 종류가 많은 안드로이드처럼 다양한 스크린 사이즈를 지원할 필요가 없었습니다. 하지만 이제는 iPhone SE, iPhone 8, iPhone 8 Plus의 해상도에 iPhone X의 해상도까지 더해지면서 그야말로 ‘해상도 춘추전국시대’가 되었습니다.이런 다양한 해상도를 모두 지원하는 레이아웃을 구성하려면, iOS에서는 AutoLayout을 사용해야 합니다. AutoLayout은 Xib Editor에서 AutoLayout을 활성화하는 방식으로 사용할 수 있습니다. 거기에 한 가지 덧붙이면 Layout Constraints라는 개념도 있습니다. 레이아웃에 조건을 주는 방식입니다. 예를 들어 ‘어떤 해상도에서든 이 컴포넌트는 왼쪽 끝으로부터 10Point의 여백을 가지도록 한다’ 라는 식이죠. AutoLayout, Layout Constraint이 Layout Constraint를 이용하면 짧은 시간 안에 다양한 해상도를 지원하는 레이아웃을 쉽게 만들 수 있습니다. 가히 AutoLayout의 꽃입니다.ConclusionXCode/iOS 개발과 관련된 팁은 대부분 구글링으로 찾을 수 있습니다. 다룰 내용이 많지만 초보 iOS개발자들이 당황할 수 있는 내용을 중심으로 글을 썼습니다. 소소한 이야기지만, 분명 도움을 받을 수 있을 겁니다.글이정환 과장 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #iOS #개발기 #업무환경 #인사이트 #경험공유 
조회수 1307

게임은 마약이 아니라 약이다

우리 사회에서는 게임에 대한 부정적인 시선들이 많다. 우리 사회의 모든 악이 모두 게임을 통해서 파생된것 같은 느낌이다. 철없는 부모가 아이를 죽인 사건에도 게임중독이 나오고, 10대의 잔혹한 범죄 뒤에도 언제나 게임이 등장한다. 정말 게임은 나쁜 것일까? 사실 게임은 최근에 만들어진 것이 아니다. 인간의 문명 이전부터 게임은 있어왔고 인류와 언제나 함께 있었다. 단지 기술의 발전으로 인해 게임하는 방법이 달라진것 뿐이다. 난 게임 자체가 나쁘다는 것에 동의할 수 없다. 단지 그 게임에 지나치게 중독된 몇몇 사례를 증폭해서 게임자체를 나쁘게 몰고 있지 않나라는 생각이 든다. 난 이제 게임이 좋은 방향으로도 쓰일 수 있다는 이야기를 해주고 싶다. 네오펙트는 재활 환자의 동기부여를 강화시키는 목적으로 게임을 활용하고 있다. 재활치료는 반복적인 동작을 지속적으로 수행해야 하는 지루하고 고된 과정이다. 이 과정 중에 많은 환자들이 쉽게 포기하게 된다. 포기하지는 않더라도 환자들의 낮은 동기 부여는 재활의 효과를 낮추게 된다. 그렇기때문에 재활의학계에서는 게임을 이용하여 재활 환자의 동기 부여를 높이고 재활 효과를 극대화 시킬 수 있다는 연구가 꽤 오래전부터 되어 왔다. 그리고 최근에 그러한 연구 결과들이 조금씩 나오고 그 효용성이 증명이 되고 있다. 네오펙트도 이러한 연구 결과를 바탕으로 재활 환자들을 위한 다양한 게임들을 만들고 있다. 재활 환자를 위한 게임을 만드는 것은 생각만큼 단순하지않다. 재활 환자를 위한 게임의 목적은 치료가 가장 중요한 목적이고 재미적인 요소는 그 다음 요소이기 때문에 기존 게임의 룰과는 다른 룰을 가지고 있다. 게임에 대한 재활의학계의 시각을 재활의학과 의사 선생님들의 말을 인용하여 이야기를 해본다면 의사 분들이 약을 처방하듯이 재활 의학과 의사들은 재활 환자들에게 게임을 약처럼 처방을 내릴 수 있다고 한다. 그렇다면 게임도 약처럼 처방을 내릴 수 있도록 임상적인 의미가 게임안에 고도로 설계가 되어 있어야 한다. 마치 어린아이에게 쓴 한약을 먹이기 위해 꿀을 타는 것 처럼 재활 훈련이라는 재미없는 훈련을 게임의 재미요소를 통해서 꾸준히 할 수 있게끔 해주는 것이다. 하지만 꿀을 너무 많이 타면 한약의 본래 성질을 해칠 수 있는 것처럼 재미요소를 우선시 했을때의 부작용도 분명히 있기 때문에 적절한 발란스가 중요하다. 그렇기 때문에 네오펙트에서는 내부에 오랜 임상 경험을 가진 전직 재활 치료사와 전문 게임기획자가 같이 재활 게임을 만들고 있다. 이러한 콜라보를 통해서 임상적으로도 의미가 있고 환자의 동기 부여도 극대화 할 수 있는 게임을 만들고 있다. 그리고 이렇게 만들어진 게임을 새로운 신약을 병원에서 임상 시험 하듯이 실제 병원의 환자들을 통해서 시험을 해보면서 임상적 효과도 검증하고 또한 필요한 경우 병원의 피드백을 통해서 꾸준히 게임의 밸런스를 맞추어나가는 작업을 반복하게 된다. 이렇게 하면서 재활 환자들의 치료에 최적화된 게임이 만들어진다.  게임은 인간이 만들어낸 도구에 불과하다. 도구는 무색 무취하다. 어떻게 쓰느냐에 따라서 그 성질이 악할 수도 있고 선할 수도 있다. 우리는 게임이 재활환자들의 희망을 만들어낼 수 있는 훌륭한 도구가 될 수 있다고 믿는다. 그리고 우리는 그 믿음을 실현하고 있다.  #NEOFECT #서비스 #서비스소개 #기업문화 #기업가치
조회수 2980

JANDI CONNECT 개발기

지난 1월 말, 새해를 맞아 잔디에 새로운 기능이 업데이트되었습니다. 바로 잔디 커넥트에 관한 내용인데요, 협업에서 많이 쓰이는 몇 가지 외부 서비스를 잔디와 쉽게 연동해서 더욱 효율적인 업무 커뮤니케이션을 할 수 있게 되었습니다. 많은 고객분들이 이번 업데이트를 기다려주신 만큼, 저희 개발팀 또한 기대에 보답하고자 지난 몇 주의 스프린트 동안 열심히 준비했습니다. 이번 글에서는 커넥트 동작 방식을 설명하고 그 개발 과정에서 저희가 겪은 시행착오를 비롯한 여러 값진 경험들을 공유하고자 합니다.Integration? Webhook!연동: [기계] 기계나 장치 따위에서, 한 부분이 움직이면 다른 부분도 함께 잇따라 움직임.앞서 말한 대로 잔디 커넥트는 여러 웹 서비스들과 잔디를 연동할 수 있는 기능입니다. 서로 다른 웹 서비스를 연동하기 위해선 한 서비스 내에서 특정 이벤트가 발생 했을 때 다른 서비스로 해당 이벤트를 알려주는 연결 고리가 필요합니다. 이때 해당 연결 고리 역할을 위해 대표적으로 사용되는 기법이 웹훅(WebHook) 입니다. 웹훅은 user-defined HTTP callbacks, reverse APIs 등으로 불리는데, 간단히 설명하자면 웹 서비스에서 공개한 API가 아닌 사용자가 직접 지정한 주소(URL)로 특정 이벤트가 발생 시 HTTP Request를 보내주는 기법입니다. 예를 들어,새로운 일정이 등록된 경우(Google Calender)요청한 Pull Request가 Merge된 경우(GitHub)카드에 새로운 코멘트가 작성된 경우(Trello)이러한 이벤트가 발생했을 때 사용자가 매번 이벤트가 발생했는지 확인하지 않아도 서비스가 먼저 알려줄 수 있도록 일종의 알림을 등록하는 것이죠. 잔디 커넥트는 이와 같은 특징을 이용해서 각각의 웹 서비스에서 제공하는 웹훅을 잔디의 메시지 형태로 전달하는 기능입니다.일반적으로 웹훅은 이벤트에 대한 알림을 외부로 전달하는 것을 말합니다. 이 부분에서 중요한 것은 전달 방향인데, 서비스 내부에서 외부로 전달하기 때문에 이를 Outgoing Webhook으로 부르기도 합니다1. 같은 맥락에서 반대로 생각해보면 외부에서 서비스 내부로 특정 데이터를 전달하는 경우이니 Incoming Webhook이 됩니다. 앞서 웹훅을 reverse API라고 했는데 이를 다시 뒤집으니 결국 서비스 내부로 통신하는 제한적인 API와 같은 역할을 합니다. 굳이 용어를 구분한 이유는 API와 달리 접근하려는 서비스의 별도 인증 절차를 거치지 않고도 사용자가 생성한 웹훅의 URL을 인증 토큰으로 사용하며 약속된 Request Body 포맷만 알고 있다면 자유롭게 사용할 수 있기 때문입니다.개념 설명이 다소 길어졌지만, 이번 잔디 커넥트 기능에 대해 용어나 개념이 낯설다는 피드백이 생각보다 많았기 때문에 이번 글을 통해 더 많은 분들이 웹훅을 이해하는 데 도움이 될 수 있으면 좋겠습니다.구현에 앞서서비스를 운영한지 1년 정도 지난 시점에서 저희 내부적으로는 백엔드의 기술 스택 변경 및 각 서비스 분리에 대한 갈증이 있었습니다. 하지만 이미 서비스를 운영 중이기 때문에 안정성이 최우선시 되는 만큼 꽤 부담스러운 숙제로 미뤄둘 수밖에 없었고요. 때마침 커넥트 기능은 숙제를 시험해볼 만한 좋은 기회임에는 분명했지만, 새로운 기술 스택을 바로 서비스에 적용하기엔 오히려 개발 효율이 떨어질 것이라는 판단하에 일단 서비스 분리에만 집중하기로 했습니다.기본적으로 API와 DB를 기존 서버와 분리하고 웹훅 데이터를 저장하기 위한 큐와 해당 데이터를 처리하는 배치 서버 또한 모두 기존 서비스와 분리해서 최대한 결합도를 제거했습니다. 이런 설계 덕분에 추후 사업 전략이나 각 국가의 특성에 맞춰 커넥트 기능을 어렵지 않게 포함하거나 제외할 수 있게 되었습니다. 전반적인 저희 잔디 백엔드 아키텍쳐에 대해서는 아직 한 번도 소개 해드린 적이 없으니 다음에 따로 주제로 선정해 집중적으로 다뤄보도록 하겠습니다.동작 방식잔디 커넥트가 동작하는 방식은 기본적으로 다음과 같습니다.Incoming Webhook URL 생성 - 외부 서비스 웹훅 등록 - 웹훅 수신 - 메시지 작성 연동 대상 서비스마다 조금씩 차이가 있지만, 기본적으로 모두 위와 같은 방식으로 동작하기 때문에 단계마다 나누어 설명하겠습니다.1. Webhook URL 생성Webhook URL은 https://wh.jandi.com/connect-api/webhook/{teamId}/{webhook-token}와 같은 형태로 생성됩니다. hostname을 별도로 설정함으로써 기존 API 서버와의 분리는 물론이고, nginx의 Limiting the Request Rate 설정을 이용해서 호출되는 웹훅 요청 수를 효과적으로 제한할 수 있었습니다. webhook-token은 중복을 피하면서 각 웹훅에 대한 유효성을 검증할 수 있도록 여러 키를 조합한 md5 hash 값을 이용했습니다.이렇게 생성된 URL은 Incoming Webhook 뿐만 아니라 Google Calendar 등의 서비스에 등록하는 콜백 URL로 사용합니다.2. 외부 서비스 웹훅 등록웹훅을 등록하는 방법은 서비스에 따라 API를 이용하거나 수동으로 직접 등록할 수 있습니다. 사용자가 직접 웹훅을 등록하는 방법은 웹훅 URL만 생성해서 전달하면 등록 과정의 추가 처리가 필요 없어서 간단하지만, 서비스마다 등록하는 방법이 조금씩 다르고 다소 복잡하게 느껴지는 문제가 있습니다. 반대로 각 서비스에서 제공하는 API를 이용해 웹훅을 등록하면 사용자의 부담을 많이 줄일 수 있지만, 그만큼 내부적으로 처리해야 할 작업이 많아집니다. 그래서 구현 초기에 꽤 많은 시간을 투자할 수밖에 없었고 그 과정에서 아래와 같은 어려움을 겪었습니다.웹훅 관련 API를 사용하려면 먼저 인증을 받아야 하는데 서비스마다 제공하는 인증 방식이 조금씩 달라서 이를 통합하는 모델을 만들기가 쉽지 않았습니다. 요약하자면 기본적으로 accessToken을 사용하지만, 인증 방식에 따라 부가적으로 필요한 데이터가 서로 조금씩 다른것이죠. 가령, 구글캘린더는 만료 일시와 토큰 갱신을 위한 refreshToken 값을 별도로 갖고 있어야 합니다. 또 한가지 놓치기 쉬운 부분은 인증 폐기(revoked) 관련한 데이터 처리인데 저희가 경험한 바로는 인증이 폐기되었을 때 별도로 웹훅 알림을 주지 않기 때문에 반드시 인증의 유효성을 확인하는 추가 로직이 필요합니다.대부분의 사무실이 그렇듯이 저희 또한 공유기를 이용해 내부 네트워크를 구성하고 있습니다. 게다가 백엔드 파트는 개개인의 로컬 가상 서버에 동일한 환경을 설정해놓고 개발을 하므로2보통 경우엔 외부(public network)에서 들어오는 요청을 받을 수 없습니다. 그렇다고 매번 외부 네트워크에 있는 서버에 배포 후 테스트하기가 어려우니, 저희는 각 로컬 서버마다 고유 포트 번호를 나눠 갖고 WAN이 물린 공유기의 포트 포워딩을 알맞게 설정한 뒤에 네트워크 터널링 유틸리티인 ngrok을 이용해 내부와 연결되는 public 주소를 생성해서 외부 서비스와 문제없이 통신할 수 있었습니다.3. 웹훅 수신웹훅을 통해 들어오는 Request는 일단 정상 응답을 하는 게 좋습니다. 서비스마다 최초 웹훅 등록 시 유효한 URL인지 확인하는 테스트 요청을 하는데 이때 정상 응답을 하지 못하면 아예 등록조차 처리되지 않습니다. 또한, 정상적으로 등록된 이후 특정 이벤트에 해당하는 웹훅 요청에 대한 응답에도 주의할 필요가 있는데, 만약 에러 응답이 반복되면 일정 시간 동안 각 서비스에서 아예 해당 웹훅을 발송하지 않도록 제한이 걸려 더 이상 테스트를 진행할 수 없는 경우도 있었습니다.따라서 일단 웹훅 요청이 들어오면 teamId와 webhook-token 값으로 올바른 웹훅인지 검증한 후 서비스별 큐에 Request header와 body를 포함한 데이터를 전달한 뒤 바로 응답하고, 큐에 쌓인 데이터는 커넥트 종류별로 배치 서버가 돌면서 처리하게 됩니다. SQS를 사용함으로써 늘어나는 데이터에 대한 안정성을 확보하고 각각의 배치 서버를 독립적으로 분리해서 구현함으로써 자연스레 확장성(scalability)도 보장할 수 있게 되었습니다.4. 메시지 작성웹훅 데이터를 잔디의 메시지로 변환하는 역할은 배치 서버가 담당합니다. 서비스별로 데이터 포맷이 다르므로 해당 데이터를 파싱 및 처리하는 Worker 또한 각각 구현했습니다. 사실 커넥트 기능에서 가장 핵심적인 역할을 하는 부분인 만큼 가장 많은 공수가 드는 작업이였던 것 같습니다.서비스마다 정해놓은 웹훅 이벤트와 잔디 커넥트에서 제공하고자 하는 알림이 서로 완전히 일치하지 않아서 이를 서로 연결하는 작업연동 서비스의 문서가 잘 정리되어 있지 않아서 일일이 필요한 동작을 취하고 그에 따라 들어오는 데이터를 정리하는 작업잔디 계정 언어에 따라 메시지 L10N3을 적용하는 작업커넥트 메시지를 전달하기 위해 기존 멤버와 다른 커넥트 봇을 구현하는 작업등 요약하기 어려울 정도로 크고 작은 이슈들이 많았습니다. 그 내용이 너무 다양해서 모두 상세히 기록하긴 어렵지만, 개중에 도움이 될만한 내용을 추려서 아래 따로 정리했으니 관심 있으신 분들은 참고하시면 좋을 것 같습니다.서비스별 집중 탐구커넥트 구현 일정을 최대한 앞당기기 위해 저희는 개발자들끼리 각각의 커넥트 종류 별로 전담해서 작업하는 전략을 취했습니다. 제가 대표로 글을 작성하기는 하지만 보다 정확하고 구체적인 정보를 전달하는 것이 좋겠다는 생각에 개발을 담당하신 분들과의 짧은 인터뷰 형식을 빌려 공유하겠습니다.- Google CalendarQ. 기술적으로 난이도가 높았던 작업을 소개해달라.전반적으로 어려운 작업이 있었다기보단, 캘린더 특성상 세세하게 처리할 부분들이 많아 설계와 구현이 어쩔 수 없이 복잡해졌다. 가장 골치 아팠던 작업은 일정 알림을 타임존(Time Zone)에 따라 각각 알맞은 시간에 전달하는 작업인데, “잔디 계정의 타임존”, “구글 캘린더의 타임존”, “개별 일정의 타임존” 이렇게 3가지를 모두 고려해서 경우마다 기준이 되는 타임존을 결정하는게 엄청 까다로웠다. 심지어 구현 후 테스트를 하는 과정에서도 출력된 시간이 올바로 표시된 것인지조차 헷갈려서 디버깅하는데 한참 고생할 수 밖에 없었다.웹훅을 등록하고 관리하는 부분도 꽤 복잡했는데, 구글 답게(?) 웹훅에도 만료 기간이 존재한다는 것이 포인트다. 때문에 만료되기 전에 반드시 재등록 및 과거 웹훅 삭제 작업을 하는데, 효과적으로 처리하기 위해 “웹훅을 받을 때마다 만료 기간을 확인”, “등록된 일정이 많지 않아 웹훅을 받지 못하는 경우도 있으니 별도의 배치서버가 하루 단위로 확인” 이렇게 두 가지 로직을 넣어서 자동으로 웹훅을 유지하도록 구현했다.또한, 다른 연동 서비스와 달리 구글은 웹훅 콜백으로 들어오는 요청에 해당 이벤트에 대한 데이터를 직접 담아주지 않기 때문에 key를 가지고 한 번 더 API 호출을 통해 필요한 데이터를 가져와야 한다는 점도 주의해야 한다. 요청해야 할 API 문서는 비교적 잘 정리된 편이지만, 같은 요청에 대해서도 인자를 어떻게 보내는지에 따라 그 응답이 제각각이기 때문에 응답 값에 대해 무조건 신뢰하고 처리해서는 안 된다. 당연히 존재할 것으로 생각한 필드 값에 빈 배열이 들어와서 일정 관련된 데이터를 일부 날리고 나서야 깨달았다.. -_-Q. 가장 처리해야 할 이슈가 많았다고 알고 있는데, 그중에서도 기억에 남는 이슈가 있을 것 같다.너무 많은 이슈를 동시에 처리하다 보니 특별히 기억에 남는 이슈는 없다. 다만 아직도 왜 그랬는지 확실한 이유는 알 수 없지만, 언젠가 한 번 구글에서 웹훅을 아예 전달해주지 않았던 경우가 있었다. 과도한 요청으로 limit이 걸린 것도 아니었는데, 갑자기 웹훅이 안들어오니깐 우리로서는 어떻게 풀어볼 방법이 없었다. 그러다 나중에 확인해보니 대략 12시간쯤 지나고 나서 그동안 밀려있던 웹훅 데이터가 한 번에 밀려서 들어와 있더라. 다행히 그 이후로 지금까지 한 번도 재현되지 않는걸 보니, 혹 동일한 증상을 겪는다면 당황하지 말고 기다려 보시라.반복 일정을 다루는 것도 꽤 골치 아픈 이슈인데, 왜냐하면 일정이 있을 때 마다 웹훅 알림을 주지 않고 처음 등록된 시점에서 한 번만 정보를 알려주기 때문에 등록된 시점 이후의 일정은 내부적으로 계속 등록해줘야 한다. 기본적으로 구글 캘린더는 RFC-55454 표준을 따르지만, 실제 전달되는 데이터 중 일부는 표준과 조금 다른 부분이 있었다. 특히 반복 일정(recurrence) 관련 데이터 포맷이 조금 다르므로 캘린더 데이터를 파싱하기 위해 만약 외부 library를 사용한다면 별도의 예외처리가 필요하다. 더욱 더 까다로운 건 사실 등록된 반복 일정이 수정되거나 삭제되는 경우인데, 이때 “특정 일정만 삭제”, “지금 시점 이후의 일정 모두 수정” 등 워낙 케이스도 많고 각각을 테스트 하는 것도 쉽지 않기 때문에 작업 시간이 꽤 오래 걸렸다. (심지어 아직 확인하지 못한 드문 케이스에서는 잠재된 버그가 있을 수도…)Q. 그 밖의 도움이 될만한 노하우나 꿀팁이 있다면?구글 캘린더 API는 Webhook 보단 Push Notification 키워드를 많이 사용한다. 푸시 노티라는 게 좀 다른 카테고리에서 많이 쓰이는 용어이기도 하다 보니 코드 리뷰 등의 커뮤니케이션을 할 때 혼동이 좀 있었던 것 같다.물론 서비스 요구사항마다 다르겠지만, 잔디 같은 경우엔 요구사항에 맞춰 계속 설계를 변경 및 개선하다 보니 결과적으로 너무 복잡해져 효율이 떨어지는 코드를 작성할 수밖에 없었다. 처음부터 연동을 생각하기보다는 아예 캘린더 자체 기능을 베이스로 설계하고 데이터만 구글에서 가져온다 생각했다면 개발 생산성이 더욱 좋았을 것 같다.- TrelloQ. 기능을 구현하면서 느낀 아쉬웠던 점과 좋았던 점을 짚어달라.트렐로 공식 API 문서가 더 명확했다면 좀 더 개발이 수월했을 것이다. 문서가 RESTful하게 end-point path는 간결하게 잘 정돈되어 있지만, 각 요청 parameter에 대한 설명이나 response 데이터 등이 명확하게 정리되지 않아서 적합한 API를 찾거나 불명확함을 걷어내기 위한 테스트를 하다 보니 전반적으로 시간이 길어지고 비효율적이었던것 같다.그에 반해 트렐로에서 웹훅 이벤트를 발생시키기 위한 유저 액션들이 비교적 간단하고, 그에 따른 콜백 리퀘스트 또한 누락 없이 빠르게 잘 들어와서 그나마 쉽게 테스트를 할 수 있었다.Q. 기능 구현을 위해선 반드시 알아야 할 웹훅 이벤트 종류 및 데이터에 대한 문서는 정리가 전혀 안 되어있다고 하던데 정말인가?그렇다. 처음엔 좀 당황했지만, 그래도 방법이 없으니 일일이 경우마다 테스트해보면서 직접 정리를 하려고 했다. 하지만 각 웹훅마다 큰 구분만 있고 세세한 데이터는 너무 다양해서 깔끔하게 정리하기가 어려워 따로 공유를 위한 문서를 만들지는 못했다. 예를 들자면 트렐로에서 updateCard 라는 action type의 웹훅 데이터를 보내주는데, 그 데이터만 보고 “Card Archive”, “Description 수정/삭제”, “Due date 등록/수정”, “카드 이동” 등의 여러 가지 서로 다른 이벤트를 구분해야 한다. 근데 그 구분하는 방법이 특정 flag가 있는 게 아니라서 각 data를 모아놓고 역으로 분리하다 보니 코드를 깔끔하게 작성하기가 어려움은 물론, 추후 트렐로 측 데이터의 변동이 있을 때의 품질을 보장할 수 없는 리스크를 안고 구현할 수밖에 없었다.Q. 그 밖의 도움이 될만한 노하우나 꿀팁이 있다면?만약 트렐로와 어떤 형태로든 연동하려고 한다면, 설계 전에 모든 API에 대해 꼼꼼히 살펴보고 웹훅 이벤트 또한 직접 테스트해서 일단 전체적으로 리스트업을 정리하는 게 보다 생산성에 도움이 될 것이다. 트렐로를 잘 알고 있더라도 서비스 내부에서 “보드”, “리스트”, “카드”가 어떤 상관관계를 가지는지 미리 정리해보는 것도 좋다.사소하지만 좀 특이했던 점은 웹훅을 처음 등록할 때 해당 URL로 확인 요청을 한번 하는데, 이때 요청은 HTTP method가 POST가 아닌 HEAD로 들어온다. 그래서 반드시 동일한 URL의 HEAD 요청에 대해서도 정상 응답을 할 수 있도록 구현해야 한다.마무리잔디 커넥트를 구현하면서 특히 서비스 품질과 개발 속도 간의 밸런스에 대한 고민을 많이 했습니다. 초반에 서비스 종류별로 작업을 분리하고 각각의 방식으로 설계한 뒤 나중에 정리하는 전략이다 보니 공통으로 가져갈 수 있는 DB 모델이나 서비스 로직이 많아서 이를 통합하기 위해 반복 작업을 할 수밖에 없었는데 이 부분이 저희 내부적으로 느낀 가장 아쉬운 부분이 아니었나 생각합니다. 기능 중 많은 부분이 외부 서비스에 의존적이다 보니 생각하지도 못한 크고 작은 이슈들이 발생해서 일정 산출에도 꽤 어려움을 겪었습니다.커넥트 기능을 출시한 이후로 꽤 시간이 지났음에도 불구하고 이슈 백로그(Backlog)를 보니 아직도 개선할 부분이 많이 남아있는 듯 합니다. 그렇지만 이번에 기반이 되는 작업을 최대한 튼튼히 하기 위한 많은 시행착오를 거쳤기에, 추후 연동되는 커넥트 종류를 늘려나가는 시점5에 보다 효과적으로 개발할 수 있을 것이라 기대하면서 이번 글을 마치겠습니다.Slack API 문서 참고 ↩vagrant의 box로 서로의 로컬 개발 환경을 동일하게 유지하고 있습니다. 참고로, 현재 저희 서버 환경은 Local - Dev - Staging - Production으로 구성되어 단계별로 상황에 알맞게 배포하고 있습니다. ↩Localization의 약어. 잔디는 아시아 시장에 최적화된 서비스를 제공하고자 한국어, 일본어, 중국어 간체자(중국), 번체자(대만/홍콩), 영어 총 5가지 언어를 지원합니다. ↩아이캘린더(iCalendar)로 불리는 인터넷 캘린더의 데이터 포맷에 관한 표준. IETF 문서참고 ↩구체적인 시점은 말씀드리기 어렵지만, 더욱 좋은 사용성을 제공하고자 유저분들의 설문조사를 진행하고 있으니 많은 참여 부탁드립니다. ↩#토스랩 #잔디 #JANDI #개발후기 #일지 #인사이트
조회수 1381

영화관에서 ‘치킨’ 어때요? CJ CGV F&B사업팀 이홍철 님

코미디 영화 사상 1,500만 명 관객을 기록한 <극한직업>. 극장 밖을 나선 순간 치킨이 생각나는 건 어쩌면 당연한 일. 이에 발맞춰 CJ CGV에서 ‘BBQ 직화구이 치킨’을 선보였다. 영화관에서 치느님 영접을 가능케 주인공을 만나보았다.  유학파 출신 셰프가 극장으로 온 이유? ▲ ‘BBQ 직화구이 치킨’을 탄생시킨 CJ CGV F&B사업팀 이홍철 님지난 1월 24일, CJ CGV에서 야심 차게 출시한 ‘BBQ 직화구이 치킨’. 부드러운 순살 치킨에 바비큐 소스, 쫄깃한 떡꼬치를 더해 남녀노소의 입맛을 사로잡기 충분했다. 마성의 ‘BBQ 직화구이 치킨’을 탄생시킨 이는 CJ CGV F&B사업팀 이홍철 님이다. 이홍철 님은 프랑스요리학교 ‘르 꼬르동 블루(Le Cordon Bleu)’를 졸업한 유학파 출신으로 프랑스 엠배서더 호텔, 국내 웨스틴 조선호텔을 거쳐 지난 2010년, CJ CGV로 오게 됐다. 셰프로서 이름을 알릴 수 있는 유명 호텔을 마다하고, CJ CGV로 오게 된 이유가 궁금해졌다.음식과 엔터테인먼트가 결합하면 재미있겠다는 생각이 들었습니다. 그래서 CJ CGV로 오게 됐죠.CJ CGV F&B사업팀은 CJ CGV에서 판매하는 모든 식음 제품의 기획, 개발, 마케팅, 프로모션 등을 총괄하고 있다. 타 극장과 다른 점이라면? 차별화된 제품을 기획하고 개발하는 이홍철 님이 있다는 것! 해외를 비롯 대부분의 극장 사업자가 매점 메뉴를 수급 받아 판매하는 방식을 택한 것과 달리,  CJ CGV는 국내 유일 극장 매점 메뉴 개발자인 이홍철 님을 통해 자체적으로 맛 좋은 매점 먹거리를 만들고 있다. 그만큼 CJ CGV에서 그는 없어서는 안 될 중요한 존재인 셈. 그 동안 CJ CGV는 이홍철 님과 함께 다양한 메뉴 출시를 통해 극장에서 이색 먹거리를 접할 수 있도록 다변화를 꾀했다. 대표 제품으로는 지난 2012년, 프리미엄 팝콘 문화를 만든 고메 팝콘을 시작으로 죠스떡볶이와 콜라보해 튀김범벅과 라볶이를, 스쿨푸드와 손잡고 대표 메뉴인 ‘모짜렐라 스팸계란마리’를 냉동김밥 형태로 세계 최초로 출시했다.왜 이렇게 팝콘이 맛있어지는 건데?  ▲ 팝콘의 ‘맛’을 업그레이드하기 위해 불철주야 노력하고 있는 이홍철 님이색 먹거리의 첫 신호탄은 ‘팝콘’이다. 이홍철 님의 첫 완성작이라 말할 수 있는 팝콘의 시작은 팝콘의 ‘맛’ 업그레이드 연구였다. 그는 기존 팝콘보다 더 맛있는 제품을 만들기 위해 연구에 연구를 거듭했다. 시중에 판매하는 국내외 팝콘은 다 먹었고, 다양한 종류의 옥수수로 직접 팝콘을 튀겨보기도 했다. 이뿐만이 아니었다. 팝콘에 고소한 맛을 더하기 위해 기존에 사용했던 팜유 대비 원가가 30%나 비싼 코코넛 오일을 사용하기도 했다. 그 다음 스텝이라 할 수 있는 고메 팝콘 개발은 두 세배 노력이 더해졌다. 팝콘 표면에 치즈와 초콜릿 등 다양한 원재료를 사용했는데, 열이 가해지면서 그대로 녹아버렸던 것. 이홍철 님은 이를 보완하기 위해 온도와 습도를 함께 조절하는 쇼케이스까지 제작했단다. 밤낮없이 제품을 개발했지만, 곧바로 출시하진 못했다. 기존 팝콘보다 만들기도 어렵고, 원가도 비싸고, 취급도 까다롭다는 게 이유였다. 그렇다고 포기할 수는 없을 터. 많은 사람을 설득시키기 위해선 ‘맛’으로 승부를 볼 수밖에 없었다. 임원분들께서 자주 다니는 동선을 찾아 고메 팝콘을 올려놨어요. 하나씩 드셔보시라고요. 맛있다고 하시더니 한번 판매해보라고 기회를 주셨죠.▲ ‘뭘 좋아할지 몰라서 다 준비했어!’ CJ CGV에서만 만날 수 있는 고메 팝콘2012년 마침내 고메 팝콘이 출시됐고, 제대로 통했다. 프리미엄 팝콘을 취향에 따라 골라 먹을 수 있다는 점이 고객에게 매력적으로 다가온 것. 고메 팝콘을 먹기 위해 일부러 CJ CGV를 찾거나 배달해 먹는 고객도 있었다. CJ CGV에서는 ‘매점’ 대신 ‘팝콘 팩토리’라는 이름을 사용하였고, 국내 최초 새로운 팝콘 문화를 형성했다. ▲ 신제품 출시 전, 품평회는 필수!물론, 모든 팝콘이 성공했던 것만은 아니었다. 와사비 열풍이 불던 4년여전. 이홍철 님은 와사비 팝콘을 만들기로 했다. 와사비 향을 내는 원재료를 구하기 위해 가까이로는 아시아부터 멀리로는 유럽까지 샅샅이 찾아보았다. 와사비 팝콘에 대한 내부 평가는 매우 긍정적이었다. 마지막 고객 품평회 날. 이홍철 님은 와사비 팝콘의 초록색이 마치 푸른곰팡이 같다는 청천벽력 같은 이야기를 듣게 되었다. 결국 충격을 받고 출시를 접었다고. 망고 맛, 불닭 맛 등 7가지 시즈닝을 뿌려 먹는 쉐이크 팝콘을 판매했을 때. 기대했던 것보다 고객의 반응이 좋지 않아 판매를 접어야만 했다. 실패를 통해 그가 얻은 해답은? 바로 제품의 이름을 듣고 그 맛을 상상했을 때 ‘먹고 싶다’는 생각이 들어야 한다는 것. 거듭되는 실패에도 이홍철 님이 계속 도전할 수 있었던 건 CJ CGV의 아낌없는 지원이 뒷받침되었기 때문이란다. 극장에서 치느님을? 한국형 매점 메뉴는 현재 진행 중!CJ CGV와 이홍철 님의 도전은 팝콘에만 국한하지 않았다. 전 세계 극장 메뉴가 팝콘, 콜라, 핫도그 등 미국식 메뉴로만 구성되어 있다는 점을 주목했고, 국내 고객들이 선호할 수 있는 한국형 매점 메뉴를 개발하기로 했다. 한국인들이 좋아하는 음식을 ‘한국형 매점 메뉴’라 재정의하고 한국인들이 최애 메뉴인 치킨과 분식 등을 극장 환경에 맞게 개발했습니다.▲ 출시 후 뜨거운 인기를 끌고 있는 ‘BBQ 직화구이 치킨’ 이렇게 탄생한 게 바로 ‘BBQ 직화구이 치킨’이다. 아이디어는 좋지만, 현실화를 끌어내기까지 쉽지 않았다. 특히 치킨 특유의 냄새가 가장 큰 장애물. 취식을 보다 쉽게 하는 방법도 고려해야 했다. ‘맛’을 놓치고 싶지 않았던 그는 직화구이 치킨에 인공 훈연제를 첨가하는 대신 직접 불에 일일이 굽는 방법을 선택했다. 또한 순살 닭고기로만 구성하면 식감이 단조로울 수 있어 떡꼬치를 추가했다. 제품 기획부터 출시까지 14개월 동안 고생한 결과물이 나왔을 때 가장 보람찼다고 말한다. ’BBQ 직화구이 치킨 전국 15개 직영매장 중심으로 선 오픈 한 후 오는 3월 말 전국 직영 극장 중심으로 확대할 예정이다. 또한 CGV에서는 지역 상생의 일환으로 ‘춘천 닭갈비’도 판매 중이다. 앞으로 CGV에서는 비장의 한국형 메뉴를 매년 선보이겠다는데 벌써 내년 제품이 무엇이 될지 설레게 된다.   ▲ 이젠 CJ CGV에서 먹는 즐거움도 누려보세요!고객들이 더 만족할 수 있는 제품을 만들고자 고민하고 노력하겠습니다.매점 메뉴라는 고정관념을 깨고 꾸준하게 제품을 확장하고 있는 이홍철 님. 그가 만들어 낸 다양한 제품을 통해 보는 즐거움을 넘어 먹는 즐거움까지 만끽할 수 있었던 것이 아닐까. 앞으로 CJ CGV와 이홍철 님이 선보일 새로운 제품을 기대해본다.[채널 CJ] #CJ #CGV #BBQ직화구이치킨 #CGV고메팝콘 #CGV치킨 #영화관치킨 #구성원인터뷰 #직무소개 #직무정보 #F&B사업팀 #이홍철님 #기업문화 #CGV채용 #CGV공채
조회수 3476

[개발] 개발자는 왜 체크남방을 입는가?

프리모아의 Will 입니다. 최근 한 개발자 커뮤니티에서 재미있는 글이 올라온 걸 봤는데요. 제목이 "개발자는 왜 체크남방을 입는가?" 라는 글이었습니다. 제목을 읽자마자 아!! 이거다 하고 들어가 봤는데 "엄마가 사줘서" 라고 단순하게 끝나버려서 허무하기만 했는데요. 프리모아에서 이러한 개발자, 디자이너, 기획자와 변수들간의 상관관계에 가설을 세우고 검증을 해보는 실험을 해보았습니다. 자 그럼 어떤 '가설'들이 있는지 한번 볼까요?1. 개발자는 왜 체크남방을 입는가?개발자들의 화면에 그리드를 그려봤더니 체크무늬가 나온다.└ 나도 모르게 글자의 각과 격자무늬에 익숙해졌다. 개발자가 개발하고 있는 모니터 화면을 보면 일반인들은 머리가 아찔해질 정도로 복잡한 개발언어가 화면에 가득합니다. 하지만 개발자들에게는 아무렇지도 화면을 봐도 아무렇지도 않은데요. 오히려 몇몇 개발자는 그 복잡한 화면들과 언어들을 보고 있으면 마음이 편해 진다고 합니다. 개발자들의 개발화면은 자세히 보면 글자들이 반듯하게 각을 잡고 있는데요. 개발자들이 언어를 읽기 쉽도록 가독성을 잡아주는 것인데요, 이러한 이유로 개발자들은 곡선 보다는 직선과 정사각형에 대한 편안함이 있어서 체크무늬 남방을 입는게 아닐까 합니다. 2. 디자이너는 왜 대표님도 함부로 못 건드리는가?최악의 웹사이트 디자인└ 디자인이 망하면 서비스가 망한다. 디자이너 대부분은 굉장히 독립적이고, 자기주장이 강한 모습을 보이는데요. 회사의 주인인 대표조차 디자이너들의 눈치를 보고는 합니다. 디자이너는 필요에 따라 자신의 요구사항을 다른사람에게 당당하게 요구합니다. 이러한 이유는 디자이너가 굉장히 많은 스트레스를 동반하는 직군이기 때문인데요.디자인은 굉장히 주관적인 기준을 바탕으로 하기 때문에 아무리 멋진 디자인이라고 하여도 그걸 보는 다른이들이 이상하다 하면 수정을 해야하는 부분이지요. 특히 최근에는 UX, UI 디자인을 포함해 고객들의 웹사이트 또는 앱 디자인을 보는 시각적인 기대감의 평균치가 높아지고 있기 때문에 디자인이 망하면 아무리 좋은 서비스라도 외면받기 때문에 디자이너는 항상 클라이언트로 부터 많은 수정과 창작의 고뇌로 인한 스트레스를 받고는 합니다. 3. 기획자와 개발자는 왜 견원지간이 되는가?└ 새로운걸 만들고 싶은 기획자 vs 작업범위를 픽스하고 싶은 개발자 기획자의 목적과 개발자의 목적이 충돌하기 때문이지 않을까 합니다. 기획자의 경우에는 기존에 앱 또는 웹사이트 서비스와 다른 차별성을 먼저 생각을 해야하기 때문에 새로운 기능과 창의적인 서비스 형태를 만들고 싶어합니다. 개발자는 그러한 기획자의 의도를 실제 결과물로 만들어야 하기 때문에 어떤방식으로 구현을 할지, 설계는 어떻게 할지 등을 고민하며 현실적인 방안들을 자꾸 말하게 되는 것이지요. 기획자가 새로운 지도 서비스를 만들고 싶다고 말하면 개발자는 GPS를 이용한 LBS 서비스 인지, 위경도 좌표를 잡아서 뿌려주는 방식인지 그런 기술적 검증과 구현 방법들을 최우선으로 생각하게 되는 것입니다. 4. 디자이너는 왜 히스테릭한가?└ 심플하고 엘레강스한 색깔 네가 찾아봐!!클라이언트들은 디자이너 프리랜서에게 웹 또는 앱 디자인에 대한 컨셉과 가이드를 주는데요. 실제 프로젝트 의뢰를 맡기는 클라이언트들이 IT에 대한 지식이 없는 경우들이 많습니다. 때문에 자신의 원하는 느낌을 최대한 표현을 하려고 하지만 그게 명확하게 나오지는 않습니다. 예를 들어서 클라이언트들이 쉽게 말하는 심플하면서도 엘레강스한 색깔로 해달라고 요구하는데요. 그게 정확하게 코발트 블루의 짙은 남색인지, 밝은 청색인지, 연청색인지 파란색이 단순히 파란색 딱 하나 있는게 아닌데 파란색에도 수십개의 색깔이 있는데, 그걸 너무 단순하게 요구를 하니 디자이너는 스트레스를 쌓이고, 히스테릭해져 가는 것입니다.물론 실력있는 웹디자이너, 디자이너 프리랜서들은 그러한 고민 없이 요즘 트렌드에 맞는 계통 + 클라이언트 요구사항을 콕콕 찍어내는 분들도 있습니다. 프리모아에서 한가지 팁을 드리자면 클라이언트의 성향을 정확하게 끄집어 내는 것도 중요하지만 막상 '그래 이거' 하는 것은 표현과 전혀 다른 경우가 많습니다. 디자이너가 디자인 컨셉을 제안할 때는 상대에 대한 이해도가 우선시 되어야합니다. 기업형태가 공기업 VS 사기업 VS 스타트업인지 산업분야는 교육인지, 의료인지, 컨설팅인지를 구분하여서 제안을 하는게 좋습니다. 또한 현재의 디자인 트렌드는 어떤지, 이런부분을 종합적으로 아울러서 제안을 하는게 오히려 클라이언트의 최종 컨펌을 쉽게 딸 수 있습니다. 쉽게 말하면 공기업이니 레이아웃에 대한 요구조건이 있고, 컨설팅 쪽이기 때문에 색은 톤다운되어 무게감을 주는 남색계통, 최근 디자인 트렌드는 라인 아이콘을 많이 쓰니 그런쪽으로 제안을 한다던가 디자인컨펌에 있어서도 전략적인 접근방법이 필요합니다. 이래서 디자이너가 히스테릭해지는 것이지요.이상 안전한 IT 아웃소싱 프리모아였습니다. 감사합니다.#프리모아 #개발자 #개발팀 #개발자의일상 #체크무늬남방
조회수 886

당신이 놓치고 있던, 측정 항목 : Dwell Time

Dwell Time은 가장 중요한 지표지만, 자주 오역되어 사용되는 웹사이트 측정 항목 중 하나입니다. 많은 마케팅 담당자가 데이터를 분석할 때 페이지에 머문 시간(Duration Time)만을 지나치게 신뢰하고 있지만, 단순히 사용자들의 체류시간은 그리 믿을만한 측정항목이 되지 못합니다.오늘 포스트에서는 , 도대체 Dwell Time 이 뭔지, 검색엔진이 왜 이 Dwell Time을 검색 결과 순위를 매기는 데 사용하는지, 그리고 여러분의 비즈니스 사이트에 이 Dwell Time을 증대시킬 수 있는 방법론에 대해서 자세히 써보겠습니다 :)Dwell Time이 뭘까?3년 전에 Bing 소속의 Duane Forrester 라는 분이 "퀄리티있는 컨텐츠를 만드는 방법론" 에 대해서 자세한 블로그 글을 쓴적이 있습니다. 이 글에서 Dwell Time에 대해서 처음으로 언급하게 됩니다.쉽게 말하자면, Dwell Time은 실제 방문자가 우리 웹사이트를 나가기 이전에 우리 웹사이트 내에서 사용한 순수 시간입니다. 단순히 머문시간이 아니라 '순수 사용 시간' 이라 이해하시면 될 듯 합니다. 이론적으로, Dwell Time이 길면 길수록 사용자들이 웹사이트에 있는 컨텐츠들을 소비할 확률이 높아지고, 우리 웹사이트 내의 다른 Action들로 전환할 수 있는 확률도 높아집니다.이탈률 그리고, 진짜 이탈률더 자세한 내용을 다루기 이전에, 이탈률과 '진짜 이탈률'의 차이를 짚고 넘어가는 것이 굉장히 중요합니다. 왜냐하면 우리가 다루고 있는 이 Dwell Time이 이탈률과 직접적으로 관련이 있기 때문이지요.Google Analytics를 포함한 모든 데이터 분석 플랫폼에서는 웹페이지 내 체류시간을 정확하게 측정하기 위하여, 2번의 클릭을 필요로 합니다. (웹사이트를 들어오는 클릭과 나가는 클릭). 하지만, 가장 중요한 나가는 클릭이 없다면, 25분 정도가 지나도 사용자가 아무런 움직임이 없을시에는 자동으로 해당 사용자가 나갔다고 판단하여 명확히 나간것인지는 모르겠지만, 세션을 종료해버립니다. 이것이 바로 이탈률과 진짜 이탈률 뒤에 숨어있던 원리입니다.6초 동안 방문하게 되는 트래픽이 진짜 이탈이라는 것이죠. 방문자가 사이트에 들어와서, 페이지를 바로 나가버리기로 결정했거나, 어떤 컨텐츠도 소비하지 않기로 마음먹고 바로 나가버리는 경우 6초가 걸립니다. 하지만 사용자가 방문하는 동안 들어와서 거의 30 분 정도 긴 시간 동안 긴 내용의 콘텐츠를 읽은 후 이탈하는 것은 실제 이탈 행위가 아닙니다. 따라서 순위가 높고 우수한 콘텐츠를 가진 페이지 중 일부가 높은 이탈률을 보일 수 있습니다. 이탈률은 높게 나올 수 있지만, 진짜 이탈률이 아닐 수도 있다는 것이지요.이것이 Dwell Time이 페이지 품질 및 관련성에 대한 신뢰할 수있는 지표인 이유입니다. 일부 마케팅 담당자는 이탈률이란 지표가 너무 단순하게 측정되기 때문에 신뢰할 수 없다고 생각합니다.Dwell Time은 검색엔진 순위에 영향을 끼칠까?검색 엔진에 의해 Dwell Time이 순위를 매기는 기준들 중 하나로 사용되는지 여부에 대한 토론은 SEO 분야에서 오랫동안 이루어졌습니다. Google은 알고리즘은 특정 측정 항목에 대해 영향력을 가지고 있긴하지만,  Google의 특정 기능을 살펴보면 Dwell Time이 가장 중요한 요소입니다. 하기 이미지의 기능은 지정된 도메인의 모든 결과를 차단하는 옵션입니다.Google은 체류 시간을 기준으로 검색 결과로부터 도메인을 차단할 수있는 옵션을 제공할지 여부를 결정한다는 이론이 생겼습니다. 당연히 정확한 사실은 여전히 수수께끼이지만, Dwell Time이 짧아지면 방문객에게 차단 옵션이 제공된다는 결과를 낳습니다. 이로 인해 구글 검색 엔진을 사용하는 사람들의 사용자 경험이 상당히 향상되었습니다.순위표에서 SERPs의 '더보기'기능으로 Google 알고리즘이 Dwell Time에주의를 기울이고 있다는 또 다른 증거가 있습니다.이 기능은 저작자와 밀접하게 연결되어 있습니다. 긴 Dwell Time을 가지고 있는 기사를 게시한 콘텐츠 제작자는 SERP에서 더 높은 게재 위치를 얻었고 기본 검색 결과 아래의 "More by" 링크로 다른 컨텐츠도 조회가 가능하도록  보상을 받고있는 것 같습니다.저작권이 중요한 신호로 남아 있지만 "더보기"와 도메인 차단 기능은 모두 Google에서 폐기되었습니다. (이 기능들이 얼마나 유용한지를 생각해 보면 부끄러운 일입니다.)어쨌든 구글 알고리즘은 사용자의 페이지 콘텐츠에 대한 품질 및 관련성을 안정적으로 추측하는 데 Dwell Time을 사용할 가능성이 높을 것입니다. 지금은 Dwell Time이 결정적인 순위를 매기는 항목인지 여부에 대한 정답은 없습니다.어떻게 Dwell Time을 늘릴 수 있을까?이제 우리는 Dwell Time이 무엇인지, 그리고 왜 그것이 검색 결과 순위를 결정하는 항목이라고 생각해야하는지, 알아보았습니다. 그렇다면 어떻게 해야 Dwell Time을 늘릴 수 있을까요 ?여러분이 Dwell Time을 늘리려고 노력할지 여부에 관계없이, 어쨌든 좋은 컨텐츠를 만들기 위해 네 가지 중 적어도 세 가지는 해야합니다. 체류 시간을 늘리는 말도 안되는 마법 같은 것은 아니지만,  이러한 기술을 직접 해보면 사이트 내 콘텐츠의 이탈을 어느정도 줄일 수 있습니다.1. 더 좋은 컨텐츠를 만들자 !체류 시간을 늘리는 데 도움이되는 첫 번째 제안은 당연하게도 더 나은 콘텐츠를 만드는 것입니다. 아무도 쓰다만 내 물건을 아무도 사용하지 않는 것 처럼, 우리는 쓰레기와 같은 컨텐츠를 만들면 의미가 없습니다.블로그 게시물, 인포 그래픽 또는 비디오를 제작하든 좋은 콘텐츠는 다음과 같아야합니다.- 유용해야 한다. (실무적이거나 교육적인것)- 재밌어야 한다. (재밌거나, 평범하지 않거나, 놀라운 것)- 이해가 쉬워야 한다. (탁월하고, 대화가 잘되고, 잘 설계된 것)콘텐츠가 좋을수록 방문자가 머무를 확률이 높아 지므로 체류 시간이 길어집니다.2. 사이트 내 연결 링크를 자주 사용하자 ! 체류 시간은 페이지에 도착한 후 다시 검색결과창으로  돌아가는 시간 사이에 측정되므로, 사용자가 콘텐츠를 읽었을 때 취할 추가 행동을 사용자에게 제공하는 것이 좋습니다. 따라서 사이트 콘텐츠 내 두번째 링크를 두는 것은 방문객에게 더 나은 사용자 환경을 제공합니다.물론 SEO를 극대화하려면 내부 연결이 필수적입니다. 강하고 논리적인 내부 연결 전략이 없으면 사이트가 검색 결과 순위에서 어려움을 겪을 수 있습니다. 검색 엔진의 거미가 철저하게 여러분의 위치의 전체 index를 붙일 수 없을지도 모르기 때문입니다.3. 더 나은 참여 전략 채택하라 !다른 기사 및 페이지에 대한 내부 링크가 방문자가 사이트를 더 오래 머물도록 유도 할 수있는 것처럼 콘텐츠 참여 기법도 사용할 수 있습니다. 여러분의 독자에게 관련 콘텐츠를 제시함으로써 독자가 여러분의 사이트에 계속 머물 수있는 강한 인센티브를 제공하게됩니다. 이 전략은 올바르게 구현된다면, 매우 효과적일 수 있으며 추천 기사는 독자가보고있는 콘텐츠에 더 밀접한 관련이 있기 때문에, 클릭을 통해 귀하의 사이트에 머무를 확률이 높습니다. 결국 방문자가 검색결과 창으로로 돌아 가지 않고도 관심있는 주제에 대해 더 많이 알게될 수 있어 유용하지요.4. [Pageless 스크롤 디자인]을 도입하라 !Dwell Time을 늘리는 데 사용할 수있는 또 다른 기술은 웹 페이지에 "무언가"또는 스크롤되는 디자인을 도입하는 것입니다. 스크롤이 긴 웹페이지는 사용자 경험 측면에서는 우수 할 수 있지만 실제로 구현이 잘못되면 SEO에 피해를 줄 수 있습니다. 이는 검색 엔진 크롤러가 클릭이나 스크롤과 같은 사용자 동작을 항상 추적할 수 없기 때문입니다.(멍청하거든요)다행히도 많은 작업이 필요없는 편리한 솔루션이 있습니다. 검색 엔진 크롤러가 스크롤링 페이지의 컨텐츠를 철저하게 색인 할 수있게하려면 페이지를 다른 페이지 섹션으로 분리해야합니다. 각 섹션에는 유사한 <title> 태그가 있으며 rel = "next"및 rel = "prev"값은 <head> 태그에 선언되어 있으면 좋겠죠.무한 스크롤 페이지에 페이지를 매기는 방법에 대한 자세한 내용은 해당 주제에 대한 Google의 공식 블로그 게시물을 확인하시면 됩니다.결론Dwell Time이 검색결과 순위를 측정하는 항목인지 여부에 관계없이 방문자가 사이트에 머문 시간을 늘리고 이탈률을 낮추는 것은 굉장히 유의미합니다. 위에 나열된 기능을 구현하면 페이지를 더 끈끈하게 만들고 방문자에게보다 매력적인 경험을 제공하며 잠재적으로 전환을 늘릴 수 있습니다.퍼포먼스 마케팅 에이전시, 오피노 바로가기
조회수 2016

IR자료 작성을 위한 소소한 팁

펀딩을 위해 가장 중요한 것은 역시 사업의 본질이지만, 그 본질을 투자자에게 잘 전달하고 설득하는 것 또한 중요한 작업이다. 그리고 그것을 전달하기 위한 가장 기본적인 문서가 IR자료이다. IR 자료라는 게 어느 정도는 정형화된 틀이 있고, 세상에 많은 그 노하우와 팁을 전달하는 글들이 많기 때문에 글의 소재로 삼기에 너무 식상하다는 생각이 들고 나의 경험을 담은 글 하나 더 얹는 게 무슨 의미가 있을까 살짝 걱정도 되긴 하지만, 창업을 시작하는 사람들에게 조금이나마 도움이 되었으면 하는 바람으로 경험을 나누고자 한다.1. 알고 싶어 하는 것을 이야기하라!모든 발표자료는 청중을 생각하고 만들어야 하지만, IR자료는 그 청중이 나에게 중요한 의사결정을 하는 투자자이기 때문에 청중에 대한 고려가 절대적이다. 기술기반 스타트업이 가장 범하기 쉬운 오류가 투자자가 원하는 내용이 아닌 내가 말하고자 하는 것들을 기술하는 경우가 많다. 기술 기반 스타트업은 내가 가진 기술이 이렇게 대단하다는 것을 이야기 하고 싶지만, 투자자들은 그 기술을 가지고 어떻게 돈을 벌 수 있는지에 대해서 알고 싶어 한다. 이것은 미묘한 차이가 있다. 우리가 가진 것 (기술, 아이디어, 사람)을 자랑하기보다는 우리가 가진 것으로 그들이 원하는 것(투자수익)을 어떻게 만들어 줄 수 있는가를 이야기해주어야 한다.2. 스토리 텔링이 중요하다.난 개인적으로 이건 IR 뿐만 아니라 모든 발표자료에 적용되는 이야기라고 생각한다. 사람은 이야기를 듣고 자라왔다. 어렸을 때 읽었던 동화책/만화부터 우리가 술자리에 나누는 대화 모두가 스토리텔링이다. IR도 마찬가지이다. 우리가 영화나 드라마를 볼 때 인과관계가 없고 얼토당토않는 스토리 구조로 되어있다면 채널을 돌려버리거나 영화관에서 자버릴 수 있다. IR도 마찬가지이다. 발표자료의 각 장의 구조가 물 흐르듯이 흘러가는 인과관계와 서사구조가 뚜렷한 스토리로 이루어져야 한다. PPT 자료는 그 스토리의 삽화가 되어야 하고 그 화면에 청중을 집중시키기보다는 스토리를 말하는 발표자에 집중될 수 있도록 발표에는 스토리 구조가 잡혀야 한다.3. 쉽고 간결한 메시지 전달이 중요하다.투자자들은 모든 것을 꿰뚫어 보는 신이 아니다. 다양한 분야의 회사를 수없이 많이 보고 짧은 시간의 IR을 보면서 판단을 내려야 한다. 정말 어려운 일이다. 이해를 시키는 사람도 어렵고 이해를 하는 사람도 어렵다. 그렇기 때문에 어려운 전문용어의 나열과 특정분야의 기술에 대한 자세한 설명이 독이 될 수 있다. 근본적으로 사람은 자신이 이해하지 못하는 것에 대해서 투자하기를 꺼려하는 습성이 있다. 물론 전문적이지 않은 개인투자자들은 반대로 하는 경우도 있다. 보통 사기꾼들이 어려운 전문용어를 나열하여서 선량한 개인 투자자들을 현혹시키는 경우를 봤지만, 전문 투자자들의 경우는 역효과가 날 가능성이 높다. 그렇기 때문에 IR 자료는 정말 쉽게 이해할 수 있도록 작성되어야 하고 간결해야 한다. 우리가 가진 것을 많이 자랑하고 싶겠지만, 그걸 쉽고 간결하게 전달할 수 없다면 과감히 빼야 한다. 정말 그게 중요해서 꼭 이야기해야 하는 것이라면 정말 고민해서 쉽고 간결하게 전달하려고 노력해야 한다. 난 개인적으로 발표자료 1장에 1 문장이 베스트이고 최대 3 문장을 넘기는 것은 아니라고 생각한다. 소화하기 힘든 음식을 주면 상대방에게 거부당할 확률이 높다.4. 정직해야 한다.IR은 펀딩의 한 과정이다. 그 자리에서 과장 혹은 거짓말을 통해서 투자자를 설득했다고 해서 바로 투자가 이루어지는 것이 아니다. 전문 투자자들은 반드시 검증과정을 거친다. 그런데 그 검증 과정 중에 IR 중에 나왔던 내용과 상반되거나 좀 다른 이야기가 흘러나온다면 투자 프로세스는 끝나버린다. 그리고 Reputation은 다른 투자자들에게도 알려질 수도 있다. 그렇기 때문에 절대 정직해야 한다. IR로 모든 게 끝나는 게 아니라는 걸 명심해야 한다.5. 숫자가 말하도록 해야 한다.투자자들이 중요하게 여기는 몇몇 수치들이 있다. 시장의 크기, 비즈니스의 성장 속도, 등등 몇몇 중요한 수치들에 대한 사전 조사가 중요하고 그러한 수치들이 자연스럽게 스토리에 녹아들어야 한다. 그리고 그런 수치들이 의미가 있어야 하고, 숫자가 비즈니스의 가치를 말할 수 있어야 한다.여기 적혀 있는 팁들은 지극히 주관적이 경험을 통해서 얻어진 나만의 개인적인 견해이기 때문에 사람마다 받아들이는 것은 다를 수 있을 것 같다. 동의하지 않는 사람도 있을 수 있다. 다만 나 또한 다른 사람들의 글을 읽으면서 창업 초기에 많은 도움을 받았고, 그에 대한 부채의식으로 내가 가진 경험을 나누어서 조금이나마 창업을 하고 열심히 꿈을 위해 도전하는 사람들에게 도움이 되었으면 하는 바람으로 글을 공유합니다.#NEOFECT #스타트업 #스타트업창업 #스타트업창업자 #창업가 #투자유치 #IR #IR자료 #조언 #꿀팁 #인사이트
조회수 897

아마존 리스팅 최적화에 대한 고찰

인사말안녕하세요 대한민국 셀러들의 아마존 진출을 도와주는 컨설팅 회사이자 업무 대행사인 컨택틱의 이이삭 대표입니다.오늘 제가 여러분께 소개해드리고 싶은 주제는 '아마존 리스팅 최적화에 대한 고찰'입니다.INTRO. 리스팅 최적화의 중요성너무나도 많은 분들이 아마존 리스팅 최적화의 중요성을 간과하고 있습니다. 물론 그 어느 아마존 셀러라고 하더라도 본인의 리스팅을 최적화 시키고 싶어 할 것입니다. 하지만 여러분은 본인의 아마존 리스팅을 최적화 하는 것에 대해 어느 정도로 간절하신가요? 물론 가독성 높은 상품 설명글은 구매전환에 치명적인 요소 중에 하나로써 굉장히 중요합니다. 다들 아는 이야기죠. 하지만 상품 설명글은 고객이 여러분의 상품에 대한 더 깊은 이해를 할 수 있게 할 뿐만 아니라, 가장 중요할 수도 있는 '아마존 검색 결과 내에서의 노출'과 직접적인 연관을 가지고 있습니다.PROBLEM. 내 리스팅은 노출이 안되는 것 같습니다아마존은 전자상거래 시장입니다. 즉, 고객들이 쇼핑할 때 가장 먼저 하는 일이 바로 '검색'이라는 것을 절대로 간과해선 안됩니다. 백화점에 입점된 상품들이 1층 맨 앞에 전시되어 있어야 잘 팔리듯이, 아마존에서도 내 리스팅이 검색 결과 맨 앞 맨 상단에 노출되어야 그만큼 잘 팔릴 가능성이 높아집니다. 하지만 검색 결과에서 내 리스팅이 보이지 않았을 때 원인이 두 가지가 있을 수 있다는 것을 명심해야 합니다. (1) 아마존에서 해당 키워드 검색 결과와 내 리스팅에 대한 연관을 짓지 않기 때문에 아예 검색 결과에 안 나오는 경우 (이걸 보고 keyword indexing 키워드 인덱싱이라고 합니다). (2) 검색 결과 안에 내 리스팅이 존재하긴 하는데, 너무 뒤에 밀려 있어서 고객들의 눈에 안 띄는 경우. 분명히 해당 키워드에 대해 내 리스팅이 인덱싱은 되고 있지만 아무리 뒤 페이지까지 넘기더라도 보이지 않는다면 그것은 마치 백화점에 판매자로 입점했는데 상품은 창고에만 보관되어 있어서 매일매일 백화점을 방문하는 고객들이 내 상품을 보지도 못하는 상황과 동일한 것입니다.SOLUTION. 어떻게 하면 내 리스팅이 노출될까?여러분께서 이해하기 쉽도록 하나의 예시를 들겠습니다. 여러분께서 sunscreen을 판매한다고 가정하겠습니다. 여러분은 당연히 여러분의 리스팅 상품명 및 상세 설명에 sunscreen이라는 단어를 삽입하겠지만, sunscreen을 sun cream, sun gel, sun block 이라고 표현하는 미국 현지인들도 굉장히 많다는 것을 간과해선 안됩니다. 만약 여러분의 리스팅에 이러한 유의어/연관어들이 최적화되어 들어있지 않다면 여러분의 리스팅은 결국 sunscreen이라는 키워드로 검색해서 유입되는 고객들에게만 노출될 뿐 나머지 키워드를 타고 들어오는 고객들에게는 리스팅이 노출되지 않게 됩니다. 여러분의 상품이 sun cream, sun gel, sun block 등의 단어들과 연관성이 없어서요? 아닙니다. 아마존 시스템에서 그걸 알아차리지 못하기 때문입니다. 리스팅의 그 어디에도 표현하지 않았기 때문이죠. 그렇다면 답은 '올바른 키워드들을 찾고' '해당 키워드들을 자연스럽게 내 리스팅에 녹이게 만드는 것'이 핵심이라고 볼 수 있겠습니다.1. 올바른 키워드를 찾아라제 포스트를 한 번이라도 읽어보신 분들은 잘 아시겠지만, 저는 그 누구의 주관적인 생각도 믿지 않습니다. 항상 숫자와 데이터로 입증할 수 있는 결론이야말로 안심하고 진행하는 것이 제 성격인지라 자연스럽게 제 블로그 글들도 그런 위주로 작성이 되는 것 같습니다. 올바른 키워드를 찾는 것 또한 역시 주관적인 생각을 버려야 합니다. 앞서 언급했던 예시에서 sunscreen이라는 단어를 sun gel, sun block, sun cream 등등의 방법으로 표현할 수 있을 거라고 제가 얘기를 했지만, 이것 또한 지금 이 글을 쓰고 있는 현재 시점에서는 그저 제 주관적인 의견일 뿐입니다. 실제로 미국 현지 고객들이 해당 키워드들로 구글이든 아마존이든 검색을 하고 있으며 그 검색량이 많다는 것을 숫자로써 증빙하기 전까지는 저 자신도 쉽게 결단을 내리지 않을 것입니다. 오직 이러한 factual data에 대한 확신이 생긴 뒤에야 올바른 키워드를 찾았다고 결론 내릴 수 있습니다. 컨택틱은 아마존 고객들이 어떤 키워드에 대해 얼마나 많이 검색하고 있는지, 그리고 그 키워드와 연관된 키워드/키워드절 (keyword phrase)가 어떤 것들이 있는지도 명확히 알아낼 수 있는 노하우가 있습니다. '내 리스팅에 대한 올바른 키워드를 찾는 것에 대한 도움'이 필요하신 분은 컨택틱을 찾아주세요.2. 키워드를 자연스럽게 리스팅에 삽입하라올바른 키워드를 찾았다면 그다음으로 해야 할 일은 리스팅에 빠짐없이, 하지만 자연스럽게 삽입하는 것입니다. 이 부분은 유난히 어려운 것이 사실입니다. 상품명에는 200 byte가 최대 입력 제한이며, 강조 포인트에는 한 줄당 250 byte, 상품설명란에는 2000 byte가 최대입니다. 하지만 그 안에서도 아마존이 어느 정도의 글자까지는 indexing 시킬지는 미지수입니다. 저희가 할 수 있는 최선은 단지 최대한 많은 유의어들과 연관어들을 상품명, 강조 포인트, 그리고 상품설명란에 입력하는 것일 뿐입니다. 하지만 마구잡이로 키워드 또는 키워드절들을 도배하는 것은 아마존뿐만 아니라 고객들의 눈에도 당연히 이상해 보이고 오히려 부작용을 불러일으킬 확률이 높습니다. 따라서 올바른 키워드를 수집하고 목록화했다면 영어를 원어민급으로 구사할 수 있는 주변인에게 도움을 받아서 자연스럽고 매끄러운 copywriting을 요청하거나 전문 업체에게 의뢰해보시길 추천드립니다. 컨택틱의 '고급 상품 등록 대행' 서비스는 올바른 키워드를 찾는 단계에서부터 copywriting 단계까지도 해결해주는 서비스이다 보니, 도움이 필요하신 분들은 언제든지 컨택틱을 찾아주시기 바랍니다.3. 기타 조심해야 할 사항타사 브랜드명은 리스팅에 넣으면 안 됩니다. 타사 브랜드명을 내 상품의 PPC 광고할 때 타깃 할 키워드로 설정할 수는 있으나 리스팅 최적화 단계에서는 엄격히 금지사항입니다. 이런 부분을 간과하고 경쟁사들의 브랜드명을 리스팅에 포함한 어느 한 셀러는 리스팅도 강제로 내려갔으며 판매 권한도 박탈 당하게 되었습니다. 그 외에도 한 번 사용한 키워드/키워드절은 두 번 중복 입력할 필요가 없습니다. 아무래도 제한된 입력 가능 란들 안에서 최대한 자연스럽게 copywriting을 해야 하는데, 거기에 더해서 한 번 사용한 키워드는 가급적 두 번 사용하지 않으려는 것은 정말 머리 아프고 어려운 작업일 수밖에 없습니다. 하지만 글자 수가 제한된 만큼 최대한 중복 키워드는 사용하지 마시고, 주어진 칸들을 최대한 유리하고 노출이 많이 될 수 있는 방향으로 꾸며보시기 바랍니다.그럼 오늘도 즐거운 글로벌 셀링 되세요!컨택틱  서울특별시 강남구 강남대로 62길 11, 8층 (역삼동, 유타워)  대표 전화: 02-538-3939  해외 부서: 070-7771-1727  영업 부서: 070-7771-1728  이메일: [email protected]  유튜브: https://www.youtube.com/channel/UC8OxbQGAnMqWGpGj5weLcZA 홈페이지: https://www.kontactic.com
조회수 4499

문돌이가 개발자랑 일할만큼만 프로그래밍 익히기

나는 대기업(스러운 곳)의 경영기획팀의 기획자로 5년간 일하다가 작년 초 회사를 그만두고 스타트업을 하겠다고 나왔다 (이거 뭐 써먹을데가 있어야지). 흔히 스타트업에서 '기획'한다고 하면 그건 대부분 '모바일/웹 서비스 기획자'를 의미한다. 이들은 개발자, 디자이너, 마케터들 사이에 새우 등 터지듯 일하는 경우가 많기 때문에 프로그래밍 배경지식이 없으면 특히 개발자들에게 x무시 당하기 쉽다. 이 글에서는 나같은 문돌이가 짜투리시간 약 3-4개월만 투자하면 초보 수준의 웹사이트는 개발 가능할 정도의 프로그래밍 스킬을 익혀서 개발자랑 어느정도 대화가 되는 PM이 되는 법에 대해 논하고자 한다. 참고로, 책보고 공부하는거 질색인 사람들에게 강추한다.지금부터 내가 설명하려는 '문돌이의 프로그래밍공부 방법론'은 어디까지나 다음에 해당하는 사람들에게 어울리는 방법임을 미리 밝혀둔다.1. 나는 학원같은거 다니면 적어도 반 이상은 완주할 정도의 인내력이 있다.2. 기본적인 영어 리스닝 실력은 있다.3. 내 목표는 개발자 되는게 아니라 개발자랑 일하는거다 (-> 진짜 프로그래머가 되는법은 절대로 내가 한 방법론으로 해서는 안된다.. 이건 그러니까.. 어디까지나 야매) Step 1. 생활코딩으로 공부하지 말고 준비운동만 하기 (1주일)생활코딩은 이제 너무 유명해져서 많은 문돌이들이 코딩 공부하는 성역이 되어버렸다. 그런데 아이러니한건 여기를 아는 사람은 많은데 여기서 코스 하나를 완주했다는 사람 보기는 힘들다는거. 생활코딩 사이트에 보면 생활코딩 작심 40시간 라이브 가 있는데 그야말로 40시간동안 웹서비스의 방대한 영역을 전부 건드리는 무지막지한 코스로서, 아무리 이고잉님이 쉽게 리드한다지만 문돌이가 처음부터 저걸 다 따라하는건 무리가 있다고 생각한다. 하지만, 이고잉님이 프로그래밍의 세계에 대해 전반적인 그림을 아주 잘 그려주시기 때문에 한번쯤 완주하고 나면 앞으로 내가 뭘 공부해야 하겠구나 하고 감 잡는데 큰 도움이 된다. 여기서 명심할 것은 이걸 그냥 가벼운 마음으로 시청만 하라는거다. 설치하라는거 다 설치하고, 코딩하라는거 다 코딩하면서 너무 진지하게 보지 말고, 그냥 시청만 하면서 프로그래밍 세계에 대해 맛만 보는거다. 왜냐면 완전 초보자가 AWS 트고, 리눅스, 우분투 설치하고, 깃허브에 서브라임까지 생소한 툴들 만지작하다 보면 겁부터 먹고 그냥 접게되는 경우가 많기 때문이다.생활코딩으로 프로그래밍의 방대한 세계의 맛만 보자Step 2. 유데미에서 Ruby on Rails 프로그래밍 코스 완주 (2개월)요즘 온라인에서 프로그래밍 배우는 사이트가 정말 많아졌다. 유데미, 유다시티, 칸, 코세라, 린다닷컴 등등 내가 아는 곳만 해도 10군데는 된다. 개인적으로 처음 프로그래밍 공부하는거면 왠만하면 한글로 배우지 말고 영어로 배우는 것을 추천한다. 객체 지향, 변수, 매개변수, 상수, 선택자, 제어문... 등등 한글로 배우면 이런 한문어로 된 단어들로 가르치는데 솔직히 더 어렵기도 하고 어차피 나중에 코딩하다 막히면 가장 많이 찾아볼 사이트가 스택오버플로우일텐데 저거 다시 영어로 찾아보느니 아예 처음부터 저걸 object-oriented, variable, parameter, constant, control statement... 요런식으로 인식해 버리는게 더 낫기 때문이다.해외 온라인 사이트는 많은 사람들이 유다시티를 얘기하는데 나는 유데미를 추천한다. 이유는 간단하다. 우리의 목표는 프로그래머로 취직하는게 아니라 프로그래머랑 일을 같이 하는게 목표이기 때문이다. 유다시티는 진짜 프로그래머 취업을 목표하는 사람들을 위해 디자인되었기 때문에 일단 수강료가 비싸고, 퀴즈도 엄청 풀어야 하고, 출석률도 체크하고, 아무튼 엄청 까다로운데 비해 유데미는 내가 필요한 특정 스킬들만 골라서 퀴즈같은거 없이 (있어도 점수체크 없음) 빠르게 수강 가능하고, 수업료도 저렴한 편이고, 무엇보다도 강사들이 대부분 실제 현업 종사자들이어서 가르치는 내용이 매우 실무적이다. (유다시티는 대학 백그라운드에 좀 교수같은 느낌)유데미에는 내가 필요한 특정 분야만 골라서 빠르게 마스터가 가능한 구조로 되어 있다.아까 1단계의 생활코딩 40시간 라이브를 전부 들었다면, 이제 프로그래밍의 세계가 대략 클라이언트-서버 프로그래밍의 두 영역으로 구분될 수 있고 (하드웨어, OS 이런거 제외), 프로그래밍 언어가 뭔지 (Ruby, Python, PHP 이런거), 프레임워크가 뭔지 (Ruby on Rails, Django, CodeIgnitor 이런거) 정도는 감이 생겼을 거다. (저게 각각 뭔지는 몰라도 되고 그냥 카테고리화만 할 줄 알아도 된다는 뜻임)이 글에서는 간단하게 프로그래밍 언어와 프레임워크의 차이점만 짚고 넘어가 보자. 프로그래밍 언어는 말그대로 소프트웨어를 작성하기위해 필요한 언어규약을 의마한다. 즉 내가 미국사람과 대화를 하려면 영어라는 언어가 필요하듯이 어떤 웹서비스를 통해 사용자와 통신하려면 수 많은 프로그래밍 언어들 중 내가 필요한거를 사용한다는것으로 이해하면 편하다. 흔히 고급언어-저급언어 이런말이 있는데 뭐 고급언어가 더 좋은거고 저급언어가 나쁜거고 이런말이 아니고, 최대한 사람이 사용하는 언어와 가까우면 고급언어라 부른다. 반대로 컴퓨터가 CPU 레벨에서 비트단위로 직접 사용하는 언어는 저급언어라고 부르고 기계어, 어셈블리어 뭐 이런걸 말하는데 이런건 지금 몰라도 된다. (생활코딩에서 이고잉님이 빙산의 일각 그림으로 아주 명쾌하게 설명해 주신다) 즉, 우리 초보레벨에서 프로그래밍 언어라고 하면 Ruby, Python, PHP, Java, JavaScript, C, C++, HTML, CSS 요런거 말하는거라고 이해하면 되고, 저기서 HTML, CSS는 웹브라우저에서 지금 당신이 보고있는 페이지 띄워주기 위해 필요한 언어이다. 즉, HTML, CSS는 웹페이지 코딩하려면 반드시 들어가는 내용이고, 좀 현란한 인터렉션도 넣으려면 JavaScript도 이 범주에 필요할 수 있고, 나머지 Ruby, Python, PHP, Java, C들 중에서 당신이 기본 베이스로 할 프로그래밍 언어를 선택하면 된다는 뜻이다. 정리하면, |HTML, CSS, JavaScript (선택) | + |기본 베이스로 할 언어 한개| 요렇게 공부를 해야 한다는 뜻이다. 프레임워크는 저기 언급한 프로그래밍 언어들로 프로그래밍을 쉽게 할 수 있도록 필요한 뼈대를 미리 설계해 놓은것, 좀더 어려운 말로는 재사용이 가능한 클래스들과 그 관계들을 미리 정의해 놓은 패키치같은거라고 이해하면 되는데, 각 기본 베이스로 선택하는 언어별로 프레임워크가 정해져 있다. 예를들어 Ruby 언어를 공부하면 프레임워크는 Ruby on Rails, Python을 공부할거면 프레임워크는 Django를 같이 공부하는 식이다.정리하면, 생활코딩 강의로 그냥 저 전반적인 세계에 대해서는 맛만 보고 당신은 그냥 Ruby와 Ruby on Rails를 선택해서 배우도록 하자. 왜 Ruby on Rails로 공부해야 하는가에 대해서는 여러가지 내 나름의 이유가 있는데 첫째, 컨벤션이 매우 엄격해서 비록 처음에는 러닝커브가 조금 있는 편이지만 초보자가 실수할 여지를 최대한 줄여준다. 예를들어 내가 써야하는 구문이 살짝만 틀려도, 명령어 하나의 대소문자만 틀려도 레일즈는 아예 페이지 전체를 보여주지 않는다. 이게 장점일수도 단점일수도 있겠지만 초보자가 어느정도 돌아가는 웹사이트 만들기 위해서 말도안되게 코딩한게 지저분하게 돌아가는 웹사이트보다는 좀 오래걸리지만 한번 만들고 나면 제대로 돌아가는 웹사이트가 운영하는데 더 유리하겠다라는 내 개인적 의견이다. 둘째, 레일즈에는 Ruby Gem이라고 불리는 아주 강력한 서드파티 라이브러리가 있다. 물론 대부분의 프로그래밍 언어에서 서드파티 라이브러리는 다 있지만, 루비젬이 강력한 이유는 앞서 얘기한 첫번째와 유사하다. 다른 언어의 라이브러리는 초보자가 그대로 가져다 쓰면 분명 에러 백퍼일것이다. 내 상황에 맞게 어느정도 변형할 수 있는 수준의 프로그래밍 능력이 있어야 할텐데 문돌이 초보자에게 그걸 기대하긴 어렵다. 반면 루비젬은 (전부 다 그렇진 않지만) 진짜 옛날 MS도스 시절 디스크 갔다 꼽고 인스톨 클릭하면 알아서 프로그램 깔아주던 느낌으로 젬파일을 인스톨하면 대부분의 라이브러리가 알아서 장착된다.루비를 선택해야 하는 마지막 이유는 (또 가장 중요한 이유는) 실제 웹사이트를 Deploy하는데 있어서 아무런 지식이 필요 없이 가능하다는데에 있다. 당신의 컴퓨터에서 코딩한 웹페이지들을 실제로 유저가 사용하기 위해서는 크게 다음 3가지가 필요하다. 1/서버 - 당신이 만든 웹페이지들을 어딘가에 가져다 놔야 유저가 찾아올수 있다. 당신 컴퓨터로 유저가 직접 접속할 순 없지 않은가. 2/도메인 - 당신 집에 유저가 놀러오려면 집주소가 필요한것 처럼, 당신이 올려놓은 웹페이지를 호출하기 위해서 필요한 주소같은 거다. 3/Deploy (배포) - 위 준비된 내용들을 실제 서버에 설치하고 유저가 찾아올 수 있게 만들어주는 일. 이 3가지 영역은 보통 백엔드라고 부르고 아마존 클라우드 서버니 하는게 다 저거 매니징하기 위해서 활용하는 서비스 이다. 아무튼, 이 영역은 나같은 평범한 문돌이에게 넘사벽의 영역이다. 괜히 배우려고 낑낑댈 필요도 없다. 레일즈를 배우면 나중에 디플로이할때 '헤로쿠'라는 서비스를 활용할 수 있는데 (물론 다른 언어도 가능하지만 쓱 읽어보면 레일즈로 하는게 젤 편해보임) 저기 웹사이트에서 시키는 대로 코드 복붙하고 명령어 몇번 치면 디플로이가 정말 마법처럼 이루어지고 덤으로 공짜 도메인까지 준다!! (물론 일정 트래픽 이하에는 서버비도 공짜) 난 이 3번째 이유만으로도 초보자들이 첫 배우는 프로그래밍 언어로 루비만큼 강력한게 없다고 생각한다.서론이 너무 길었다.. 아무튼 결론은 아까 말한 유데미 사이트에서 Ruby on Rails로 웹사이트 만들기 프로그램을 찾아서 공부하라는 말을 하려고 이 긴 설명을 한 거다. 유데미에서 레일즈로 웹사이트 만드는 코스 찾아보면 한 20개는 넘게 검색되는데, 다음 기준에 부합하는 내용의 코스를 선택하도록 한다.1. Bootcamp가 제목에 있는 코스 - 부트캠프라고 명시한 코스는 대부분 웹서비스 하나를 실제 서버에까지 올려서 완전하게 구현하는 코스를 말한다.2. Ruby on Rails를 활용하는 코스 - 각 코스 실라부스에서 Ruby on Rails를 활용하는지 확인해 본다.3. 레이팅이 적어도 4.5 이상, 별점 준 학생수가 최소 200 이상인 코스를 선택한다.참고로 내가 들었던 과정은 The Complete Web Developer Bootcamp라는 코스인데, 이미 1년 넘은 과정이기 때문에 이걸 듣지 말고, 그냥 이 코스의 실라부스를 참고해서 유사한 최신 코스를 찾아서 완주하길 바란다. 보통 2-3달 코스로 디자인 되어 있는데 하루에 1시간정도씩만 투자하면 2달이면 완주 가능하도록 되어있다.내가 수강했던 레일즈로 웹사이트만드는 부트캠프 코스. 이 코스의 실라부스를 참고해서 수강할 코스를 결정하도록 하자.Step 3. 부트스트랩 (Bootstrap) 숙달하기 (1주일)부트스트랩이란 아까 잠시 짚고 넘어간 HTML, CSS등의 웹페이지를 구현하는 언어를 위한 프레임워크이다. 사실 HTML, CSS도 초보자가 자유자재로 내가 구상한대로 화면에 딱 띄우도록 코딩하는건 매우매우 어렵다. 심지어 버튼하나 중앙정렬 하는것도 쉽지 않다. 부트스트랩은 이런 일들을 마법같이 쉽게 해주는, 그리고 모바일 반응형 구현도 코딩 몇줄로 가능하게 해주는 프레임워크이다. 아마도 당신이 선택할 유데미 코스에서 부트스트랩 활용하는 법이 포함되어 있을 듯 한데, 거기서는 정말 기본적인 내용만 훑어볼게 뻔하니 1주일정도 투자해서 부트스트랩을 제대로 익히고 넘어가도록 하자. 부트스트랩 사용법은 유데미에서 저렴한 코스를 하나 찾아서 수강하는것도 좋은 방법이고 그리 어렵지 않으니 부트스트랩 공식 웹사이트에서 필요한 내용만 골라서 본인의 웹사이트에 이것저것 적용해보며 익히는것도 좋다.부트스트랩은 초보자에게 어려울 수 있는 CSS의 박스모델, 플로팅, 정렬 이런걸 마법같이 쉽게 해주는 프레임워크이다.Step 4. 부트스트랩 코딩 되있는거 통째로 다운받아서 내 포트폴리오 사이트로 변형해보기 (3주일)여기까지 왔으면 당신은 이미 웹서비스에 관해서는 개발자랑 어느정도 대화는 되는 수준이 되어있을 것이다. 하지만, 여기까지 왔는데 실제로 내가 직접 코딩해서 서버에 디플로이까지 해 본 사이트 하나 정도는 있어야 하지 않겠나? 하지만 아무리 유데미 코스 하나 들었다고 당장 멋진 포트폴리오 웹사이트 만드는게 그리 쉽지는 않을 것이다. 이 단계를 아주 쉽게 해주는 사이트가 하나 있다. 바로 부트스트랩에서 제공하는 연습용 웹페이지인 Start Bootstrap이다.  완성도 높은 부트스트랩기반 웹사이트 파일을 통째로 다운받아 공부할 수 있는 사이트 이다.여기 가면 아주 잘 디자인된 다양한 종류의 부트스트랩 기반 웹사이트 코딩 파일들을 통째로 다운받을 수 있다. 본인이 도전해 보고 싶은 스타일 몇개를 골라서 다운받은 후에 index.html과 연결된 css파일 구조를 잘 파악해 본 다음에, 본인의 포트폴리오 웹사이트를 한번 만들어 보자. 이미 뼈대가 다 잡혀있기 때문에 그 뼈대를 분석하는 것 만으로도 큰 공부가 된다. 박스모델을 어떻게 쓰고 있고, 각종 버튼들을 글리피콘이랑 폰트어썸을 써서 멋있게 구현하는 법, jQuery의 각종 트랜지션들을 어떻게 구현하고 있는지 등등을 배울수 있고, 이 중에서 내가 필요한 부분을 복붙해서 내 웹사이트에 붙여볼 수도 있다. 나는 이 당시 여기의 웹사이트들 중 3개를 적절히 조합해서 다음과 같은 내 포트폴리오 웹사이트를 만들었다.StartBootstrap에서 3-4개의 사이트를 조합해서 만들어본 내 포트폴리오 웹사이트이다.당신이 여기까지 오는데 아마도 3-4달정도의 시간이 필요할 것이다. 다시 한번 강조하지만, 이렇게 공부하고 나서 당신이 '나는 개발자 입니다'라고 말하면 x욕 먹기 쉽다. 개발자의 세계는 웹개발만 해도 그리 녹록한 세상이 아니다. 하지만 이렇게 3달정도 야매로 포트폴리오 웹사이트 하나 뚝딱 만들어낼 정도로 훑어내고 나면 개발자랑 어느정도 대화가 통하는 문돌이 PM이 될수는 있다. 또한 당신이 정말 뜻이 생겨서 앞으로 앱개발도 배우고 직접 스택오버플로우 찾아다니면서 버그도 고치고 하다 보면 한 반년쯤 후에는 진짜 기본수준의 프로그래밍은 할 줄 아는 문돌이 PM이 되어 있을 것이다. PM으로서 본인이 구현하고자 하는 기능의 기술스택에 대해 개발자랑 어느정도 대화도 가능할 것이다.다음 글에서는 같은 맥락으로 디자이너랑 일할 수 있는 PM되기, 또는 디자이너 없는 스타트업에서 PM이 디자이너역할하기의 야매스러운 방법론에 대해 논해보고자 한다.글쓴이는 스팀헌트 (Steemhunt) 라는 스팀 블록체인 기반 제품 큐레이션 플랫폼의 Co-founder 및 디자이너 입니다. 비즈니스를 전공하고 대기업에서 기획자로 일하다가 스타트업을 창업하고 본업을 디자이너로 전향하게 되는 과정에서 경험한 다양한 고군분투기를 연재하고 있습니다.현재 운영중인 스팀헌트 (Steemhunt)는 전 세계 2,500개가 넘는 블록체인 기반 앱들 중에서 Top 10에 들어갈 정도로 전 세계 150개국 이상의 많은 유저들을 보유한 글로벌 디앱 (DApp - Decentralised Application) 입니다 (출처 - https://www.stateofthedapps.com/rankings).스팀헌트 웹사이트 바로가기

기업문화 엿볼 때, 더팀스

로그인

/