스토리 홈

인터뷰

피드

뉴스

조회수 719

궁금해서 여행다녀오겠습니다 - 1

"한 사람의 삶에서 무엇이 영향을 미쳤고, 어떻게 시간을 보내며 살아가고 있을까? "집에 방문해보면 그 사람이 어떤 사람인지 더 깊이 알 수 있다."궁금해서 여행 다녀오겠습니다" 누군가의 책장을 살펴보면 관심분야와 생각을 알 수 있고, 가지고 있는 물건들을 보면 취미나 취향을 알 수 있다. 그렇게 한 사람을 좀 더 잘 파악할 수 있게 된다. 그렇다면 사람들, 인류 전체 역사에서 무엇이 중요한 영향을 미쳤고, 사람들(인류)은 어떻게 시간을 보내며 살아가고 있을까? 앞으로 우리는 어떻게 살게 될까?  이 질문에 대한 답을 찾으려면 사람들이 살고 있는 곳을 방문해야했다. 사람들이 살고 있는 도시에 가서, 역사와 흔적을 찾아보면 사람들(인류)을 더 잘 파악할 수 있을거라 믿었다. 그렇게 나의 500일에 걸친 도시 관찰 일기가 시작됐다.Prologue : 관찰 여행의 시작 사실 대학 입학 후, 나의 목표는 졸업 전까지 5대양 6대주를 다 보는 것이었다. 국제적인 이벤트에 지원받아서 참가할 수 있는 기회를 계속 찾고, 방학이 되면 해외로 나가기 위해 학기 중에 돈을 모았고, 그렇게 남미, 북미, 유럽, 중동, 동남아, 동북아를 하나하나 여행해 나갔다. 본격적으로 관찰 여행을 시작하게 된 것은 졸업 후 회사를 다니면서다. 언젠가는 창업을 하리라 라는 마음이 있었기에 스타트업에 계속 관심을 가지고 있었고 아이폰이 세상에 등장한 이후, 실리콘밸리에 대해 궁금증은 커져갔다. 그래서 회사를 다니는 동안, 휴가를 활용하여 세계적인 스타트업 허브들을 방문하기로 마음먹은 것이 첫 번째 관찰 여행의 시작이었다. 가서 어떻게 더 많은 것을 얻어올 수 있을까 라는 고민을 하면서 본격적으로 나만의 글로벌 탐방 여행을 기획하기 시작했다. 미국의 실리콘밸리, 이스라엘의 텔아비브 (이스라엘은 미국 나스닥(한국 코스닥에 해당)에 가장 많은 기업을 상장시켰다), 중국의 선전, 싱가폴 등 주요 도시를 목표로 기획서를 작성하고 차례로 방문하기 시작했다. 처음 실리콘밸리에 갈 때는 매일매일의 점심, 저녁 시간에 인터뷰 약속을 잡아놓고 출발했다. 인터뷰를 하면서 meetup을 통해 현지 event 에 참가하는 방법을 배웠고, 기회가 닿아 회사에도 방문하게 되었다. 그렇게 점점 기획하는 능력이 개선되어서, 텔아비브 방문 시에는 개인 인터뷰뿐만 아니라, meetup 등 현지 이벤트 참가, 기업 방문(startup, 대기업, VC, 엑셀러레이터) 등을 조합하여 기획해서 다니게 되었다. 결과적으로 이렇게 다닌 여행은 기존의 여행과는 다른 경험이 되었다. 다녀와서 생각이 달라지기도 했고, 세계의 흐름을 조금 더 이해할 수 있었다.To be Continued 
조회수 1169

[인터뷰] Humans of MEME, 그 다섯 번째 주인공을 만나다. - 순간을 행복하게 살아가는 졔졔의 이야기

안녕ㅎr세요 !멋진 미미박서의 이야기를 담아오는 MOTH 입니다 !이번 주에는미미박스 사이트, 상품 페이지나 프로모션 등미미박스를 더욱 아름답게 만들어주시는 디자이너 분을 만나보았어요 !오늘의 주인공 jyejye 를 만나러 가볼까용?Q. 졔졔! 안녕하세요. 졔졔는 그렇다면 전공이 디자인 계열이신가요?A. 아니요. 저는 미생물학과였어요. 제 전공으로 학위를 받고 직업군을 가지게 된다면, 보통 제약회사 아니면 화장품 R&D 에서 제품을 연구하는 일을 하게 되는 전공이에요.( Moth : 와우! 그러면 어떻게 디자인을 하고 계신거에요? )저는 어렸을 때부터 미술에 관심이 많았어요. 교과목 수업 중 미술 시간이 사실 제일 행복했었거든요. 근데 그 당시 스스로 생각해봤을 때, 중학생 때부터 미술을 시작하는 것이 늦었다고 생각했었던 것 같아요. 당시 미술 학원을 다니고 벌써부터 예중∙예고의 과정을 밟고 있는 친구들도 많았구요. 근데 사실 생각해보면 ‘나는 늦었다, 힘들 것 같다, 안될 것 같다’ 이런 것이 다 핑계 같고 또 그만큼 하고 싶은 용기가 없었던 것 같아요. 그런데 어른이 되어서도 디자인 하는 것이 굉장히 즐겁고 재밌다는 것을 점점 스스로 느끼는 것 같았어요. 대학생 때에도 당시 전공 교수님께서도 전공을 살려서 일하라고 하시는데 제가 스스로 생각했을 때 대학교 이후의 제 삶에서도 이렇게 보내게 된다면, 굉장히 후회할 것 같은 거예요. 부모님도 사실 그 방향으로 가시면 좋아하셨거든요. 그랬는데 그 때, 제가 용기를 가졌던 것 같아요. 이과에 가고 대학교에 진학하고, 그런 것이 어떻게 보면 부모님이 원하시는 안정적인 방향의 삶 쪽으로 간 것이었는데, 제가 결국에도 직업을 그렇게 선택한다면 정말 후회할 것 같았고 제 삶이 즐겁지 않을 것 같았어요. 그래서 결국 졸업 한 후, 약 1~2년정도 무작정 배워야겠다는 결심으로 웹디자인 학원도 다니면서 이것 저것 만들어보며 다시 새롭게 디자인을 시작했어요.    Q. 정말 용기 있는 선택이셨네요. 다시 새로운 길을 가기 정말 어렵잖아요. 지금은 어떠세요, 용기 낸 선택에 만족하시나요?A. 네. 사실 제 대학교 생활만 봐도, 이미 디자인으로 마음이 기울어져 있었을지도 몰라요. 대학생 때 발표하며 PPT를 만들잖아요. 저는 내용도 내용이지만, 그것을 더 잘 보이고 집중되게 만들고 싶었어요. 발표 시간에 대부분 딴짓을 하는 경우도 많지만 집중을 하게 만드는 요소로 비주얼적인 것이 크잖아요. 그렇게 이 발표를 집중하게 만들고 싶었어요. PPT의 내용도 내용이지만, 어떻게 구성하고 내용을 풀어나가는 것이 중요한 것을 느껴서 그 당시에도 디자인 측면에서 많이 집중했었어요. 주변 사람들도 제가 평소에 디자인하는 것을 좋아하는 것을 아셔서 학회활동에서도 과티를 만드는 것도 저에게 맡겨서 디자인 해보라고도 하시는 등요.학교생활만 돌아봐도 항상 제 일상엔 그런 것이 많이 있었던 것 같아요. 그래서 결국에는 평소에도 제가 좋아하는 것들을 항상 느끼고 있었기 때문에, 졸업 후에도 직업을 선택할 수 있는 지표가 되어줬던 것 같아요. Q. 그렇다면 어떻게 미미박스에 오시게 되셨어요?A. 사실 미미박스에 가장 끌렸던 것이 기업문화였어요. 저는 다른 무엇보다도 제가 일할 수 있는 환경이 중요하다고 생각해요. 좋지 않은 환경에서 제가 제 일만 하여 높은 보수를 받는 것이 아니라, 지금 이 순간을 즐겁고 행복하게 보내는 것이 결국에는 나중에도 행복할 수 있는 것 같아요. 그래서 순간 순간을 즐겁게 일할 수 있게 만드는 기업문화가 제일 매력있게 느껴졌던 것 같아요. 그렇게 미미박스에 들어오게 되었고, 자연스레 화장품에도 관심이 생겼어요. 기업문화 때문에 회사에 들어왔는데 화장품에도 관심이 생겼고, 화장품에 관심이 생기다보니 이 화장품을 더 잘 보이게 하는 콘텐츠를 만들어야겠다는 열정으로 자연스럽게 이어졌네요(웃음).  저는 제가 걸어왔던 발자취와 경험들을 중요하게 생각해요. 결국 지금을 기준으로 했을 때는 모든 것이 다 경험이잖아요. 나중에 어떻게 쓰이는지 모르는 거더라고요. 힘들 때도 정말 많았어요. 버티고 버티면서, 그렇게 버텼던 순간들이 나중에는 도움이 많이 되더라구요. 그 시간들이 우리가 인지하지 못한 채로 잘 흘러가잖아요. 그 흘러가는 순간에도 최선을 다하면, 그게 허투루 쓰이는 경우는 없는 것 같아요. 대학교 4년 동안 배웠던 전공을 직업으로 선택한 것도 아니니 그 시간도, 등록금도 아깝다고 생각했어요. 그런데 제가 배우고 경험했던 순간들이 항상은 아니더라도 생각보다 디자인을 할 때도 응용할 수 있는 부분이 생기며 ‘내가 한 모든 경험들이 다 쓸모 없는 것은 아니구나’라는 생각이 들더라구요. 예를 들면, 연예인 이성경씨도 피아노를 전공했지만 모델이 됬는데, 모델 일을 하기도 연기도 하면서 기회가 생겨서 피아노를 연주하기도 하더라고요. 그런 것처럼 지금 하고 있는 일이 옳다, 그르다 라고 판단하기 보다 그저 긍정적으로 받아들이면 좋을 것 같아요. 언제 어떤 순간들이 일어날지 모르니까요.저는 부끄럼도 많고 두려움도 많으면서도 도전정신도 있거든요. 상반적인 것을 같이 가지고 있고 해보고 싶은 것도 많아요. 이것 저것 해보고싶고.. 등 그런 것들이 결국 모여서 제가 되기도 하니깐요(웃음).그래서 제가 아직도 쓰는 슬로건이 manymuch 이에요. 뭐든지 많이 경험해보는 것이 중요한 것 같아요.저는 강박관념을 가지고 주말에 나가는 경우도 꽤 있어요. 정말 피곤해서 쉬고 싶은데 ‘그래 쉬자’ 라고 생각하면 또 몸이 근지러운 성향이기도 하고요. 피곤해도 나갔다 오면 ‘역시 나오길 잘했네.’ 라는 생각이 들어서 가능하면 주말에 새로운 곳에 많이 가보려고 해요. 전시가 있으면 보러가고 새로운 공간에 계속 찾아가보는 것도 디자이너한테는 감각을 키울 수 있어요. 제가 생각하기에 디자인은 아무것도 없는 것에서 완전한 창조가 일어날 수는 없다고 생각해요. 이것 저것 많이 보면서 응용하고 다양하게 생각할 수 있는 스펙트럼이 넓어지는 것 같아요. 사람들이 어떠한 분위기를 원하는지, 요즘 트렌디한게 무엇이며 제가 디자인을 하고 싶은 욕심이 있으니깐 더 찾아보려고 하는 것 같아요.Q.  졔제는 어떤 목표가 있으신가요?A. 졔졔가 바꾼 한정특가 이벤트 가이드 변경기본적인 한정특가 이벤트 가이드가 있어요. 한정특가 작업물을 만들어야 할 때, 그 이벤트가 디자인적으로 고객이 느낄 수 있을만큼 후킹하게 느껴져야 하잖아요. 그래서 이벤트 가이드 자체를 바꾸었어요. 누군가 저한테 시켜서가 아니라 이렇게 디자인을 하면 고객들의 눈에 확 들어오지 않을까? 라는 생각으로 기본 가이드 룰에 어긋나지 않으면서 좀 더 눈에 띄게 바꾸었어요. 그렇게 제가 만든 것이 또 자연스레 가이드가 되었어요. MD분들도 제가 만든 방식으로 제작을 해달라고 요청해주신다던지, 그런 것이 가장 많이 뿌듯했던 것 같아요. 기존의 것을 개선하는 것도 일의 일부며 딱 주어진 일만은 하고 싶지는 않아요. 앞으로도 좀 더 고객의 눈을 사로잡을 수 있게 개선하고 싶은 마음이 커요.어느 정도 퍼포먼스를 내고 있지만 완전히 퍼포먼스를 냈다고 생각은 안해요. 제가 하는 업무에서 스스로 만족할 때까지 그리고 사람들이 어느 정도 인정할 수 있을 정도의 퍼포먼스를 내고 싶고, 그게 또 제 목표에요. 앞으로 우린 어디에 있던 간에 계속 나아갈 사람이잖아요(웃음).졔졔와 이야기를 나누며저는 개인적으로는 삶의 방향과업무를 하는 마음가짐 등 배울 수 있었던 것 같아요 !사실 이번 주의 이야기는 인터뷰라기보다 졔제가 저의 고민도 많이 들어주시고격려도 많이 해주시며 이야기 하면서 정말 시간 가는 줄 몰랐답니다..맛있는 코~퓌~도 사주신 졔졔 흑흑흐그흑 ㅠㅠㅠㅠ항상 쉬운 것에 안주하지 않고더 나은 것을 만들어내기 위해 노력하시는 졔졔이런 멋진 미미박서분이 계셔서미미박스가 더욱! 멋진 회사로 성장할 것 같아요 !다음에는 더욱 알찬 이야기로 찾아오도록 하겠습니다 :  )그럼 이 10000 안녕히계세요!
조회수 3211

