스토리 홈

인터뷰

피드

뉴스

조회수 1921

스타트업 가격전략 - 아마추어 벗어나기

김대리는 대기업에서 일하다가 얼마전 화장품 커머스를 하는 초기 스타트업에 조인했다 (이전 글 참고). 회사의 마케팅 전략 전반을 총 책임해야하는 김대리에게 이번에 신규 런칭하는 '감탄크림' 제품의 가격전략을 수립하라는 미션이 떨어졌다. 경쟁제품들의 채널별 판매가를 모조리 조사해 봤더니 평균 12,000원 정도가 나왔다. 개당 제작/유통단가가 6,800원이고 회사에서 목표로하는 마진율이 15% 이상, 김대리가 운영 가능한 마케팅 예산이 개당 4,000원 선 이기 떄문에 김대리는 나름 합리적으로 6,800원 + 4,000원 + 마진 2,100원 = 12,900원이라는 가격을 책정하였다. 언뜻 보면 나쁘지 않은 가격 책정법 같은데? 라고 생각하고 있거나, 본인도 혹시 이런식으로 가격을 책정하고 있던 분들이라면 오늘 글은 반드시 읽어주시길 바란다. 그렇다. 이번 글에서는 많은 김대리들이 가격전략을 수립할때 자주 저지르는 헛발질들에 대해 소개하려고 한다.** 이 글에서 '김대리'는 그냥 일반명사 김대리지 실제 김대들을 지칭하는게 절대로 아닙니다.** 이 글에 나오는 김대리의 회사 및 제품은 모두 가상의 설정입니다.1. 업에대한 본질과 가격이 전혀 연결이 안되는 김대리가격전략의 근본은 업에대한 정확한 정의, 다시말해 본인 제품 또는 브랜드가 약속하는바에 대한 정의를 가격체계에 녹여내는데에 있다. 김대리가 책정한 12,900원이라는 단순한 5개의 숫자 그 자체로 감탄크림이 소비자에게 약속하는바가 정확하게 전달되지 않으면 그건 가격전략이라고 부를 가치가 없다는 뜻이다. 대략 다음과 같은 순서로 선언적 가치를 정의해 볼 수 있다.1) (단일제품이 아닌) 브랜드가 전달하고자 하는 가치2) 해당 제품이 브랜드가 선언한 가치에 어떤 역할을 하는지에 대한 정의3) 가치-비용 관계로 가격전략의 방향 설정예를들면 이런식이다.1) 브랜드가 전달하고자 하는 가치: 감탄크림 등 14종의 제품을 보유하고 있는 감탄 화장품 브랜드가 전달하고자 하는 가치는 바로, 감탄이 흘러나올만한 차별적 가치가 전 제품에 한개 이상씩 담겨져 있는 화장품을 심플한 패키징과 합리적인 가격대로 제공함으로써 1인라이프에 최적화된 가치를 제공한다.2) 감탄크림이 위 가치에 역할하는 바: 감탄크림은 보습력 하나에만 집중한 제품으로, 경쟁제품 대비 30%이상의 보습력, 40% 이상의 지속력을 달성한 제품. 이를통해 바쁜 아침에 세수하고 푸석한 얼굴에 착~하고 바르기만하면 물광피부가 된 감탄을 선사할 것이다.3) 합리적 가격대에서 명확한 차별화 가치 전달: 감탄크림의 타겟은 단일제품에 큰 비용을 지불하지 않는 중저가 브랜드를 애용하는 젊은 10-20대 남녀임. 이들에게 같은 가격대에서 보습력 끝판왕이라고 불리는 명확한 차별화 가치를 통해 지각된 가치 (perceived value)를 최대화 한다.여기서 '지각된 가치를 최대화 한다'가 바로 업에대한 본질과 가격전략을 연결시키는 핵심이다. 지각된 가치라는 것은 소비자가 해당 제품/브랜드로 부터 지각된 효용 (perceived benefits)들의 합과 소비자가 지불한 비용 (costs)' 사이의 차이를 의미하는데, 이 차이가 (+)가 되어야 소비자는 소비행위를 통한 행복을 느끼는거고, 이게 (-)가 되버리면 불행해져서 '아 딥빡이네, 이 제품 다시는 안산다' 이런 반응이 나오게 된다. 저 효용 (benefits)과 비용 (costs)들에는 당연히 제품/브랜드와 관련된 유 무형의 모든 영혁을 포함하는 개념으로써, 예를들면 기능적 효용 뿐만 아니라 구매의 편리성, 사용이미지로 부터 오는 만족감, 고객서비스 등등을 모두 포함한다. 여기서 한가지 오해하면 안되는 것이, 경쟁제품 대비 효용을 최대화 하는것 뿐만 아니라 효용가치는 비슷한 수준에서 소비자가 지불해야 하는 비용을 경쟁제품 대비 최저로 낮추어 지각된 가치를 최대화 시키는 것 또한 하나의 방법이다.업에대한 본질이 가격전략으로 연결되어 소비자의 지각된 가치를 최대화 시키는것이 가격전략의 핵심이다.2. 차별화가치를 정량화하지 못하는 김대리혹시 당신의 제품이 B2B에 해당한다면 이 부분은 특히나 중요하다. 생각보다 많은 사람들이 본인 제품의 차별화 가치에 대해 명확하게 정량화 하지 못하거나, 정량화에 대한 시도 자체를 안하는 경우가 많다. 가격전략에서 차별화가치를 정량화 하는 방법은 여러가지가 있는데, 여기서는 Thomas Nagle의  '경제적 가치 평가 (EVE, Economic Value Evaluation)' 모델에 대해 간단히 소개해 보려고 한다. (이름은 제법 거창하지만 전혀 어려운 개념이 아니니 쫄지 말자)EVE 모델의 개념은 어떤 제품의 '총 경제적 가치'를 정량화하려면 해당 고객이 다른 대안으로 부터 얻을 수 있는 가치 (레퍼런스 가치)와 그 대안에 비해 이 제품이 갖는 차별화된 특성으로 부터 얻는 경제적 가치 (차별화 가치)를 합해야 한다는 건데, 그냥 쉽게 말하면 다음과 같다.당신 제품의 경제적 가치는 경쟁제품의 가격에다가 당신 제품을 이용함으로써 추가적으로 떨어지는 이득/손실을 모두 합한거다.예를들면 이런거다. 위의 감탄크림의 경우 레퍼런스 가치, 즉 다른 대안제품들을 선택했을때의 평균 비용이 12,000원이였다. 하지만 감탄크림을 이용하면 다른 대안을 이용했을때에 비해 다음과 같은 추가적 이득이 생긴다.(+) 동일 보습력을 위해 경쟁제품은 별도의 에멀젼이 필요하다 (+11,000원)(+) 동일한 시간동안 보습력이 유지되려면 경쟁제품은 감탄크림에 비해 평균 2.5배정도 제품을 더 사용해야 한다 (+5,500원)(+) 감탄크림은 정기배송 옵션이 있어서 화장품 떨어졌을때 온/오프라인 서치해서 제품구매하는 수고를 덜어준다 (+6,500원)(+) 펌프형태의 패키징이 심플해서 매일매일 사용이 편하다 (+2,500원)(-) 감탄크림은 레퍼런스 가격보다 900원이 비싸다 (-900원)(-) 감탄크림은 (경쟁사와는 달리) 아직 올리브영, 왓슨스, 대형마트 등 오프라인 구매가 어렵다 (-13,000원)(-) 화이트닝 기능이 없다 (-3,000원)(-) UV 프로텍트 기능이 없다 (-1,000원)(-) 감탄크림은 (경쟁사 대비) 카드사 포인트 사용이 불가능하다 (-3,000원)이를 EVE로 모델링 해 보면 총 16,600원의 경제적 가치가 계산된다.경쟁제품의 가격에다가 제품을 이용함으로써 추가적으로 떨어지는 이득/손실을 모두 합하면 경제적 가치가 계산된다.물론 해당 계산법으로 가격을 16,600원으로 설정하라는 것이 아니다. 대략 본인의 차별화 가치를 이런식으로 정량화 해 보면 소비자의 지불가격 대비 최종 차별화 가치는 개당 3,700원 (16,600원 - 12,900원)이라고 정량화할 수 있다. 사실 B2C에서 이렇게 차별화가치를 정량화 하는건 대단히 어렵지만, B2B라면 상대적으로 명확한 편이다. 이에대한 자세한 내용은 (비록 영어긴 하지만) 토마스 네이글이 고문으로 있는 레버리지 포인트의 블로그 글인 Economic Value Estimation글을 읽어보기 바란다. B2B 제품의 EVE 모델 예시 - 토마스 네이글의 '프라이싱 전략' 책에서 발췌3. 지불의향을 설문조사로 뽑아내려는 김대리이건 특히 B2C 제품에서 가격수립할때 절대로 해서는 안되는 헛발질에 해당한다. 가격수립한다고 소비자에게 샘플제품 보여주고 (심지어 제품도 없이 대략 제품 스팩만 설명하는 경우도 있다) 소비자에게 이거 이정도 가격이면 사겠니? 또는 얼마까지 지불할 의향이 있니? 하고 적나라하게 설문지로 물어봐서 해당 답변 평균내는 방식이나, 그나마 더 전문적인 리서치기관에 의뢰해서 나름 비교제품들을 제시해서 컨조인트 분석기법등을 동원해서 지불의향 가격을 조건별로 발라내는 방식인데, 이렇게 지불의향을 조사해서 가격 책정하는 방식은 특히 스타트업이라면 매우x10 위험한 방법이다.이런 전문적인 컨조인트 분석으로 구매의향을 발라내주는 리서치 기법이 많이 있지만 개인적으로 위험한 방법이라고 생각한다. (사진 출처: 동아비즈니스리뷰 55호)그 이유는 여러가지가 있지만, 가장 중요한 이유는 소비자가 정말 얼마까지 저 제품에 가격을 지불할 의향이 있는지를 본인 스스로도 절대로 모른다는 점에 있다. 소비자의 지불의향을 결정하는 변수는 가격 그 자체에 있는게 절대로 아니기 때문이다. 소비자가 지갑을 여는 순간 눈에 들어온 옵션들의 가격, 구매 순간의 심리, 오늘 아침에 본 리뷰 내용, 마누라 구박, 내일 엄습할 카드갑 등등 수 많은 변수들이 구매 시점에서 지불의향 가격을 형성한다. 이런 복잡한 지불의향을 단순히 설문조사로 제품 샘플 보여주고 얼마면 사겠니? 하고 물어보는걸로는 정확히 파악하는게 원천적으로 불가능하다.또한 더 중요한 이유가 있는데, 가격전략의 목적이 소비자의 지불의향 가격을 잘 맞춰서 합리적인 가격대를 설정하는것 보다는, 소비자로 하여금 해당 가격과 그 이면의 가치제안을 통해 소비자의 지각된 가치를 높이는데 있다는 점이다. 특히, 위에서 설명한 이면의 가치제안을 더욱 정교하고 효과적으로 수행함으로써 소비자의 구매시점에서 지불의향 가격 자체를 높이는 전략이 더 똑똑한 가격전략이라고 할 수 있다.4. 가격펜스에 대해 무개념한 김대리아무리 시장세분화를 통해 원 니즈를 공유하는 세분시장을 타겟한다고 하더라도 3번에서 얘기한것 처럼 구매하는 상황, 심리적 변덕 등 수 많은 변수들로 인해 지갑을 여는 시점에서 가격민감도가 다 다르게 형성된다. 이 가격민감도가 다른 다양한 소비자들을 최대한 공략하기 위해 많은 기업에서는 차별적 리스팅 프라이스, 채널별 멀티 할인률 적용, 카테고리별 가격할인 전략 등 다양한 테크닉을 구사한다.예를들어, 김대리의 감탄크림의 정가가 12,900원으로 책정되었지만, 해당 크림을 구매하는 소비자가 오픈마켓에서 가격비교중인 상황, 로드샵에서 할인행사중인 경쟁제품 바로 옆 진열대에 놓이는 상황, 여친이 남친 선물주려고 사는 상황, 페북에서 끝내주는 리뷰 보고 충동구매 하는 상황 등등 소비자가 해당 제품을 구매하는 개별 상황에서 가격 민감도는 모두 제각각이 되기 마련인지라, 이를 잘 고려해서 각 채널별, 구매상황별, 소비자 카테고리별 할인전략을 운용하는건 매우 어렵고도 중요한 전략이다. 이 부분은 본인도 아직 경험이 미천해서 나중에 좀더 경험이 쌓이면 별도의 글로 방법론을 정리해 보도록 하겠다.아무튼, 위 상황에서 아무리 초보라도 이거 하나는 반드시 명심하고 있어야 한다. 바로 명확한 가격펜스 (Price Fense)의 설정이다. 가격펜스란 서로 다른 가격들을 구분하는 기준, 조건들을 명확하게 설정하고 해당소비자들로 하여금 서로 다른 고객군의 영역으로 넘나드는 행위를 원천봉쇄하는 걸 말한다. 예를들어, 애플이나 마이크로소프트에서 학생/교직원 할인 혜택을 운영할 때 해당 대학교만을 위한 별도의 스토어 URL을 운영한다던지, 등록된 학교 도메인의 이메일로 인증을 해야만 할인 가격으로 구매할 수 있도록 해서 타 고객군에서 할인가격 혜택을 받는걸 방지하는 등의 행위가 모두 가격펜스에 해당한다.애플은 학생할인을 아예 학교별로 별도의 URL로 스토어 사이트를 운영하고, 이를 학교 커뮤니티 사이트에 알리는 가격펜스 정책을 운영중이다.여기서 애플의 가격펜스에 주목해야 하는 점은, (물론 워낙 유명한 애플이라 많은 사람들이 정보공유를 하곤 있지만) 가격할인을 그 대상이 되는 소비자만 알고 다른 소비자군은 잘 모르게 세팅하거나, 알더라도 해당 혜택을 받기 어렵도록 다양한 장치를 설치함으로써 서로다른 가격군에서 장벽을 넘나드는것을 최대한 방지하는 노력이 중요하다는 것이다. 이걸 잘 못하는 기업은 정가에 대한 소비자 신뢰가 무너져서 결국 가격 인하 -> 수익성 악화 -> 소비자는 여전히 가격할인을 기대 -> 가격할인 실시 -> 가격인하 ... 의 악순환에 빠지게 된다.5. 매몰비용의 관점에서 1개당 판매비용을 책정하는 김대리가격 책정할때 많은 사람들이 실수하는 부분중 하나가 바로 제품 1개당 판매 비용을 매몰비용의 관점에서 계산한다는 것이다. 이건 조금 헷깔릴 수 있는 개념이라 일단 각각의 정의부터 살펴보도록 하자. 회피가능비용 (Avoidable Cost)란 말 그대로 현재 시점에서 아직 발생하지 않았거나 되돌릴 수 있는 비용을 말하고, 매몰비용 (Sunk Cost)은 반대로 이미 되돌릴 수 없이 지불해 버린 비용이다. 이렇게 얘기하면 많은 분들이 '그거 고정비-변동비 개념 아닌가?' 하고 의문을 갖기 쉬운데, 개념 자체가 아주 다른거니 다음 설명을 주의해서 읽어주길 바란다.회피가능비용을 이해하기에 가장 적절한 예는 언제나 석유회사의 예가 단골처럼 등장한다. 석유회사가 가솔린 1리터를 주유소에 판매하기 위해 들어간 비용을 계산할때 대부분은 원유구입비와 정제, 배달에 들어간 비용의 합이라고 생각하기 쉽지만 절대 이렇게 비용계산을 하지 않는다. 석유회사는 미리 석유를 구입해서 재고를 엄청나게 채워넣고 공급해야 하는 비즈니스이기 때문에 이미 석유를 구입한 비용이 아니라 새로 석유를 판매할 때 빈 재고를 채워넣는데 들어가는 석유 구입비를 계산하여 현재 가격에 반영하는 방법을 사용한다. 뭐 전문용어로 NIFO (Next In, First Out)이라고 표현한다고도 하는데 이런것까진 몰라도 될것 같다. 중요한 부분은 석유회사는 가격을 책정할 때 이미 재고에 채워넣은, 즉 회피 불가능한 원유구입비를 가격에 반영하지 않고, 판매한 만큼 비는 재고를 채워넣어야 하는, 즉 아직 발생하지 않은 회피가능비용을 기준으로 현재 가격을 책정한다는 것에 있다. 원유가격이 변동할때 마다 정유사들이 가격을 바로바로 반영하는 이유이다.정유사는 판매한 석유에 들어간 구입비가 아닌 판매한 빈 재고를 채워넣을 때 들어가게 될 원유구입비를 가격에 반영하고 있다.김대리의 감탄크림 케이스에 이 개념을 적용해 보자. 만일 12,900원에 판매하고 있는 감탄크림의 판매량이 예상치를 훨씬 밑돌게 되어 화장품을 재고로 보유하고 있는 임대료비용이 더 많이 들고 있는 상황이라고 해 보자. 1개당 재고보유 비용이 3개월 단위로 2천원씩 상승한다고 하고, 현재 가격으로는 재고 보유가 평균 1년이 걸릴 것으로 예상된다고 해 보자. 우선, 이미 생산과 마케팅에 쏟아넣은 6,800 + 4,000 = 10,800원이라는 원가는 현 시점에서는 회피불가능 비용이라고 생각해야 한다. 이미 만들어버린 화장품 제작/유통비용, 이미 집행해버린 마케팅 비용들을 이 시점에서 가격에 반영하는건 어리석은 행위다. 오히려 현재 가격으로는 1년이나 재고로 쌓아둬야 할 것으로 예상되는 재고 보유비용인 8천원을 회피가능비용으로 생각해서 현재 가격 12,900원에서 반값 할인 행사를 쳐서 6,450원에 현재 재고를 모두 소진할 수 있으면 앞으로 발생할 재고 보유비용 8천원을 회피할 수 있으니 더 이득이 되는 선택이라고 할 수 있다.물론 위의 예시는 지나치게 상황을 단순화한 거라 실제 상황에서는 저런 결정이 쉽지는 않을 것이다. 저 예시에서 전달하고자 하는 바는, 가격 전략을 운용할 때 이미 지불해서 더이상 되돌릴 수 없는 비용은 생각하지 말고 앞으로 발생이 예상되는 비용인 회피가능비용을 탄력적으로 적용하려는 노력이 필요하다는 뜻이다.지금까지 가격전략을 수립할때 사람들이 자주 저지르는 헛발질들에 대해 소개했다. 다시한번 강조하지만 가격은 단순히 표시된 숫자 그 이상의 의미를 지닌다. 가격 책정 그 이면에는 해당 기업/브랜드의 모든것이 응축되어 담겨있다고 해도 과언이 아니다. 특히 위에서는 디테일하게 구술하진 않았지만 가격민감도가 서로다른 소비자들을 그룹별/구매시점별로 다양하게 타겟팅하는 가격펜스 트릭을 잘 하는 기업들을 보면 이건 거의 아트수준이다. 혹시 지금까지 경쟁사 가격 조사해서 대충 가격 책정해오던 분들이시라면 아무쪼록 이 글이 어느정도 전략적 가격책정에 도움이 되길 바란다.** 본 글은 김대리의 헛발질 시리즈 입니다.** 1화 보기 - 인스타그램 초기마케팅 헛발질들을 정리해봤다** 2화 보기 - 스타트업에서 STP 전략을 그리고 있는 당신에게글쓴이는 스팀헌트 (Steemhunt) 라는 스팀 블록체인 기반 제품 큐레이션 플랫폼의 Co-founder 및 디자이너 입니다. 비즈니스를 전공하고 대기업에서 기획자로 일하다가 스타트업을 창업하고 본업을 디자이너로 전향하게 되는 과정에서 경험한 다양한 고군분투기를 연재하고 있습니다.현재 운영중인 스팀헌트 (Steemhunt)는 전 세계 2,500개가 넘는 블록체인 기반 앱들 중에서 Top 10에 들어갈 정도로 전 세계 150개국 이상의 많은 유저들을 보유한 글로벌 디앱 (DApp - Decentralised Application) 입니다 (출처 - https://www.stateofthedapps.com/rankings).스팀헌트 웹사이트 바로가기 
조회수 1143

이커머스 고객사의 고객경험을 지키는 사람들, 품고 운영 팀장 지원님을 만나다.

1. 안녕하세요! 지원님, 간단히 자기소개 부탁드려요! 안녕하세요! 이커머스 풀필먼트 서비스 ‘품고’ 커뮤니케이션 팀에서 일하고 있는 노지원입니다!  커뮤니케이션팀으로 입사해서 현재 운영 팀장으로 ‘품고’와 함께하고 있습니다.     2. ‘품고’ 운영 팀에서 주로 하고계신 업무는? 고객사 분들께 ‘품고’의 IT 물류 시스템 사용에 대한 안내를 해드리고  있어요.  제품이 품고를 통해 배송되어, 고객의 손에 닿는 순간까지  배송상황을 체크하고 제품이 고객에게 전달 된 이후에도 고객사와 소통하며 다양한 상황에 대비해드리고 있어요:)     3. 품고 커뮤니케이션 팀만의 강점이 있을까요? 직접 물류를 하면서 쌓은 전문성을 바탕으로 고객의 ‘비즈니스’를 함께 고민하고 더 나은 방법을 제안 드릴 수 있다는 점인 것 같아요. 예를 들어 상황에 따라 제품 발송에 있어 비용절감이 가능한 방법 등을 안내해드리고 있어요.     4. 품고 운영팀에서 일하시면서 기억에 남는 일이 있으실까요? 현재 저희와 함께 하고 계신 고객사 ‘하비풀’이 기억에 남아요. 온라인 취미 클래스와 함께 취미 키트를 판매하는 곳이고, 취미문화를 선도하고 있는 기업이라고 생각해요.   키트 제품이다 보니 배송 전 임가공 작업이 필요해요. ‘품고’의 임가공 전문팀이 임가공 작업을 해드리는 고객사 중 하나에요. 물류 업무를 품고에 맡기시고 하비풀에서 잘하시는 상품 기획, 마케팅 등 핵심업무에 집중하신 이후,  현재 하비풀은 저희와 처음 함께할 때보다  주문량이 약 10배정도 늘으셨어요:)     5. 앞으로 품고에 계시면서 해보고 싶은 일이 있으실까요? 현재 품고와 함께하고 있는 고객사 분들 중에 뷰티 브랜드 고객사 분들도 계세요.  요즘  ‘K뷰티’가  많은 관심을 받고 있잖아요?  뷰티업체 중에 혹시 해외배송을 생각하는 업체가 계시다면 만나서 ‘품고’의 해외배송 서비스를 통해 도움을 드리고 싶어요.    ‘품고’는 단순히 배송을 대행하는 것이 아니라, 고객사의 성장을 함께 응원하고 돕는 것을 목표로 하고 있어요.  앞으로도 많은 이커머스 사업자 분들의 품을 덜어드리고 고객경험을 함께 지켜드리는 든든한 물류팀 ‘품고’가 되고 싶습니다:)  
조회수 9807

아이폰 X를 위한 디자인 가이드    

아이폰 X가 11월3일 정식으로 출시됩니다. 이번 모델은 1125x2436픽셀을 자랑하는 슈퍼 레티나 디스플레이를 장착하고 나오죠. 상단에 파인 홈 부분을 통해 미래지향적인 얼굴 인식 기능을 쓸 수도 있습니다.이 아름다운 기기의 디자인은 조금 새롭고 도전적일 수도 있지만, 또한 새로운 디자인의 가능성을 보여주기도 합니다. 액정의 너비를 따져 봤을 때는 아이폰 6, 7, 8과 같죠. 하지만 높이는 145pt만큼 증가해서 기존보다 20%정도 늘어났습니다. 예전에 @ 1x 이미지를 디자인 할 때는 375x812 픽셀의 아트보드가 필요했었죠. 하지만 이번에 새롭게 도입된 레티나 디스플레이 때문에 아이폰 X는 아이폰 8처럼 @ 2x 에셋을 사용할 필요가 없습니다. 대신에 아이폰 7-8 플러스처럼, @ 3x 에셋을 이용해 이미지를 내보내면 되죠.당신이 UI를 디자인 할 때, 이 기기의 새로운 기능들(OLED 디스플레이, M자 상단 디스플레이, 없어진 홈 버튼 부분)이 당신의 UI를 방해하지 않도록 해야겠죠. 또한, 기존의 홈 버튼 부분은 스크린의 하단부에 작은 줄의 형태로 남아있습니다. 이곳을 손가락으로 살짝 밀어주면 전처럼 홈 화면으로 돌아오고 다른 작업들도 할 수 있게 되죠.^ See that white line, that’s the new home indicator.당신의 앱이 기존의 iOS 구성을 벗어나지 않는다면, 그것들은 이 새로운 iPhone에 자동적으로 적용이 됩니다. 거기엔 네비게이션 바, 테이블, 그리고 탭 바까지 포함되죠. 그것들은 자동적으로 새로운 iPhone에 맞춰서 옮겨지게 됩니다.^ iPhone 8 design on the left, automatically adapted to the iPhone X on the right만약 당신이 커스텀 레이아웃을 쓰고 있다면, 그 앱을 새로운 스크린에 맞게 업데이트 해 줘야 할 겁니다. 그것도 당신이 만약 Auto Layout 기능을 쓴다면 훨씬 더 쉬워지겠죠.바로 시작해봅시다우선, 이 기기의 디자인을 받아들일 필요가 있겠습니다. 이걸 개발한 애플 직원들은 이 비싼 하드웨어의 놀라운 기능들을 숨기기 위해서 이렇게 노력한 건 아닐테니까요.풀 스크린을 사용하도록 하세요. 스크롤 뷰가 화면 하단의 곡선 디스플레이 부분을 넘어가도 좋습니다. 또한 애플은 상단부의 M자 부분과 하단의 휘어진 디스플레이 부분을 가리지 않는 것을 권장합니다. 왜냐면 그곳을 검은색 바 같은 것으로 가려버리면 그건 디자인적으로 아이폰 8과 다를 게 없으니까요.새로운 상단바. 디스플레이어의 상단부에 있는 센서가 중간에 위치하기 때문에, 상단바가 양쪽으로 갈라지게 됐습니다. 당신이 UI를 디자인할 때 이 공간을 활용해서 뭘 할려고 한다면, 인터페이스를 업데이트 하는 게 좋을 겁니다. 왜냐하면 iPhone X는 더 길어졌기 때문이죠. 이 달라진 높이 때문에 당신의 UI를 상당히 많이 바꿔줘야 할 겁니다. 또한 상단바의 높이를 동적으로 바뀔 수 있게 만들어 주세요. 이번 새로운 아이폰의 좋은 점 중 하나는 보통은 상단바가 동적으로 바뀌지만 전화를 걸 때나 네비게이션 앱을 쓸 때는 높이가 바뀌지 않는다는 부분입니다. 이점은 예전 아이폰에선 문제가 됐었죠.^ split and taller status bar새로워진 스테이터스 바를 가리지 마세요. 만약 당신이 스테이터스 바를 가리려고 생각한다면, 그 결정을 재고해 보시길 바랍니다. 아이폰X는 스크린이 더 커졌기 때문에 컨텐츠를 넣을 공간도 더 생겼죠. 그러니 스테이터스 바를 가리지 않는게 좋을 겁니다. 유저들은 이 바를 통해 유용한 정보를 얻을 수 있을 것이고 그 공간은 어차피 다른 UI를 쓸 때 거의 사용되지 않으니까요.풀스크린 이미지를 쓰세요. 만약 당신이 풀스크린 이미지를 쓰고 있다면, 그것들을 새로운 iPhone을 위해 업데이트 해 줘야 할 겁니다. 아래 사진처럼 잘린 부분이나 그 밖의 핵심적인 부분이 안 보일 수도 있기 때문이죠.액정 하단부에 인터페이스를 넣지 마세요. 긴 선 모양의 홈 부분은 오직 손가락의 움직임만을 캐치하기 위해 만들어졌습니다. 이 근처에다가 버튼을 둔다던가 하는 것은 좋은 생각이 아니에요. 유저들은 아마 실수로 홈 부분을 건드리게 될 것이고 그러면 당신의 UI에 접근하는 게 어려워질 겁니다. 하지만 탭바나 펑션 바에 그것들을 둘 수는 있을 거에요. 즉, 단지 홈 부분 주변에만 두지 말라는 거죠.홈 부분(기존에 홈 버튼이 있던 부분)을 숨기려 하지 마세요. iOS 자체적으로 당신의 앱에서 홈 부분을 숨길 수 있게 해주기 때문이죠. 유저들이 스크린에 몇 초간 손을 대지 않으면 자동적으로 사라지게 됩니다. 당연히 손을 대면 다시 나타나죠. 비디오나 사진을 볼 때 사용되는 몰입형 인터페이스를 쓴 것입니다. 또한 홈 부분은 당신의 앱 배경 색에 맞춰서 자동적으로 색깔이 달라지게 되어 있습니다.더 많은 색깔을 써보세요. 새로운 슈퍼 레티나 디스플레이는 기존의 sRGB 대신에 DCI-P3를 이용해 스크린에 보여줍니다. 즉 더 풍부하고 선명한 색깔을 보여줄 수 있다는 것이죠. 특히 비디오와 사진 기능이 이 광범위한 색깔로 인한 혜택을 받게 될 것입니다.손가락을 이용한 움직임에 익숙해지세요. 홈 버튼이 없어졌기 때문에, 이제 당신은 손가락으로 밀어서 아이폰을 조작해야 합니다. 위로 밀면 홈 화면으로 돌아오거나 멀티 태스킹 뷰 모드로 전환할 수 있죠. 왼쪽이나 오른쪽으로 밀면 그 앱들을 선택할 수 있습니다. 액정 상단에서 아래로 밀어주면 알림이나 제어 센터로 이동할 수 있죠. 게임 같은 경우에는, 기존에 위나 아래로 미는 iOS의 기본 움직임을 무시하고 당신만의 움직임을 설정할 수 있습니다. 새로운 기능인 ‘edge protect’를 쓰면 앱에서 설정한 손가락 움직임을 먼저 인식하고, OS의 움직임을 나중에 인식할 수 있게 되죠. 하지만 이 기능을 너무 많이 쓰는 건 권장하지 않습니다. 왜냐면 기존 아이폰 시스템에 익숙한 유저들이 혼란을 느끼게 될 수 있으니까요.Face ID를 써보세요. 이전 iPhone의 가장 큰 특징이라면 터치 ID겠죠. 이는 유저들로 하여금 지문을 이용해서 장치의 잠금을 해제할 수 있게 했습니다. 이 기능은 원래 홈 버튼에 붙어있었지만, iPhone X에서 홈 버튼이 사라지면서, 애플은 이 기능을 좀 더 보안적으로 발전된 형태로 대체했죠. Face ID는, 사람들의 얼굴 윤곽을 분석하는 아주 놀라운 알고리즘을 이용해 동작합니다. 이 기능은 UI 적으로도 새로운 가능성을 보여줄 것이기 때문에, 당신은 아이폰 X를 쓰는 유저들을 위해서 이 기능을 써야만 하겠죠. 새로 앱이나 메뉴를 만들 때 더 이상은 터치 ID를 쓰지 않아야 한다는 걸 꼭 기억하세요. 이제 이걸 Face ID가 대체할테니까요.커스텀 키보드. 아이폰 화면에 들어가는 커스텀 키보드를 만들거라면, Emoji같은 이모티콘이나 받아쓰기 기능을 추가하지 마세요. 그것들은 자동적으로 키보드에 추가될 겁니다.네비게이션 바가 더 커졌습니다. iOS 11버전에서는 새로운 네비게이션 바가 업데이트 되었습니다. 이제 더 길어졌죠. 이러한 디자인은 특히 아이폰 X같이 길이가 긴 휴대폰에 더 좋다고 할 수 있습니다. 새로운 스테이터스 바와도 아주 잘 어울리죠. 그러니 이 점을 UI를 디자인할 때 참고하세요. 또한 이제 네비게이션 바를 스크롤 할 때 멋진 애니메이션이 추가됐습니다.내용 요약아이폰 X는 145pt만큼 더 깁니다. 그러니 375x667pt로 디자인하지 말고 375x812pt로 디자인하세요.아이폰 X는 @3 이미지 에셋을 씁니다.풀스크린으로 디자인하고 싶다면, 아이폰 X의 고유한 기능들을 가리지 마세요.당신 UI의 중요한 콘텐츠는 센터부분에 위치해 두세요. 기기의 센서와 코너부분은 항상 가리지 않고 보이게 하세요.상단 스테이터스바가 기존 22pt에서 44pt로 더 커졌습니다.기존의 풀스크린 이미지들을 계속 다 보이게 하려면 업데이트를 해줘야 합니다.버튼을 홈 부분 근처에다 두지 마세요.정말 필요한 경우가 아니라면 홈 부분을 가리지 마세요.아이폰 X는 DCI-P3를 지원하기 때문에 색깔이 더 풍부하고 선명해졌습니다.홈 부분이나 스테이터스 바에서 쓰이는 손동작들을 커스텀 할 때 항상 주의하세요. 유저들이 기존에 쓰던 손동작들과 혼동하게 만들지 말아야 합니다.이제 사용자를 인증할 때 Face ID가 Touch ID를 대체합니다. 커스텀 키보드를 만들 때 Emoji 이모티콘과 받아쓰기 버튼을 따로 추가해 줄 필요는 없습니다.더 커진 내비게이션 바는 긴 화면을 갖고 있는 아이폰 X와 아주 잘 어울립니다.여기 비디오에도 내용을 요약해 봤습니다.How do I preview my app UI?내 앱 UI를 프리뷰 해보려면 어떻게 해야 하죠?Xcode 9 시뮬레이터를 사용하시면 당신의 앱을 프리뷰 해 볼 수 있습니다. 이 프로그램은 만약 당신의 UI가 업데이트가 필요하다면 즉각 그 부분을 표시해줍니다.Where can I find iOS 11 and iPhone X resources?iOS11과 아이폰 X 리소스는 어디서 찾을 수 있나요?애플은 Sketch, 포토샵, 그리고 Adobe XD 같은 뛰어난 리소스를 지원하고 있습니다. 이곳에서 찾아보세요.참조: 이 글의 대부분의 정보는 애플 UI 가이드라인에 기초합니다.원문 : https://blog.prototypr.io/designing-for-the-iphone-x-4239d5ac736c#더팀스 #THETEAMS #디자인 #디자이너 #인사이트 #영문번역 #꿀팁
조회수 888