ReactorKit 시작하기

ReactorKit 시작하기오늘은 StyleShare에서 ReactorKit을 사용한지 딱 1년이 되는 날입니다. ReactorKit은 반응형 단방향 앱을 위한 프레임워크로, StyleShare와 Kakao를 비롯한 여러 기업에서 사용하고 있는 기술입니다.StyleShare의 iOS 프로젝트 첫 커밋은 2011년 8월 23일입니다. 그 뒤로 약 7년간 크고 작은 기능을 추가하며 굉장히 큰 코드베이스를 가지게 되었습니다. 특히 2015년에는 스토어 기능을 런칭하면서 기존 서비스 만큼이나 많은 코드를 작성했습니다. 서비스 복잡도는 점점 높아졌고, 지속 가능한 코드베이스를 위해 많은 개선이 필요했습니다.ReactorKit은 많은 부분에 있어서 StyleShare가 가진 고민을 해결해주었습니다. Flux와 Reactive Programming의 개념을 결합하여 만들어진 ReactorKit에서는 사용자 인터랙션과 뷰 상태가 관찰 가능한 스트림을 통해 단방향으로 전달됩니다. 뷰와 비즈니스 로직을 분리할 수 있게 되면서 모듈간 결합도가 낮아지고 테스트하기 쉬워졌습니다. 또한, 자칫 복잡해질 수 있는 비동기 코드를 일관되게 작성할 수 있게 되었습니다.이 글에서는 ReactorKit의 기본 개념과 테스트를 위한 기법을 소개 합니다.데이터 흐름ReactorKit에는 뷰(View)와 리액터(Reactor)라는 개념이 존재합니다. 뷰는 상태를 표현합니다. 뷰 컨트롤러나 셀도 모두 뷰에 해당합니다. 뷰는 사용자 인터랙션을 추상화하여 리액터에 전달하고, 리액터에서 전달받은 상태를 각각의 뷰 컴포넌트에 바인드합니다. 뷰는 비즈니스 로직을 수행하지 않습니다.반대로, 리액터는 뷰의 상태를 관리합니다. 뷰에서 액션을 전달받으면 비즈니스 로직을 수행한 뒤 상태를 변경하여 다시 뷰에 전달합니다. 리액터는 UI 레이어에서 독립적이기 때문에 비교적 테스트하기 쉽습니다.ViewView 프로토콜을 적용하면 뷰를 정의할 수 있습니다. DisposeBag 속성과 bind(reactor:) 메서드를 필수로 정의해야 합니다.import ReactorKit import RxSwift class UserViewController: UIViewController, View { var disposeBag = DisposeBag() func bind(reactor: UserViewReactor) { } }<iframe width="700" height="250" data-src="/media/78a16e327ba4eb073cc5bdbb703c81f9?postId=c7b52fbb131a" data-media-id="78a16e327ba4eb073cc5bdbb703c81f9" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/78a16e327ba4eb073cc5bdbb703c81f9?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 236.984px;">이 프로토콜을 정의하면 reactor 속성이 자동으로 생성됩니다. 이 속성에 새로운 값이 지정되면 bind(reactor:) 메서드가 자동으로 호출됩니다. 이곳에는 사용자 인터랙션을 리액터에 바인드하거나, 리액터의 상태를 각각의 뷰 컴포넌트에 바인드하는 코드를 작성합니다.func bind(reactor: UserViewReactor) { // Action self.followButton.rx.tap .map { Reactor.Action.follow } .bind(to: reactor.action) .disposed(by: self.disposeBag) // State reactor.state.map { $0.isFollowing } .distinctUntilChanged() .bind(to: self.followButton.rx.isSelected) .disposed(by: self.disposeBag) }<iframe width="700" height="250" data-src="/media/6a6d5aa66b156cae7d4475f6ed13efb0?postId=c7b52fbb131a" data-media-id="6a6d5aa66b156cae7d4475f6ed13efb0" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/6a6d5aa66b156cae7d4475f6ed13efb0?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 325px;">Reactor리액터를 정의하기 위해서는 Reactor 프로토콜을 사용합니다. 사용자 인터랙션을 표현하는 Action과 뷰의 상태를 표현하는 State, 그리고 상태를 변경하는 가장 작은 단위인 Mutation을 클래스 내부에 필수로 정의해야 합니다. 또한 가장 첫 상태를 나타내는 initialState가 필요합니다.import ReactorKit import RxSwift final class UserViewReactor: Reactor { enum Action { case follow } enum Mutation { case setFollowing(Bool) } enum State { var isFollowing: Bool } let initialState: State = State(isFollowing: false) }<iframe width="700" height="250" data-src="/media/572f53fb442c67060d2a69f90a42a07b?postId=c7b52fbb131a" data-media-id="572f53fb442c67060d2a69f90a42a07b" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/572f53fb442c67060d2a69f90a42a07b?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 435px;">Action이나 State와 달리 Mutation은 리액터 클래스 밖으로 노출되지 않습니다. 대신, 클래스 내부에서 Action과 State를 연결하는 역할을 수행합니다. Action이 리액터에 전달되면 두 단계를 거쳐서 뷰의 상태를 변경합니다.mutate() 함수에서는 Action 스트림을 Mutation 스트림으로 변환하는 역할을 합니다. 이곳에서 네트워킹이나 비동기로직 등의 사이드 이펙트를 처리합니다. 그 결과로 Mutation을 방출하면 그 값이 reduce() 함수로 전달됩니다. reduce() 함수는 이전 상태와 Mutation을 받아서 다음 상태를 반환합니다.func mutate(action: Action) -> Observable { switch action { case .follow: return UserService.follow() .map { Mutation.setFollowing(true) } .catchErrorJustReturn(Mutation.setFollowing(false)) case .unfollow: return UserService.unfollow() .map { Mutation.setFollowing(false) } .catchErrorJustReturn(Mutation.setFollowing(true)) } } func reduce(state: State, mutation: Mutation) -> State { var newState = state switch mutation { case let setFollowing(isFollowing): newState.isFollowing = isFollowing } return newState }<iframe width="700" height="250" data-src="/media/dc8fbdce8314a7eba99be944241c5432?postId=c7b52fbb131a" data-media-id="dc8fbdce8314a7eba99be944241c5432" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/dc8fbdce8314a7eba99be944241c5432?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 522.984px;">테스팅테스트를 위해 가장 먼저 고민하게 되는 것은 ‘무엇을 테스트할 것인가’에 대한 것입니다. ReactorKit을 사용하면 뷰와 로직이 분리되어 상대적으로 쉽게 해답을 얻을 수 있습니다.View사용자 인터랙션이 발생했을 때 Action이 리액터로 잘 전달되는지리액터의 상태가 바뀌었을 때 뷰의 컴포넌트 속성이 잘 변경되는지ReactorAction을 받았을 때 원하는 State로 잘 변경되는지뷰 테스팅리액터의 stub 기능을 이용하면 뷰를 쉽게 테스트할 수 있습니다. stub 기능을 활성화하면 리액터가 받은 Action을 모두 기록하고, mutate()와 reduce()를 실행하는 대신 외부에서 상태를 설정할 수 있게 됩니다.func testAction_refresh() { // 1. Stub 리액터를 준비합니다. let reactor = MyReactor() reactor.stub.isEnabled = true // 2. Stub된 리액터를 주입한 뷰를 준비합니다. let view = MyView() view.reactor = reactor // 3. 사용자 인터랙션을 발생시킵니다. view.refreshControl.sendActions(for: .valueChanged) // 4. Reactor에 액션이 잘 전달되었는지를 검증합니다. XCTAssertEqual(reactor.stub.actions.last, .refresh) } func testState_isLoading() { // 1. Stub 리액터를 준비합니다. let reactor = MyReactor() reactor.stub.isEnabled = true // 2. Stub된 리액터를 주입한 뷰를 준비합니다. let view = MyView() view.reactor = reactor // 3. 리액터의 상태를 임의로 설정합니다. reactor.stub.state.value = MyReactor.State(isLoading: true) // 4. 그 때 뷰 컴포넌트의 속성이 잘 변하는지를 검증합니다. XCTAssertEqual(view.activityIndicator.isAnimating, true) }<iframe width="700" height="250" data-src="/media/9e5e0349766c69076a5081cbd680645b?postId=c7b52fbb131a" data-media-id="9e5e0349766c69076a5081cbd680645b" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/9e5e0349766c69076a5081cbd680645b?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 721px;">리액터 테스팅리액터는 뷰에 비해서 상대적으로 테스트하기 쉽습니다. Action이 전달되었을 때 비즈니스 로직을 수행하여 State가 바뀌는지를 확인하면 됩니다.func testBookmark() { // 1. 리액터를 준비합니다. let reactor = MyReactor() // 2. 리액터에 액션을 전달합니다. reactor.action.onNext(.toggleBookmarked) // 3. 리액터의 상태가 변경되는지를 검증합니다. XCTAssertEqual(reactor.currentState.isBookmarked, true) } func testUnbookmark() { // 1. 리액터를 준비합니다. 액션을 미리 한 번 전달해서 테스트 환경을 만들어둡니다. let reactor = MyReactor() reactor.action.onNext(.toggleBookmarked) // 2. 리액터에 액션을 한 번 더 전달합니다. reactor.action.onNext(.toggleBookmarked) // 3. 리액터의 상태가 변경되는지를 검증합니다. XCTAssertEqual(reactor.currentState.isBookmarked, false) }<iframe width="700" height="250" data-src="/media/32af3eac8c1c9646bf95ea1442ad8ff4?postId=c7b52fbb131a" data-media-id="32af3eac8c1c9646bf95ea1442ad8ff4" data-thumbnail="https://i.embed.ly/1/image?url=https://avatars2.githubusercontent.com/u/931655?s=400&v=4&key=a19fcc184b9711e1b4764040d3dc5c07" class="progressiveMedia-iframe js-progressiveMedia-iframe" allowfullscreen="" frameborder="0" src="https://medium.com/media/32af3eac8c1c9646bf95ea1442ad8ff4?postId=c7b52fbb131a" style="display: block; position: absolute; margin: auto; max-width: 100%; box-sizing: border-box; transform: translateZ(0px); top: 0px; left: 0px; width: 700px; height: 522.984px;">마치며ReactorKit은 지금까지 CocoaPods에서 약 3만 7천회 다운로드 되었고, 약 730개 앱에서 사용되고 있습니다. 최근에는 Wantedly에서 사용하며 일본에서도 많은 호응을 얻고 있습니다. 공개된지 1년밖에 되지 않았지만 굉장히 좋은 평을 받으며 성장하고 있는 프레임워크입니다. 만약 새로운 프로젝트를 시작하거나, StyleShare와 비슷한 고민을 하고 계신다면 ReactorKit을 강력하게 추천합니다.ReactorKit GitHublet’Swift 2017 ReactorKit 발표 영상let’Swift 2017 ReactorKit 발표 자료#스타일쉐어 #개발팀 #개발자 #경험공유 #인사이트
조회수 2375

CloudWatch에 대하여

OverviewAmazon Web Services(AWS)는 많은 고객들이 이용하고 있습니다. AWS를 이용하여 프로젝트를 운영하고 있다면 각종 서비스의 리소스를 모니터링 하는 게 귀찮게 느껴질 수 있습니다. 이번 글에서는 AWS 리소스를 효과적으로 모니터링할 수 있는 Cloudwatch 서비스를 소개하겠습니다.Cloudwatch는 통합 뷰를 확보하는데 필요한 데이터를 제공합니다. 뿐만 아니라 이벤트 및 리소스를 이용해 경보를 생성할 수도 있습니다.1. Events2. Logs3. Custom Metrics(맞춤형 지표) 생성하기4. Alarm 생성5. Dashboards쉬어가기: Query 언어가 지원하는 여섯 가지 명령 유형1. EventsCloudWatch Events는 정기적인 일정에서 트리거(trigger)되는 규칙을 생성할 수 있습니다.1.규칙 생성을 클릭합니다.2.대상을 호출할 일정을 설정합니다.호출 방식에는 이벤트 패턴과 일정 두 가지가 있습니다. 이벤트 패턴은 json 구조로 표현됩니다. AWS 서비스에서 발생하는 패턴과 일치하면 트리거가 동작합니다. 일정은 지정한 시간과 일치하면 트리거가 동작합니다.cron 또는 rate 표현식을 사용해 예약된 모든 이벤트는 UTC+09:00 시간대를 사용합니다. 최초 단위는 1분입니다.아래는 각각의 필드에 대한 일정 cron식 설명입니다.이번 예제에서는 특정 시간에 트리거되는 일정으로 설정하겠습니다.매일 4시에 동작하도록 설정19 + 9(UTC) - 24(하루) = 새벽 4시3.대상 추가를 선택해 호출할 대상을 지정합니다.Lambda 함수 외에 여러 서비스를 선택할 수 있지만 이번 예제에서는 Lambda 함수를 지정하여 구성하겠습니다.4.규칙의 이름과 설명을 등록하고 규칙 생성을 클릭합니다.5.규칙이 생성된 것을 볼 수 있습니다.2. LogsCloudWatch Logs는 운영 중인 애플리케이션 리소스를 기록하고 액세스할 수 있으며, 관련된 로그 데이터를 검색할 수도 있습니다.1.생성된 규칙이 지정된 시간에 동작하면 CloudWatch Logs에 로그 그룹이 생성된 걸 확인할 수 있습니다.2.Lambda 함수에서 실행된 로그 메시지를 확인할 수 있으며 필터링도 가능합니다.3.로그 그룹에 이벤트 만료 시점을 설정해 오래된 데이터는 모두 자동으로 삭제되도록 설정할 수 있습니다.3. Custom Metrics(맞춤형 지표) 생성하기모니터링하고자 하는 통계치를 직접 선정하고, CloudWatch로 보내 관리하는 지표를 생성해보겠습니다.1.Log Groups에 대한 지표를 생성하겠습니다. 해당 Log Groups에 ‘Filters’를 클릭합니다.2.’Add Metric Filter’를 클릭합니다.3.로그 지표에 대한 필터 패턴을 정의합니다.Filter Pattern* “INFO Success 200” → 세 단어를 모두 포함하는 로그 이벤트 메시지와 일치* “INFO - Start - End” → ‘INFO’ 포함된 메시지 중에 ‘Start’, ‘End’ 제외된 필터 로그 이벤트 메시지와 일치4.필터 및 지표 정보를 입력한 후 ‘Create Filter’를 클릭합니다.Metric Details* Metric Namespace → CloudWatch 지표에 대한 대상 네임 스페이스* Metric Name → 모니터링된 로그 정보가 게시되는 CloudWatch 지표의 이름* Metric Value → 일치하는 로그가 발견될 때마다 지표에 게시하는 숫자 값* Default Value → 일치하는 로그가 발견되지 않은 기간 동안 지표 필터에 보고되는 값5.두 가지 케이스의 필터를 생성했습니다.4. Alarm 생성단일 CloudWatch 지표를 감시하거나 CloudWatch 측정치를 기반으로 하는 수학 표현식의 결과를 감시하는 CloudWatch 경보를 생성할 수 있습니다. 지표가 지정된 임계값에 도달하면 자동으로 이메일을 보내는 Alarm을 만들어보겠습니다.1.추가된 지표 필터에 ‘Create Alarm’ 버튼을 클릭해 경보를 추가합니다.2.경보 세부 정보 및 수행할 작업을 정의합니다.경보 평가경보를 생성할 때, CloudWatch가 경보 상태를 변경하는 조건 세 가지에 대한 설정을 지정할 수 있습니다.기간은 경보에 대해 개별 데이터 포인트를 생성하기 위해 지표 또는 표현식을 평가하는 기간입니다. 초로 표시됩니다. 1분을 기간으로 선택하면 1분마다 하나의 데이터 포인트가 생성됩니다.Evaluation Period(평가 기간)는 경보 상태를 결정할 때 평가할 가장 최근의 기간 또는 데이터 포인트의 수입니다.Datapoints to Alarm(경보에 대한 데이터포인트)는 평가 기간에 경보가 ALARM상태에 도달하게 만드는 위반 데이터 포인트의 수입니다. 위반 데이터 포인트가 연속적일 필요는 없습니다. Evaluation Period(평가 기간)와 동일한 마지막 데이터 포인트의 수 이내면 됩니다.3.경보가 발생할 Alarm 상태와 알림 받을 이메일을 등록합니다.경보 상태/OK/ 지표 또는 표현식이 정의된 임계값 내에 있습니다./ALARM/ 지표 또는 표현식이 정의된 임계값을 벗어났습니다./INSUFFICIENT_DATA/ 경보가 방금 시작되었거나, 측정치를 사용할 수 없거나, 또는 측정치를 통해 경보 상태를 결정하는데 사용할 충분한 데이터가 없습니다.4.이메일 수신함에서 ‘AWS 알림 - 구독 확인’이라는 제목의 메일을 클릭합니다. 내용에 포함된 링크를 클릭해 알림을 수신할 것을 확인합니다. (AWS는 확인된 주소로만 알림을 전송할 수 있습니다.)5.이메일 수신함을 확인해 ‘Confirm subscription’을 클릭합니다.6.등록한 이메일이 확인되었습니다.7.AWS에 이메일이 정상적으로 등록되었는지 SNS Subscriptions 메뉴에서 확인합니다.8.Lambda를 실행해 Alarm 상태를 변경해보겠습니다.9.등록한 이메일 주소로 Alarm 메일이 도착했습니다.5. DashboardsCloudWatch를 통해 리소스를 손쉽게 모니터링할 수 있는 맞춤형 통계 기능입니다.1.Metric Filter에서 추가된 Custom Namespaces를 클릭합니다.2.생성된 Metrics를 선택한 후, Graphed metrics Tab을 클릭합니다.3.Metrics에 표시될 그래프를 설정합니다.1)그래프 제목 : testLambda12)그래프 표시 : 숫자3)그래프 라벨 : testMetrics-400, testMetrics-2004)통계 : 합계5)기간 : 1 Day4.수식을 응용하여 여러 형식의 Metrics 표현식을 추가하겠습니다.지표 수식 함수* METRICS() : 요청에 모든 지표를 반환* SUM(METRICS()) : 모든 지표의 합계* AVG(METRICS()) : 모든 지표의 평균* MIN(METRICS()) : 모든 지표의 최소값* MAX(METRICS()) : 모든 지표의 최대값* ABS(METRICS()) : 각 요소의 절대값* RATE(METRICS()) : 각 요소의 초당 변경 비율5.완성된 지표 Source를 복사합니다.{ "metrics": [ [ { "expression": "SUM(METRICS())", "label": "합계", "id": "e1", "stat": "Sum", "period": 86400 } ], [ { "expression": "AVG(METRICS())", "label": "평균", "id": "e2", "stat": "Sum", "period": 86400 } ], [ { "expression": "MIN(METRICS())", "label": "최소값", "id": "e3", "stat": "Sum", "period": 86400 } ], [ { "expression": "MAX(METRICS())", "label": "최대값", "id": "e4", "stat": "Sum", "period": 86400 } ], [ { "expression": "SUM(METRICS())/SUM(m1)", "label": "SUM(METRICS())/SUM(m1)", "id": "e5", "stat": "Sum", "period": 86400 } ], [ { "expression": "SUM(100/[m1, m2])", "label": "SUM(100/[m1, m2])", "id": "e6", "stat": "Sum", "period": 86400 } ], [ "testMetrics", "testMetrics1", { "id": "m1", "stat": "Sum", "period": 86400, "label": "testMetrics-400" } ], [ ".", "testMetrics2", { "id": "m2", "stat": "Sum", "period": 86400, "label": "testMetrics-200" } ] ], "view": "singleValue", "stacked": false, "region": "ap-northeast-1", "title": "testLambda1", "period": 300 } 6.Dashboard name을 입력한 후 ‘Create dashboard’를 클릭합니다.7.’Add widget’을 클릭해 Number 유형을 선택합니다.8.Source Tab에서 복사해 둔 지표 Source를 붙여 넣고, ‘Create widget’을 클릭합니다.9.위젯이 추가되었습니다. 추가된 위젯은 ‘Save dashboard’ 버튼을 클릭해야 최종 저장됩니다.10.이번에는 로그 메시지 결과를 확인할 수 있는 Query result 유형을 추가해보겠습니다. 먼저 Query result 유형을 선택합니다.11.로그 메시지에 조건을 추가해 필터링합니다.잠시 쉬어가기!: Query 언어가 지원하는 여섯 가지 명령 유형fields : 지정한 필드를 검색합니다. 필드 명령 내에서 함수 및 연산을 사용할 수 있습니다. 만약 @ 기호, 마침표(.) 및 영숫자 문자 이외의 문자가 포함된 로그 필드가 쿼리에 명명되어 있으면 해당 필드 이름은 억음 기호로 둘러싸야 합니다.filter : 하나 이상의 조건으로 필터링합니다. filter statusCode like /2\d\d/ → 필드 statusCode의 값이 200~299인 로그 이벤트를 반환합니다.stats : 로그 필드에 대한 지정된 시간 간격의 집계 통계를 계산합니다.sort : 검색된 로그 이벤트를 정렬합니다.limit : 쿼리에서 반환되는 로그 이벤트 수를 제한합니다.parse : 로그 필드에서 데이터를 추출하고 쿼리로 추가 처리할 수 있는 임시 필드가 하나 이상 생성됩니다.12.추가된 위젯은 이름과 사이즈를 조절한 후, ‘Save dashboard’ 버튼을 클릭해 최종 저장합니다.13.생성한 Alarm을 Dashboard에 추가하겠습니다.14.Dashboard가 완성되었습니다!Conclusion지금까지 CloudWatch 서비스를 소개했습니다. 이 서비스를 이용하면 로그와 지표를 쉽게 시각화할 수 있고, 작업을 자동화할 수도 있는 것을 확인했습니다. CloudWatch를 이용해 애플리케이션을 최적화하고, 원활하게 실행해보는 건 어떨까요. 분명 리소스를 효과적으로 다룰 수 있을 겁니다.글곽정섭 과장 | R&D 개발1팀[email protected]브랜디, 오직 예쁜 옷만
조회수 826

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

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