고객이 먼저 다가오게 만드는 개입 전략은 무엇일까?

이미지 출처 : 구글 이미지    1. 고객이 먼저 다가오게 만드는 개입 전략은 무엇일까?      구매 전, 고객이 고민하는 두 가지  마트에서 저녁 찬 거리를 고르는 상황을 생각해보자. 무슨 반찬을 고를지, 돌아다니다가 어느 한 시식코너 앞에 멈춰 섰다. 시식코너에서  소시지를 건네받아먹고, 결국 그 상품을 사게 된다. 물론, 사지 않고 늘 구매하던 소시지를 살 수 있다. 하지만 시식을 통해 전혀 경험하지 못했던 브랜드의 소시지 맛을 볼 수 있었다. 이번에는 택시를 잡는 상황을 생각해보자. 늦은 저녁, 이태원에서 친구들과 한 잔 하고 일산의 집까지 택시를 타려고 한다. 택시가 쉽게 잡히지 않는다. 이때 우리가 꺼내 드는 카드는 바로 ‘카카오 택시’. 카카오 택시에서 기사와 운행 거래, 운임, 시간 등을 확인 후, 호출 버튼을 눌러 택시 서비스를 이용한다. 위 두 가지 이야기는 우리가 일상에서 아주 쉽게 겪을 수 있는 일들이다. 바로 이 일상에 개입 전략이 잘 녹아 있다. 일반적인 구매 과정 중에서 고객은 두 가지를 늘 고민한다. 첫 째, 이 상품이나 서비스를 통해 정말 자신이 원하던 ‘이익’을 얻을 수 있느냐이다. 두 번째, 자신이 처한 문제를 해결하는 과정에서 이런 서비스와 상품을 통해 발생하게 될 또 다른 위험이나 위협은 없느냐이다. 이미지 출처 : 구글 이미지가령, ‘카카오 택시’의 경우, 우린 이 서비스를 사용하는 이유가 명확하다. 사실, 바로 길 앞에서 택시를 잡을 수 있다면, 카카오 택시를 사용하지 않을 것이다. ‘카카오 택시’를 사용하는 순간은 바로, 택시가 잘 잡히지 않는 경우가 될 것이다. 즉, 택시의 배차시간을 앞당기기 위해 사용하게 된다. 이 부분에서 택시의 배차시간을 명확하게 앞당길 수 있으니, 내가 이 서비스를 이용함에 얻을 수 있는 이익은 명확하다. 그리고 택시 서비스를 이용함에 일반적인 고객이 우려하는 것들이 있다. 불친절한 서비스, 초과 운임, 배차 여부 등이다. 카카오 택시를 이용하게 되면, 이러한 우려는 사라지게 된다. 서비스가 친절해지거나 운임이 저렴해진다는 것이 아니다. 다만, 비대칭적읜 정보 환경에서 우리는 사전에 해당 서비스의 가치를 미리 확인해볼 수 있다. 기사의 서비스 평가, 요금, 운행 거리, 도착 시간 등을 말이다. 이런 경험을 통해 사전에 우리가 생각할 수 있는 위험과 위협에서 벗어 날 수 있는 것이다. 즉, 고객이 생각하는 이 두 가지를 통해 마케터는 미리 설정해두어야 하는 메시지가 명확해진다. 바로, 먼저 주기와 헷지(hedge)하기이다. 먼저 주기는 본래 제공하는 서비스나 상품을 가장 작은 단위로 쪼개어 잠재고객에게 제공하는 방식이다. 소시지 시식코너와 같을 수 있고, 화장품의 샘플이나 테스터가 이에 해당한다. 앱의 경우에도 라이트 버전의 무료 서비스를 먼저 사용할 수 있게 하고, 유료 버전으로 앱 내 구매를 유도한다. IT 서비스의 경우, 2주간 미리 서비스를 풀버전으로 사용 가능하게 하여, 락인 효과를 노리기도 한다. 이 모든 것이 먼저 주기에 해당한다. 헷지(hedge)하기는 잠재고객이 생각할 수 있는 위험과 걱정을 미리 해소해주는 것이다. 위의 카카오 택시가 아주 좋은 사례였다. 가령, 새로운 화장품을 구매하기 전, 테스터를 사용해보는 것도 좋지만 제품의 특성상, 그 효과라 어느 정도의 시간이 필요하기에 일정한 시일 이내 환불조건을 제공하는 것도 하나의 헷지 하기에 해당한다. 위 두 가지 전략에 기초하여, 당신의 제품과 서비스는 먼저 주기와 헷지 하기 전략이 있는가. 만약, 준비되어 있지 않다면, 고객의 의사결정 여정 속에서 당신의 서비스나 제품은 외면받기 쉬울 수 있다. 먼저 주기를 통해 고객의 사용경험을 유도하고 헷지 하기를 통해 고객의 걱정을 미리 해소해주자. 당신의 제품과 서비스가 시장에서 도드라질 수 있는 간단한 방법이다.     개입 전략의 선두주자  최근 페이스북이나 인스타그램 타임라인을 보게 되면, 젊은 남녀 모델이 나와 코믹한 상황 속에서 다양한 화장품을 체험하는 영상을 종종 볼 수 있다. 민감성 피부를 가지고 있는 이가 며칠 후 피부가 몰라보게 달라졌다며, 이리 비추고 저리 비춰보는 영상을 통해 나도 모르게 샘플 신청 클릭 버튼을 누르게 된다. 최근 저가 화장품 브랜드가 샘플 신청이라는 개입 전략을 넘어 화장품을 이미 사용한 것처럼 느낄 수 있는 경험을 제공하는 영상 마케팅에 열을 올리고 있다. 이 영상을 보며, 이 자극적인 영상이 과연 잠재고객의 호응을 얻을 수 있을까?라는 의문이 들긴 하지만, 실제로 샘플을 신청하거나 보 제품으로 구매를 시도하는 여성들을 보면 그 의아함은 금방 해소된다. 앞서서 설명드린 두 가지 관점에서 고객이 구매 전 가질 수 있는 의문점을 충분히 해소할 수 있는 포인트다. 실제 해소는 아닐 수 있어도 고객이 이 상품을 써야 하기 위해 스스로를 설득할 수 있는 명분이 될 수도 있는 것이다. 화장품의 본 제품을 바로 구매하는 고객들은 생각보다 많지 않다. 테스터나 샘플을 이용하길 원한다. 즉, 이런 습관이 고착화된 구매 환경에서 바로 본 제품을 사라고 설득하는 것은 무리가 있다. 하지만 샘플을 제공하는 것도 비용적인 부담과 샘플만을 사용하고 본 제품을 구매하지 않을 판매자의 두려움이 상존한다. 이럴 땐, 마치 샘플이나 테스터를 사용하여 판매자가 말하고 싶은 것을 체험한 것과 같은 간접 경험이 필요하다. 그중에 하나가 바로 영상이다. 간단한 스낵 영상에서 브랜드가 말하고자 하는 것만 명확하게 전달할 수 있다. 민감성 피부 개선, 탄력, 미백 등, 그것에 맡게 고객의 후기나 사용 전후의 비교 콘텐츠를 충분히 영상으로 담아 설득하는 것이다. 이런 메시지가 구매자로 하여금 쉽게 행동할 수 있게 만든다. 이런 행동을 유발하는 개입 전략은 IT기술을 활용하게 되면 그 사용범위가 대단히 넓어진다. 경험 구현에 한계가 사라지는 것이다. 여행 상품을 생각해보자. 예전에 여행지의 이미지를 보여주는 식이라면, 현재는 여행지에서 체험할 수 있는 에피소드를 정리하여 영상으로 보여주기도 한다. 이에 한 발 더 앞서 나간다면, 가고 싶은 여행지를 미리 탐험해볼 수 있는 기술을 활용하는 것이다. VR, AR 등을 활용하여, 직접 가지 않았지만 마치 여행지를 미리 답사할 수 있는 경험을 할 수 있다. 외국어 공부는 어떤가? 우리 세대만 하더라도 외국어는 책, 바로 종이 위에만 존재했다. 조금 더 적극적인 친구들은 해외 서적이나 영화를 보며 회화 실력을 늘리기도 했다. 더 나아가 외국인 친구를 사귀거나 해외 연수를 가기도 한다. 이런 행동에는 물론 비용이 든다. 적거나 많거나 상관없이 비용이 수반된다. 장소와 시간적인 제약이 생기기도 한다. 이런 모든 것들을 IT기술을 통해 저렴한 비용으로 미리 경험할 수 있다면 어떨까? 해외연수를 가지 않아도 미리 다니고 싶은 학교의 수업을 경험하고 그곳 친구들과도 이야기를 나눠 볼 수 있다면 말이다. 제공되는 서비스나 제품이 단순히 눈속임으로 고객을 상대하는 것이 아니라 본질적으로 좋은 제품과 서비스를 제공하고 있다면 선경험을 통해 대부분의 잠재고객이 본 제품과 서비스로 이어질 수 있을 것이다. 특히, 이러한 선경험은 교육 사업에서 더욱 활발하다. 집단교육의 형태가 익숙한 우리의 경우, 수능이나 다른 자격증 시험을 준비하며 인강(인터넷 영상 강의)이라는 것을 겪었다. 물론, 인강의 편의성은 오프라인의 집단 교육과 비교했을 때, 더욱 분명해진다. 시간과 공간의 제약이 사라지며, 다수가 아닌 1:1 교육을 받는 집중도가 생긴다. 질의응답 게시판을 통해 실시간 문의도 가능하다. 물론, 온라인 강의는 오프라인의 시장을 잠식하지 않는다. 이 둘은 서로 보완의 관계를 가지며, 온라인 강의를 통해 오프라인 강의 사업 확장이 가능하며, 이는 다시 온라인 수요 확장으로 긍정적인 영향을 준다. 비즈니스 모델 관점에서 볼 때, 온라인 강의는 오프라인 강의의 맛보기 역할을 하기도 한다. 10분이나 20분 내외의 짧은 온라인 강의를 통해 진성 유저는 오프라인 강의로 유도하고 니즈가 없는 유저는 강의로 유도되지 않아 불필요한 소통이나 업무가 발생되지 않는다. 자, 어떤가?. 당신의 비즈니스의 서비스도 이처럼 개입 전략을 구사할 기회가 존재하는가? 두 가지 관점으로 살펴보면 된다. 작은 단위로 미리 줄 것이 있는가. 그리고 고객이 불안해하는 요소를 미리 헷지 할 수 있는가.     몸통을 흔드는 꼬리, 전략의 비즈니스화  최근 빙그레 바나나맛 우유가 흥미로운 빨대를 출시하면서 큰 인기를 끌었다. 여러 개의 우유를 연결하여 한 번에 마실 수 있는 빨대, 링거를 연결하여 호스로 우유를 빨아먹을 수 있는 빨대 등, 호기심을 자극하는 빨대들을 활용한 영상이 바로 그 이야기다. 영상에서만 그치는 것이 아니라 실제로 고객이 구매하여 직접 사용할 수 있도록 빨대를 한정판으로 출시까지 했다. 그 인기는 실로 대단했다. 빨대 출시와 함께 바로 품절 사태가 발생할 정도였다. 더불어, 이 빨대의 인기만큼이나 빙그레 바나나맛 우유의 매출도 늘어났으며, 오래된 브랜드에 새로운 활력을 일으켰다는 평가도 받았다. 우리가 평소 마케팅을 진행하게 되는 경우, 판매하고자 하는 제품과 서비스에 집중하곤 한다. 물론, 최종 목표를 이루고자 하는 노력의 결과다. 다만, 그 전의 행동 혹은 그 주변의 행동에 초점을 맞춤으로써 최종 행동을 하게 유도하고 결국, 최종 목표를 달성하게 하는 방식이 더 다양한 설루션을 만들 수 있게 한다. 바나나맛 우유가 맛있다, 신선하다, 저렴해졌다, 양이 많아졌다 등의 내용이 아니라 필수적으로 사용했던 빨대를 더 재밌게 만들었으니 이용을 권하는 방식인 것이다. 마치, 쇼핑몰의 경우, 매출을 더 올리는 것에 집중하는 것이 아니라 구매 과정 중, 바로 그 전 단계인 장바구니 버튼 클릭 수를 늘려 보는 식인 것이다. 트라이 닷컴(Try.com)이라는 쇼핑앱을 생각해보자. 여성분들이라면 쇼핑 중에 이 불편함은 모두 공감할 것이다. 바로 직접 입어 볼 수 없으니, 실제 배송 이후에 사이즈가 맞지 않을 경우, 그 절차가 불편하거나 귀찮다는 것이다. 그럼, 미리 입어 볼 수는 없을까? 물론, 주변에 동일 브랜드의 매장이 있다면 매장 방문 후에 결정해도 되지만 수많은 온라인 쇼핑몰이 매장을 가지고 있진 않을 것이다. 그렇다면, 이 구매 결정의 부담은 모두 소비자에게 넘겨지게 된다. 트라이 닷컴은 이 부분에 사업의 기회가 있음을 발견했다. 바로, ‘미리 입어보기’다. 여성들이 구매 전, 아무런 비용 부담 없이 원하는 브랜드의 옷을 7일간 입어보는 것이다. 미리 입어 볼 수 있게 옷의 물류비용 역시 제로다. 즉, 말 그대로 고객은 옷을 입어보고 살 수 있게 된 것이다. 이 사업의 본질은 그저 의류 쇼핑몰인 것이다. 더 좋은 옷, 더 나은 고객관리로 차별화를 두는 것이 아니라 고객이 옷을 온라인에서 구매하느 과정에서 공통적으로 하게 되는 걱정을 헷지 한 것에서 시작된 것이다. 출처 : 구글 이미지생각해보자. 고객이 옷을 미리 입어 불 수 있게 이 시스템을 관리하는 비용보다 한 번이라도 옷을 입어 본 고객을 통해 늘어난 수익이 더 크다면, 이 헷지 모델은 아주 강력한 세일즈, 마케팅이 되는 것이다. 입소문은 또 어떻겠는가. 자연스럽게 강력한 입소문을 탈 수밖에 없을 것이다. 우리나라에 비슷한 사례가 있다. 바로 스트라입스다. 스트라입스는 최초 론칭 시, 남성 맞춤 셔츠라는 작은 시장에서 시작했다. 그리고 그들은 자신들이 더 품질 좋고, 디자인이 우수하며, 더 저렴한 셔츠를 판매한다고 전면에 이야기하지 않았다. 그것보다 더 강조했던 것은 바로 코디네이터 무료 출장 서비스다. 웹을 통해 스트라입스의 코디네이터 방문을 신청하게 되면 위치가 어디더라도 방문하게 된다. 저자는 예전에 직접 코디네이터 방문을 신청하였고 만나게 된 장소는 카페였다. 놀랍게도 나에게 커피를 사주기까지 했다. 이런, 놀라운 경험은 그들의 말에 경청하게 하고 결국, 셔츠 구매로까지 연결시키게 만들었다. 물론, 커피를 사줘서가 아니다. 맞춤 셔츠 구매 과정은 복잡하고 귀찮기 짝이 없다. 미리 디자인을 볼 수도 없으며, 스튜디오에 직접 방문하여 치수를 재야 한다. 그런데 이 모든 과정에 나의 노력이 필요 없게 된 것이다. 이 부분도 위와 동일하게 생각해보자. 코디네이터 출장 서비스를 운영하는 비용보다 코디네이터를 통해 셔츠를 더 잘 구매하게 됨으로써 늘어난 수익이 더 많다면 이 역시, 훌륭한 세일즈, 마케팅이 되는 것이다. 우리는 무엇을 먼저 줄 수 있으며, 무엇을 헷지 할 수 있을까? 오늘 하루, 이 두 개의 질문에서만 답을 찾는다면, 당신의 마케팅 방향은 50% 이상 잡은 것이다. Q1. 당신의 서비스를 가장 작은 단위로 나눠, 미리 제공할 수 있는가?Q2. 당신은 고객이 구매 과정에서 갖는 걱정과 고민을 어떻게 미리 해소시켜 줄 수 있는가?오피노 자세히 보러 가기
조회수 1680

박문수 이야기

출근 첫날 이효진 대표님으로부터 입사 지원 메일을 하나 전달받았다. 이력서를 살펴보니 컴퓨터를 전공하지도 않았고, 현재 개발을 하고 있지도 않았지만 개발자로 일하고 싶다고 적혀 있었다. 개발을 할 수만 있다면 인턴부터 시작해도 좋다고 말했다. 남들이 부러워하는 삼성에 다니고 있는데 어떤 이유로 개발자가 되고 싶어 할까? 궁금한 마음에 한 번 만나보기로 했다. (뽑을 생각은 없었다)첫인상은 그냥 수수한 시골 청년이었다. 나도 입사한 지 얼마 안 되어 회사 주위 식당을 몰라 그냥 눈에 띄는 식당으로 들어갔다. (생각해 보니 그 식당을 그 이후로는 한 번도 가지 않았다) 지난 회사에서 어떤 일들을 했고, 왜 개발에 대한 목마름을 느꼈는지를 들었다. 개발자가 되기 위해 어떤 것들을 포기할 수 있는가에 대한 각오도 들었다.나는 앞으로 일 년 동안 인턴 월급을 받아야 할지 모른다고 이야기했다. 정말 열심히 하지 않으면 그저 그런 개발자가 되어 인생이 꼬일지도 모른다고 경고했다. 그런데도 흔쾌히 도전해보고 싶다고 말했고, 나는 배움의 기회를 제공하겠다는 약속을 했다. 좋은 대학을 나와 어렵게 얻은 직장을 포기하고 다시 새로운 길을 선택하려는 용기를 높이 샀다. 입사일은 3주 뒤로 정했다. 파이썬 책과 웹 프로그래밍 기본 책을 던져주고 모두 읽어 오라고 했다.입사 후 정신없이 3주가 지나고 문수님이 입사를 했다. 첫날 개발 환경을 셋업 하는 것을 도와주었다. 나에게는 너무나도 자연스러운 많은 것들이 그에게는 생소한 것이고 설명을 해야 했다. 문수님이 이해할 수 있는 간단한 것만 설명하고 나머지는 더 크면 알게 된다고 설명을 미루었다.(첫날 전체를 대상으로 자기소개를 하는 문수님. 우리 회사에는 입사자가 전체를 대상으로 자기소개를 하는 문화가 있다. 이 문화의 유래에 대해서는 다시 한 번 이야기해 보겠다.)내가 모든 것을 알려 줄 수는 없으니 코세라 수업을 같이 들어 보자고 이야기했다. 내 기준으로는 너무 쉬운 강의였지만 나는 회사 내에서 공부하는 분위기를 만들어 가고 싶었고 문수님께는 회사에서 필요한 기술 스택을 맛보는 기회가 될 수 있으리라 생각했다. (현재 시점으로 3달째 코세라 강의를 이어서 듣고 있다.)첫 강의인 HTML5를 들으면서 간단한 버그 수정부터 문수님께 요청을 하기 시작했다. 오자를 고치거나 박스의 위치를 조정하는 일부터 시작했다. 입사하고 3일이 지나서 첫 번째 배포를 했다. 처음이 어려웠을 뿐 간단한 수정을 하는 것에는 일주일이면 충분했다. 그때부터는 git과 git flow를 알려주기 시작했다. 착한 신입은 마음이 열려 있어서 불만 없이 모든 것을 따라 했다. 어느 정도 이해를 했는지는 알 수가 없다. 하지만 프로그래밍을 배우는 길에는 머리보다 손이 먼저 익히는 것들도 많다.3주가 지난 시점에는 첫 번째 데모를 전체 앞에서 보였다. (우리는 스크럼을 하고 있어서 매번 스크럼이 끝나는 날에 개발자가 스스로 자신이 개발한 것을 전 직원 앞에서 데모를 보인다.) 지금은 잠깐 문을 닫은 채권 거래소에서 채권 판매자가 손쉽게 채권을 팔 수 있는 기능이었다. 그것을 만들기 위해 일주일 넘게 꽁꽁 머리를 싸매고 있었고, 결국은 결과물을 내놓았다.(첫 번째 데모를 보이는 문수님. 긴장한 모습이 느껴진다. 데모를 마치고 다들 뜨거운 박수를 보내주었다)내가 만들면 2시간이면 끝났을 기능이라 일주일간 고생하는 것을 옆에서 지켜보는 것은 상당한 인내를 필요로 했다. 하지만 최대한 혼자만의 힘으로 첫 번째 과제를 해내기를 원했기에 최소한의 도움만을 주었다.이제 문수님이 입사한 지 만 3개월이 되었다. 그동안 많은 변화가 있었다. 회사에서 조그마한(점점 커지고 있다) 수정/기능들은 대부분 맡아 주고 있기에 다른 개발자들은 좀 더 어려운 문제를 풀 수 있게 되었다. 처음에는 코드 리뷰를 온라인으로 할 수가 없었다. 옆에 앉아서 어떤 부분을 어떻게 고쳐야 하는지를 구체적으로 알려 주어야 했고, 이해하지 못하면 관련된 지식을 얻을 방법을 알려 주어야 했기 때문이다. 하지만 이제 github의 PR을 보고 코멘트를 다는 것 만으로 코드를 적절히 수정할 수 있게 되었다. 얼마 전에는 하루에 1억이 넘는 이체를 하는 내부 시스템을 80% 이상 만들기도 했다. (내가 뼈대는 잡아 주기는 했다.)개발자라 부를 수 있는 기준이 따로 있겠냐만은 나는 이제 그를 개발자라 부를 수 있을 것 같다. 아마도 오늘의 문수님에게는 “개발자 박문수 님”이 가장 듣고 싶은 호칭이 아닐까 생각한다.  마지막으로 전공하지도 않았고, 첫 직장과도 관련 없는 새로운 도전을 하는 문수님의 용기에 박수를 보낸다. 내게 말하지는 않았지만 수많은 주위의 걱정과 우려를 이겨내기 위해 최선을 다하고 있으리라 생각한다. 나는 앞으로 그에게 “문수님은 지금 어디로 가고 있나요?"를 종종 물어봄으로 내 역할을 해야겠다.8퍼센트는 멋진 저희 팀과 함께 할 분들을 찾고 있습니다. 특히 저보다 개발을 잘 하시는 시니어 개발자, 그리고 3년 뒤에는 저 보다 잘하게 되실 주니어 개발자는 제가 모시러 갑니다. [email protected]로 연락 주세요.박문수 님이 이체 시스템 개발을 할 때 Toss의 이체 대행 API를 사용했습니다. 정말 간편합니다. 관련 개발을 하시는 분들은 사용해 보세요.#8퍼센트 #에잇퍼센트 #채용 #채용후기 #개발자 #개발자채용 #인턴 #인턴채용 #스타트업CTO
조회수 934

마케팅 부서에서 대행사와 협력을 잘 할 수 있는 방법 5가지