React + Decorator + HOC = Fantastic!!

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

이노버즈미디어의 대표 미남, '박충선 디자이너'

안녕하세요, Y입니다! 지난 옐로피플 스토리에서 뷰신 나나가 첫 번째 인터뷰로 소개되면서 엄청난 화제를 몰고 왔는데요. 이번 두 번째 타자는 바로바로 YDM 소속의 디지털 마케팅 에이전시 이노버즈미디어의 대표 꽃미남 박충선 디자이너 입니다!Y: 안녕하세요! 옐블 독자들을 위한 자기소개 부탁 드려요! 박충선: 안녕하세요, 이노버즈미디어에서 브랜드 콘텐츠를 만들고 있는 디자이너 박충선입니다! 반갑습니다! Y: 브랜드 콘텐츠라! 정확히 어떤 일인지 궁금합니다박충선: 쉽게 말해서 각 기업 브랜드들이 페이스북, 인스타그램 등 소셜미디어에 발행하는 이미지를 제작하는 거죠. 현재는 롯데카드랑 글로벌 스포츠 의류 브랜드인 스파이더 코리아를 맡고 있어요. 아래와 같은 식으로 각 브랜드의 소셜미디어 콘텐츠를 제작하고 있습니다.Y: 본인이 느끼는 이노버즈만의 특별한 점이나 자랑할만한 사내문화가 있나요? 박충선: 사실 이노버즈가 제 첫 직장이라 다른 회사들과 비교하긴 어렵지만, 여기서 1년 4개월동안 몸담으면서 느낀 것은 정말 수평적이라는 거예요. 서로 눈치보지 않고 말할 수 있는 분위기다 보니 정말 다양하게 싱크빅 돋는 아이디어가 많이 나오죠 :) 또 매월 두 명씩 뽑아서 전 직원 앞에서 다양한 주제로 스피치를 해요. 업무에서 벗어나 본인이 흥미를 느끼는 분야 등 개인적인 이야기로 진행하기 때문에 서로를 알아가는데 큰 도움이 되는 것 같아요. 또 인턴과 신입사원은 물론 임직원들을 위한 다양한 교육과 지원을 해주는 것도 이노버즈만의 특별한 점인 것 같아요.출처 : 이노버즈 페이스북Y: 박충선님의 주제는 뭐였나요? 박충선: 저는 아직 안 했어요!ㅋㅋㅋㅋ 샤이가이라서.. Y: 샤이가이셨구나ㅋㅋㅋㅋ 네 다음질문 드릴게요! 기억나는 재미있는 에피소드가 있나요?박충선: 인턴기간에 업무와는 별개로 동료들에 대한 콘텐츠를 만들었어요. 이노버즈 가족 한 명 한 명에 대해 웹툰형식으로 만들었는데 친해질수록 디스(?)내용을 조금씩 넣어봤거든요. 그러다 보니 반응도 좋았고 다들 다음 편은 어떤 디스가 나올지 기대해줘서 재미있었어요ㅋㅋㅋ 역시 까야 제맛이라고……Y: 드라이플라워 고문이라니ㅋㅋㅋㅋ앞으로 드라이플라워 볼 때마다 죄책감들것 같아요ㅋㅋㅋ 그나저나 디자인 팀이라 남자가 많이 없을 것 같아요! 박충선: 이노버즈에 처음 입사했을 때 디자인 실에 저 포함 두 명 빼고 전부 여자분들이었어요. 처음엔 좀 걱정이 됐는데, 다들 좋으신 분들이고 형들처럼(!) 편하게 대해 주셔서 좋았어요ㅎㅎ Y: 다 여자분들이면 회식이 많이 없겠어요! 박충선: 왜 때문에 그런 생각을…… 저보다 잘 드세요 다들 (또르르)Y: 빨리 넘어갈게요!! 이노버즈/옐로모바일에 바라는 점이 있다면? 박충선: 일을 한다는 건 돈을 버는 것도 중요하지만 함께 일하는 사람들, 그리고 회사에서 임직원들을 대하는 자세가 엄청 중요한 것 같아요. 앞으로도 지금처럼 인간관계를 중요시 여기고 직원 한 사람 한 사람을 우선시하는 회사였음 좋겠어요. Y: 마지막 질문입니다! 앞으로는 어떤 일을 해보고 싶으신가요? 충선: 아주 먼 미래에는 디자인을 접목한 카페나 술집을 운영하고 싶어요. 당장은 원래 하고 싶었던 미술을 배워서 지금 하는 일에 적용시켜보고 싶습니다. 앞으로도 재미있는 컨텐츠로 브랜드에 좋은 영향을 미치는 디자이너가 되겠습니다! 저와 이노버즈 많이 응원해주세요! 
조회수 1103