혹시 대행사와 함께 일하고 계시나요? 아마 대행사 없이 일하는 마케팅 부서는 없지 않을까 생각됩니다. 저희 마케팅 부서에서도 캠페인별로 여러 대행사와 협력하고 있는데요. 대행사는 회사 내부의 부족한 일손을 돕기 위해, 잘 모르는 분야의 전문가 의견을 듣기 위해, 함께 일하는 협력 업체를 말합니다. 오늘은 많은 대행사와 함께 일하면서 얻게 된, 협업하는 노하우에 대해 소개해드리려 합니다. 이 콘텐츠를 통해 대행사와의 시너지 효과를 톡톡히 내실 수 있기를 기대합니다!대행사와 하나가 되었을 때 사랑이 피어납니다.이런 분들에게 추천합니다. 1.  대행사와 함께 일하면서 어딘가 모를 불편함을 느낀 마케터 2.  관리하고 있는 대행사가 많아 일일이 관리하기 힘든 팀장님 3.  대행사에게 외주를 주려고 고민 중인 대표님 4.  여러 광고주의 업무 요청에 지친 AE1. 커뮤니케이션은 비동기식으로 하세요.비동기식 커뮤니케이션이라는 말을 들어보셨나요? 즉시 답장이 오지 않을 것이 전재된 상태에서 메시지를 주고받는 커뮤니케이션 방식을 뜻합니다. 상대방이 언제 확인할지 모르는 '이메일'이 대표적인 예가 되겠습니다. 하지만 많은 기업 담당자들이 대행사와 협업을 진행할 때 동기식으로 업무를 진행합니다. 이메일로 업무를 주고받기 보다, 개인용 카카오톡으로 업무 대화를 나누게 되죠.대행사는 카톡방 업무 지옥을 경험하고 있을지 모릅니다.대행사가 우리 회사의 업무만 맡아주면 좋겠지만, 단독 대행사가 아닌 이상 대부분 동시에 여러 회사의 대행을 맡이 처리합니다. 잠시 대행사의 업무 루틴을 상상해볼까요? 출근하자마자 광고주의 전화가 울리고, 경쟁 입찰을 하기 위해 회의에 참가합니다. 그 와중에 광고주는 카톡으로 업무 재촉을 하고…. 이런 상황에 동기식 커뮤니케이션은 일하는데 방해 요소가 됩니다. 특히 채팅으로 업무 관련 피드백이나 내용을 주고받게 되면, 누락될 가능성이 높아지게 되죠.2. 업무에 관련된 내용은 모두 기록하세요.분명 어딘가 저장했다고 생각했는데, 몇 달이 지나고 나서 파일이 없다는 사실을 알게 된 적이 있으신가요? 저도 웬만하면 바로 저장을 하지만 가끔 놓치는 경우가 발생합니다. 이메일로 전송된 대용량의 파일, 카카오톡으로 주고받은 파일은 다운로드 기간이 있는데요. 이때 다운로드하지 못하면 영영 날아가는 상황이 발생됩니다. 파일뿐만 아니라 주고받은 계약사항, 피드백도 한순간에 날아갈 위험이 있죠.그래서 파일은 물론이고 업무 히스토리도 모두 기록에 남아야 합니다. 대행사 직원이 바뀌거나 내부 직원이 바뀌더라도, 기록이 남아있다면 별도의 인수인계 없이 모든 히스토리 파악이 가능하겠죠!3. 업무 데드라인을 명확하게 정하세요.마케팅 부서에서 가장 중요한 것이 스케줄 관리인데요. 제품 출시나 이벤트는 기간에 맞춰야 하는 경우가 많습니다. 그래서 더더욱  업무 데드라인을 확실하게 정해야 하는데요. 대행사는 얼굴을 마주 보며 함께 일하는 형태가 아니다 보니, 데드라인이 명확하지 않으면 업무가 지연되는 경우가 있습니다. 4. 피드백은 댓글로 남기세요.사람이 한 번에 기억하는 정보는 한계가 있습니다. 채팅이나 전화로만 의견을 전달한다면 누락될 가능성이 높죠. 먼저 댓글로 피드백을 명확하게 남겨주세요. 그 후 자세한 설명을 위해 통화나 화상회의를 진행하세요. 서로 간의 오해를 줄일 수 있을 뿐만 아니라, 빠르게 업무를 진행할 수 있습니다. 가끔은 응원의 메시지도 댓글로 남겨주세요. :)5. 협력 관계임을 잊지 마세요.대행사는 우리의 일을 도와주는 고마운 곳입니다. 갑과 을의 구도로 보면 안되는 이유죠. 협업툴 플로우는 마케팅 조직에서 사용하면 좋은 업무툴 중 하나 입니다. 대행사의 입장에서도, 인하우스 마케팅 부서에서도 사용하기 좋죠. 성공적인 협업을 통해 매출 달성과 KPI 달성이라는 두 마리 토끼를 잡으셨으면 좋겠습니다.협업툴 플로우 바로가기
조회수 991

[블랭크코퍼레이션 상생스토리.04]전통 한과에 바질씨를 담다#소소반끼-유림푸드

제조사와 같이블랭크코퍼레이션은 좋은 기술과 제품을 보유한 제조사를 발굴하고, 그들과 함께 생활의 문제에 대해 고민하고 있습니다. 더불어 그 제품을 소비자와 더 효율적으로 연결할 수 있도록 함께 하고 있습니다. 우리의 고민이 단발성이 되지 않도록, 함께 성장할 수 있는 가치를 만들고자 노력하고 있습니다.이런 인터뷰는 처음이라며 무척 쑥스러워 하셨지만 한과에 대한 이야기하실 땐 누구보다 열정적으로 알려주신 유림푸드 김주형 대표블랭크의 식음료 브랜드 소소생활에는 눈에 띄는 다이어트 식품이 있다. 한과제조업체 유림푸드가 전통 다식제조 방법을 응용한 바질정을 개발해 만든 ‘소소반끼’가 그 주인공이다. 전통 방식을 고수해 만들던 한과가 ‘소소반끼’로 재탄생하기까지의 과정을 유림푸드 김주형 대표에게 들었다.유림푸드 로고가 들어간 조그마한 간판Q1. 유림푸드는? 1979년에 서울 종로구 창신동에서 가족기업 창신제과로 한과 사업에 첫발을 내디뎠습니다. 한과를 만들다 1997년 3월부터 유림한과로 독립해 현재 유림푸드로 사명을 변경해 사업을 이어오고 있습니다. 소소반끼를 비롯해 수제 약과, 다식, 강정, 넛츠바 등 10가지 제품을 생산합니다.Q2. 주요 제품과 특징은?전통방식의 수제제조로 제품을 만듭니다. 생산성이 좀 떨어지더라도 수작업을 고집하죠. 기계화가 필요한 부분은 받아들이되 맛과 관계된 부분에서는 수작업을 고수하고 있어요. 약 40년 동안 한과를 제조하면서 노하우를 쌓았습니다. 특히 강정과 넛츠바는 여름철이 되면 찐득찐득하게 변하기 쉬운데 이런 현상이 전혀 없는 제품을 만들고 있습니다. 일반적으로 한과 업체는 강정을 만들기 위해 물엿을 졸입니다. 그리고 강정의 형태를 유지하기 위해 다량의 설탕을 넣고, 일부 업체는 젤라틴이나 한천 같은 보조제를 넣기도 합니다. 단단한 경도를 유지하는 것이 기술이기 때문입니다. 그러나 요즘 소비자에게 딱딱하고 달달한 강정은 입맛에 맞지 않습니다. 경도는 유지되나 씹으면 쉽게 바스러지고 달지 않은, 쿠키 같은 식감의 넛츠바를 만들었습니다.공장에 들어가면 바로 깨끗하게 잘 정리된 기계들이 있는데 이렇게 깨끗하게 잘 관리되어 한과업체에서는 드물게 HACCP 인증을 받을 수 있었다.전통방식의 수제제조로 제품을 만듭니다.생산성이 좀 떨어지더라도 수작업을 고집하죠.기계화가 필요한 부분은 받아들이되 맛과 관계된 부분에서는수작업을 고수하고 있어요.반죽기계를 지나 다른 방으로 들어가니 많은 직원분들과 함께 한과를 제조 중에 있었다.많은 직원분들이 바쁘게 한과 생산에 몰두하고 있다.Q3. 같이 일하게 된 과정은? 전통 한과 시장의 주요 고객층은 60대 이상 노년층입니다. 젊은 세대의 눈높이에 맞지 않아 소위 ‘잊혀져 가는 식품’, 제사 때나 먹는 맛없고 비싼 음식으로 전락하고 말았습니다. 시장이 위축되다 보니 회사에도 어려움이 닥쳤습니다.그러던 중 지난해 5월경 블랭크에서 바질씨를 이용한 제품을 만들고 싶다는 의뢰가 들어왔습니다. 물에 닿으면 30배가 불어나는 바질씨의 성질을 이용해 포만감을 느낄 수 있는 제품을 만들어보자는 것이었습니다.바질씨는 성형하기 곤란한 물성을 가지고 있습니다. 반죽할 때 경화되는 속도가 빨라 캡슐에 바질씨만 넣어야 했습니다. 하지만 현행법상 의약품이 아닌 것은 캡슐에 넣을 수가 없습니다. 그래서 압력을 통해 압축하는 방식인 타정으로 만들어 달라는 요청이 있었습니다. 기존 업체에서 타정 방식으로 작업을 할 수가 없는 상황이었던 것 같습니다. 그래서 한과를 만드는 우리 회사에 의뢰가 들어온 것이죠. 그러나 바질씨는 반죽 후 20분이면 경화가 되어 타정을 할 수가 없었습니다. 이후 바질씨를 갈아 한약의 환 형태로 만들었습니다. 그러나 환 형태로 만드는 과정에서 수분에 노출되어 이미 부풀어오른 것을 반죽해야 했죠. 뱃속에서 부풀어야 하는데, 이미 부푼 것은 먹어도 효과가 없었습니다.다이어트 식품의 특성을 살려 미량의 쌀조청만으로 제품화하기까지 두 달이 걸렸습니다. 전통방식으로 제조해 특허 출원까지 따냈습니다. 만드는 것만이 전부는 아니라는 마음가짐으로 바로 HACCP 기준에 맞는 설비를 갖출 수 있게 준비했고, 2018년 4월 HACCP 인증을 받았습니다. 현재 한과업체 중 HACCP 인증을 받은 곳은 손에 꼽을 정도입니다. 소소반끼의 제품 품질을 위해 별도로 설치한 조명.Q4. 시장의 반응은?소소반끼 첫 출시 때 5,000세트 정도를 납품했습니다. 시장 반응은 그야말로 폭발적이었습니다. 첫 납품 후 일주일도 채 안돼 3만개의 추가 발주가 들어왔습니다. 한과 특성상 명절이 아닐 때는 한가했는데, 일이 크게 늘어나 즐거운 비명을 질렀죠. 주야간 3교대로 24시간 작업을 돌려 물량을 맞췄습니다. 인력이 부족해 소분을 할 여력이 없어 평소 친분이 있던 업체인 정과원의 도움을 받기도 했습니다. 현재는 자체적으로 설비를 선진화하여 HACCP 인증을 취득했고, 인력 확충을 통해 유림푸드 자체적으로 생산 및 소분까지 완제품을 만들고 있습니다.소소반끼 출시 이후 34만개를 생산해 약 34억원의 매출을 기록했습니다. 블랭크와 협업한 뒤 매출이 40% 정도 급성장했습니다.마침 한쪽에서는 소소반끼의 제품 포장이 이루어지고 있다. 이 기계는 불순물 검출기로 HACCP인증 기준 이상으로 준비한 기계라고 한다.Q5. 어떤 점이 달랐는지?HACCP 인증 설비를 갖추기 위해 기계를 장만할 때 블랭크가 큰 도움이 됐습니다. 기계 값이 한두 푼이 아닌데 블랭크의 선결제로 무사히 HACCP 인증을 받을 수 있었습니다. 블랭크는 ‘안 될 것 같은 것’을 ‘되게 하는’ 힘이 있습니다. 특히 요즘 젊은 층의 니즈에 부합하는 SNS를 통한 마케팅은 탁월하다고 생각합니다. 저희 업무는 한과 특성상 명절에 주로 작업을 하고 평소에는 한가한 편이었습니다. 이제는 성수기가 아니어도 쉬지 않고 작업할 수 있게 돼 회사 운영에 큰 도움이 되고 있습니다.식품업계에서 오래 종사하다 보니 ‘이건 이래서 안 될 거야’라는 나름의 저지선이 있었습니다. 그런데 감각적이고 도전 정신 넘치는 블랭크의 모습을 옆에서 지켜보면서 나도 뭔가 전통 한과에 새로운 것을 접목해야겠다는 도전 의식이 생겼습니다. 한과가 기존 것을 답습하는 것이 아니라 서양의 수많은 식품과 비교해도 경쟁력을 가질 수 있도록 발전시켜 나가고 싶습니다. 새로운 세대의 기호에 맞춰 한과 제품을 현대화하는 작업에 심혈을 기울이게 됐습니다. 전통 제품만이 아니라 우수한 건강식품으로 제품군을 넓혀 나가고자 합니다.소소반끼의 시작은 정과원의 홍권택 차장님의 소개로 공동개발되었다.(사진왼쪽)유림푸드 김주형대표 (사진오른쪽)정과원 홍권택 차장소소생활 - 소소반끼 홈페이지블랭크 코퍼레이션은 좋은 기술력의 기업과 함께더 나은 생활을 만들어 갑니다./Lifestyle needs solutionblank.
조회수 1804

츠타야를 다녀오다