프리랜서에서 마케팅 디자이너로

주식회사 마이쿤 '스푼 라디오' 서비스를 운영하는 회사엔 대체 어떤 사람이 근무를 하고 있을까?한 번쯤은 다들 그런 생각과 궁금증을 가진다. "저 회사엔 어떤 사람들이 근무 하는지 궁금하다!"스푼과 함께 하고자 하는 분들을 위하여, 그리고 서비스를 사용하는 유저분들과 공유하고자 '스푼을 만드는 사람들'을 한 명 한 명 인터뷰를 통하여 내부를 공개하기로 했다.완벽한 인싸템 장착 양말 어디서 사세요?재키를 떠올리면 가장 먼저 생각나는 건 바로 '양말'이다. 대체 어디서 저런 귀여운 양말들을 구매했을까? 싶을 정도로 귀엽고 예쁜 양말을 신고 출근하는 재키에게 물었다. "대체 양말 어디서 사세요? 양말이 정말 특이해요!"그러자, 재키는 이렇게 대답했다."제가 양말이 특이하단 말을 여기서 처음 들었어요. 제가 비닐 바지를 입고 다니는 것도 아닌데..."닉네임이 'Jakie'인 이유 1. 중성적인 이름, 성별이 가늠이 가지 않아서2. 짱구 극장판에 등장하는 비밀요원의 이름3. '재클린'이라는 이름에서 비롯됌(실제로 재키를 보면 재키라는 이름이 너무나도 잘 어울린다)재키의 자리마케팅 디자이너가 되기까지 Q. 재키는 스카우트 제안이 들어오셔서, 입사하신 걸로 알고 있는데 맞나요?"네, 맞아요. 저는 원래 그림을 그리던 프리랜서였어요. 강사에서, 프리랜서로 그리고 지금은 '회사원' 이 되었어요. 살면서 한 번쯤은 직장인도 해보면 좋지 않을까? 하는 마음에 입사 제안을 받아들였습니다."Q. 마케팅 디자이너로서의 삶은 어떤가요?"저는 사실, 그림을 그리는 사람이기에 '디자인'을 따로 공부한 적이 없었어요. 기획과 디자인은 다른 업무이니까요. 그림을 그리는 작업을 하는 건 동일하지만, 마케팅과 접목시키는 것은 또 다른 일이라고 생각해요. 마케팅 디자인은 저에게 새로운 세계이기도 하거든요. 그저 단순히 좋아하는 그림을 작업하는 것이 아니니까요. 디자이너로 소속되었지만 어느 정도의 마케팅 지식과 데이터를 볼 줄도 알아야 하기에 입사 후 많이 배우고 즐겁게 일하고 있습니다."Q. 어디서 영감을 얻나요?"저는 이전에 만들었던 작업물에서 영감을 얻는 편이에요. 관심 있던 전시회를 가기도 하고요."Q. 앞으로 해보고 싶은 작업은?"일본에서 더 많이 활용되고 있는 스푼 캐릭터 모코모니 캐릭터를 더 활용해서 작업하고 싶어요. 한국에서도 모코모니를 알리고 싶기도 하고요"나는 그림을 그리는 사람 원래 그림을 잘 그렸냐는 질문에 재키의 대답은, "어릴 때부터 그림 말고는 다른 일을 할 줄 몰랐어요" 라던지, 앞으로 만약 그림을 그리지 못하면 어떻게 할 것이냐는 대답에 재키는 무조건 이번 생은 '그림'이라고 답했을 정도로 그림에 대한 애정이 가득하다.당신의 회사생활이 궁금합니다 Q. 아침에 회사 오면 하는 일은?"아침에 출근하면 회사 카페테리아에 있는 컵밥을 먹어요. 원래 인스턴트 음식을 잘 먹지 않는 편이지만, 출퇴근길이 멀다 보니 아침식사를 회사에서 하게 되었어요. 주로 먹는 메뉴는 '날치알'과 '참치마요 덮밥' 정도?"Q. 회사 냉장고 최애템은?"우유를 마십니다. 원래 탄산음료를 안 좋아하기도 하고, 점점 나이가 들면서 건강해져야 한다는 생각이 들더라고요."Q. 입사 후 가장 기억 남는 에피소드는?"매 달에 한번 마지막 목요일에 회사엔 '피자데이'가 있어요. 저는 그 피자데이가 신선하기도 하면서, 가장 좋았던 점은 피자 브랜드가 바로 도미노 였기 때문이에요" (도미노를 좋아함)Q. 어떤 사람들과 일하고 싶으세요?저는 의사소통을 굉장히 중요하게 생각해요. 완만한 의사소통이 되는 사람들 그리고 저와 관심사가 다른 분야의 사람들과 작업해보고 싶어요. 다른 시각에서 또 영감을 얻을 수가 있으니까요. 만약 제가 누군가의 사수가 된다면, 저는 저 또한 배울 수 있는 후배이자 동료가 있었으면 좋겠어요.당신의 사생활이 궁금합니다.Q. 요즘 고민이 있다면?"저는 출퇴근길이 워낙 멀어서 그게 가장 큰 고민이라면 고민이에요. 그래서 항상 칼퇴를 하는데, 그것 말곤 없는 것 같아요 하하"Q. 본인을 한 마디로 표현하자면?헐크 - "맨날 화가 나 있어서요. 아침에 출근할 때도 퇴근할 때도(출근길) 그리고 녹색 아이템이 많거든요"Q. 스트레스를 받으면 어떻게 해소하세요?"저는 극한의 스트레스를 받으면 잠이 와요. 그게 안 좋다는 소리를 듣긴 했지만(?) 그리고 저는 게임을 해요. 심즈라던지 밭 일구고 농장 짓고 그렇게 마음이 편안해지는 게임들 있잖아요."재키가 그린 그림으로 제작한 굿즈 한국 마케팅 팀원들이 재키를 한마디로 표현한다면?Sunny 曰: 효자손 - 손이 닿지 않는 부분을 긁어주는 그런 존재Summer 曰: 허수아비 - 닮아서..Ted 曰:고추장 - 시간이 지날수록 매력이 남다름 하지만 그 매력 속에 톡 쏘는 맛이 은근히 있음Ringo 曰: 보리차 - 그냥 보았을 때는 정적이고 잔잔한데 얘기할수록 친절하고 구수하고 매력 있다.Jay 曰:가오나시 - 다른 차원에 존재하는 것 같아서 
조회수 852

아마존 시장 제대로 알기

안녕하세요 대한민국 셀러들의 성공적인 아마존 진출을 도와주는 컨설팅 회사이자 대행사인 컨택틱의 이이삭 대표입니다. 유통 공룡 아마존에 대한 얘기가 많습니다. 혹자는 드론을 이용한 배송, Alexa와 같은 음성인식 기술, 클라우드 컴퓨팅 기술을 제공하며, 실질적으로 아마존의 캐시카우 역할을 하고 있는 AWS 등을 언급하면서 말이죠. 하지만 제게 아마존을 단 한 단어로 정의하라고 한다면, ‘마켓 플레이스’ 즉, 시장이라고 얘기할 것입니다. 특히 글로벌셀러의 경우, 아마존이라는 시장은 다소 불편한 존재입니다. 왜냐하면, 일 년에도 수십 번의 정책 변경과 신규 정책 도입으로 인해, 판매 전략을 수립하는데 많은 자원을 들여야 하기 때문입니다. 따라서, 이에 제대로 대응하기 위해서는 아마존 자체를 이해해야 하는데, 이는 곧 제프 베조스 삶을 이해는 것에서 시작됩니다. 프린스턴 대학 졸업 이후, D.E SHAW라는 투자회사에 다니던 제프 베조스는 당시 놀라운 통계를 발견하게 됩니다. World Wide Web(WWW)이 한 달에 2300%나 성장하고 있다는 것이었죠. 그는 여기서 가능성을 보았고, 온라인 셀링에 대한 야망을 갖기 시작했습니다. 그렇다면 왜 제프 베조스는 왜 온라인 서점 형태로 아마존 사업을 시작한 것일까요? 전 세계에 있는 모든 상품을온라인 시장에 등록할 수 있기 위해서는 어떻게 해야 할까?위와 같은 고민을 하던 중 제프 베조스는 책에 붙어있는 바코드를 발견한 했습니다. ISBN. International Standard Book Number의 약자인 ISBN은 지금의 아마존 ASIN(Amazon Standard Item Number)의 모태가 되었다고 해도 과언이 아닙니다. 따라서, 이미 상품 등록하고, 입점을 진행해보신 셀러 분들은 왜 ASIN이나 SKU(Seller Keeping Unit)가 필요한지, 운송 보낼 때, 귀찮게 다른 바코드를 발급받아야 되는지 의문을 가지셨을 수도 있겠지만, 제프 베조스가 바코드 통일을 통해 전 세계의 상품을 등록하려 하고, 관리 측면에서의 효율화를 위해 했다는 것을 알게 되셨다면, 향후 직접 대시보드에서 작업을 하실 때, 그 피로감이 조금은 덜 하실 것이라 생각합니다^^( https://astrumpeople.com/jeff-bezos-biography)   시간이 지나 2008년, 전 세계 금융위기를 촉발했던 서브프라임 모기지가 발생하게 됐습니다. 2008년 금융위기는 최강의 구매력을 가졌던 미국인들의 소비 행태에 큰 영향을 미쳤습니다. 사치품에 대한 수요뿐만 아니라, 필수재에 대한 소비 지출까지 줄이려는 경향성은 아마존의 성장 궤도에 로켓을 달아주게 된 것입니다. 즉, 글로벌 금융위기 이후의 미국 소비자들의 구매 패턴 변화는 적자를 감수하더라도 시장 가격을 낮춘 아마존이 충성도 높은 고객을 확보함으로써 Lock-in 효과를 극대화할 수 있었던 환경이라고 할 수 있습니다.  이런 아마존은 2018년 7월 기준, 미국의 전자상거래 중 약 50% 미국 전체 거래의 5%를 차지하고 있을 정도로 성장했습니다.(eMarketer) 2018년 기준, 미국의 인구가 3억 2천7백만 명, 한국이 5천만 명이라고 할 때 인구 규모에서 6배, 소비자의 구매력 차이에서도 1인당 GDP를 비교해보면, 한국은 27,538 USD(2016), 미국은 57,466 USD(2016) 규모로 2배 이상이 차이 납니다. 이때, 놓치지 말아야 할 요인이  바로  Prime 회원 숫자인데요. 아마존 프라임은 연 99달러를(2018년 5월 기준, 119$로 인상) 내면 무료 배송과 음악, 영화, 책등의 콘텐츠를 즐길 수 있는 유료 멤버십인데, 그 회원 수가 무려 1억 명을 돌파했습니다. 투자은행 베어드에 따르면, 미국 내 아마존 프라임 회원은 일반회원보다 매년 600달러 이상 더 소비하기 때문에, 아마존 진출을 생각하고 계시는 글로벌셀러 분들은 이틀 내 배송이 가능할 수 있도록 하는 것이 중요하다고 할 수 있겠습니다. 참고로, 비 프라임 회원(프라임 회원이 아닌 고객)도 $25 이상 구매 시, 프라임 무료 배송(단, 이틀 배송은 아님) 혜택을 받을 수 있기 때문에, 저희 컨택틱에서는 FBA는 이제 선택이 아니라 필수라고 말씀드릴 정도입니다. 컨택틱의 모든 교육은 파트너인 글로벌셀러 창업연구소와 접수하고 진행합니다. 교육 신청은 아래 링크나 글로벌셀러 창업연구소의 홈페이지를 통해 접수 가능합니다. 강의 신청하러 가기!그럼 오늘도 즐거운 글로벌 셀링 되세요! 감사합니다.컨택틱 서울특별시 강남구 강남대로 62길 11, 8층 (역삼동, 유타워) 대표 전화: 02-538-3939 이메일: [email protected] 홈페이지: https://www.kontactic.com네이버 블로그: https://blog.naver.com/kontactic 카카오 브런치: https://brunch.co.kr/@allaboutamazon
조회수 2160

스켈티인터뷰 / 스켈터랩스의 스테로이드 서종훈 님을 만나보세요:)