일본 출장길에 츠타야를 다녀왔다. 사실 그 이전에도 츠타야를 구경할 기회가 있긴 하였지만, 그래도 제대로 한번 살펴보고 싶다는 생각에 "츠타야, 그 수수께끼 (마스다 무네아키, 가와시마 요코 대담)"라는 책을 사서 일본으로 가는 비행기에서부터 읽기 시작했다. 대담 형식으로 작성되어 이해하기 쉽고 창업자의 생각을 직접 듣는 것 같아서 편하게 읽을 수 있었다.우선 대표적인 지점인 다이칸야마의 츠타야를 방문! 시부야에서 가까우며 동네가 고급 주택가이고, 대표적인 매장이라서 그런지 한눈에 보기에도 훌륭해 보였다. 그냥 서점이라고 보기에는 너무나도 좋은 분위기에 안에는 스타벅스까지 있기 때문에 커피 한잔 하면서 책을 볼 수 있는 공간으로 이 보다 더 좋은 곳이 있을까?라는 생각이 들게 한다. (여기 방문 전까지 책을 다 읽지 못해서 그 책을 츠타야에 가서 읽는 상황이 ^^;) 방문해서 느낀 점과 책을 읽으면서 느낀 점들을 책(BOOK)과 나의 대담 형태로 몇가지로 나눠 이야기해보는 것도 재미있겠다는 생각이 들었다. (책의 구성이 마스다 대표와 가와시마 요코의 대담 형태로 되어 있음) 이렇게 구성해놓으니, 쉽게 쉽게 잘 읽히는 장점이 있엇기에!! 이 책에서 가장 기억에 남았던 점으로Book : 기획은 프로덕트 아웃이지, 마켓인이 아님(프로덕트 아웃 : 시장의 니즈가 아니라 생산자, 즉 만드는 사람의 형편과 생각에 따라 상품과 서비스를 제공하는 것 / 마켓인 : 시장의 니즈, 즉 손님이 필요로 하는 상품과 서비스가 무엇인지 조사해서 그 상품과 서비스를 제공하는 방법)기획은 고객이 원하니까 한다기보다는 '멋진 것', '매력적인 것'을 고객에게 전달하고 싶고, 고객을 가게로 초대하고 싶다는 감각에 더 가깝습니다. 나 : 사실 startup을 시작하기 전에는 새로운 제품이나 서비스를 출시하는 것에 대해서 "프로덕트 아웃"의 접근 이어야 새로운 기업으로써의 의미가 있지 않을까?라는 생각을 했었다면, 몇 년간의 스타트업 운영 경험을 통해서 "마켓인" 이 절대적으로 기반이 되어야 한다는 생각을 하게 되었다. 사업은 아티스트(artist) 가 만들어내는 '멋진 & 매력적인' 작품이 아니라, 고객이 원하는 가치를 전달하고 키워나가야 하는 business 이기 때문이라는 생각인데, 파펨이라는 브랜드를 처음 설계할 때도 "프로덕트 아웃"의 접근이었지만, 운영하면서부터는 절대적으로 "마켓인" 이 중요하다고 느꼈기 때문이다. 이에 대한 가장 최근의 생각을 추가하자면, (좀 진부하지만) 두 가지가 모두 양립해야 한다는 것이다. 단, 그 시기별로 중요도가 다르다는 생각인데... 처음 startup을 출시하는 시점에는 "마켓인"에 중심을 두어 생존을 위한 기반을 마련해야 한다면, 성장하면서 그 브랜드가 가지고 있는 "프로덕트 아웃"을 통해 만든 이의 고민과 철학을 반영하고 전달해야 브랜드 & 기업이 영속성을 가질 수 있겠다는 생각을 하게 되었다. 그래서 츠타야의 마스다가 말하는 '기획은 프로덕트 아웃!이다'라는 주장에 대해서 약간의 반기를 들었지만, 그 정도의 수준이기에 할 수 있는 도발적인 발언이 아닐까?라는 생각으로 결론을 내리게 되었는데, 헨리 포드가 말한 "만약 고객에게 무엇을 원하는지를 물었다면 그들은 조금 더 빠른 말과 마차라고 대답했을 것"이라는 짧은 문장의 의미와도 연결이 되는 듯하다. 두 번째로, Book : 업계의 상식에 고객은 등 돌린다. 한정된 업계 내에만 빠져 있다 보면, 그 업계에서 통용되는 상식에 갇혀 벗어날 생각을 하지 못한다는 예기죠. 별것 아닐 것 같이 들를 수도 있겠지만, 업계의 관습이나 상식을 바꾸는 시도에는 부단한 노력이 필요한 법이니까요. 새로운 기획을 세상에 제안한다는 일이 다 그렇겠지만 말입니다. 나 : 너무나도 동의하는 부분이다. 사실 어떤 일들을 조금 진행하다 보면 겪게 되는 것들 중에 "원래 그렇게 해왔다." 혹은 심지어 그런 생각 조차 하지 않는 경우들이 많다. 그렇기 때문에 이러한 벽들을 깨 나가는 것이 스타트업의 역할이고 그러한 당연한 것들을 바꾼 스타트업들이 유니콘이 되어간다. 문제는 나나 우리 회사 또는 조직도 이러한 것들에 계속 물들어갈 수밖에 없다는 것인데, 기본적으로 인간이 계속해서 다른 각도에서 생각하고 변화를 주는 것이 귀찮기 때문인데, 나는 이런 것들을 하루 생활에서라도 바꿔보려고 노력하는데.. 조금씩 다른 길로 출근해본다던가, 혹은 안 써본 새로운 앱들을 다운로드해서 써본다던가, 안 먹어보던 음식을 시도해본다던가 등등.. 개인적으로는 나이가 들 수록 혹은 기업이 시간이 흐를수록 이런 생각하지 않음을 피하기 위해 노력해야겠다는 생각을 한다.  자, 이제 매장을 둘러보면서 느꼈던 점들에 대해서 조금 더 살펴보면.. 분류와 진열에 대한 이야기!Book : "생활 제안별 분류"를 시도한 것이지요. 여행, 음식, 요리, 인문, 자동차 같이 장르별로 구역을 나누고 단행본이나 문고본 같은 범주에서 벗어나 책을 나열했지요. 즉 진열되어 있는 책 자체가 '그 나라를 여행하기 전에 이러한 문화를 먼저 체험해 보는 게 어떨까요? 식으로 제안을 하는 것입니다. 츠타야는 내부를 편집 작업을 하는데.. 가령 여행 코너에서는 예술을 통해 환상의 도시 프라하를 소개하는 등 고객의 마음에 와 닿는 제안을 계속해서 떠올리고 테마에 맞는 서적과 잡지를 모아갔지요.. 이 편집 작업이 생각보다 상당히 어렵더군요.. 나 : 츠타야에 가서 구석에서 경기용 오토바이가 한대 진열되고 있어서 '이건 뭐지?" 라고 생각하는 중에, 그 옆에는 오토바이 잡지들과 화보들이 전시되어 있었고, 바로 옆 책장에는 오토바이와 관련된 만화들이 진열되어 있었다. (아래 사진 참조)말 그대로의 생활 제안을 하는 방식으로 진열을 하였는데.. 이렇게 하는 것이 상당히 재미있었던 것이, 츠타야 서점은 우리가 어떤 정보를 찾는 체계적인 도서관의 접근이 아니라, 고객의 관심사에 따라 재미있는 정리가 되어 있었던 것이다. 나름 상큼했다. 마음에 드는 섹션을 발견하였을 때는, 여러가지 책들과 다양한 제품들로 인해 확실히 이것저것 관심이 더 가서 많은 시간을 쓸 수밖에 없었고, 이것이 나를 여기에 묶어둘 수 있는 힘이구나! 라는 생각이 들었다.뜬금없는 오토바이 전시에서 시작된 오토바이 관련 서적, 잡지, 그리고 만화!!상품이 무진장 진열되어 있어도 팔리지 않는다? Book : 다이칸야마 츠타야 서점에서 시도한 것은 책뿐만이 아닙니다. 그와 관련되는 물건과 행동의 제안도 시도하였지요. 예를 들어 여행에 관련된 코너와 가까운 곳에다 여행 대리점 카운터를 설치한 겁니다. 책을 한 장 한 장 넘기면서 여행하고 싶다는 기분을 느꼈을 때, 어떤 투어가 있는지 그곳에서 문의도 하고 신청도 할 수 있는 것이지요. 그 연장선으로 요리책 코너 옆에 요리 교실을 만들 수 도 있고요...나 : 사실이었다. (아래 사진 참조) 츠타야 서점 곳곳에는 이렇게 여행사 카운터도 있었고, 와인도 있었고, 심지어는 간장이나, 우메보시(장아찌 종류)를 팔고도 있었다. 살짝 당황!! 정말 궁금한 것은 이러한 장치들이 실제로 작동하고 있느냐? 가 궁금하였다. 실제로 고객들이 저러한 장치에서 어떤 행동을 만들어 낼 수 있을까? 구매로 이어질 수 있을까? 저렇게 만들어둔 것에서 가치를 느낄까? 나는 사실 NO라는 대답을 하였다. 우선 제품을 하나하나 살펴보지는 못했지만 저러한 진열에는 구색의 깊이를 갖추기 어렵다. 와인만 하더라도 몇 종류 되지 않고, 대표적인 몇 가지 제품들만 진열되어 있다. 책을 보다가 뭔가를 떠올리고 다음 행동으로 이어지기에는 좀 부족하다는 느낌이다. 내가 아무리 집 반찬 관련 책을 사러 간다고 해도 저곳에서 장아찌를 사지는 않을 것 같다. 차라리 먼저 책을 한 권 사고, 백화점 지하 식품점에 가서 다양한 반찬들을 맛보며 구경하지 않을까? 저런 구조를 더 잘 설계하기 위해서는 나는 on-line이 더 추가되어야 할 것으로 보이는데.. 마스다 씨는 저러한 점이 인터넷보다 실제 매장이 우위를 점할 수 있는 하나의 방법이라고 주장하고 있다. 진짜 맞음?? 츠타야 서점안의 여행사, 와인코너, 반찬코너.. 츠타야 오모테산도와 더부어 츠타야 일렉트로닉스까지 가보기로 마음먹었다. 지하철로 20~30분 정도 가면, 살짝 외곽의 bed town의 큰 mall에 입점하여 있었다. 후타코 타마가와 역에 내려서 바로 연결됨. 츠타야 일렉트로닉스에서 재미있었던 것은 이제는 책과 일상생활에서 사용되는 가전제품, 그리고 일상생활용품들까지 모두 잘 버무려 놓은 매장이었다는 점이다. 일본어를 몰라도 구경하는 재미가 있다. 흠.. 이래서 이곳의 키워드를 "생활"이라고 잡은 것인가? 일단 입구에 들어가면 전자 제품 매장이 있다. 예전에 영국, 미국 시장 등의 베스트바이 같은 매장들하고는 시작부터 다르다. 베스트바이와 같은 곳이 큰 매장의 일반적인 마트 느낌이라면, 이곳은 큰 서점을 중심으로 여러 가지 가게들이 만들어진 골목과 같은 느낌이다. 이것저것 행동의 제안이라는 기본 철학을 잘 구현해 놓은 듯하다. 하지만! 또 다른 측면에서의 느낌은.. 이곳에서 구매가 잘 이루어질까? 라는 생각도 들었다. (외국인 관광객의 관점일 수도 있겠지만) 구매보다는 재미있게 구경하기 좋은 곳이 아닐까?라는 생각이 들었는데.. 이곳을 다녀온 다른 분들의 의견도 들어보고 싶다. 츠타야 일렉트로닉스에서 찍은 사진들.. 스포츠 용품, 화원, 서점과, 전자제품들이 재미있는 골목처럼 연결되어 있다. 츠타야 일렉트로닉스 매장재미있었던 것은 책에서 말했던 것과 같이 실제로 커뮤니티 활동들이 일어나고 있었다. 아래 왼쪽 사진에서는 일본 프리미엄 맥주 브랜드 에비스(EBYSU) 에서 주최하는 것으로 보이는 행사가 진행 중이었는데, 아마도 맥주와 잘 어울리는 음식을 만드는 클래스로 보였다. 진행하는 분이 꽤나 재미있게 리드하는 듯이 보였는데, 참가자들이 모여서 웃고 떠들면서 진행하는 행사로 보였음.아래 오른쪽 사진은 커피 머신을 판매하는 코너에서 한 노부부와 판매원이 커피 이야기를 하면서 실제로 이런저런 머신에 커피를 갈아 넣고, 커피를 내려보는 것을 하고 있었다. 오호! 이런 점은 참 신박했다. 그냥 이런 머신 입니다가 아니라.. 실제로 두 노부부가 커피를 갈아보고 내려 마셔보는 것까지 (꽤나 오래!) 체험을 해보고 있었는데.. 이런 것이 판매와 체험이 실제로 공존하는 매장으로서의 츠타야 일렉트로닉스! 이군이라는 느낌을 주기에 충분해 보였다. 왼쪽은 에비수 맥주에서 그룹 모임을 하고 있었고, 오른쪽은 고객이 실제로 커피를 내려보면서 점원과 이야기하는 모습 주차장의 하늘이 넓을수록 고객은 다시 찾아오고 싶다. 도쿄에서도 비싼 동네인지라 이렇게 주차장을 만들어 놓는 것이 정말 "철학" 적인 도움 외에 실제로 도움이 될 것인가?라는 생각이 들 정도로 주차장은 좋았다. 일본에서 큰 주차장 구경하기가 쉽지 않았는데 (주차 비용은 얼마인지 확인 못함), 정말 잘해두었구나 라는 생각과.. 이런 기획을 해서 위로 올리기가 쉽지 않은 조직 구조를 고려할 때, 창업자가 이런 생각을 가지지 않는 한, 이런 실행은 절대 불가능할 것이라는 생각이 또한 들었다. 주차장 쪽을 돌아서 나오는데, CCC의 사무실이 옆에 있었다. 일본어를 조금이라도 할 줄 알았다면 한번 들어가서 이런저런 이야기 해보고 싶은 느낌이 들었다. 또한 밖에서 본 사무실에는 Magazine B의 츠타야 편이 있어서 또한 반가웠다는!!츠타야 뒤의 주차장의 하늘과.. CCC 오피스마지막으로 책에서 이야기했던 것들 중에 몇몇 가지 재미있는 포인트 들을 뽑아보자면하나,Book : 생활 제안은 우선 콘셉트에서 시작하지 않습니까? 하지만 곰곰이 듣다 보면 고객을 기쁘게 하는 일이 아니라, 결국 자기 자신을 기쁘게 하는 일에 그치는 경우가 꽤 있어요.. 기획이 이타적인 것이 아니라, 무리하게 이유를 만들어 내어 결국 자기만족에 불과한 이기적인 것이 되는 경우가 많아요. 나 : 아 뜨끔.. 둘, Book : 직원들에게 바라는 것은 항상 자유롭다는 것이고, 이것은 자유란 하기 싫은 일을 하지 않아도 되는 것이 아닙니다. 해야만 하는 일을 할 수 있는 것이 바로 자유입니다. 그래서 자유란 어려운 것이고 누군가의 관리를 받는 편이 한결 편하지요. 나 : 요즘 고민이 많은 부분! 조직문화라는 것과 구성원들이 그 조직 안에서 어떻게 일을 할 것인가의 문제인데, 자유라는 의미를 잘 해석해 준 듯하다. 구성원들에게 자유를 주는 것도 때로는 위험하다는 생각을 하는데, 스스로 움직이지 못하는 구성원에게는 자유를 제공해 주는 방식이 더 큰 어려움을 줄 수 있다는 것을 경험해 보았기 때문이다. 마지막으로는,Book : 도전하지 않는 직원에게는 화가 난다. 나 : 네 저두요.. 가끔 저 자신한테도 ㅜㅜ PS. 츠타야 바로 맞은편에 있던 ASO cafe(책에도 나오는 카페) 에서 여유있게 커피한잔 하지 못한 것이 아쉽!
조회수 79

지적인 삶을 위한 바로고의 문화생활 즐겨찾기, 영화<발레리안>

barogo바로고 복지문화출근이 즐거워지는바로고의 복지문화안녕하세요.바로고입니다.지난 포스팅에서바로고의 다양한 13가지의복지문화를 소개하였습니다.그중에 두 번째지적인 삶을 위한문화생활 즐겨찾기매월 마지막 주 수요일!영화, 전시, 공연, 스포츠 등다양한 문화생활을 즐기는 바로고8월의 마지막 주 수요일에는어떤 문화를 함께 했을까요?<출처-네이버 영화> <발레리안 : 천 개 행성의 도시>프랑스 영화감독이자영화계의 거장뤽 배송 감독이 40년간 구상한 일생의 프로젝트라서더욱 기대를 모으고 있습니다.영화 발레리안은 28세기 미래의 우주 평화를 지키기 위해시공간을 이동하며 임무를 수행하는특수 에이전트의 이야기를 다룬 영화입니다.<출처-네이버 영화>발레리안: 천 개 행성의 도시감독뤽 베송출연데인 드한카라 델레바인클라이브 오웬리아나에단 호크허비 행콕등등스포일러는 없으나영화에 대한 기대감이 높으시다면슝슝~ 바로고의 소식만 만나보세요^.^<출처-네이버 영화>데인 드한발레리안 역<크로니클> <킬유어달링> <어메이징 스파이더맨2>그동안 다양한 장르의 영화에서 필모를 쌓아온 데인 드한<발레리안>에서는 우주 최강 악동 에이전트 '발레리안' 역을 맡았습니다.촬영 7개월 전부터 몸을 만들고거의 매일 스턴트처럼 연습했다고 하네요.<출처-네이버 영화>카라 델레바인로렐린 역최고의 탑모델 출신으로영화 <수어사이드 스쿼드>에서 매력적인 악녀 '인챈트리스'를 완벽하게 연기한카라 델레바인이번 영화에서 그녀의 업그레이드된 연기를 보실 수 있다고 합니다.<출처-네이버 영화>리아나버블 역글로벌 팝스타 리아나를발레리안에서 만나보실 수 있습니다.지금까지보다 더욱 화려한퍼포먼스를 선보일 예정이라고 하니기대해주세요^^<출처-네이버 영화>두 남녀 주인공의 케미를 보는 재미도 쏠쏠~대배우로 성장하고 있는데인 드한과 카라 델레바인의 연기변신을기대해주세요!<출처-네이버 영화>영화 <발레리안>의 원작 <발레리안과 로렐린><스타워즈> <스타트렉> <아바타> 등SF 역사에 한 획을 그은명작들의 탄생에 영향을 준 작품이라고 합니다.영화 <아바타>의 배경이 되는 판도라 행성과 나비족<발레리안>의 뮐 행성과 진주족의 놀라운 싱크로율이것만으로 원작 <밸레리안과 로렐린>에얼마나 큰 영향을 받았는지 짐작할 수 있습니다.<출처-네이버 영화>초현실 세계를 만난 듯한우주의 모습영화에서 보시면상상의 세계를 완벽하게 구현한뤽 베송 감독의 유니크한 연출력을 보실 수 있습니다.압도적인 스케일과 잠시도 눈을 뗄 수 없는 영상미바로고에서 추천하는 영화입니다~!<출처-네이버 영화>현장에서의 뤽 베송 감독의 모습40년간 구상한 영화라고 하니정말 거장은 다르다는 생각이 듭니다.스토리보드 작업만 1년 6개월프로덕션 디자인 작업 3년특수효과 2,734개제작비는 2억 9백만 달러기록이 증명하는 이 영화, 꼭 봐야 하지 않을까요?<출처-JTBC 비정상회담 방송>영화 <발레리안> 개봉에 맞추어한국을 찾은 뤽 베송 감독JTBC <비정상회담>에 출연하였습니다.털털하고 유머러스한 그의 모습이그의 영화를 기다려온 한국 팬들의 마음을 사로잡았어요~<출처-JTBC 비정상회담 방송>바로고복지문화지적인 삶을 위한문화생활 즐겨찾기영화관에 도착한 바로고 직원들지적인 삶을 위한 문화생활너무 기쁜 나머지 눈물이 살짝"울지마세요~ㅠㅠ"영화 관람을 위한 필수!지금부터는 분주하게팝콘 및 콜라 구매가 시작됩니다.즐겁게 이야기도 나누고바쁜 일상에서 잠시 머리 식혀가는 시간영화 관람을 할 수 있어서 좋아요!영화가 시작되기 전기념샷을 샤샤샥!지금부터는 즐겁게 영화 감상을 시작하겠습니다.출근이 즐거워지는바로고의 복지문화오로지 바로고에만 있는문화생활 즐겨찾기8월의 문화의 날에는영화 <발레리안 : 천 개 행성의 도시>를 감상하였습니다.다음 문화의 날도 기대합니다![바로고 공식 홈페이지]
조회수 1512

잘 가요 친구들

그동안 고생 많았어요.마지막 식사를 하고 승표님, 날씽님과 헤어짐의 인사를 나눴다. 하지만 뭔가 아쉬움이 남아 이제 곧 계정이 정리될 슬랙으로 한번 더 고생했다는 개인 메시지를 남겼다. 오늘은 함께 일했던 그들을 떠나보내는 날이다.스타트업이라는 기차에 타고 여행을 하다 보면 정해진 역 없이 사람들이 타고 내린다. 어떤 역에서는 사람들이 왕창 타기도 하고, 또 어떤 역에서는 예고도 없이 내리기도 한다. 북적북적한 기차를 같이 타고 가다 빈자리를 보면 그 사실을 알고 있었음에도 쓸쓸한 마음이 든다. 역시 든 자리는 몰라도 난 자리는 안다.승표님은 5개월, 날씽님은 2개월을 함께 일했다. 그들이 회사에 처음 들어와서 했던 자기소개를 기억해 본다.대출  좀 받아줘야 8퍼센트 들어올 수 있지 말입니다당시에는 미국 명문대에 다니고 있는 이 친구가 왜 8퍼센트에서 일하고 싶어 하는지 솔직히 잘 이해가 안 되었다. 일반적으로 스타트업 인턴이라고 하면 '제가 스타트업에 관심이 많습니다. 스타트업을 경험해 보고 싶습니다' 가 일반적이다. 그런데 미국의 스타트업에서도 일해 보고 한국에서 창업 경험도 있는 친구가 8퍼센트에서 무엇을 얻어 가려 하는지 의문이었다.          실제로는 조금만 더 잘생겼다병특을 마치고 놀고 있는 날씽님은 세바님이 8퍼센트에 추천해 주셨다. (보다 정확하게 이야기하면 풋살장에서 축구하고 있는 날씽몬을 세바 트레이너가 잡아왔다.) 원래 8퍼센트에서는 짧은 기간만 일하는 개발 인턴을 채용하지 않는다. 손발을 맞춰 가는데 드는 노력에 비해 얻을 수 있는 것이 많지 않다는 생각 때문이다. 하지만 이미 3년의 경력을 갖추고 보증인(세바)도 있는 개발자가 인턴을 하고 싶다고 하니 마다할 이유가 없었다. 오히려 병특을 막 끝내고 복학 전에 놀고 싶을 텐데 왜 굳이 일을 하려 할까 하는 생각이 들었다.두 분은 인턴이라는 이름으로 일했다. 두 분이 원한 것은 취직도 아니고 돈도 아니었다. (그 기간 동안 돈을 벌려고 했으면 훨씬 더 좋은 기회가 많았으리라 생각한다) 그들이 원한 것은 경험이었다.승표님은 '성장하는 한국의 스타트업'을 경험해보고자 했다. 승표님이 들어오신 시점을 기준으로 회사에 대한 객관적인 성장 잣대인 누적 대출액이 2배 이상 늘었으니 성장했다고 할 수 있겠다. 그동안 회사는 아무것도 모르는 천둥벌거숭이에서 조금은 먼 미래를 볼 수 있게 되었으니 그것도 성장이라고 부를 수도 있겠다. 이런 과정에서 승표님이 스스로 만족할 수 있는 경험을 가져갔는지는 잘 모르겠다.날씽님은 8퍼센트에서 '함께 개발하기'를 경험해보고자 했다. 전 직장에서 오랜 시간 동안 혼자 일을 하셔서 팀으로서 효율적으로 그리고 즐겁게 일하는 것은 어떤 것일까? 를 궁금해하셨다. 다행히 회사에서 소울메이트도 만났고, 나는 많은 신경을 써주진 못했지만 금방 팀과 어울려서 도움을 주고받는 모습을 볼 수 있었다. 황금 같은 2달의 시간이 충분한 가치가 있었는지는 역시 날씽님만 아는 일이다.승표님은 진중한 사람이다. (우리는 재미없는 사람이라고 부른다.) 항상 논리적인 대화를 통해 이성적인 결과를 만들어 가고자 했다. 디자인을 전공한 최진님과 자주 제품을 두고 티격태격했지만 내가 보기에는 좋은 조합이었다. 이 스마트한 친구는 분야를 한정하지 않고 일을 했고 회사의 여러 곳을 개선시켜 두었다. 특히 데이터에 기반한 기획과 마케팅을 할 수 있게 기틀을 잡아준 것은 앞으로 회사에 많은 도움이 될 거다. 이 글을 빌어 감사드린다.  날씽님 또한 회사에 필요한 여러 가지 일들을 '알아서' 해 주셨다. 역시 좋은 인재는 꼭 일을 던지지 않아도 알아서 찾아서 한다. 회사의 개발 환경도 야금야금 개선시키고 코드도 (내가 모르는 사이에) 여기저기 리팩터링을 해두었다. 그리고 고객팀 분들께 필요한 도구들도 개발해 주셨다. 역시 이 글을 빌어 감사드린다.날씽님이 떠날 때 고객 팀분들이 겨울방학 때 꼭 돌아와서 일해달라고 부탁했다. 그리고 날씽님은 “겨울방학 때 돌아올게요.”라고 답하셨다. (내가 볼드는 왠만해서는 잘 쓰지 않는다)떠나는 분들께 감사한 마음을 담아 작성한 롤링페이퍼두 분은 이제 학교로 돌아가셔서 다시 공부를 시작하실 거다. 회사에서 보여준 그들의 능력과 태도라면 학교에서도 그리고 조만간 맞닥뜨릴 사회에서도 충분한 인정을 받으시리라 생각한다. 이제 남은 우리가 해야할 일은 8퍼센트를 충분히 성장시켜서 그들이 사회에 나올 때 멋진 오퍼를 건네는 것이다. 다시 만날 그날을 기다리며.#8퍼센트 #에잇퍼센트 #작별 #팀문화 #조직문화 #기업문화 #팀워크 #인턴 #P2P금융
조회수 656

경계를 지우자

당신이 디자이너라면디자인의 경계를 넘어서야 뜻을 이룰 수 있으며,당신이 마케터라면마케팅의 영역을 벗어나야 진짜 마케팅을 할 수 있다.자신의 영역을 고수하면 그냥 고립될 뿐이다명함에 새겨져 있는 당신의 분야는 그저 관념일 뿐이며,실존하는 구분이 아니다. 컨베이어 벨트에서 편의상 내 일과 당신의 일을 구분하기 위한 경계선일 뿐이다.지금의 구분이라면,레오나르도 다빈치는 무엇을 하는 사람으로 구분할 것인가?당신이 숫자를 다루는 회계사에 머문다면,그냥 기능인으로 살뿐이며,당신이 변호사의 틀 안에서만 일 한다면,기술인일 뿐이다. 그저 전문적인 기술인일 뿐이다.법을 도구로 세상을 새롭게 기획할 수 있다면,위대한 정치인이 될 것이며,디자인을 도구로 새로운 생각을 표현할 수 있다면,뛰어난 크리에이터가 될 것이다.당신이 현재 가지고 있는 직함과 직종은요리의 재료일 뿐이다. 그 재료로 무엇이든 만들 수 있다.대학 4년간 배운 것에 한계를 두는 것만큼 우둔한 것이 없으며, 자신이 사회생활을 시작한 그 영역을 벗어날 수 없어서 몸부림친다면, 그 또한 관념의 경계에 발목을 잡힌 것일 뿐이다.엔지니어가 디자이너가 될 수 있으며,마케터가 철학자가 될 수 있어야 하며,교사가 창작자가 되어야 한다.댄서가 프로듀서가 될 때 세계적인 히트 그룹을 만들어내고,시각디자이너가 건축가가 될 때 세상에 없던 위대한 공간이 만들어진다.요리사가 패션을,바리스타가 큐레이팅을,개그맨이 슈퍼레이싱을,건축가가 음악을 넘나들을 때세상은 서로 다른 영역을 이해하고 새로운 것을 접목할 수 있으며, 창의성이 발휘될 수 있다.문과, 이과는 우리에게만 있는 구분이다.고2 때의 결정이 인생의 족쇄가 되어서도 안되며,도대체  누가 '문'과 '이'로 세상을 나누어 이해하는가?세상에 문과와 이과의 구분은 없다모든 경계를 넘나들 수 있는 용기가 있을 때새로운 것이 보인다.어쩌면, 그 영역 안에서만 고민하기 때문에인생이 답답한 것일 수 있다.경계를 지우자.그러면 새로운 세계가 보일 것이다.순간, 몇 사람이 떠오른다.그게 당신일지도 모른다.
조회수 1506

레진 기술 블로그 - 자바 기반의 백엔드와의 세션 공유를 위한 레일즈 세션 처리 분석