Editor. 스켈터랩스에서는 배경이 모두 다른 다양한 멤버들이 함께 모여 최고의 머신 인텔리전스 개발을 향해 힘껏 나아가고 있습니다. 스켈터랩스의 식구들, Skeltie를 소개하는 시간을 통해 우리의 일상과 혁신을 만들어가는 과정을 들어보세요! 스켈터랩스의 스테로이드 서종훈 님을 만나보세요:)사진1. 스켈터랩스 스테로이드 서종훈 님Q. 진부한 첫 번째 질문, 자기소개를 부탁한다.A. 스켈터랩스에서 소프트웨어 엔지니어로 일하고 있는 서종훈이다. 연세대학교 컴퓨터과학과에서 HCI(Human-computer interaction)와 컴퓨터 비전(Vision)쪽 연구로 박사 학위를 받았다. 그리고 L모 기업의 AI연구소에서 일을 하다가 최근 스켈터랩스에 입사했다.Q. 어떻게 스켈터랩스에 입사하게 되었는지 궁금하다.A. 지인을 통해서 스켈터랩스의 여러가지 프로젝트에 대해 듣게 되었다. 스켈터랩스의 Inno Lab에서 진행 중인 프로젝트가 HCI와 가장 연관성이 깊고, 재미있는 디바이스를 구현하고 있어서 눈여겨 보다가 입사를 지원했다. 물론 프로젝트의 방향성이 나의 관심 분야와 일치하는지 뿐만 아니라, 함께 일하는 사람이 어떤 사람인지 알아보는 과정도 필요했다. 다행히 스켈터랩스에 지인이 있었고, 그의 소개로 하드웨어 엔지니어팀을 이끌고 있는 재경 님을 비롯하여 다른 팀원들을 미리 만날 수 있었다. 긴 대화 끝에 회사의 조직문화나 방향성의 결이 나와 맞는다는 생각을 했다. 뛰어난 개발자가 많기 때문에 내가 계속 성장해나갈 수 있는 환경이라는 점도 입사 결심을 굳히게 된 큰 요소 중 하나다.Q. 스켈터랩스에서는 어떤 업무를 맡고 있는가. A. 스마트 거울 샘(Samm)의 제스처 인식을 담당하고 있다. 이미지 인식을 기반으로 하는 작업이기 때문에 카메라로 구현을 하는게 맞을 지, 혹은 센서를 사용하는 것이 좋을지를 테스트하며 최적의 답을 찾아내려 하고 있다. 또한 엔도어 솔루션(Endor Solution, 공정 과정에서 부품의 결함을 자동으로 검출하는 솔루션)이 더욱 뛰어난 성능을 발휘할 수 있도록 개발에 참여하고 있다. 기존의 팀원들 모두가 딥러닝 경험이 풍부하다. 반면 전통적인 비전(Vision) 쪽 경험은 상대적으로 내가 더 풍부하기 때문에, 데이터처리나 고전적인 방법을 적용한 개발을 통해 엔도어 솔루션을 탄탄하게 보완하려고 한다. 텐서플로우(Tensorflow) 기반으로 기존의 팀이 일해왔다면, 나는 OpenCV를 통해 선행 데이터를 처리한다.사진2. 영화 <마이너리티 리포트>에 등장하는 G-SpeakQ. 비전 기술에 관심을 갖게 된 특별한 계기가 있었는지 궁금하다.A. 글쎄, 계기라고 말하기는 힘들다. 그냥 자연스럽게 HCI쪽에 관심을 가지게 되었고, 그러다보니 다양한 인터페이스를 구현하는 일을 맡아왔다. 당시 HCI가 붐이었고, 아이폰이 이제 막 세상에 등장한 시기이기도 했다. 그런데 HCI 분야의 개발을 지속할수록, 사람들에게 편리한 방식으로 원하는 것을 제공할 수 있는 분야에서 비전 기술은 필수라는 생각이 들더라. 웨어러블 디바이스를 사용하지 않고서도, 개개인의 행동을 관찰하고 그에 맞게 적절한 가이드를 제시하는 것은 모두 비전을 바탕으로 한다. 스티븐 스필버그 감독의 톰 크루즈 주연 영화 <마이너리티 리포트>를 보면, 톰 크루즈가 특수장갑을 착용한 채 스크린을 제어하는 장면이 등장한다. 양손을 사용하여 자유자재로 허공에 활성화시킨 스크린을 제어하는데, 이 장면은 단지 영화 연출이 아닌 실제로 개발된 기술에서 영감을 얻은 장면이다. 기술의 명칭은 ‘G-스피크(G-Speak)’. 이 혁신적인 기술을 개발한 존 언더코플러(John Underkoffler)는 영화 자문 이후, ‘오블롱 인더스트리즈(Oblong Industries)’라는 회사를 설립했다. 사실 ‘G-스피크'를 구현하기 위한 개별 기술들은 당시에도 굉장히 많았다. 오블롱의 차별점은 이 다양한 개별 기술을 하나로 통합한다는 점이다. 오블롱의 행보를 관찰하며, 비전 기술의 활용도에 대해 일종의 확신을 강하게 품게 되었다. NUI(Natural User Interface) 기술이 보편화되면, 기존 오퍼레이션 시스템 환경은 크게 변화할 것이다. 그때 일반 소비자에게 편하게 와닿을 수 있는 새로운 인터페이스를 선도하는 회사가 시장의 선도자가 될 것이고, 비전 기술은 시장 선도자의 핵심일 것이라고 생각하고 있다.Q. 여러 프로젝트에 동시에 참여하고 있기 때문에, 각 팀마다 업무 방식이 어떻게 다른지를 경험했을 것 같다. 그 이야기를 듣고싶다.A. 기본적으로 분위기가 굉장히 다르다. 엔도어 솔루션은 기업의 사설연구소의 느낌이랄까, 굉장히 학구적인 느낌이 강하다. 딥러닝과 관련된 많은 논문을 읽고 깊이 있게 연구하고자 한다. 많은 실험도 필수적으로 병행되는데, 내부적으로는 각 논문과 실험을 통해 얻은 인사이트를 정리하고 공유하고자 노력하고 있다. 이러한 과정을 통해 기존의 다양한 모델을 조합하고 자체적인 모델 개발을 통해 최적의 결과물을 구축하려고 한다. 반면 Inno Lab의 다양한 프로젝트는 오히려 내가 기대했던 스타트업스러운 느낌이 있다. 기존에 없던 디바이스를 만들어 내기 위해 다같이 아이디에이션 과정을 진행했다. 그리고 빨리 구현하고 피드백을 취합한 후, 다시 개발에 들어가는 과정이 꽤 다이나믹하게 이뤄진다. 현재 개발 중인 샘 덕분에 주변의 신기하고 재미있는 디바이스를 검색해보고, 직접 써보고 있는데 덕분에 굉장히 얼리어답터가 된 듯한 느낌이다.사진3. 종훈 님의 일하는 모습을 몰래 촬영해보았다Q. 동시에 결이 다른 두 개의 프로젝트를 진행하기가 어려울 것 같다.A. 어렵다. 그래서 나는 아예 프로젝트마다 기한일을 설정한다. 한 분야에 몰입해서 쭉 끌고 나가는 것이 내게는 더 맞는 느낌이라, 각 프로젝트의 PM과 상의하여 샘 개발에 15일까지 참여한다면, 월 말까지는 엔도어 솔루션에 참여하는 식으로 조정한다.Q. 이전 직장과 스켈터랩스의 업무가 어떻게 다른지도 궁금하다.A. 이제 스켈터랩스에 합류한지 3개월이 좀 지났는데, 크게는 두 가지가 가장 다른 점이자 만족스러운 점인 것 같다. 첫 번째는 일단 개발 환경이다. 스켈터랩스는 개발 환경이 굉장히 빠르고 선진적이다. 개발을 워낙 잘 하시는 분들이 많기 때문에 협업하면서 배울 점도 많고 협업을 통한 시너지도 강하다. 여러가지 툴을 똑똑하고 빠르게 잘 활용하는 것도 업무 효율을 크게 향상시키는 부분이다. 구글 드라이브, 깃허브(GitHub) 뿐만 아니라, 유트랙(Youtrack)과 같은 이슈트래커(Issue Tracker)도 적극 활용한다. 클라우드 환경, 빌드 환경 등도 모두 유연하게 잘 갖춰져있다. 이전 회사가 폐쇄적으로 운영되었던 부분이 있어서 상대적으로 이런 부분을 더 만족스럽게 생각한다. 스타트업인 만큼, 신기술에 대해서 팔로우하고 적용시켜 보려는 과정이 빠르게 일어나고 있는 점도 좋다. 두 번째는 ‘함께 하고 있다'라 느낌이 강하다는 것이다. 이전에는 워낙 프로젝트의 규모도 컸기 때문에, 각자 맡은 업무의 경계선이 분명하게 그어져있었다. 그러나 스켈터랩스는 잦은 미팅을 통해 함께 기획부터 참여하기 때문에 ‘우리의 것'을 만들어낸다는 느낌을 준다.Q. 스켈터랩스에서 가장 애정하는 조직문화가 있다면?A. 맥주를 먹으면서 일할 수 있다는 것(스켈터랩스에는 맥주 디스펜서가 구비되어 있다)! 다이어트를 하고는 있지만 워낙 맥주를 좋아하는 나로서는, 개발이 잘 안풀릴 때 맥주를 먹으면서 일을 할 수 있다는 것 자체가 만족스럽다. 매주 금요일마다 함께 모여서 회사의 여러 프로젝트 진행 상황을 듣고, 구성원에 대해서 알아보는 시간인 올핸즈(All-hands)도 좋아한다. 보통 다른 회사의 경우 정보가 총체적으로 전달되지 않고, 쪼개진 정보만이 내려오는 경우가 많다. 하지만 올핸즈 덕분에 회사의 정보들이 모두에게 공유될 수 있고, 또한 참여할 수 있다고 생각한다.Q. 비슷한 질문이지만 회사 자랑을 위해 하나 더 묻고싶다. 스켈터랩스에서 가장 자랑하고 싶은 점을 꼽는다면 무엇일까.A. 두 가지를 꼽고 싶다. 먼저 자유로운 문화라는 점. 한국에서 정말 몇 안되는 실리콘밸리의 분위기를 풍기는 곳이라고 생각한다(단순히 나만의 의견이 아니라, 실제 실리콘밸리에서 근무하는 친구가 사무실에 놀러왔을 때 ‘실리콘밸리 같다'라고 표현했다). 겉으로는 허름한 창고같은 사무실이지만, 문만 열리면 다른 세계가 펼쳐지는 듯한 느낌을 받을 수 있다. 자유롭게 의견을 내고 토론을 하는 문화도 이 사무실의 분위기와 일맥상통한다. 두 번째는 개개인의 실력이 높아서 정말 배울 것이 많다는 점이다. 그게 한편으로는 스트레스기도 하다. ‘내 밑천이 바닥나면 안될텐데'라는 생각에 책과 다양한 소스를 통해 끊임없이 자발적으로 공부하게 만든다. 실제 개발자 중 몇 분은 구글에서 개발자 레벨의 최고 등급을 받은 것으로 알고있다. 개발 실력은 당연히 코드에 묻어나온다. 다른 개발자의 코드를 보면서도 많은 영감을 얻을 수 있고, 코드 리뷰에 참여하는 것 만으로도 개발 실력이 향상될 수 있다.Q. 자유로운 출퇴근 문화지만, 종훈 님은 꽤 일찍 출근하는 편으로 알고 있다. 하루 일과가 궁금하다.A. 집에서 아침 시간을 여유롭게 즐기는 편이다. 여섯시에 일어나 아침 밥을 집에서 챙겨먹고 출근하고 있다. 일찍 출근할수록, 그 날 내가 목표로 한 업무를 빨리 마치고 퇴근할 수 있기 때문에 너무 늦게는 출근하지 않으려 한다. 덕분에 규칙적으로 일곱시 쯤에는 퇴근을 마치고 운동을 한다. 주말에도 주로 운동을 즐기는 편인데, 요즘에는 토요일마다 꼬박 꼬박 딥러닝 스터디를 하고있다. 나는 전통적인 비전(Vision) 연구를 해왔기 때문에, 딥러닝 쪽은 바탕 지식이 얕은 편이다. 업무를 진행하는데 큰 어려움은 없지만, 회사 프로젝트의 좋은 결과물을 내기 위해서는 딥러닝을 썼을 때 효율적인 부분이 크다. 때문에 많은 시간을 공부에 할애하는 것 같다.Q. 스켈터랩스 헬스동호회 스켈터 스테로이드의 수장으로 알고있다. 동아리를 소개한다면?A. 동호회를 만들게 된 계기는 단순하다. 새 회사에 왔으니, 새로운 몸을 만들겠다는 마음이었다. 사실 헬스는 누군가랑 같이 하는 운동은 아니지않나. 그래도 동호회원들 덕분에 ‘오늘은 그냥 좀 운동을 쉴까’ 싶다가도 누군가가 먼저 나서면 ‘그래도 빠지지 말아야지'란 생각에 꼬박꼬박 운동을 가게된다. 일주일에 두 번이니, 부담스럽지 않은 양이기도 하다. 내가 수장인 만큼 본보기로 열심히 나가야한다는 일종의 책임감도 꾸준히 운동을 이어나가는 원동력이 되었다. 날씨가 추워지면서, 다들 몸을 만들겠다는 의지가 약해져서인지 최근에는 참여률이 떨어지고 있다. 실내에서 할 수 있는 다양한 운동 종목을 더해, 참여를 높이는 방법을 고민 중이다. Q. 운동을 꾸준히 해오고 있는데, 헬스 동호회를 통해 목표했던 성취는 이루었는지 궁금하다.A. 동호회 소개를 하며 ‘이틀 밤을 새도 지지않는 체력을 얻어갈 수 있습니다'라고 공표했는데, 변명이지만 목표가 너무 거창했던 것 같다. 이틀 밤을 새도 지지않는 체력이 갖기 위해 갈 길이 멀다. Q. 이제 인터뷰를 마무리할 단계다. 스켈터랩스가 어떤 회사가 되면 좋겠는가.A. 앞서 말했던 오블롱 인더스트리즈나 센스타임(Sensetime)처럼, 확고한 기술력으로 시장의 선두주자가 되었으면 한다. 이를 위해서는 논문도 많이 내야할 것이고, 더욱 많은 개발자와 함께 기술을 더 깊게 파고드는 과정이 지속되어야 한다. 또한 스타트업으로서 시장의 성패와 상관 없이 가치있고 재미있는 개발을 많이 하면 좋겠다. 현재로서는 Inno Lab이 이러한 성격을 띠고 있다. 그래서 일단은 프로젝트 중 하나인 샘을 성공적으로 런칭하는 것이 나의 목표다.Q. 진짜 마지막 질문. 앞선 질문과 비슷하지만, 개인적인 꿈이 있다면?A. 오래 일하고 싶다. 나이가 들어서도 시장의 흐름을 읽고, 새로운 기술에 대한 충분한 이해와 개발력을 갖춘 사람으로 오래오래 일하고 싶다. 사실 일반적으로 개발자의 수명은 길지 않다. 그래서 창업에 대한 욕심도 품고 있다. 스켈터랩스의 CEO인 테드 님을 보면서 한편으로는 기업 운영 노하우를 배워나간다는 생각도 있다. 향후에는 스켈터랩스의 경쟁사를 내가 세울 수도 있지 않을까(테드 님이 이걸 보면 뭐라하실지 걱정이긴 하다).#스켈터랩스 #사무실풍경 #업무환경 #사내복지 #기업문화 #팀원인터뷰 #팀원소개 #팀원자랑
조회수 863