레일즈 기반의 프론트엔드(브라우저에서 서버 사이드 렌더링 계층까지)와 자바 기반의 백엔드(내부 API와 그 이후 계층)이 세션을 공유하기 위해 먼저 레일즈의 세션 처리 과정을 분석하고, 레일즈 세션 쿠키를 다루기 위한 자바 소스 코드를 공유합니다.여기저기 자랑하고 다녔으니 아시는 분은 아시다시피 레진은 구글앱엔진을 사용하고 있습니다. 지금이야 Java, Python, Node.js, Go 언어와 Flexible Environment 같은 다양한 선택지가 있지만, 레진이 입주할 당시만 해도 Java 7(subset), Python(subset)을 지원하는 Standard Environment라는 선택지 밖에 없었죠.최근 Saemaeul Undong 기술 부채 탕감의 일환으로 자바7, 스프링3.x, JSP(!) 기반의 백엔드에 포함되어 있던 프론트엔드를 레일즈 기반의 프론트엔드 서버(서버 사이드 렌더링을 담당하는 서버는 프론트일까요? 백엔드일까요?)로 분리하고 있습니다.서로 다른 세계의 존재들 - 자바와 레일즈의 세션을 공유해야하는 상황이 문제의 발단입니다.자바와 레일즈의 세션을 공유하는 여러가지 방법이 있겠지만, 가장 단순하고 효과적인 방법은 쿠키(cookie)라고 판단하고, 세션 encrypt/decrypt와 marshal/unmarshal을 동일한 방식으로 맞추기로 했습니다. (백엔드 API를 완전히 stateless하게 새로 만들면 좋겠지만, 코인은 벌어야 소는 키워야죠)이를 위해 레일즈의 세션 처리 과정을 분석하고 정리했습니다.레일즈의 actionpack의 action_dispatch/middleware/cookie.rb를 보면 EncryptedCookieJar 클래스의 초기화 과정은 다음과 같습니다(digest의 경우 따로 지정안하면 SHA1이 사용되는 듯):class EncryptedCookieJar < AbstractCookieJar # :nodoc: include SerializedCookieJars def initialize(parent_jar) super if ActiveSupport::LegacyKeyGenerator === key_generator raise "You didn't set secrets.secret_key_base, which is required for this cookie jar. " + "Read the upgrade documentation to learn more about this new config option." end secret = key_generator.generate_key(request.encrypted_cookie_salt || '') sign_secret = key_generator.generate_key(request.encrypted_signed_cookie_salt || '') @encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, digest: digest, serializer: ActiveSupport::MessageEncryptor::NullSerializer) end private def parse(name, encrypted_message) debugger deserialize name, @encryptor.decrypt_and_verify(encrypted_message) rescue ActiveSupport::MessageVerifier::InvalidSignature, ActiveSupport::MessageEncryptor::InvalidMessage nil end def commit(options) debugger options[:value] = @encryptor.encrypt_and_sign(serialize(options[:value])) raise CookieOverflow if options[:value].bytesize > MAX_COOKIE_SIZE end end key_generator는 EncryptedCookieJar에 포함된 SerializedCookieJars 모듈에 정의되어 있습니다:module SerializedCookieJars # ... def key_generator request.key_generator end end 흠… 좀 더 파보죠. request.key_genrator는 다음과 같습니다:class Request # ... def key_generator get_header Cookies::GENERATOR_KEY end #... end 흠… 좀 더 파야할 듯 ㅠㅠ.Cookies::GENERATOR_KEY는 다음과 같습니다:class Cookies #... GENERATOR_KEY = "action_dispatch.key_generator".freeze end action_dispatch.key_generator는 레일즈의 엔진 모듈에 해당하는 railties의 application.rb에 정의되어 있습니다:def key_generator # number of iterations selected based on consultation with the google security # team. Details at https://github.com/rails/rails/pull/6952#issuecomment-7661220 @caching_key_generator ||= if secrets.secret_key_base unless secrets.secret_key_base.kind_of?(String) raise ArgumentError, "`secret_key_base` for #{Rails.env} environment must be a type of String, change this value in `config/secrets.yml`" end key_generator = ActiveSupport::KeyGenerator.new(secrets.secret_key_base, iterations: 1000) ActiveSupport::CachingKeyGenerator.new(key_generator) else ActiveSupport::LegacyKeyGenerator.new(secrets.secret_token) end end # ... def env_config @app_env_config ||= begin validate_secret_key_config! super.merge( # ... "action_dispatch.key_generator" => key_generator, "action_dispatch.signed_cookie_salt" => config.action_dispatch.signed_cookie_salt, "action_dispatch.encrypted_cookie_salt" => config.action_dispatch.encrypted_cookie_salt, "action_dispatch.encrypted_signed_cookie_salt" => config.action_dispatch.encrypted_signed_cookie_salt, "action_dispatch.cookies_serializer" => config.action_dispatch.cookies_serializer, "action_dispatch.cookies_digest" => config.action_dispatch.cookies_digest ) end end 너무 깊이 판 느낌적느낌(?)이 있지만, 여기까지 왔으니 좀 더 파보겠습니다.핵심 알고리즘은 activesupport의 key_generator.rb, message_encryptor.rb, message_verifier.rb에 정의되어 있습니다.먼저, key_generator.rb의 핵심은 다음과 같습니다:class KeyGenerator def initialize(secret, options = {}) @secret = secret # The default iterations are higher than required for our key derivation uses # on the off chance someone uses this for password storage @iterations = options[:iterations] || 2**16 end # Returns a derived key suitable for use. The default key_size is chosen # to be compatible with the default settings of ActiveSupport::MessageVerifier. # i.e. OpenSSL::Digest::SHA1#block_length def generate_key(salt, key_size=64) OpenSSL::PKCS5.pbkdf2_hmac_sha1(@secret, salt, @iterations, key_size) end end 계속해서, message_encryptor.rb의 핵심은 다음과 같습니다:def initialize(secret, *signature_key_or_options) options = signature_key_or_options.extract_options! sign_secret = signature_key_or_options.first @secret = secret @sign_secret = sign_secret @cipher = options[:cipher] || 'aes-256-cbc' @verifier = MessageVerifier.new(@sign_secret || @secret, digest: options[:digest] || 'SHA1', serializer: NullSerializer) @serializer = options[:serializer] || Marshal end def _encrypt(value) cipher = new_cipher cipher.encrypt cipher.key = @secret # Rely on OpenSSL for the initialization vector iv = cipher.random_iv encrypted_data = cipher.update(@serializer.dump(value)) encrypted_data << cipher.final "#{::Base64.strict_encode64 encrypted_data}--#{::Base64.strict_encode64 iv}" end def _decrypt(encrypted_message) cipher = new_cipher encrypted_data, iv = encrypted_message.split("--".freeze).map {|v| ::Base64.strict_decode64(v)} cipher.decrypt cipher.key = @secret cipher.iv = iv decrypted_data = cipher.update(encrypted_data) decrypted_data << cipher.final @serializer.load(decrypted_data) rescue OpenSSLCipherError, TypeError, ArgumentError raise InvalidMessage end def encrypt_and_sign(value) verifier.generate(_encrypt(value)) end def decrypt_and_verify(value) _decrypt(verifier.verify(value)) end (Hopefully)마지막으로, message_verifier.rb의 핵심은 다음과 같습니다:def initialize(secret, options = {}) raise ArgumentError, 'Secret should not be nil.' unless secret @secret = secret @digest = options[:digest] || 'SHA1' @serializer = options[:serializer] || Marshal end def valid_message?(signed_message) return if signed_message.nil? || !signed_message.valid_encoding? || signed_message.blank? data, digest = signed_message.split("--".freeze) data.present? && digest.present? && ActiveSupport::SecurityUtils.secure_compare(digest, generate_digest(data)) end def verified(signed_message) if valid_message?(signed_message) begin data = signed_message.split("--".freeze)[0] @serializer.load(decode(data)) rescue ArgumentError => argument_error return if argument_error.message =~ %r{invalid base64} raise end end end def generate(value) data = encode(@serializer.dump(value)) "#{data}--#{generate_digest(data)}" end private def encode(data) ::Base64.strict_encode64(data) end def decode(data) ::Base64.strict_decode64(data) end def generate_digest(data) require 'openssl' unless defined?(OpenSSL) OpenSSL::HMAC.hexdigest(OpenSSL::Digest.const_get(@digest).new, @secret, data) end # ... # encode, decode는 base64사용 이제 레일즈가 쿠키 기반의 세션을 어떻게 처리하는지 조금 눈에 들어옵니다. 그러나 우리의 최종 목표는 레일즈의 내부를 공부하는 것이 아니라, 자바에서 동일한 처리를 하는 것입니다. 모듈 의존성 따위는 가볍게 무시하고 무한복붙(?)을 시전해서, 레일즈의 세션 처리 과정을 눈으로 확인할 수 있도록 재구성했습니다:require 'openssl' require 'base64' require 'concurrent/map' class Object def blank? respond_to?(:empty?) ? !!empty? : !self end def present? !blank? end end class Hash # By default, only instances of Hash itself are extractable. # Subclasses of Hash may implement this method and return # true to declare themselves as extractable. If a Hash # is extractable, Array#extract_options! pops it from # the Array when it is the last element of the Array. def extractable_options? instance_of?(Hash) end end class Array def extract_options! if last.is_a?(Hash) && last.extractable_options? pop else {} end end end module SecurityUtils def secure_compare(a, b) return false unless a.bytesize == b.bytesize l = a.unpack "C#{a.bytesize}" res = 0 b.each_byte { |byte| res |= byte ^ l.shift } res == 0 end module_function :secure_compare end class KeyGenerator def initialize(secret, options = {}) @secret = secret # The default iterations are higher than required for our key derivation uses # on the off chance someone uses this for password storage @iterations = options[:iterations] || 2**16 end def generate_key(salt, key_size=64) OpenSSL::PKCS5.pbkdf2_hmac_sha1(@secret, salt, @iterations, key_size) end end class CachingKeyGenerator def initialize(key_generator) @key_generator = key_generator @cache_keys = Concurrent::Map.new end # Returns a derived key suitable for use. def generate_key(*args) @cache_keys[args.join] ||= @key_generator.generate_key(*args) end end class MessageVerifier class InvalidSignature < StandardError; end def initialize(secret, options = {}) raise ArgumentError, 'Secret should not be nil.' unless secret @secret = secret @digest = options[:digest] || 'SHA1' @serializer = options[:serializer] || Marshal end def valid_message?(signed_message) return if signed_message.nil? || !signed_message.valid_encoding? || signed_message.blank? data, digest = signed_message.split("--".freeze) data.present? && digest.present? && SecurityUtils.secure_compare(digest, generate_digest(data)) end def verified(signed_message) if valid_message?(signed_message) begin data = signed_message.split("--".freeze)[0] @serializer.load(decode(data)) rescue ArgumentError => argument_error return if argument_error.message =~ %r{invalid base64} raise end end end def verify(signed_message) verified(signed_message) || raise(InvalidSignature) end def generate(value) data = encode(@serializer.dump(value)) "#{data}--#{generate_digest(data)}" end private def encode(data) ::Base64.strict_encode64(data) end def decode(data) ::Base64.strict_decode64(data) end def generate_digest(data) require 'openssl' unless defined?(OpenSSL) OpenSSL::HMAC.hexdigest(OpenSSL::Digest.const_get(@digest).new, @secret, data) end end class MessageEncryptor module NullSerializer #:nodoc: def self.load(value) value end def self.dump(value) value end end class InvalidMessage < StandardError; end OpenSSLCipherError = OpenSSL::Cipher::CipherError def initialize(secret, *signature_key_or_options) options = signature_key_or_options.extract_options! sign_secret = signature_key_or_options.first @secret = secret @sign_secret = sign_secret @cipher = options[:cipher] || 'aes-256-cbc' @verifier = MessageVerifier.new(@sign_secret || @secret, digest: options[:digest] || 'SHA1', serializer: NullSerializer) @serializer = options[:serializer] || Marshal end def encrypt_and_sign(value) verifier.generate(_encrypt(value)) end def decrypt_and_verify(value) _decrypt(verifier.verify(value)) end def _encrypt(value) cipher = new_cipher cipher.encrypt cipher.key = @secret # Rely on OpenSSL for the initialization vector iv = cipher.random_iv encrypted_data = cipher.update(@serializer.dump(value)) encrypted_data << cipher.final "#{::Base64.strict_encode64 encrypted_data}--#{::Base64.strict_encode64 iv}" end def _decrypt(encrypted_message) cipher = new_cipher encrypted_data, iv = encrypted_message.split("--".freeze).map {|v| ::Base64.strict_decode64(v)} cipher.decrypt cipher.key = @secret cipher.iv = iv decrypted_data = cipher.update(encrypted_data) decrypted_data << cipher.final @serializer.load(decrypted_data) rescue OpenSSLCipherError, TypeError, ArgumentError raise InvalidMessage end def new_cipher OpenSSL::Cipher.new(@cipher) end def verifier @verifier end end #key generate encrypted_cookie_salt = 'encrypted cookie' encrypted_signed_cookie_salt = 'signed encrypted cookie' def key_generator secret_key_base = 'db1c366b854c235f98fc3dd356ad6be8dd388f82ad1ddf14dcad9397ddfdb759b4a9fb33385f695f2cc335041eed0fae74eb669c9fb0c40cafdb118d881215a9' key_generator = KeyGenerator.new(secret_key_base, iterations: 1000) CachingKeyGenerator.new(key_generator) end # encrypt secret = key_generator.generate_key(encrypted_cookie_salt || '') sign_secret = key_generator.generate_key(encrypted_signed_cookie_salt || '') encryptor = MessageEncryptor.new(secret, sign_secret, digest: 'SHA1', serializer: MessageEncryptor::NullSerializer) value = "{\"session_id\":\"6022d05887d2ab9c1bad8a87cf8fb949\",\"_csrf_token\":\"OPv/LxbiA5dUjVsbG4EllSS9cca630WOHQcMtPxSQUE=\"}" encrypted_message = encryptor.encrypt_and_sign(value) #encrypted_message = encryptor._encrypt(value) p '-----------encrypted value-------------' p encrypted_message # decrypt encrypted_message = 'bDhIQncxc2k0Rm9QS0VBT0hWc3M4b2xoSnJDdkZNc1B0bGQ2YUhhRXl6SU1oa2c5cTNENWhmR0ZUWC9zN05mamhEYkFJREJLaDQ3SnM3NVNEbFF3ZVdiaFd5YXdlblM5SmZja0R4TE9JbDNmOVlENHhOVFlnamNVS2g1a05LY0FYV3BmUmRPRWtVNUdxYTJVbG5VVUlRPT0tLXd1akRqOU1lTTVneU9LTWszY0I5bFE9PQ==--b0a57266c00e76e0c7d9d855b25d24b242154070' p '-----------decypted value-------------' puts encryptor.decrypt_and_verify encrypted_message p '---------------------------------------' 이 과정을 자바로 구현한 소스는 생략 깃헙에 올려두었습니다. 이 코드를 이용해서 서블릿 세션과 연동하는 방법은 추후 사측(?)과 협의되는 대로 공유할 예정입니다. 물론, 그 전에 쿠키를 공유할 필요가 없어지면(or 공유할 쿠키가 없어지면) 더 좋겠죠 :D

기업문화 엿볼 때, 더팀스

로그인

/