모바일 앱마케팅 시, 필수적으로 고려해야 할 4가지

기업 입장에서 모바일은 사용자 연결에 매우 강력한 수단입니다. 하지만 효율적인 앱마케팅 및 지속적인 관계를 유지하기 위해선 개인화, 편의성 등 세밀하게 신경써야 할 부분이 많습니다.1. 모바일앱은 모바일앱 답게모바일을 단지 데스크탑의 축소 버전으로 판단하고 데스크탑에서 제공하는 모든 기능을 작은 화면에 제공할 필요는 없습니다. 모바일 앱은 분명 웹하고는 다른 플랫폼이고, 사용자 역시 앱에서 기대하는 경험은 웹과 다릅니다. 데스크탑과 같이 페이지간 전환이 발생하면서 로딩되는 느낌을 제공한다면, 사용자에게 그 앱의 꾸준한 사용을 기대하긴 어렵습니다.사용자에게 정말 필요한 기능만을 중점적으로 제공함으로 사용자의 앱 사용 패턴을 단순화 해야 합니다. “The font game”이란 모바일 앱은 모바일에 최적화 된 디자인 예입니다. 굉장히 큰 버튼과 눈에 띄는 버튼(CTA), 그리고 핵심 기능만을 메인에 배치함으로 모바일 환경을 고려해 제작된 앱이라 볼 수 있습니다.  2. 기존 보유하고 있는 채널 활용하기2017년 스토어에서 발생할 앱 다운로드 수는 천억 건이 넘을 것으로 예상됩니다. 하지만 우리의 앱이 많은 다운로드가 발생하리란 보장은 없습니다. 그렇기에 마케팅이 필요한 것인데요, 마케팅을 새로운 채널에 비용을 들여하는 방법도 있지만, 이미 웹 등 타 채널을 운영중인 기업은 앱을 런칭할 때 적극 활용해야 합니다.꼭 앱 광고를 위한 프로모션 페이지가 아니더라도, 고객이 웹사이트에 방문했을 때, 모바일앱이 있음을 인지할 수 있도록 최적화 해야 합니다.‘Nordstrom’은 모바일 앱이 있었지만, 한줄의 텍스트 링크만을 제공하여 앱의 존재여부를 인지할 수 조차 없었습니다.반면, ‘Sephora’는 모든 페이지 하단부에 iOS 앱 다운로드 링크를 게재하여누구나 인지할 수 있고, 빠르게 스토어로 이동할 수 있도록 제공하고 있습니다.3. 어쨋든 앱을 쓰겠지라는 생각 버리기모바일앱 비즈니스가 성장하기 위해 가장 중요한 건 리텐션입니다. 하지만 대부분의 앱 사용자의 90%가 6개월 이내에 앱을 방치 또는 삭제를 합니다. 이를 해결하기 위해선 결국 사용자에게 앱을 정기적으로 사용할 수 있도록 동기부여가 필요하다는 말인데요. 이를 해결하기 위한 방법은 2가지 입니다.1) 직접 고객에게 답을 얻기이는 사용자가 모바일앱으로부터 원하는 것이 무엇인지 직접 묻는 것입니다. 왜 앱을 사용할까, 어떻게 앱을 사용할까, 언제 앱을 사용할까. 만약 이에 대해 대답하지 못한다면 고객 대상의 리서치가 필요합니다.2) 고객의 재사용을 위한 인게이지먼트 메커니즘을 만들기쉽게 말해 앱을 사용하는 고객만을 위한 베네핏을 만드는 것입니다. Walgreen의 경우 모바일 앱을 통해서만 발급하는 쿠폰을 운영 중이며, 이는 국내 소셜 커머스에서도 주로 활용하는 방법입니다..또한 사용자를 위해 꾸준히 개선하고 있음을 알릴 필요가 있습니다. 즉 정기적인 업데이트가 필요합니다. 이를 통해 사용자에게 앱을 재 인식 시키고, 업데이트 후 첫 실행 시, 기능 또는 메뉴 등 개선된 부분을 인지시키는 것이 좋습니다. 4. 모바일=개인화우리의 앱은 매일매일 고객 주머니에 함께 합니다. 이는 그들의 개인적인 의견을 알 수 있는 가장 완벽한 기회를 제공합니다. 이를 통해 기업은 고객에게 가치있는 것을 제공할 수 있습니다.그러나 많은 기업이 앱을 다운로드 하는 데만 투자하는 경우가 많습니다. 꾸준한 사용성을 고려한다면 고객의 반응을 빠르게 살피고 대응하기 위한 앱 내 커뮤니케이션 공간을 만드는 것도 방법이 될 수 있습니다.Urbanspoon의 경우, 앱 내 간편한 피드백 기능을 제공하는 커뮤니케이션 툴을 적용했습니다. 이를 통해 사용자가 앱 스토어 불편한 사항을 게재하기 떠나기 전에 미리 앱에서 소통하고, 빠르게 문제를 해결하는 방향으로 운영했습니다. 그 결과 앱 순위, 리뷰평, 리텐션 모두 긍정적인 성장을 거두었습니다.모바일앱은 강력한 채널이고 비즈니스 성장에 좋은 기회이지만, 그만큼 운영의 묘(妙)가 매우 중요한 채널이라 할 수 있습니다. 마케팅을 접하는 고객의 환경을 한번 더 고려한다면, 성공적인 모바일앱 마케팅 효과를 얻을 수 있을 것입니다.source : https://blog.kissmetrics.com/mistakes-in-app-marketing/ * WISETRACKER는 모바일 광고 성과 측정부터 In-app 이용자/컨텐츠 분석, 푸시메시지 최적화까지 지원하는 모바일 통합 분석/타겟팅 솔루션입니다. 와이즈트래커 솔루션의 무료체험을 원하실 경우 여기를 클릭해주세요.* WISETRACKER가 제공하는 무료 데이터 분석 컨설팅를 원하신다면 여기를 클릭해주세요.#와이즈트래커 #서비스소개 #앱마케팅 #데이터분석 #데이터트래킹
조회수 780

당신의 마케팅에는 고객경험을 고려한 시나리오가 있는가

작은 부탁의 힘가끔 마트의 장난감 진열대 앞에서 아이와 곤란한 줄다리기를 하고 있는 젊은 부부들을 볼 때가 있다. 평소 사고 싶던 장난감 앞에서 한 꼬마는 엄마에게 이렇게 물어본다.  “엄마, 저게 뭐예요?” (가끔, 저렇게 놀랍도록 뻔뻔한 질문을 하는 아이들을 보면 역시, 아이들에게 배울 것이 많다는 생각을 한다. )  그럼, 엄마는 이렇게 이야기 한다.  “아빠가 빨리 오래”  상황 파악이 된 아이는 그 자리에 풀썩 주저 앉더니 보채기 시작한다. 그리고 마법의 주문을 외우기 시작한다.  “엄마! 이번 한 번 만요!” 늘 이런 패턴을 알고 있는 부모지만 이 ‘한번만’이라는 마법같은 단어에 못 이긴 듯 결국, 장난감을 사주고 만다.  그런데 이런 대화는 비단, 아이와 부모 사이에서만 일어나는 것이 아니다. 영업이나 설득의 기술에 탁월한 이들을 보면, 애초에 부탁하고자 하는 것보다 더 어렵거나 들어주기 힘든 부탁을 전략적으로 건네곤 한다. 그리고 상대가 거절하게 되면 기다렸다는 듯이 부탁의 수준을 낮춰 작은 부탁을 제안한다. 그럼, 절반 이상은 거절할 수 없게 되는 것이다. 사실, 그 부탁이 원래 목적의 부탁인지도 모른 채 말이다.  그런데 더 놀라운 것은 이렇게 작은 부탁을 들어준 친구는 어느샌가 처음에 제시했던 큰 부탁도 크게 어렵지 않게 들어 줄 가능성이 크다는 것이다.  맥락에서 오는 실행력과 설득력마치 저것이 거절의 미안함을 스스로 없애기 위한 자기만족의 선택이라고 느껴지는가? 그렇지 않다. 고전에서도 많이 다뤄지고 있는 설득 법칙 중의 하나다. 바로, 자신이 한 행동의 방향성을 그대로 유지 시키고 싶은 관성의 법칙이기도 하다.  즉, 원인과 결과, 그리고 그 결과는 다른 행동의 원인이라는 이 맥락의 흐름을 파악하게 되면 어떻게 우리가 얻고자 하는 결과의 앞 단에 어떤 원인이 있어야 하는 지 알게 될 것이다. 더 나아가 원하는 결과를 얻기 위해 필요한 원인을 디자인하고 적절한 곳에 배치 시킬 수도 있을 것이다.  이런 모든 흐름들을 원인과 결과라는 맥락의 단위로 쪼개다 보면, 각 단계로의 진전에 자연스럽게 실행력과 설득력이 생기게 된다. 정말 쉬운 예를 들어보면 어떨까? 일찍 일어나고 싶다. > 일찍 잔다. 운동을 하고 싶다. > 운동을 하러 간다.  혹시 피식 웃는 이가 있을 지 모르겠다. 누가 이것을 모르나라고 할 수 있을 것이다. 혹시 알면서도 못 하는 것이라고 이야기 한다면, 한 번 더 원인을 만들어 보자. 그럼, 자연스럽게 ‘실행력’까지 생기게 될 것이다.  일찍 일어나고 싶다. > 일찍 잔다. > 무조건 7시 전에는 업무를 마치고 8시까지는 식사와 샤워를 마치고 9시 전에는 침대에 눕는다.  운동을 하고 싶다. > 운동을 하러 간다. > 정해진 시간에 친구와 헬스장에서 만나기로 한다.  물론, 원하는 결과를 얻을 수 없을 때도 있다. 운동을 하기로 한 친구의 연락을 차단하면 모든 것은 수포로 돌아간다. 다만, 저 원인들이 있다면, 운동을 할 가능성은 커진다.  고객이 행동을 맥락으로 바라보는 관점이런 맥락의 흐름을 마케팅의 관점으로 바라보면 어떨까? 쇼핑몰의 한 예를 들어보자. 구매를 하기 직전, 원하는 제품에 찜을 해두거나 장바구니에 담아두는 행동을 유도해보는 것은 어떨까. 그런 이전의 행동들을 해 본 유저는 구매까지 가는 과정이 어렵게 느껴지지 않을 것이다.  어느 오프라인 교육프로그램을 예를 들어보자. 오프라인 마케팅 과정이 있다면, 그 전에 pre-seminar를 진행하기도 하고 프로그램을 안내하는 웹사이트 페이지에 교육의 일부를 촬영하여 미리 보여줄 수도 있을 것이다. 해당 프로그램에 흥미를 느끼는 이들은 pre-semina에 참여하거나 영상을 보게 되며, 이런 행동은 본 프로그램 참여까지 관성 작용을 일으키게 될 가능성이 커진다.  이렇게 관성을 이용한 설득의 법칙을 페이스북과 같이 full-funnel 마케팅이 가능한 매체를 활용하면 그 효과가 더욱 커질 수 있다. 10초 정도의 짧은 영상으로 관심을 유발하고, 이에 반응했던 유저를 대상으로 캠페인의 full 영상을 보여준다. 긴 영상에도 일정 시간 시청하며 반응한 유저에게는 세일즈 전환 메시지를 다시 보여줌으로써 전환을 유도하게 된다. 아마 당신도 이런 full-funnel 마케팅에 반응한 경험이 꽤 많을 것이다.  고객은 어떠한 경험을 하는가 이런 맥락을 더 잘 활용하려면 어떻게 해야 할까? 당신의 고객이 특정 니즈를 가진 순간부터 최종 구매 완료를 하는 순간까지 어떤 경험을 하게 되는 지를 모두 관찰 할 필요가 있다. 그리고 그 과정을 작은 단위로 쪼개어 정의 할 필요가 있다. 작은 단위로 고객의 경험을 쪼개어 보면 어느 부분의 고객 경험을 향상 시켜야 할 지, 그 솔루션이 보이게 된다. 즉, 이런 과정의 연속이 마케팅 실행력을 성장 시키게 된다.  가령, 쇼핑몰의 메인 페이지에서 제품의 상세 페이지를 경험하는 과정에 고객이 있다고 하자. 마케터 입장으로는 메인 페이지에만 고객이 머물다가 사이트를 나가면 무의미하다. 단 한명이라도 더 제품, 서비스의 상세 페이지를 보게 만들어야 한다. 이 때, 상세페이지 확인이 가능한 썸네일 이미지 클릭이나, 배너 클릭이 이루어져야만 다음 단계로 갈 수 있다. 이 때, 해당 이미지나 배너는 고객이 클릭할 수 있는 요소들을 갖추고 있어야 한다. 단순 제품 이미지를 싣는 방법도 있을 테고, 직접 해당 제품을 사용하는 모습의 이미지가 들어갈 수도 있다. 사실, 어떤 이미지가 고객의 클릭율을 높일 수 있을지는 모른다. 다만, 해당 이미지나 배너는 클릭하고 싶게끔 만들어야 상세 페이지뷰가 많아진다는 것은 누구나 안다.  이런 생각의 흐름으로 쪼개진 고객 경험의 모든 구간에서 전환율 상승에 도움되는 모든 전략을 구성해 볼 수 있다.  고객의 경험에 따라 우린 어떤 메시지를 적절하게 줄 수 있는가 만약, 제품의 상세페이지에 유입된 고객이 후기 텝을 눌러 후기를 3가지 정도 읽어보고 구매 없이 나간 데이터가 많다고 생각해보자. 이들은 구매에 대한 의사결정으로 무엇을 주로 본다고 할 수 있는가. 두말 할 나위 없이 바로 후기다. 구매를 실패한 유저 외에 구매를 한 유저도 사전에 후기 콘텐츠 소비가 많다고 판단되면 고객에게 구매 전, 후기 확인이 매우 중요한 구매결정우선순위라고 이야기 할 수 있다.  그럼, 이 데이터를 기반으로 무엇을 해야만 하는가. 바로 구매는 실패했지만 유의미한 행동(후기 소비)을 했던 유저를 다시 사이트에 불러 올 필요가 있다. 바로, 리타겟팅이다. 바로, 이때 우린 어떤 메시지로 이들을 데려와야 할까? 바로, 후기다. 그들의 구매결정우선순위에 맞는 후기 콘텐츠를 통해 그들의 흥미를 다시 끌어야 하는 것이다.  고객을 다시 데리고 올 때, 혹은 신규 고객을 더 많이 유입 시키고자 할 때, 적절한 메시지는 바로 웹사이트에서 목표 전환 전, 유저가 가장 많이 해본 행동이나 소비한 콘텐츠의 내용이 된다. 흥미를 유발하는 콘텐츠는 이미 사이트 유입 전, 한 참 전에 사용되었어야 한다.  우리가 처음에 이야기했던 작은 행동으로부터의 힘은 바로 이렇게 연결된다. 작은 부탁이라도, 작은 행동이라도 그것을 실행하게 되면 관성의 법칙이 생긴다. 즉, 그 다음 요구되는 액션을 할 가능성이 높아지는 것이다. 마트의 시식코너나 화장품의 테스터는 이런 전략의 아주 기초적인 사례라 할 수 있다. 웹사이트에서 찜 버튼을 누른 이는 장바구니 버튼의 클릭을 더 잘 할 것이며, 장바구니 버튼 클릭 유저는 구매를 더 잘 할 것이다. 그래서, 더 작은 것부터 우린 제안해야 한다. 그리고 그 제안을 받아 들인 유저가 물 흐르 듯 흘러 갈 수 있게 그 다음 단계가 잘 준비되어 있어야 한다.  즉, 구매고객들의 구매결정우선순위에 맞춰, 작은 행동부터 요구하라. 이 작은 행동이나 부탁을 들어 줄 가능성은 당신의 본 제품이나 서비스를 구매 할 가능성보다 크다. 이렇게 처음부터 끝까지 고객 행동경험을 디자인하고 이 경험을 웹사이트 내부, 외부에서 모두 디자인하는 것을 시나리오 마케팅이라고 부른다. 자, 당신의 마케팅에는 시나리오가 있는가. 지금부터 한 번 고객의 경험을 A to Z, 모두 설계 해 볼 수 있길 바란다.  

기업문화 엿볼 때, 더팀스

로그인

/