스토리 홈

인터뷰

피드

뉴스

조회수 1711

코인원에서 가장 분주한 '우사인 볼트', 제가 맡고 있습니다! - 운영지원팀 최진웅

우사인 볼트가 세상에서 ‘가장 빨리 달리는 사나이’라면, 코인원의 진웅님은 ‘가장 분주하게 달리는 사나이’ 중 한명일 거에요. 코인원 고객들의 VOC를 실시간으로 수집하고 개발팀, 기획팀, 법무팀 등을 찾아가며, 실제로 서비스에 반영될 수 있도록 발로 뛰기 때문인데요. 오늘의 인터뷰는 진웅님과 함께 코인원이 지향하는 고객만족에 대한 이야기를 들어 볼 예정입니다.Q. 오늘도 코인원을 매우 분주하게 뛰어다니고 계신 진웅님, 자기소개 부탁드립니다.안녕하세요, 운영지원팀 최진웅입니다. 운영지원팀이라는 이름을 들으셨을 때 제가 어떤 업무를 하고 있는지 독자분들께서 바로 감잡았을거에요. 운영지원팀은 코인원 고객들의 최접점에 위치하고 있어, 고객센터와 블록스 등 여러 채널을 통해 VOC를 수집하고 저희 서비스를 편리하게 이용할 수 있도록 지원하고 있습니다.암호화폐 시장 특성 상, 365일 24시간 동안 거래할 수 있기 때문에 고객들의 서비스 이용 문의가 실시간으로 발생해요. 운영지원팀에서는 고객들의 거래기반을 탄탄하게 정립시키는 것을 목표로 하고 있기 때문에 다른 팀들에게 VOC (Voice of Customer)를 전달하며 분주하게 뛰어다니고 있죠. (참고로, 요새 살이 빠졌답니다?)Q. ‘운영지원팀'에서는 어떤 업무를 하고 있나요? 상세하게 설명해주세요. 기본적으로 ‘운영'이라고 하면 플랫폼과 서비스로 나뉘어서 생각해볼 수 있는데요, 저희 팀은 서비스에 중심을 두고 움직입니다. 운영지원팀은 코인원 고객들의 만족도를 향상시켜, 코인원에서 거래할 수 있는 거래기반을 탄탄하게 확립시키는 것을 목표로 하고 있어요. 운영지원팀에서 하는 일은 크게 운영기획, 일반고객관리, 이용자 보호 세 가지로 구분됩니다.먼저 운영기획에서는 VOC로 수집한 고객들의 피드백을 기능단계에서 정립하고, 개발팀과 기획팀 등 유관부서에 전달해 코인원 서비스까지 실질적으로 반영될 수 있도록 전달하고 있습니다. 일반고객관리에서는 여러 채널에서 수집된 VOC를 바탕으로 무중단으로 돌아가는 암호화폐 시장 속에서 고객들이 안전하게 거래할 수 있도록 돕고있어요. 마지막으로 이용자 보호를 위해 이상거래탐지, 보이스피싱과 해킹 대응 진행 등 고객들의 암호화폐 자산 오입금을 막기 위해 24시간 대기조로 활동하고 있습니다. 고객들의 VOC를 실시간으로 수집하고 있는 진웅님, 조금은 설정샷? ㅇㅅㅇQ. 운영지원팀이 특히 가장 밀접하게 협업하는 팀을 꼽자면 어느 팀일까요?아무래도 기술본부를 가장 첫 번째로 꼽을 수 있을 것 같아요. 코인원 서비스가 성장하는데 있어서 고객들의 피드백과 사용후기, 그리고 전반적인 CS문의는 상당히 중요한 역할을 하고 있어요. 특히 VOC로 수집된 피싱사기사례를 통해 고객들을 보호하기 위한 출금제한정책과 *FDS룰을 적용시켜 사고 예방률을  90~95% 정도 끌어올릴 수 있었습니다. 이를 통해 시중은행들과의 협조가 원만히 이루어질 수 있었고, NH농협은행과의 재계약 건도 성공하게됐죠!*FDS(이상금융거래탐지시스템, Fraud Detection System) : 전자금융거래 시 단말기 정보와 접속 정보, 거래 정보 등을 수집하고 분석해 의심스러운 거래나 평소와 같지 않은 금융 거래가 발생하면 이를 차단하는 시스템입니다. 'NH농협은행과 실명확인 계좌 제공 재계약' 기사 바로가기▼Q. 운영지원팀이 고객들의 VOC를 잘 반영하려면 다른 부서와의 협업이 정말 중요해 보이네요.현재 운영지원팀에서는 다양한 채널을 통해 코인원 고객들의 VOC를 수집하고 있습니다. 그래서 더욱더 다른 팀들과 발로 뛰면서 협업을 진행하는 것이 중요해요. 당연한 이유겠지만 누구나 급하게 암호화폐를 입출금해야 하는 경우가 있습니다. 코인원 고객들이 다양한 이유로 암호화폐 거래가 필요할 때, 오류가 생기거나 궁금증이 생기면 곧바로 해결해 드리기 위해 조금이라도 미흡한 부분은 지속적으로 모니터링하고 피드백을 통해 개선하고 있어요.Q. 암호화폐 거래소를 포함한 블록체인 업계가 날이 갈수록 발전하고 고도화되고 있지만, 여러 취약점을 이용한 사기 사례도 빈번하게 발생하고 있는 것 같아요. 코인원은 여기에 어떻게 대응하고 있을까요?암호화폐 시장에서 일어나는 금융사기나 자금세탁은 기존의 금융사기방법에서 보다 복잡하게 진화하고 있어요. 코인원은 소중한 고객자산 보호를 위해서 독자적인 코인원 이상거래탐지시스템 (Coinone - Fraud Detection System) 을 자체 개발해 적용하고 있습니다. C-FDS를 통해 평상시와 다른 거래 패턴이나 입/출금이 고객계정에서 발생할 경우, 이상거래 여부를 판별하여 피해를 최소화합니다.또한 암호화폐 출금제한 정책을 들 수 있어요. 기존 은행이나 증권사 같은 금융사에서는 건당 이체 한도, 일일이체한도, 자동화기기 인출제한 등을 통해 금융사기 피해를 줄이고 있어요. 반면에 암호화폐 시장에서는 출금제한이 정해져 있지 않거나, 한도 액수가 높게 설정된 경우가 많아 피해가 커지는 경우가 많았습니다. 이러한 이유로, 기존의 금융권에서 활동하던 금융사기범들이 피해금을 현금화하기 위해 기존의 대포통장과 함께 출금정책과 한도에 대한 모니터링등이 약한 거래소를 악용하기도 합니다.코인원에서는 이러한 어둠의 손길로부터 회원들의 자산을 보호하기 위해서 레벨에 따라 출금한도를 유동적으로 분류합니다. 이용자 본인여부를 판단하거나, 갑자기 고액을 출금하거나, 평소와 다른 매매패턴을 보이는 고객의 경우 C-FDS에 따라 이상유무를 판별하고 사용자의 이력들을 확인하여 대응하고 있어요.Q. 암호화폐 사기를 방지할 수 있는 진웅님만의 꿀팁을 독자분들에게 알려주실 수 있을까요?암호화폐 사기유형은 계속적으로 진화하고 있습니다. *피싱(Phishing), *파밍(Pharming), 명의도용, *워터링 홀(Watering Hole), 랜섬웨어 등 해커들이 정말 교묘하게 사이트를 만들면서 일반인들이 사이트의 거짓 유/무를 판단하기가 정말 어려워졌습니다. 코인원 고객들 포함 암호화폐 거래소 이용자분들께서는 정보를 비판적으로 바라보는 시각이 매우 필요합니다. ‘돌다리도 두들겨보고 건너자’ 라는 속담이 있죠? 공식사이트 출처인지 꼭 확인해보고 사이트를 이용하는 것이 필요합니다.본인인증수단과 관련된 모든 것들은 아무리 조심해도 지나치지 않습니다. OTP 설정과 비밀번호는 꼭!꼭! 주기적으로 바꿔주세요. 또한 이메일나 공유어플 등 해커들에게 해킹당할 수 있는 공간에는 개인정보를 남기지 않는 것이 좋습니다. 이 외에 궁금하신 사항은 언제든지 코인원 온라인 고객센터 및 코인원블록스를 방문해서 문의주세요!여기서 잠깐, 전자금융사기예방 상식!*피싱(Phishing) : 개인정보(Private data)와 낚시(Fishing)의 합성어로, 금융기관을 가장한 이메일을 발송하여 가짜사이트로 접속을 유도해 금융정보를 탈취합니다.*파밍(Pharming) : 악성코드에 감염된 사용자PC를 조작하여 금융정보를 빼내는 수법입니다.*스미싱(Smishing) : 문자메시지(SMS)와 피싱(Phishing)의 합성어로 문자메시지를 통해 악성코드를 스마트폰에 설치해서, 피해자가 모르는 사이에 소액결제 피해 발생 또는 개인/금융정보를 탈취합니다.*워터링홀(Watering Hole) : 표적 집단이 자주 방문하는 웹사이트에 악성 코드를 심어 놓고, 해당 웹사이트를 방문할 때까지 기다리는 해킹 수법입니다.코인원에는 진웅님이 있어, 언제나 든든합니다!Q. 실제로 거래소 운영지원팀에서는 어떻게 고객들의 거래기반을 다지고 있는지 들을 수 있는 유익한 시간이었습니다. 그렇다면, 진웅님께서 지향하는 고객만족의 최종목표는 무엇인가요?운영지원팀의 목표는 한마디로 말씀드리자면 우렁각시(?)가 되는거에요. 가장 좋은 서비스는 불편함이 없는 서비스, 혹은 불편함이 느껴졌다가도 바로 해결되는 서비스가 아닐까요? 저희가 고객들의 이야기를 듣고 문제점을 해결해 드리면서 얻는 만족감도 있지만, 정말 편하게 사용할 수 있는 서비스야말로 완벽한 서비스 운영이라고 생각합니다.현재는 블록체인과 암호화폐 산업이 초기단계라 기술적인 용어나 개념들이 생소해 딱딱하고 어려울 수 있습니다. 인터넷을 하기 위해 넷스케이프와 익스플로러를 배우던 시절에서 어느새 인터넷을 사용하는 시대로 넘어간 것처럼, 사용자들에게 필요한 것을 제공하고 쉽게 다가갈 수 있는 환경이 되도록 디딤돌이 되고 싶어요. 구체적으로는 고객들이 검색엔진에서 검색하듯, 편리하게 안내할 수 있는 가이드와 코인원 위키 등을 만드는 것을 목표로 하고 있습니다.운영지원팀 뿐만 아니라 함께하는 코인원 서포트는 물론 모든 코인원 조직들은 항상 최고의 고객만족을 위해 노력하고 있습니다. 언제나 개선점을 하나라도 더 찾아내서 고객의 의견과 목소리를 중시하는 조직이 되는 것이 될겁니다.코인원 온라인 고객센터 바로가기▼코인원 운영지원팀은 항상 최고의 고객 만족을 위해 노력합니다. 팀원 한 명, 한 명이 1건의 불편 사항도 놓치지 않으려 애쓰고 항상 고객을 행복하게 할 수 있는 아이디어를 쏟아내고 있어요. 고객의 의견과 목소릴 중시하며, VOC를 통해 코인원 서비스 개발과 고도화에 함께 힘쏟고 있습니다. 최접점에서 소통하는 운영지원팀, 앞으로 많이 기대해주세요!#코인원 #블록체인 #기술기업 #암호화폐 #스타트업인사이트 #기업문화 #조직문화 #팀원소개 #인터뷰
조회수 1537

꽃다운 스무살, 옐로오투오를 첫직장으로 선택한 '손지호 매니저'

안녕하세요, Y입니다! 오래 기다리셨죠~? 세 번째 옐로피플의 주인공은 넘나 사랑스러운 소녀 옐로인, 꽃다운 스무살의 옐로오투오 막내 손지호 매니저입니다! YO2O분들의 사랑을 독차지하고 있는 상큼한 그녀와 함께한 인터뷰! Y도 그 풋풋한 매력에 푹 빠지고 말았는데요, 첫 직장으로 옐로오투오를 선택한 손지호 매니저가 들려주는 옐로피플 스토리! 자 지금 만나보실까요?  (※ 세대차이 주의ㅋㅋ)Y: 안녕하세요! 옐블 독자들을 위해 간단히 자기소개 부탁 드려요!손: 안녕하세요, 옐블 독자 여러분! 옐로오투오 커머스 TF에서 기획과 운영을 담당하고 있는 막내, 손지호입니다. 반가워요! Y: 커머스 TF가 정확히 어떤 일을 하는 부서인가요?손: 최근 옐로오투오에서 피트니스나 숙박업소 등을 위한 쇼핑몰 서비스인 ‘옐로아이템’을 오픈했어요~ 커머스 TF팀은 옐로유통과 연계해서 판매도 하고 다른 벤더들과 협약을 맺고 상품 납품도 하면서 옐로아이템(http://www.yelloitem.co.kr)을 담당하고 있어요! 정말 한 달도 안된 서비스라 너무 바쁘지만 기쁜 마음으로 일하고 있습니다 :)Y: 와, 쇼핑몰 서비스라니! 그나저나 막내라고 하셨는데, 혹시 나이가….?손: 딱 20살 입니다! Y: 헐????? 어쩐지… 문 열리는 순간부터 거부할 수 없는 상큼한 기운이 느껴진다더니! 그럼 어떻게 옐로오투오와 인연이 닿게 되었나요?손: 저는 어릴 때부터 사회경험을 빨리 해보고 싶어했어요. 그래서 특성화고 진학을 선택했었고 고등학교 3학년 들어서부터 취업 준비를 시작했어요. 여러 회사에 지원서를 넣던 중에, 현 옐로오투오 로컬 사업부 부대표님이 학교를 방문해 강의를 하셨어요. 모바일 시장의 초창기부터 옐로오투오 설립 스토리, 국내외 오투오 시장 전반에 대해 흥미진진한 설명을 해주셨는데 그 때 오투오 분야에서 일해보고 싶다는 확신이 들었죠. 마지막으로 하셨던 말씀이 아직까지 기억에 남아요. “목표를 먼저 잡고, 기회를 잡아라!” Y: 와.. 한창 취업 준비로 복잡했을 지호 매니저님에게 뭔가 방향을 제시해 준 셈이네요. 그럼 그 이후로 옐로오투오에 지원한 건가요? 손: 네. 강의가 끝나고 부대표님께 지원해보고 싶다고 말씀 드렸더니 그 자리에서 15분 정도 급 면접을 보게 됐어요. 정말 갑자기 보게 된 면접이라 어찌나 떨리던지…… 그래도 그 동안 준비했던 대로 차분하게 진행했더니 본사에서 한번 더 면접을 보자고 기회를 주시더라고요. 최종적으로 합격해서 작년 12월에 입사하여 7개월째 많이 배우며 일하고 있습니다!! ㅋㅋㅋY: 첫 직장생활에 전사 막내라! 뭔가 고충이 많을 것 같은데요^^; 손: 막내라서 힘든 점은 없어요! 오히려 다들 우쭈쭈 해주셔서 신나게 다니고 있어요. 다만 사회 나와서 첫 직장생활인데 처음 오픈하는 서비스 TF팀에 들어가게 된 거잖아요? 죄다 처음 배우는 건데 너무 한꺼번에 많은 걸 배워야 해서 그게 좀 어려운 점이 있죠. 그렇지만 정말로 어디 가서 이런 경험을 할까 싶을 정도로 많은 것을 배우고 있어요. 결과적으론 제게 큰 도움이 될 거라 믿어요! Y: 아니 갓 스무 살인데 이렇게 어른스럽다니… 옐로에서 막 굴린다고 투덜댔던 거 급 반성하게 된다는…ㅠㅠ 그럼 반대로 언제 가장 큰 보람을 느끼나요? 손: 말씀 드렸다시피 여기 와서 디자인, 기획, 운영 등 모든 것을 처음 배웠어요! 처음으로 시도했던 디자인이 반영이 되어 사내 공지 레터로 발송이 됐는데 정말 뿌듯하더라고요. Y: 디자인까지 직접!! 정말 일당백이시네요! 여기서 기습 질문! 옐로오투오에서 본인의 외모 순위는?! 손: (당황) 어… 오투오에 워낙 예쁘신 분들이 많아서…Y: 겸손은 사양한다! (단호박)손: 어… 아무래도 제가 어리니까 스무살의 풋풋함으로는 1등이라고 생각합니다! (손지호님의 회피스킬이+10 추가되었습니다)Y: ㅋㅋㅋㅋㅋㅋ넘어갈게요! 풋풋함으론 1위인걸로~  Y: 다음 질문 드릴게요! 업무 하시다가 생긴 재미있는 에피소드가 있나요? 손: 아직 사내 메신저가 없어서 카카오톡을 쓰고 있는데, 제 카톡 비밀번호가 “사랑해1” 이었거든요. 업무 공유를 위해 카톡 비번을 입력하고 들어갔는데 글쎄 ‘사랑해1’가 회사 단톡방에 올라가 있는 거예요 ㅠㅠ 한동안 팀원들이 절 마주칠 때마다 “나도 사랑해요”라며 놀려댔었죠. 당장 카카오톡 비밀번호를 바꿨던 기억이…Y: 세상에……카톡이 잘못 했네요ㅋㅋㅋㅋ 덕분에 오빠들이 좀 설레었겠어요!ㅋㅋㅋㅋ Y: 그런데 카톡을 보니 엄청 다들 친해 보여요! 옐로오투오의 사내문화는 어떤가요? 손: 네! 맞게 보셨어요~ 가끔 퇴근 후 팀 단위로 다과회를 했어요. 같이 맛있는 거 먹으면서 개인적인 얘기도 하고 업무에 대한 고민도 털어놓으면서 친해지는 계기가 됐어요. 그러다 보니 자연스레 수평적인 구조가 형성된 것 같아요. 이 다과회에서 아이디어 회의도 같이 했는데 수평적인 구조 덕분에 서로 편하게 아이디어를 내고 토론하기도 했어요! Y: 엥? 아이디어 회의요? 이거 이거 업무의 연장선 같은 느낌적인 느낌인데요~~손: 아니예요ㅋㅋㅋ놀면서 하는 회의 아닌 회의라서 더 독특한 아이디어도 나오고 그래요!  Y: 엄청난 열정과 애사심이 느껴지네요! 멋집니다:) 그럼 마지막으로 옐로오투오/옐로모바일에 바라는 점이 있다면? 손: 저는 지금과 같은 자유로움이 너무 좋아요. 앞으로 회사가 더 커져도 이런 분위기가 유지됐음 좋겠어요. 그리고 저처럼 고등학교 졸업하고 바로 취업을 준비하는 분들이 많아요. 국내 많은 대학에서도 이런 학생들을 위해 고등학교 졸업 후 3년간 회사에서 근무하고 대학교에 입학하는 ‘선취업 후진학’ 제도를 운영 중이에요. 옐로모바일에서 이런 분들에게 많은 기회를 주셨으면 해요! 
조회수 3029

KBS 신입사원 입사후기 - [장아련] 한 시절의 미완성이 나를 완성시킨다(방송경영(경영기획) 편)

딸과 많은 시간을 보내지 못한 아버지가, 암으로 딸을 먼저 보낸 후 쓴 책 <딸에게 보내는 굿나잇 키스>. 그 한 구절을 인용하자면 다음과 같습니다. “딱 한 번이라도 좋다. 낡은 비디오 테이프를 되감듯이 그때의 옛날로 돌아가자. 나는 펜을 내려놓고, 읽다 만 책장을 덮고, 두 팔을 활짝 편다. 너는 달려와 내 가슴에 안긴다. 내 키만큼 천장에 다다를 만큼 널 높이 들어 올리고 졸음이 온 너의 눈, 상기된 너의 뺨에 굿나잇 키스를 하는 거다.” ‘후회’라는 한 단어로는 미처 담지 못할, 딸을 잃어버린 아버지의 진심을 전하는 말입니다. 감히 딸을 잃은 아버지의 마음에 빗댈 수는 없겠으나, 이와 같은 후회가 남지 않도록 끊임없이 마음에 되새겼던 이 말 덕택에, 저 역시 이번 길을 완주할 수 있었습니다. 완주 후 숨을 고르고 있는 지금, 정보 부족, 적은 인원, 높은 경쟁률, 자격증, 스펙 등 많은 언덕들과 싸우기 위해 준비하고 계신, 혹은 이런 언덕들로 인해 지쳐있을 누군가를 위해 조금이나마 도움이 될만한 문장들을 적어보고자 합니다. 1% 차별성을 만들자. 방송사를 준비하시는 분들의 경우 엄두도 못 낼 높은 스펙과 역량을 갖고 계신 경우가 대부분입니다. 그 가운데서 저는 휴학 없이 달려온 대학교 4년, 경영 또는 언론과 관련 없는 학과, 방송 경험 부재의 상태에서 3개월이라는 상당히 짧은 기간 동안에 KBS를 준비해야 했습니다. 그래서 자신만의 차별성으로, 자신만의 존재감을 드러내기 위해 저는 오히려 방송사 입사의 정석이라고 알려진 길만을 가지 않도록 노력했습니다. 모두들 방송과 관련된 경험들로 자기소개서를 채워나갈 때, 방송과는 전혀 상관 없는 밴드나 법 동아리, 지리, 교생 실습 이야기 등으로 자기소개서를 작성하며 오롯이 저의 이야기를 전달하는데 집중했습니다. ‘형식이 너무 과감하다’, ‘소재가 위험하다’는 주변 사람들의 만류에도 제 방향에 확신이 있다면 이를 포기하지 않았습니다. 소위 KBS에 들어오기 위한 ‘높은 정량’에 속하지 않음에도 서류 전형을 통과할 수 있었던 건, 바로 이런 시도들에 있지 않았나 예상합니다. 우리나라의 법에서 모든 죄를 열거하기 보다 특정 죄목을 법관의 재량으로 해석할 수 있도록 허용하는 이유는, 지나치게 원칙을 지키다 보면 오히려 허점이 드러나 선량한 피해자가 발생할 수 있기 때문입니다. 선배님들의 훌륭한 입사 사례도 분명 도움이 되겠지만, 이를 바탕으로 본인에게 가장 적합한 방법을 찾고, 그 속에서 본인의 차별성을 드러낼 수 있는 방향을 잡는 것이 필요합니다. 정답이 없는 경쟁. 필기 과정을 보며 들었던 첫 번째 생각입니다. 어마한 경쟁률을 뚫어야 한다는 것도 무서웠지만, 도대체 ‘상식’과 ‘논술’이라는 이 모호한 과제를 어떻게 준비해야 할 지가 더 난감했습니다. 부족한 시간 속에서도 이를 극복할 수 있는 방법이 필요했습니다. -상식 공략 방안은, 자신만의 정리 본을 만드는 것입니다. 사실 상식 시험은 스터디에서 각 분야의 지식들을 취합하는 경우가 대부분이었습니다. 분명 효율적이겠지만, 성향이 다른 개인들이 모여 취합하다 보니 나타나는 단점도 있었습니다. 그래서 저는 서점에 가서 상식에 대한 여러 책들을 비교한 뒤, 넓은 범위를 심도 있게 다루는 책 한 권을 선정했습니다. 그리고 책에 나오는 용어들을 스스로 정리하여 한 권을 마스터하는데 중점을 두었습니다. 여기에 최근 이슈들은 여러 언론사들의 기사를 취합하여 보충했습니다. 실제로 제가 상식을 많이 맞은 편이 아니라서 확언하지는 못하겠으나, 그래도 약술(5문제)과 객관식(35문제)이 혼합된 상식 시험에서 평균 점수라도 받을 수 있었던 건, 해당 방법 덕택이라 생각합니다. -논술 공략 방안은 자신만의 논리 구조들을 끊임없이 재생산해내는 것입니다. 논술에서 어떤 주제가 나올 지는 정말 미지수이기에, 어떠한 주제가 나오더라도 근거로 사용할 수 있는 소스들을 최대한 많이 보유하는 것이 중요합니다. 가령 로이터, AP에서 시행하고 있는 ‘팩트 체크 전담팀’ 소스를 ‘신뢰도 회복’이라는 주제에 맞춰 구조화했다면, 이는 ‘가짜 뉴스에 대한 대응 방향’라는 주제에도 하나의 근거로 활용될 수 있고, 나아가 팩트체크 전담팀-> 신뢰도 및 저널리즘의 회복-> 2030세대의 유입의 논리 구조로도 이어질 수 있습니다. 이렇게 최대한 많은 소스들을 접하고자 노력하고, 해당 소스들을 여러 개의 논리 구조로 만들어보고자 노력했습니다. 또한 항상 글을 쓸 때 ‘포용, 인내, 주관, 긍정’의 뉘앙스가 많이 풍기던 글을 보다 명백히 전달할 수 있도록 논술을 작성하는 내내 ‘객관, 비판, 비난’의 눈을 되새긴 것이 큰 도움이 되었습니다. 상황을 주도하는 작가가 되자. 면접 상황에서 주도권을 잡는 방안을 고민하시면 좋겠습니다. 사실 면접관님들이 저희에게 어떤 질문을 던질 지는 알 수 없습니다. 아마도 그 날의 상황, 이전 면접자의 대답, 혹은 면접관님들의 가치관 등등에 따라 영향을 받을 겁니다. 이 모든 걸 대비하여 예상 질문을 만들고, 예상 답변을 만들어 암기하는 것은 비효율적이라 생각합니다. 대신 간략한 답변 속에서도 면접관님들이 궁금해 할 만한 trigger들을 본인의 답변 안에서 만드는 연습을 계속 하시는 것이 더 중요합니다. 면접 시뮬레이션도 중요하지만, 한 질문에 대해 trigger들을 심어놓고, 그 trigger들로 면접관님들을 유인하여 본인이 준비한 답변을 말할 수 있도록 해야 합니다. 그저 준비한 질문들이 나오기만을 바라기보다는, 본인이 면접 상황을 구성해나가는 작가라 생각하고, 본인이 원하는 방향으로 면접을 이끌고 가야 할 것 같습니다. 나아가 자신에 대한 성찰도 필요합니다. 꼬리에 꼬리를 무는 질문들을 끊임없이 던져야 합니다. ‘왜 여타의 언론 기관이 아닌 방송국을 택했는지’, ‘방송국 중에서는 왜 하필 KBS인지’, ‘KBS라는 방송국 내에서 PD, 기자 직군이 아닌 경영을 택한 이유는 무엇인지’ 질문했습니다. 보기에 그럴 듯한 답변이 아닌, 스스로가 인정할 수 있고, 스스로를 합리화시킬 수 있으며, 스스로가 당당한 답변을 준비하기 위해 노력했습니다. 그리고 그런 진심이 분명 최종 면접에 통했다고 확신합니다.  하고 싶은 일을 평생의 업으로 할 수 있다는 축복을 받은 제가, 아직은 그 준비과정에 있는 분들께 조언의 말씀을 드리는 것 자체가 어불성설이라는 점을 잘 압니다. 그러기에 제가 전해드리는 이 작은 글들이 완주의 유일한 길이 아니라는 것만은 꼭 알려드리고 싶었습니다. 그러나 꼭 얘기하고 싶은 한 마디는, 본인과 본인의 인생이 특별함 그 자체를 증명하고 있다는 사실입니다. 확률이 지나치게 낮은 이 시험에 도전하다 보면, 완벽하게 준비하기 위해 시험에 나를 맞추고, 부족한 나의 모습을 비난하고, 완벽하게 준비하지 못한 자신을 탓하기도 합니다. 허나 완벽하지 않고 조금 서툰, 미완성의 답변과 인생이 오히려 더 매력적으로 다가오는 순간이 있을 겁니다.  ‘나는 오래 멈춰있었다. 한 시절의 미완성이 나를 완성시킨다.’는 이훤 시인의 시처럼, 지금의 미완성을 너무 탓하지 말고 훗날을 기약하시길 바랍니다. 아주 부족한 제가 길을 완주한 만큼, 글을 읽고 계시는 여러분 모두들도 분명 무궁한 가능성이 존재할 거라 생각합니다. 동일한 축복을 함께 누릴 수 있는 날이 오기를, 동료가 되어 함께 발맞추어 투닥 거릴 수 있는 날이 오기를, 진심을 담아 기대하고 고대하겠습니다.#한국방송공사 #KBS #KBS공채 #KBS신입채용 #KBS채용 #입사후기
조회수 2682

모바일 데이터 분석의 시작: AARRR (해적지표)

모바일 분석의 중요성은 익히 들어 알고 있지만, 모바일 데이터를 실제 비즈니스에 어떻게 활용해야 하는지 모르겠다고 말씀하시는 고객 분들이 많으신데요. 모바일 분석 툴을 이용하여 아무리 많은 데이터를 쌓더라도, 그것이 실제 비즈니스 목표 달성에 도움이 되지 못한다면 무용지물일 것입니다.오늘은 데이비드 맥클루어의 유명한 분석 프레임워크 AARRR 에 따라 비즈니스 목표를 달성하기 위한 모바일 데이터 분석 활용법을 알아보겠습니다.* AARRR: 미국의 스타트업 엑셀러레이터 500 Startups를 이끌고 있는 데이브 맥클루어 (Dave McClure)가 개발한 분석 프레임워크. 스타트업에서 시장 진입 단계부터 서비스/제품을 홍보하고 사용자를 확보하기 위해 단계별로 집중해야 할 지표를 정리한 성과측정모델. (1) Acquisition (사용자 유치) – 사용자가 어떻게 제품을 접하는가?  모바일 앱을 출시하고, 마케팅을 진행할 때 어떤 광고 채널/캠페인이 가장 효과적인지 파악하기 위해서 어떤 데이터들이 필요할까요? 흔히 가장 많은 앱 설치수나 방문수, 페이지뷰를 일으킨 광고 채널/캠페인이 효과적이라고 생각할 수 있는데요. 하지만 데이비드 맥클루어에 따르면 해당 비즈니스에 의미 있는 이벤트 수를 가장 많이 발생시킨 채널/캠페인에 예산을 집중해야 합니다. 예를 들어, 특정 채널에서 유입된 사용자들의 앱 설치수나 방문수가 높다고 하더라도 비즈니스에 핵심적인 회원가입수, 주문수가 낮다면 효과적인 채널이라고 볼 수 없겠죠. 이 때문에 와이즈트래커에서는 마케팅 채널/캠페인별 앱설치수, 방문수, 페이지뷰 뿐 아니라 비즈니스별 맞춤 성과 (회원가입수, 예약수, 리뷰수, 공유수 등) 전환 데이터를 제공합니다.→ 해당 데이터에서 Facebook과 Google Adwords 광고를 통한 App 설치수는 비슷하지만 주문수 ( 페이스북: 205, 구글: 3 ) 는 크게 차이가 납니다. 이러한 경우, Adwords 광고보다는 Facebook 광고에 마케팅 예산을 집중해야 합니다.  이 뿐 아니라 마케팅 채널 별로 앱 설치 이후에 재사용율 및 삭제율을 Retention 리포트를 통해 제공하기 때문에 어떤 마케팅 채널이 고객들 유치 및 활성화에 효과적인지 파악할 수 있습니다.→ 페이스북으로 유입된 사용자의 Retention 리포트입니다. 앱 설치 이후에 재사용율보다 삭제율이 높아 개선이 필요한 상황입니다.  마지막으로 위의 내용을 통해 가장 효과적인 채널을 파악했다면, 그 채널로 유입된 사용자들이 어떤 사람인지 파악해 보다 효과적인 타겟팅 마케팅을 진행할 수 있습니다. 와이즈트래커의 다차원 세그먼트 기능을 이용하면, 해당 채널에 유입된 사용자의 성별, 연령, 사용국가, 기기 플랫폼 등을 파악할 수 있습니다.→ WISETRACKER 다차원 세그먼트 설정 화면. 광고를 통해 유입된 사용자들을 설정한 세그먼트에 따라 일차원 또는 다차원으로 나누어 볼 수 있습니다. 위와 같이 기기 플랫폼 (IOS vs Android) 과 성별로 다차원 세그먼트를 설정하면 아래와 같은 데이터가 나타납니다.   (2) ACTIVATION (사용자 활성화) – 사용자가 처음 제품 시 경험이 좋았는가? 사용자들이 광고 혹은 특정 경로를 통해 앱을 설치했다 하더라고, 첫 방문 시 사용 경험이 나쁘다면 앱을 삭제하거나 다시 방문하지 않을 확률이 높습니다. 우리 서비스가 유저들에게 만족스러운 경험을 제공하는지 확인하기 위해서는 아래와 같은 데이터 지표를 확인해야 합니다. 첫번째로 화면 이동경로 리포트를 통해, 사용자들이 첫 화면 이후에 앱 기획자가 의도한 화면대로 문제없이 이동하고 있는지를 확인할 수 있습니다. 예를 들어, 메인화면 이후에 서비스/상품 페이지가 아닌 엉뚱한 화면으로 이동하는 비율이 높다면 앱 UI/UX 개선이 필요하겠죠.→ WISETRACKER 화면 이동경로 화면 더 나아가, 전환 퍼널 분석을 통해 각 화면 경로 별 전환율과 이탈율을 분석할 수 있습니다. 4단계로 이루어진 회원가입 전환 경로 분석 시,  2단계에서 이탈률이 높다면 해당 단계에서 고객에게 너무 많은 정보를 기입하게 하거나 민감한 개인 정보를 요구하는 것일 수도 있습니다.→ WISETRACKER 전환 시나리오 화면. 회원가입의 2단계 (가입인증) 단계에서 이탈율이 38.8% 로 가장 높기 때문에 해당 단계에서 인증 단계를 간소화 하기 위한 작업이 필요합니다.   위의 정보들을 통해 우리 서비스가 고객들에게 긍정적인 사용자 경험을 주고 있는지 지속적으로 확인하고, 서비스를 개선해나가는 작업이 필요합니다. (3) RETENTION (사용자 유지) – 사용자가 제품을 계속 사용하는가?사용자가 지속적으로 앱을 방문한다는 것은 그 서비스에 관심이 많다는 의미이므로 추후 의미 있는 전환을 일으킬 가능성이 높습니다. 와이즈트래커의 Retention 리포트를 통해 사용자들이 앱 설치 후 지속적으로 사용하는지, 혹은 방문 후 1~2일 내에 삭제하는지 확인 할 수 있습니다. 만일 앱 설치수는 꾸준히 늘어나는데, 앱 유지율 및 삭제율 또한 점차 높아진다면 처음방문자들에게 앱 서비스가 크게 매력적이게 다가오지 않는다는 의미로 볼 수 있겠죠.→ WISETRACKER의 Retention Report. 1월 12일부터 15일까지 앱 설치수는 크게 늘어나고 있지만, 설치 다음 날(+1d) 앱 삭제율도 증가하고 있기 때문에, 소비자들이 지속적으로 앱을 사용하도록 서비스 개선이 필요한 상황입니다.     이 뿐 아니라 방문 횟수, 방문 분포 리포트를 통해 얼마나 자주 사용자들이 우리 앱을 방문하는지 확인할 수 있습니다. 만일 매일 들어오는 사용자의 수가 제일 많다면, 서비스의 충성고객이 많다는 의미로 볼 수 있습니다. 반대로 15-30일 주기로 들어오는 사용자가 많다면, 이들의 방문을 촉진할 수 있는 이벤트나 프로모션을 푸시메시지로 진행하는 방안을 생각해 볼 수 있습니다.→ WISETRACKER의 방문간격 Report. 방문간격이 0일(매일 방문)인 사용자 비율이 높은 것으로 보아, 앱 충성고객 비율이 높은 것을 알 수 있습니다.  앱 사용자 분석을 통해 우리 비즈니스의 가치고객의 특성을 파악했다면, 특정 사용자 그룹을 대상으로 타겟팅 마케팅을 진행할 수 있습니다. WISETRACKER의 오디언스 타겟팅을 이용하여 데모그래픽, 행태정보, 관심사에 따라 사용자의 ADID/IDFA를 추출하고, 해당 사용자에게만 광고를 노출하거나 푸시메시지를 보내는 것이 가능합니다.→ WISETRACKER의 Audience Targeting 설정 페이지. 위와 같은 설정을 통해 1월에 앱을 설치한 IOS 그룹의 IDFA만 추출하여 광고 노출 및 푸시메시지 전송에 이용할 수 있습니다.  또한 전송된 푸시메시지의 응답률과 실행수 전환분석이 가능하기 때문에, 사용자 방문수와 전환수를 높이는 효과적인 메시지를 파악할 수 있습니다.→ WISETRACKER 푸시메시지 분석 리포트 (4) REVENUE (매출) – 어떻게 돈을 버는가?모바일 비즈니스의 매출 향상을 위해서 앱 내 사용자가 주문을 하도록 만드는 동시에 어떤 사용자들이 가장 많은 돈을 쓰는지 파악해, 유사 사용자들을 대상으로 마케팅을 진행하는 작업이 필요합니다.와이즈트래커의 주문/매출액 리포트에 다차원 세그먼트 기능을 적용하여 주문 고객들의 성별, 연령대, 방문유형, 유입 채널들을 파악해 비즈니스의 가치 고객군을 파악할 수 있습니다.→ 주문/매출액 리포트를 회원 연령대로 세그먼트를 나누면, 아래와 같이 주문한 사용자들의 연령대에 따른 주문수 데이터를 알 수 있습니다.  또한 고객들의 구매 횟수 분포 및 구매 행동 패턴을 파악하여, 앱 내 프로모션 진행 시 활용할 수 있습니다. 예를 들어, 구매 주기가 7일인 사용자가 다수라면, 해당 주기에 맞춰 할인 쿠폰을 푸시로 보내거나 신상품을 소개하는 이메일을 보낼 수 있겠죠마지막으로, 매출 측면에서 가장 인기가 많은 상품과 컨텐츠를 파악해, 앱 내 관련 컨텐츠/상품을 빠르게 업데이트하고 종류를 늘려간다면 같은 기간 내 보다 높은 매출을 기대할 수 있습니다.→ WISETRACKER 상품별 주문/매출액 리포트. (5) REFERRAL (추천) – 사용자가 다른 사람들에게 제품을 소개하는가? 앱 출시 후 비즈니스의 빠른 성장을 위해서는 제품/서비스에 무심한 고객 10000명을 만드는 것보다, 제품과 서비스를 사랑하고 충성도가 높은 고객 100명을 만드는 것이 더 효과적이라고 하죠. 왜냐하면 그 100명은 자신들의 친구와 지인들에게 서비스를 적극적으로 홍보하기 때문에 장기적으로 10만명, 100만명의 고객을 불러올 수 있기 때문입니다.우리 상품/비즈니스가 사용자로 하여금 사랑하고 싶고 매력적인 서비스로 어필되도록 노력하는 것이 가장 중요하고, 그 다음엔 사용자들이 온라인에 쉽게 공유하고, 바이럴할 수 있도록 서비스를 개선해야 합니다.만약 SNS 공유수가 낮다면, 이들에게 적절한 보상을 제공하는 마케팅 방안도 생각해 볼 수 있습니다.마무리하며결국 AARRR 단계별 중요 지표를 데이터로 파악하고, 개선점을 찾아 빠르게 실행하고 업데이트한다면 비즈니스 목표를 달성할 수 있습니다.아직까지 많은 기업들이 추측이나 감을 통해 중요한 의사결정을 내리고 있습니다. 와이즈트래커의 목표는 이러한 고객들에게 데이터를 기반으로 보다 현명한 의사결정을 내릴 수 있도록 돕는 것입니다. 비즈니스 목표를 보다 빠르고 쉽고 달성하고 싶다면, 오늘부터 우리 비즈니스에 핵심적인 지표들부터 데이터 분석을 시작해보는 것이 어떨까요? * WISETRACKER는 모바일 광고 성과 측정부터 In-app 이용자/컨텐츠 분석, 푸시메시지 최적화까지 지원하는 모바일 통합 분석/타겟팅 솔루션입니다. 와이즈트래커 솔루션의 무료체험을 원하실 경우 여기를 클릭해주세요.* WISETRACKER가 제공하는 무료 데이터 분석 컨설팅를 원하신다면 여기를 클릭해주세요.#와이즈트래커 #AARRR #해적지표 #데이터분석 #데이터트래킹
조회수 1763

옐로의 시조새, 옐로쇼핑미디어 '김태묵 매니저'

안녕하세요, 매력 덩어리 옐로 구성원을 발굴해 소개하는 사내기자 Y의 옐플 인터뷰, 그 11번째 이야기! 이번 주인공은 바로 옐로모바일의 시조새 혹은 화석으로 통하는 YSM 마케팅 본부 김태묵 매니저 입니다. 눈물없이 들을 수 없는 사옥 이전 이야기부터, 프로 인스타그래머가 추천하는 가로수길 맛집을 지금 확인해보세요!   Y: 안녕하세요! 옐블 독자들을 위해 간단히 소개 부탁 드립니다 김: 안녕하세요, 옐로 가족 여러분! 옐로쇼핑미디어 마케팅 본부에서 일하고 있는 김태묵입니다. 반갑습니다 Y: 마케팅본부에서는 어떤 일을 하시나요? 김: 우선 내부와 외부에서 노출되는 광고들을 운영하고 효율적으로 관리하며 YSM 서비스 ‘쿠차’등의 마케팅을 담당하고 있습니다. 또 대행사들과의 원활한 커뮤니케이션도 저희 본부 몫이죠. 현재는 9명이서 재미있게 일하고 있어요 Y: 쿠차에는 어떻게 입사하게 되었나요? 김:  제가 대학교 졸업할 때쯤 소셜커머스 붐이 일어났어요. 그때 우연히 쿠차를 알게 됐는데, 비즈니스 모델이 굉장히 매력적이더라고요. 여기서 일하면서 커리어를 쌓고 싶다는 생각에 지원했습니다. Y: 옐로모바일 시조새 중 한 명이라고 들었어요!김: 뭐…시조새, 삼엽충, 화석 등등 여러 가지로 불리고 있습니다:) 사실 쿠차에 2012년 초에 입사를 했으니,옐로모바일의 탄생과정을 지켜본 몇 안 되는 실무진 중 한 명이죠. Y: 옐로모바일 초반에 기억나는 일이 있나요?  김: 아시다시피, 옐로모바일의 첫 사무실은 순탄치 않았어요. 에어컨이 고장 나서 여름에 어찌나 고생을 했는지.. 다시 생각해도 눈물이 나려 그러네요ㅠㅠ 그러다가 신사동 건물로 이사를 오게 됐는데, 당시 함께 하고 있던 쿠차, 굿닥, 우리펜션 등에서 한 명씩 나와서 사무실 배치를 돕기로 했죠. 그런데 이삿짐 센터에서 짐들을 다 1층에 놓고 가버린 겁니다.. 그래서 현장 답사 차원에서 나온 직원 분들과 함께 그 많은 짐을 다 옮겼죠. Y: 세상에…! 사옥 이전을 직접 한 셈이네요. 김: 네.. 여기 사무실 대부분의 것들에 제 땀과 눈물이 베어 있다는 걸 기억해주세요 ㅋㅋㅋㅋㅋ농담입니다ㅋㅋ Y: 태묵님의 취미는 무엇인가요? 김: 거의 운동 중독이라고 할 수 있을 만큼 운동을 좋아해서 일주일에 적어도 여섯 번은 헬스장에 갑니다. 이렇게 거의 6년간 야근이나 회식을 해도 운동을 하고 있어요. Y: 헐…6년이라니! 자기개발 끝판왕으로 인정합니다! 김: 변화가 눈으로 보이니까 중간에 그만둘 수가 없더라고요. 그래서 유지하기 위해 꾸준히 노력하고 있습니다.Y: 그나저나 먹스타그래머로 유명하다고 들었는데, 가로수길 추천 맛집 알려주세요! 김: 프로 먹스타그래머로서 허세샷이 가능한 곳으로 추천 드리자면, ‘감성타코’와 ‘델러스바베큐’가 있습니다! 맛도 있지만 인스타에 올리기 정말 적합한 음식들이 나오죠 Y: 지금 회사와 함께 하며 좋은 점은 무엇인가요?김: 사실 스타트업에서 TV광고를 할 수 있는 기업으로 성장하는 게 흔치 않아요. 이런 흔치 않은 기회를 직접 현장에서 지켜보며 저도 함께 성장할 수 있다는 게 큰 장점이죠. 또 굿닥, 알람몬과 같이 함께 마케팅 분야에서 코웍할 수 있는 계열사들이 많아 좋습니다 Y: 옐플은 피해갈 수 없는 질문! 옐로모바일 서비스 중 가장 자주 이용하는 서비스는? 김: 지하철과 알람몬은 정말 매일매일 쓰는 앱입니다. 그리고 국내 여행 갈 때 필수 서비스는 우리펜션! 직원 할인도 많이 적용돼서 저렴한 가격에 좋은 펜션을 이용할 수 있습니다 Y: 입사 후 기억나는 에피소드가 있나요?김: 제 작년 말에 사내카페에서 송년회를 했는데, 거기서 지누션과 엄정화의 ‘말해줘’ 노래로 장기자랑을 했어요. 저는 엄정화 역할이었고요. 반응이 뜨거웠죠ㅎㅎㅎ Y: 엄정화라니! 엄청난 반전인데요? Y: 2016년이 얼마 남지 않았어요. 올해 안에 이루고 싶은 것이 있나요? 김: 쿠차에서 조만간 오픈 예정인 서비스들이 있어요. 남은 기간 동안 준비를 잘 해서 유저들이 많이 찾는 서비스가 되도록 하겠습니다!   Y: 마지막으로 앞으로는 어떤 일을 해보고 싶으신가요? 김: 마케팅 시장이 빠르게 변하고 있거든요. 그런 변화에 잘 적응해서 좋은 마케터가 되고, 더 나아가 남들이 시도하지 않았던 새로운 서비스를 론칭하고 싶어요. 쿠차와 쿠차슬라이드, 많이 이용해주시고 응원 부탁 드립니다! 감사합니다
조회수 1626

스파크랩 투자 유치, 그리고 우리가 집중해야될 목표.

투자 확정은 9월 21일이였다. https://www.facebook.com/hyunil.filab/posts/1424721077604707?pnref=story그리고 9월 25일, 오늘 역삼 스파크 플러스 1호점으로 사무실에 입주했다. 지문 등록도 하고 회의실도 예약해서 앞으로 우리의 목표에 대해서 팀원들에게 나의 생각을 공유했다.올해는 어떻게든 BEP를 맞춥시다. 자생적으로 살아남아야 됩니다. 그러면 우리는 우리가 하고 싶은 걸 하면서 더 큰 미래를 만들 수 있을 겁니다.한번 더 글로벌 액설레이터가 필요하다면 다음 목표는 YC입니다. 사실 우리는 이미 YC에 온겁니다. YC 배치에서는 운동과 일만 합니다. 우리는 우리가 이루어할 공동의 목표를 잊지 않고 여기에 몰입하면 반드시 달성할 수 있습니다.그래서 우리의 목표는 올해 BEP를 맞추는 것이다. 10월, 11월, 12월 3개월 안에 맞출 수 있을까? 현재 팀원 4명 풀타임, 1명 파트 타임. 우리가 타겟하고 있는 강남 고객(특히 청담동의 페르소나)을 월 7건만 유치하면 (7마리 분양)가능하다고 판단된다. 7건을 위해서 무엇을 해야되는가? (핵심 활동 1)브리더 인터뷰 콘텐츠 포스팅, 2)메세지 아웃바운드 영업, 3)데일리 입양 가능 자견 포스팅) 4)퍼널 들어와서 매칭 안된 고객 계속 추적)1. 브리더 인터뷰 콘텐츠 확보 월 15개 포스팅, 이틀에 하나 꼴로 인터뷰 포스팅. (가능하면 더 많이) (이는 동시에 브리더 소싱/선별/영업이 동시에 이루어져야 하므로 가장 시간이 많이 드는 작업이다.)2. 시간날 때마다 인스타 다이렉트 메세지 영업  실험(매일 10명을 목표로)  (페이스북 메세지 효율은 상당히 좋았다. 타겟팅이 안되서 실제 전환까지는 힘들었지만.)3. 매일 입양 가능한 아이들 [부견-모견-자견] 1개 세트 업로드하기 ( 현실적으로 브리더 수에 따라 이것이 가능하기 때문에 힘들 수도 있다. 따라서 SKU를 최대한 중복 없는 느낌으로 잘 포스팅해서 피드 노출을 극대화 해야된다고 생각된다.)4. 우리의 이탈률은 [1] '가격'과 [2] '지속적인 응대 실패' 가 제일 컸다. 고객이 원하는 강아지라면 그 가격대에 살 수 없어서 다른 곳에서 강아지를 선택하는 경우가 이탈 대다수였다. (가끔 외모가 마음에 안들어서 이탈하는 경우도 종종) 이 문제는 참 어렵다.. 구찌와 같은 브랜드십과 퀄리티를 유지하면서도 가격은 몇십만원에 팔아야 된다는 의미다.. 이건 많이 고민중이다. [2]에 대해서는 우리가 좀 더 신경을 기울이면 충분히 수익으로 전환시킬 수 있는 부분이라서 신경써서 해야될 것 같다. +알파,오프라인 타겟 마케팅을 전통적인 방법으로 꾸준히 실험하면서 효율을 최적화시키는 것을 수시로 병행. 파트너십을 활용한 효율적인 노출(특히 예를 들어 분양 추천에 대한 문의가 꽤 있는 청담 우리 병원을 통한 모객), 그리고 리드를 넓히기 위한 각종 활동으로 고객이 유입되었을 때 퍼널을 계속 추적, UX를 계속 개선시키고 웹페이지가 어드민 시스템으로 가기 이전에 랜딩에서 충분히 후킹될 수 있는 디자인 작업과 글귀가 빠른 시일 내에 완성이 되어야 할 것 같다. (10월달) 그리고 SBA 프로그램에 10월 말 데모데이에서 마케팅 자금을 따와서 이제 돈을 태워보며 A/B테스트를 해봐야될 것 같다.2018.01.01 당당하게 달성했다는 글을 쓸 수 있도록...!!!우리가 받은 투자는 론치 투자라는 것을 받았다.나 혼자 생활비만 써도 겨우 겨우 살아갔는데 같이 일하는 팀원들까지 있으니 처음에 식비(회식비)라도 책임지자라는 마음에 애견샵에서 알바하는 것을 마음 먹었지만 ROI도 너무 안좋고 그렇게 강아지 판매&관리 하는 건 단 하루도 못 버틸 것 같았다. 그래서 내가 선택한 것은 "창업경진대회 알바" 였다.상금을 타면서 현금 500만원을 모았고 (큰 걸 한방했어야 하는데.. 짜잘한 것에서 1등 많이 해봤자...) Cj 올리브 네트웍스에서 주최한 경진대회에서 126팀 중 2등을 했고 거기 심사위원으로 있었던 스파크랩 대표님이 페오펫에 가장 좋은 점수를 주셨다. (여기서 창업허브 입주 공간도 얻게 되어 사실 사무실이 2개..) 그 인연으로 이렇게 스파크랩과 인연이 되었다.스파크랩 데모데이 6기 블로그 포스팅스파크랩 데모데이 8기 블로그 포스팅대학생때부터 스파크랩 데모데이에 갔다. 이 행사는 내 가슴을 정말 미치게 뛰게 만들었다. (지금도 나도 뭐 휴학한 대학생이지만...) 매번 나는 스파크랩 데모데이를 갈 때마다 저 무대에 반드시 오를 거다. 조금만 기다려라. 를 외쳤었다. 근데 생각보다 빨리 그 미래가 왔다. 상상의 힘은 강력하다. 먼 미래를 앞당기니깐.요즘 내가 자극받고 있는 사진, 휴대폰 잠금 화면페오펫은 하루 빨리 세계 시장에 뛰어들려고 한다. 우리의 가치를 한국 사람들에게만 알리는 것은 매우 안타깝다. 전 세계를 놀라게 만들고 싶다. 그리고.. 그를 통해 더 많은 사람들이 더 높은 꿈을 꾸게 만들고 싶다. 가치를 넘어서 영감을 주는 기업을 설립하고 싶다.상상의 힘은 강력하다. 먼 미래를 앞당기니깐.우리는 입양(분양)만으로 절대 안끝난다. 입양하고 난 뒤에 열리는 그 시장에서 우리의 독보적인 시장을 만드는 것을 목표로 한다. 내가 그리고 우리가 페오펫이 그렇게 생각하고 그렇게 할거기 때문에 그렇게 될거다. 그냥 그렇게 믿고 현재에 집중하는 것이다. 분양과 이커머스는 분명 다른 두 개의 사업이다. 그럼에도 불구하고 분양을 접점으로 브리더분들의 브랜딩을 통해 이커머스에서 새로운 도약을 만들 수 있는 기회가 분명히 존재한다고 상상하고 있다.상상한다고 비용이 드는 건 아니니깐. 꿈은 크게 꾸고 작고 빠르게 행동하자. 모든 일이 다시작은 미약하지만 끝은 창대하지 않는가. 그 거대한 비전을 상상하며 가능한 빨리 실패를 해보는 것이다. 한번 성공하면 계속 성공시킬 수 있다고 믿고 있다. 페오펫의 첫 성공을 통해 우주의 커다란 흔적을 남길 수 있는 여정의 계기가 되었으면 한다.#페오펫 #peopet #투자유치 #IR #자금조달 #자금유치 #스타트업 #생존기 #경험공유
조회수 1503

2018 왓챠 송년회 (feat. 왓챠데미 어워드) : Watcha, Inc.

2018 왓챠 송년회 (feat. 왓챠데미 어워드)아카데미 어워드를 방불케했던 제1회 왓챠데미 어워드2018 왓챠 송년회를 지금 바로 만나보세요  제법 연말 분위기가 나는 왓챠 사옥잠시후 이곳에서 세상 어디에도 없는 시상식이 열린대요 아름다운 술로 가득 찬 냉장고무려 김포에서 날아왔어요시상식이라고 멋지게 빼입은 왓챠인들드디어 시작된 시상식(와아)올 한 해 가장 많은 술자리를 도모해왓챠 직원들의 간 수치를 높이는데 기여한 사람에게 주는 우루상과연 누가 받게 될까요?“나야?”모두가 예상한 영광의 주인공은 버즈!건강 챙기시라고 우루* 챙겨드렸어요취향매칭률이 가장 높은 두 사람에게 주는찰떡궁합상은 데이지와 매튜가 받았어요.두 분 다 행복해 보여요취향 매칭률이 가장 낮은 취향존중상의 주인공은 케빈과 메이.두 분 협업에 참고바랍니다.올 한 해 가장 많은 갬블 참여로손모가지 날아갈 상을 받은 그린도박 신고는 국번없이 13361년 중 무려 42일을 꼬박 왓챠플레이를 감상한 매튜는감상을 수상해 감을 받았어요상이 조금 억지스러워 보인다면 그건 당신의 착각(번외) 가장 긴 출퇴근 길로하루하루를 여행처럼 살아가는 케빈..보부상을 수상해 캐리어를 받았어요이제 출퇴근길도 문제 없겠어요이 밖에도 한 해동안 왓챠에서 활발하게 활동하신 분들께다양한 시상이 진행되었어요.– TMT상(ben) : 슬랙에서 최다 멘션한 사람상품 : 왕 엔터키– 밥상(Elaine) : 슬랙 #hungry 채널 최다 이니시상품 : 레알 밥상 – 왓챠さん(kay) : 한 해 동안 슬랙에서 ‘왓챠’를 가장 많이 외친 사람상품 : 확성기– 타짜상(jeremy) : #z_gamble에서 가장 높은 승률을 보인 사람상품 : 화투– 빙다리 핫바지상(dora) : #z_gamble 에서 가장 저조한 승률을 보인 사람상품: 기모바지(핫바지…)– 콜바넴 상(ben) : 한 해 슬랙에서 가장 많은 태그를 당한 사람상품: 멘션 거부 1일권– 올해의 스타상(hazel) : 올 한 해 왓챠에 가장 많은 별점을 남김 사람상품: 별과자 –  책상(Lyla) : 올 한 해 왓챠 도서에 평점을 가장 많이 남긴 사람상품: 펭귄북스 굿즈세트시상식 후엔 랜덤 선물 추첨 타임포장만 보고 가져가는 눈치 게임 시작다들 궁금하지만 가져가지 않은가장 큰 선물을 용기있게 pick난방 가성비 갑 뽁뽁이!모두가 부러워했어요“뭔데, 뭔데”그가 절규하는 이유는?(체념)다들 정신없이 흡입중도란도란완벽한 타인..?술자리에서_먼저_잠들면.jpg2018년 진짜 안녕~2019년도 열심히 달릴테니 지켜봐주세요!
조회수 1069

스타트업에게 투자보다 더 중요한 것, 고객만족

상담을 진행하다 보면, 구매자(=고객 = 클라이언트, ※ 넷뱅 사이트에서는 판매자와 구매자로 회원이 나뉜다)님이 제게 털어놓는 고민은 업종을 떠나서 정말 다양합니다.여러 번 다른 곳에서 사기를 당해 극도로 조심스러워, 시작을 머뭇거려하는 케이스, 다 좋은데 작업 마감기한이 빠듯해서 빨리 좀 적합한 작업팀 좀 찾아달라는 케이스, 예산도 여유롭고, 시간도 충분한 데 본인이 원하는 기능이 꼭 되어야 한다고 고집하지만, 그건 상상으로만 가능한 일이라 결국에는 사업기획을 변경해야 하는 케이스, 세세하게는 모바일웹 페이지를 만들지 네이티브 앱을 만들지 고민하는 케이스, 정부 지원금을 받아 채용을 했는데, 오히려 그 지원금이 사장님의 족쇄가 되어 직원들이 말을 안 듣는다는 케이스, 온라인 홍보마케팅 비용으로 매월 몇백 이상을 태우지만 광고대행사가 제대로 일을 하는건지, 안하는건지 도통 모르겠다는 케이스 등등 다양한 케이스를 접하게 됩니다.  크게, 돈 문제, 사람 문제, 시간 문제, 퀄리티 문제 등으로 나뉠 수 있겠네요.이 분들의 고민을 해결해주는 것, 만족스런 작업물을 손 안에 쥘 수 있게 저희가 손 닿는 한, 도와드리는 것.설령 분쟁이 생겨 잘잘못 시비를 가릴 때 중재해서 양쪽 다 피 흘리는 것을 최대한 줄이는 것.바쁠 뿐더러 이 분야 전문지식이 없을 땐, 전속 담당자 배정을 요청해서 프로젝트가 끝날 때까지 케어 해드리는 것.우리 회사는 '해결과 고객만족'에 가치를 두고 있습니다.넷뱅이라는 회사를 창업하면서, 학교에서도 배우지 못한 것을 터득한 것이 있다면 그건, 기업을 성장시키는 근본은 잘 만들어진 서비스/제품도 아니요, 딱 들어맞는 사업모델도 아니요, 든든한 돈줄인 자금도 아니요, 영업력, 마케팅도 아니요, 호흡이 잘 맞는 팀원들도 아니요, 멋진 회사 이름도 아니요, 멋진 사무실은 더더욱 아니요, 바로 사용자(고객)이라는 것입니다.내 고객이 누군지 알고, 그들의 고민이 우리의 고민이 되고 그분들의 불편함을 해결해줄 수 있는 무언가를 제공해주는 것. 더 나아가, 기쁘게 하는 것이 무엇인지 늘 고민해야 합니다.초기 고객을 확보하고 흡족시켜서 재구매를 유도하는 것이 초기 사업의 성공에 아주 중요한 요인이 됩니다.  매출로 직결되기 때문이죠.  영화 라라랜드를 일곱 번 봤다는 사람도 있듯이, 재구매는 만족의 증거이고 입소문은 돈 안드는 진짜 바이럴 마케팅입니다.   고객을 기쁘게 하면, 고객이 영업사원 한 사람의 역량보다 더 나을 수도 있습니다.매일 한 명씩 감동한 한 명의 고객이 자기 지인에게 소개한다면, 한달 동안 신규고객은 얼마가 될까요.  배가 아니라 제곱이 됩니다.  고객만족도 X 회사 연차수는 회사 성장속도와 비례합니다.마케팅 업계 20년차 지인의 말에 의하면  사람들이 '아~ 나 들어본 것 같아'하는 정도가 되려면 적어도 마케팅 비용을 월 4천만원씩 3개월 간 질러야 한다고 합니다.  최소 1억이 필요하다는 말인데, 이 금액은 스타트업에겐 1년 매출액도 안되는 기업이 허다합니다.  오히려, 어설픈 페이스북 관리, 블로그 운영관리 보다는 마케팅 예산이 책정되어 있다면 그 돈을 고객관리에 쓰라고 하고 싶습니다.굳이 돈쓰며 휘발성 강한 온라인 마케팅 하지 않아도 되는, 고객이 한 번 체험해보고 '우와' 할 수 있게 하는 힘이 있는 우리 회사에게 있는가를 늘 자문해야 합니다.  마케팅과 영업이 중요하지 않다는 게 아니라, 순서가 달라져야 한다는 겁니다.  마케팅을 하기 전에, 내 고객들은 충분히 만족을 하고 있는지 알아야 합니다.  스타트업 대표에게, 펀딩, 씨드머니, 투자, 너무나 매력적인 단어입니다.  그러나, 고객이 내 서비스/제품을 알게된 순간 부터 후기를 달기까지의 모든 과정이 체계화, 시스템화 되지 않은 상태에서, 내 고객이 어디에 뿔나 있는지 모르면서 돈으로 마케팅을 지르는 건 밑 빠진 독에 물 붓기 아닐까요?#넷뱅 #스타트업 #스타트업창업 #고객가치 #고객중심 #고객사랑
조회수 1135

나의 첫 번째 사업 이야기

내 첫 번째 사업은 초등학교 때 했던 만화책 대여 사업이었다. 거창하게 사업이라고 말하면 쑥스럽지만, 어쨌든 돈거래가 일어났던 엄연한 비즈니스였다. 난 어렸을 때 만화책을 정말 좋아했다. 동네 만화방에 거의 살다시피 했고, 그래서 동네 만화방에서 VVIP 고객이었다. 그 시절에는 비디오가 귀했고, 만화방에서는 만화를 볼 때마다 쿠폰을 주었고 쿠폰을 모아 오면 비디오를 상영할 때 볼 수 있도록 해주었다. 하지만 죽돌이 수준의 VVIP 고객이었기 때문에 쿠폰 없이도 언제든지 내가 원할 때 비디오를 볼 수 있었다. 난 그 정도로 만화책을 좋아했다.만화책을 좋아하다 보니 자연스럽게 만화책을 사고 싶었다. 하지만 부모님은 책은 사주셨어도 만화책을 사주지않으셨다. 그리고 집안 형편이 넉넉지 않아서 만화책을 살만큼의 용돈을 받을 수는 없었다. 그래서 생각한 것이 만화 대여사업이었다. 내가 원하는 만화책을 사서 이걸 친구들에게 대여해서 돈을 벌어 다시 그 돈으로 내가 원하는 만화책을 다시 사는 것이었다. 딱히 돈을 벌기 위해서 한 것은 아니고, 단순히 만화책이 너무 갖고 싶었기 때문에 시작한 사업이었다. 만화 대여업에 대한 개념은 이미 만화방의 고객으로 터득하고 있었기 때문에 '업'의 개념은 충실히 알고 있었다. 지금 기억으로는 꽤 사업이 번창했고, 내가 원하는 만화책을 많이 살 수 있었다. 하지만 나의 첫 번째 사업은 얼마 가지 못했다. 사업의 번창으로 사모은 만화책이 화근이었다. 아버지에게 발각된 것이다. 아버지는 무슨 돈으로 이 만화책을 산 것인지 물어보았고, 난 나의 사업에 대해서 이야기할 수밖에 없었다. 아버지는 친구 간에 돈을 받고 물건을 빌려주는 것이 옳지 않다고 하셨고, 나의 첫 번째 사업은 그렇게 허무하게 문을 닫았다.나의 아버지는 평생 장사를 하셨다. 하지만 내가 장사 혹은 사업을 하는 것을 바라지 않으셨다. 내가 커서 박사 학위를 받고 교수가 되기를 원하셨다. 나도 그러한 아버지의 꿈을 알고 있었고, 나도 그 길이 멋있어 보였기 때문에 그 길로 가는 것에 대해서 이견이 없었다. 그런데 내가 친구들을 상대로 장사를 하는 모습을 보시고 나서는 적잖이 실망하셨던 것 같다. 친구 간에 돈거래를 하고 장사를 한다는 것에 대해서 옳지 않다고 생각하셨던 것 같다.아버지는 어렸을 때 공부를 잘하셨다고 한다. 내가 확인할 수는 없지만, 지금도 종종 친척들을 만나면 우리 아버지가 초등학교, 중학교 때 언제나 반에서 1등을 놓치지 않으셨다는 이야기를 한다. 하지만 집안 형편이 심하게 안 좋은 관계로 고등학교를 중간에 그만 두실 수밖에 없었다. 치킨집에 들르시는 아버지 초등학교 동창분이 술 드시면서 반에서 1등 했던 우리 아버지는 치킨집을 하고 있고, 본인은 대학도 나오고 학원 선생도 하고 있다는 이야기를 하는 거 보면 잘하긴 잘 하셨던 것 같다. 그런 본인의 이루지 못한 꿈에 대한 '한'때문인지 아버지는 나와 동생의 교육에 대해서 관심이 많으셨다.  그리고 본인은 평생 작업복을 입고 육체노동을 하시고 계시지만 나는 그런 삶을 살지 않기를 바라셨다. 나 또한 그러한 아버지의 꿈대로 과학고를 가고, KAIST를 가서 '박사'가 되는 꿈을 이루기 위해서 노력했다.하지만 그런 꿈이 깨진 건 1997년도였다. 1997년도 IMF가 터지면서 대전에 연구단지는 흉흉한 소문이 돌았다. 수많은 연구원들이 구조조정 대상이 되었고, 이공계에 대한 천시 풍조가 과장되게 들려왔다. 대덕연구단지 횟집 사장이 박사 출신이라는 확인할 수 없는 소문도 돌았다. 그러한 모습을 보면서 내가 꿈꾸었던 '연구원', '박사'라는 이름이 생각만큼 좋지 않을 수 도 있다는 생각을 했다. 게다가 난 그때 학과 공부에도 적응하지 못하고 방황하고 있었다. 그래서 난 대학원을 가지 않고 경영학을 복수전공해 보기로 했다. 그리고 학부를 졸업하고 취직하기로 마음을 정하고 아버지에게 말씀을 드렸다. 아버지는 예상대로 나에게 많이 실망하셨다. 하지만 난 내 뜻을 굽히지 않았다. 그리고 아버지는 1998년도 5월에 갑자기 돌아가셨다.난 내가 어렸을 때 꿈꾸었던 삶을 살고 있지 않다. 아버지가 원했던 '연구원', '박사'와는 거리가 먼 삶을 살고 있다. 어쩌면 아버지가 원하지 않았던 '장사', '사업'이라는 것을 하고 있다. 아버지가 살아계셨으면 어떻게 생각하셨을까?  비록 내가  아버지가 원하지 않았던 삶을 살고 있지만 기뻐하셨을것 같다. 아버지는 언제나 내가 행복하기를 바라셨던 분이기 때문이다.#NEOFECT #개인경험 #경험공유 #인사이트 #성장
조회수 4586

금융권이 좋아하는 스타트업 사업계획서 쓰는 법

 상대에게 무언가 바라는 것이 있을 때, 파워포인트 프레젠테이션, 잘 정돈된 A4용지 파일철, 좀 연배가 있다면 괘도를 준비해 가서 왜 우리를 선택해야 하는지 열변을 토하는 방법이 있다. 업계에서는 이런 것을 피칭(Pitching)이라고 한다. 아마 대부분의 스타트업 관계자들이 피칭에 사용하는 것은 사업계획서일 것이다. 내용은 간단하다. '어떤 사업에 어떻게 도전할 것이고, 얼마의 돈을 어떻게 집행하겠다' 하는 것을 담고 있으면 된다. '내가 벤츠를 몰고 다니고 싶으니, 나에게 돈 1,500만원을 보태어 달라. 취득 및 등록 절차가 끝나는 대로 당장 타고 다니겠다.'라는 것도, 원론적으로는 사업계획이다. 이렇게만 얘기하면 아이처럼 막무가내로 떼쓰는 것과 무엇이 다른가 싶은 생각에 고개를 절레절레 흔들 수도 있겠지만, 거기에 한 가지를 추가하면 이야기가 상당히 달라진다. 사업계획서를 손에 쥐고 투자자·기관 등을 찾아가는 사람은 당신 말고도 수십, 수백명이 더 있다는 사실이다. 이쯤 되면 내용은 아무래도 좋다. 결론은 '내 제안을 얼마나 매력있게 전달할 수 있는가'이다. 그런 의미에서, 요새 너무 자주 꺼내 쓰는 느낌이 좀 들지만, 나의 전 직장에서의 경험은 좀 더 다른 시각에서 사업계획서를 바라볼 수 있게 하는 좋은 토대가 되어주고 있는 것 같다. 일본에서 수위권에 드는 증권사의, 펀드를 총괄하는 부서쯤 되면, 별의 별 나라의 도통 들어보지도 못했던 회사에서 피칭이 들어온다. 말단 중의 말단이었던 나 역시 피칭 자리에 나가서 질문을 던지거나 자료를 검토하는 일을 많이 할 수 밖에 없었고, 그러다 보면 '어떤 매력적인 상품을 골라야 할까?'보다, '어떻게 거절해야 할까?'하는 쪽으로 생각이 바뀔 수 밖에 없게 된다. 그도 그럴 것이, 모든 피칭의 결론은 항상 '그래서 우리와 손잡으면 좋습니다'로 끝나기 때문이다. 그래서 나는, 다른 분야는 몰라도 금융권에 통할 만한 피칭 자료를 판별하는 데는 도가 텄다. 믿어도 좋다. 내 선에서 직접 제안을 거절한 회사만 손발가락으로 다 셀 만큼은 있기 때문에 하는 말이다. 이것도 본의 아니게 쌓은 나의 인사이트이니, 여러분을 위해 공유하면 좋지 않겠는가. 그래서 오늘은 '금융권' 양반네들이 좋아하실 만한 사업계획서를 쓰는, 다시 말하자면, 그 분들이 싫어하는 사업계획서를 피해 가는 요령을 알려드리고자 한다.*이런 느낌의 분들이 좋아하는 것을 알려드릴 생각이다.1. 결론부터 말하자 기본 중의 기본이다. 은행이나 증권 같은 회사들은 본 업무시간이 상당히 엄격하게 정해져 있다. 은행 셔터가 내려간 후에 통장을 개설하겠다며 문을 두들기면 어떻게 될까? 잡혀가지나 않으면 다행이다. 요새는 인터넷 뱅킹이 잘 되어있어 시간 외 대응도 잘 되는 모양이지만, 어쨌거나 금융기관은 시간에 매우 민감하며, 당신과 마주앉아 이야기하는 이 시간이 낭비인지 기회인지에 대해 상당히 이른 시점, 대부분은 대화가 시작된 지 1분 이내에 판단한다. 결론 없이 주절주절 말하는 것을 정말로, 엄청나게 싫어하기 때문이다. 말하자면 이런 것이다. 1) "결론은 명확합니다. 저희 회사에 투자하시면, 향후 3년 이내에 다음 스테이지 투자를 받아 귀사에 금전적 이득을 안겨드릴 수 있습니다. 근거는 세 가지입니다. 첫째로...." 2) "첫째로 ....하고, 또 ....하며, 마지막으로 ....하기 때문에, 저희 회사에 투자하시면 향후 3년 이내에 다음 스테이지 투자를 받아 귀사에 금전적 이득을 안겨드릴 수 있습니다." 2번 방식으로 말하면 일단 말을 시작한 지 5초도 안 되어 "그래서 결론이 뭔데?"라는 말을 듣는 신비한 체험의 프리패스를 끊어놓는 것과 같다. 물론 당신은 어렵게 잡은 피칭 기회를 위해 많은 연습을 했을 것이고, 그 연습 결과 우리 회사의 좋은 점을 전달하기 위해 세워놓은 계획들이 있었을 것이다. 하지만 입을 연 지 5초만에 저런 말을 들으면 패닉이 옴과 동시에 중학교 때 교과서에서만 보고 잊어버렸던 '아노미 상태'에 빠지는 아주 진귀한 경험을 하게 된다. 결국 말은 버벅거리고, 어떻게든 머릿속에 정리해놨던 결론들을 앞으로 끄집어내서 다시 말하려 하는데, 이게 잘 안 된다. 된다 해도 문제인 것이, 결론을 마지막에 말하는 것을 전제로 준비했기에, 결론을 앞에 갖다놓으면 논리 구조가 꼬인다. 'A이고 B니까 C이다'를 'C이다. A이고 B니까'라고 바꾸는 건 생각보다 어렵다. 그렇게 당신은 One of them이 되어 영혼이 탈곡기로 털린 채 터덜터덜 회사로 돌아가게 될 것이다. 대부분의 발표, 프레젠테이션에 대한 책이나 글타래에도, '두괄식으로 말하라'는 항목은 거의 기본으로 들어가 있다. 그렇기 때문에, 뭔가 대단한 팁이라도 주는 줄 알고 기대했다가 이런 기본적인 이야기를 강조하고 있으니 짜증이 날 수도 있다. 하지만 두 번, 세 번 강조해도 지나치지 않기 때문에 꼭 짚고 넘어가는 것이다. 금융기관은 결론이 앞에 오는 이야기를 아주 좋아한다.*결론은 버킹검, 그야말로 결론부터 말한 이 광고는 일세를 풍미했다.2. 생각은 혼자서 하는 것이다 뭔 소린가 싶을 것이다. 당연히 생각은 나 혼자 하는 것이고, 토론이나 토의는 나 혼자 한 생각을 공유하며 의견을 조율해 나가는 과정이니까. 여기서 하는 말은, 표현을 할 때, '~라고 생각합니다'라는 말을 절대 쓰지 말라는 뜻이다. 언어는 신비로운 것이어서, 같은 뜻도 여러 가지로 표현이 가능하다. 하지만 그 여러 표현 중에 '저는 ~라고 생각합니다'라고 말하는 순간, 아마추어의 느낌을 물씬 풍기게 된다. 다음 순간부터 상대방은 당신을 비즈니스 상대가 아니라 배우러 온 학생처럼 대하게 될 가능성이 크다. 확실하지 않은 상황이나 애매한 결론밖에 나지 않아 나의 생각, 나의 견해를 꼭 말해야 할 때는 이런 식으로 끝맺는 것이 좋다. '~로 예상한다.', '~일 것으로 상정한다.', '~라는 결론을 도출하였다.', '~라는 관점에 도달하였다.'.... 사업계획서는 당신의 생각을 쓰는 공간이 아니다. 합리적이고 이치에 맞는 말을 늘어놓아, 비지니스적 관점에서 상대방과 나 양자에게 어떠한 이득을 가져다 줄 수 있을지를 명확하게 전달하는 공간이다. 애초에 결론이 애매하면 안 되는 것이지만, 어찌됐든 그럴싸하게 포장해서 말하는 것이 그렇지 않은 것보다 백 배 낫다.*이런 사람들만 프로인 게 아니다. 우리는 모두 프로페셔널이다. 어설픔이 끼어들 자리는 없다.3. 근거는 명확하게, 논리는 간단하게, 문장은 명료하게 아까참에 1)번 방식으로 말했던 내용을 갖고 와서, 다시 조금 건드려 보도록 하자. 1) "결론은 명확합니다. 저희 회사에 투자하시면, 향후 3년 이내에 다음 스테이지 투자를 받아 귀사에 금전적 이득을 안겨드릴 수 있습니다." 2) "결론은 명확합니다. 저희 기술이 경쟁 타사에 비해 압도적으로 뛰어난 점을 생각하면, 향후 3년 이내에 다음 스테이지 투자를 받아 귀사에 금전적 이득을 안겨드릴 수 있습니다. 다음으로 브랜드 가치 면에서 검토하였을 때..." 3) "결론은 명확한 것이, 저희 회사에 투자하시면 향후 3년 이내에 다음 스테이지 투자를 받아 귀사에 금전적 이득을 안겨드릴 수 있고, 그 근거는 아마 세 가지로 압축할 수 있는데..." 1)번은 근거가 없거나 빈약하고, 2)번은 논리 전개가 복잡하며, 3)번은 문장의 맺고 끊음이 명료하지 않다. 글만 봐도 이렇게 짜증이 나는데, 이걸 갖고 아둥바둥 피칭하는 걸 눈앞에서 또 지켜보고 있자면, 굳이 금융기관 관계자가 아니더라도 머릿속에 네 글자가 떠오를 것이다. '시간낭비'라는. 펀드·보험·예금상품 등의 설명서를 보면 우리 모두 '내가 지금 읽고 있는 게 한국 말이 맞는가'하는 의문을 갖게 된다. 이런 것들은 일부러 그런 방식으로 쓰여진다. 가능한 한 어렵게 써서, 금융적인 문맹률을 높이는 것이 회사에 이득이 되기 때문이다. 그리고 평소에 그런 글을 많이 접하다 보면, 소위 말하는 '비문'이나 앞뒤가 안 맞는 말, 끝맺음이 없는 말, 명료하지 못한 말들에 상당한 스트레스를 받는다. 안 그래도 말 같지도 않은 말 부여잡고 일하느라 힘들어 죽겠는데, 피칭 자리에서까지 그런 말을 보고 있으면 대체 어떤 기분이 들겠는가. 그런고로, 핵심 파트를 구성하는 각 문장은 대체로 30자를 넘지 않는 것이 좋다. 'A는 B이다.', 'A이기 때문에 B할 수 있다.', '결론은 A이다.' 딱, 딱, 맺고 끊음이 확실해야 한다. 다른 문장은 조금 길게 늘어져도 좋다. 일단 핵심 부분, 결론 부분은 이렇게 써야 한다. 또, 논리 구조가 순환되거나, 모순되거나, 앞에서 했던 말을 뒤에서 부정하거나, 잘 생각해보면 뭔가 이상한 부분들이 들어있으면 영락없이 그 부분을 캐치해서 캐물어 올 것이다. 어차피 앞으로 있을 희망찬 미래에 대해 설명할 거라면, 최소한 앞뒤 맥락은 맞아야 하지 않는가. 알기 어려운 논리 구조로 짜여진 글은 결론의 신빙성을 크게 떨어뜨린다. 마지막으로, 근거는 명확해야 한다. 알기 어려운 근거를 토대로 도출된 결론은 도저히 이해하기 어렵다. '우리 회사는 여태까지 잘 버텨왔으므로→앞으로도 잘 버틸 것이다.' 같은 말을 하느니, '우리 아빠가 이 은행의 최대주주셔서→앞으로 우리 회사가 더 커질 것 같다' 쪽이 차라리 더 알기 쉽고 명확하다.*이 분도 이렇게 화를 내시는데....4. 표기, 단어의 통일, 그리고 특히 '숫자'...악마는 디테일에 숨어있다 앞에서는 '우리 회사'라고 하고 뒤에서는 '저희 회사'라고 하는 경우, 앞에서는 반말로 쓰다가 어느 부분에 갑자기 '~입니다.'로 끝나는 경우, 어떤 항목의 금액을 표시했는데 3자리수마다 쉼표를 넣지 않거나, 0 하나가 누락되거나 하는 경우, 일단 탈락이라고 생각하면 된다. 여러 사람이 한 사업계획서를 쓰거나, 의식의 흐름에 따라 글을 쓰다보면 자주 이런 일이 벌어진다. 특히 반말로 쓰다가 갑자기 존댓말이 나오는 경우가 심심찮게 보이는데, 그 순간 글을 쓴 상대의 수준을 의심할 수 밖에 없다. 퇴고조차 안 하고 계획서를 갖고왔다는 뜻이기 때문이다. 어떠한 개념, 단어의 표기에 대해서도, 전체적인 느낌과 방향을 일관되게 잡는 것은 매우 중요하다. 앞에서는 '피칭'이라고 쓰고, 뒤에서는 'Pitching'이라고 쓴다던가 하면 매우 보기 좋지 않다. 그리고, 무엇보다도, 숫자의 사용에 주의해야 한다. 숫자만 써있고 단위를 안 써놔서 백만원인지 천원인지 그냥 1원 단위인지 모르겠다거나, 3자리마다 쉼표를 넣지 않아 자리수 구별이 힘들다거나, 오탈자 때문에 도출될 수 없는 숫자가 나왔다거나 한 것을 발표 당일, 그 자리에서 알았다면, 최대한 정중하게 사과하고 정정한 후 그냥 마음을 비우는 게 좋다. 금융기관 사람들은 숫자들의 행간과 맥락을 읽는 것에 대해 묘한 자부심을 갖고 있다. 그런데 전년도 당기순이익이 58백만원이었다가 이번년도에 630백만원이 되었다면? 당장 그 부분에 대해 추궁이 들어올 것이다. 민감하게 반응하는 부분인 것이다. 숫자 하나가 있고 없고로 수 억, 수십 억이 왔다갔다 하는 세계에서 살아온 사람들은 자동적으로 이렇게 될 수 밖에 없다. 어차피 스타트업의 사업계획서라고 해 봐야, 앞으로 성장할지 망할지는 그야말로 신만이 아는 영역이다. 그러나 이 부분에 대해서, 소위 말하는 '가라'를 칠 때도, 터무니없는 수치를 넣어선 절대 안 된다. 향후 매출 예상의 증가율이 들쭉날쭉하다던가, '대충 이만큼 늘겠지'라는 생각으로 써넣은 부분에 대해서 호되게 털리고 나면, 처음에는 왜 이런 걸 가지고 난리를 치는지 잘 이해가 안 갈 것이다. 어차피 앞으로 우리 회사가 어떻게 클 지는 아무도 모르는데. 하지만 그들은 연속된 숫자의 나열에서 일정한 흐름을 찾는 일을 하는 사람들이기 때문에, 그 흐름이 흐트러져 있는 것을 숨은그림찾기에서 펜촉이랑 돛단배 찾아내는 것 보다 쉽게 알아낸다. 반드시 조심해야 한다. 내용보다 디테일을 세심하게 보는 사람도 있다.*악마는 프라다를 입고, 디테일에 숨어있다.5. 써보세요 숫자에 대해 이런 묘한 집착이 있다면, 당연히 좋은 쪽으로도 이용할 수 있다. 전년도 대비 금년 매출이 28.17% 성장할 것이라고 적었다면, 28.17%라는 수치가 나온 것에 대한 명확한 근거를 적어주자. '이 친구 일 좀 할 줄 아는 친구구만, 허허허'라는 말을 하진 않겠지만 대충 그런 느낌을 받을 수 있을 것이다. 근거로 댈 수 있는 것들은 찾아보면 아주 많다. 모든 비지니스 관련자들이 그렇게 생각하겠지만, 이 일을 함으로써 나에게 '어떤' 이득이 '얼마나' 떨어지는가에 대해서 적어주는 것 만큼 상대를 유혹하는 것이 없다. 객관적인 수치의 제시는 나의 주장을 더욱 공고히 하고 신뢰감을 심어주는 동시에, 상대가 나의 제안을 받아들이는 것에 대한 논리적 근거가 되어 준다. 물론, 정말 쓰잘데기 없는 수치를 집어넣으면 바로 역효과가 난다는 것을 명심해야 한다. 대충 싸잡아 계산해봤더니 80% 정도더라 하는 건 안 쓰느니만 못하다. 필요한 부분에 필요한 만큼만 사용해야 한다. 일종의 그로스해킹이라고 할 수도 있을텐데, 숫자에 민감한 사람들이 보는 자료이니만큼 온갖 것들에 수치를 제시하고 붙이면 그만큼 피로도가 가중된다. 무엇이든 적당히가 중요하다.*뭐든지 쓰기 나름이다. 최근, 이런저런 일로 다양한 형식과 다양한 분량의 사업계획서를 다양한 방법으로 쓰고 있다. 사업계획서라는 것을 여태 보기만 했지 써 본 적이 없던 나에게는 매 순간순간이 상당히 새로운 도전이었음과 동시에, 영혼을 갈아내는 듯한 고통을 맛보는 시간이었다. 사업계획서는, 사업에 대한 계획을 쓰니까 사업계획서라고 하는 것이다. 그리고 우리 모두가 알다시피, 세상엔 계획대로 진행되는 일이 별로 없다. 계획을 세워 그대로 따라가려 마음 먹어도 100% 계획대로 실행되는 일은, 내가 아는 한 단 하나도 없다. 어차피 실행여부도 불투명하고, 실현 가능성도 불투명한 것에 대해 계획을 세우고 논리를 전개해 나가려니 그야말로 사람이 갈려나가는 기분을 맛볼 수 있는 것이다. 그렇지만, 사업계획서는 외부에 우리 팀의 매력을 알리는 아주 효과적인 방법이기도 하다. 모든 것이 계획대로 흘러가지는 않지만, 큰 얼개만이라도 따라갈 수 있다면, 그렇게 함으로써 믿음과 신뢰를 줄 수 있다면 상대방은 우리를 충분히 매력적으로 느낄 것이고, 다양한 호혜적 관계를 맺음에 있어 그 바탕이 될 것이다. 그런 중요한 문서를 작성할 때에 상대의 특성과 성향에 따른 아주 작은 부분에서 이미지가 갈려버리는 것은, 결코 바람직한 일은 아니다. 하지만 이 사람들이 왜 그런지 이해하고, 그것들에 대해 아주 작은 배려를 하는 것으로 좋은 인상을 심어줄 수 있다면, 하지 않을 이유가 없는 부분이기도 하다. 현재의 나는 내 앞가림조차 잘 하고 있는 상황이 아니지만, 금융권에서 일하고 있었을 때의 경험을 공유하면서 조금이라도 그 효과를 보는 팀이 있기를 바라고 있다. 내가 줄 수 있는 것은 이런 것들 밖에 없으니, 다 같이 없는 처지에 조금이라도 나누며 돕고 살아야 하지 않겠는가. 그런 의미에서, 외국계 증권사의 업무가 궁금하거나, 피칭은 어떻게 이루어지는지, 펀드상품이나 보험상품의 취급, 증권 영업 같은 분야에 대해서 흥미가 있는 분들은 얼마든지 하단의 캐주얼 미팅 버튼을 통해 연락 주시기 바란다. 차 한 잔 정도 사드리면서 직접 만나 이야기를 나눠도 좋고, 채팅이나 메일로 간단한 궁금증만 해소해도 좋다. 항상 기다리고 있다.#더팀스 #THETEAMS #영업 #대기업경험 #사업계획서 #사업소개서 #IR피칭 #인사이트 #경험공유
조회수 1458

React 공식 튜토리얼 한글 번역

<button type="button">메뉴</button>* 오역 및 오탈자가 있을 수 있습니다. 발견하시면 댓글로 제보해주세요!** 브런치 에디터의 한계로 마크다운 적용이 되지 않아 가독성이 떨어지고 복사 기능이 지원되지 않습니다. 이왕이면 이곳에서 보시기를 권장합니다. >> 가독성 좋은 문서로 보기React 공식 튜토리얼 바로가기시작하기 전에무엇을 구현할 것인가대화형 틱택토 게임을 구현하려고 합니다.원한다면 최종 결과물을 여기에서 확인할 수 있습니다. 아직 코드가 이해되지 않거나 문법이 낯설어도 걱정하지 마세요. 튜토리얼에서 차근차근 틱택토 게임을 구현하는 방법을 배울테니까요.게임을 플레이해보세요. 이동 리스트에 있는 버튼을 클릭하여 클릭한 때로 돌아가고, 그 때로 돌아간 후 보드가 어떻게 보이는지 확인할 수 있습니다.게임에 익숙해지셨다면 탭을 닫으세요. 다음 섹션에서 간단한 템플릿을 가지고 시작할 것입니다.사전 준비HTML과 JavaScript에 익숙할 것으로 생각합니다. 하지만 HTML과 JavaScript를 사용해본 적이 없더라도 튜토리얼을 따를 수 있어야 합니다.JavaScript를 다시 봐야한다면 이 가이드를 추천합니다. 튜토리얼에서 JavaScript의 최신 버전인 ES6의 몇 가지 특징들인 화살표 함수, 클래스, let, const를 사용할 것입니다. Babel REPL을 사용하여 ES6 코드가 어떻게 컴파일되는지 확인해볼 수 있습니다.튜토리얼을 공부하는 방법튜토리얼을 공부하기 위한 두 가지 방법이 있습니다. 브라우저에서 코드를 작성하거나 컴퓨터의 로컬 개발 환경을 설치할 수 있습니다. 편한 방법을 선택하여 공부하시면 됩니다.브라우저에서 코드를 작성하기 원한다면가장 빨리 시작할 수 있습니다!새로운 탭에서 시작 코드를 여세요. 빈 틱택토 필드를 볼 수 있습니다. 튜토리얼에서는 이 코드를 수정하여 진행합니다.다음 섹션인 로컬 개발 환경 설정을 스킵할 수 있습니다. 바로 개요 섹션으로 넘어가세요.사용하던 에디터에서 코드를 작성하기 원한다면다른 방법으로 사용하는 컴퓨터에 프로젝트를 설치할 수 있습니다.이 방법은 필수가 아닌 선택 사항입니다!더 많은 준비 작업이 필요하지만 에디터의 편리함을 누리며 공부할 수 있습니다.만약 이 방법으로 공부하기를 원한다면 필요한 단계들이 있습니다.  1. 설치된 Node.js가 최신 버전인지 확인해보세요.2. 새로운 프로젝트를 생성하기 위해 설치 방법을 따르세요.$ npm install -g create-react-app$ create-react-app my-app3. 새 프로젝트의 src/ 폴더에 있는 모든 파일들을 삭제해주세요. (폴더 안의 내용만 삭제하되 폴더는 삭제하지 마세요)$ cd my-app$ rm -f src/*4. 이 CSS 코드를 src/ 폴더에 index.css 파일로 추가해주세요.5. 이 JS 코드를 src/ 폴더에 index.js 파일로 추가해주세요.6. src/ 폴더에 있는 index.js의 최상단에 아래 세 줄을 추가해주세요.import React from 'react';import ReactDOM from 'react-dom';import './index.css';이제 프로젝트 폴더에서 npm start 명령어를 실행하고 브라우저에서 http://localhost:3000 를 여세요. 빈 틱택토 필드를 볼 수 있습니다.에디터에서 문법 하이라이팅 설정을 하고 싶다면 이 문서를 따르세요.도와주세요! 막히는 부분이 있어요!막히는 부분이 생겼다면 지원하는 커뮤니티를 확인해보세요. 특히 Reactiflux chat은 빠르게 도움을 받을 수 있는 좋은 방법입니다. 어떤 커뮤니티에서도 필요한 대답을 듣지 못했다면 이슈를 제출하세요. 우리가 도와드립니다.다 끝났으면 시작해봅시다!개요React란 무엇인가요?React는 유저 인터페이스 구현을 위한 선언적이고 효율적이며 유연한 JavaScript 라이브러리입니다.React는 여러 종류의 컴포넌트들을 가지고 있지만 우리는 React.Component의 서브클래스를 사용하여 시작할 것입니다.  class ShoppingList extends React.Component {  render() {    return (            Shopping List for {this.props.name}                Instagram         WhatsApp         Oculus                );  }}// Example usage:XML과 비슷한 재밌는 태그들을 사용할 것입니다. 작성한 컴포넌트는 React에게 무엇을 랜더링하고 싶은지 알려줍니다. 그러면 React는 데이터가 변경될 때 올바른 컴포넌트들을 업데이트하고 랜더링합니다.여기에서 ShoppingList는 React 컴포넌트 클래스 혹은 React 컴포넌트 타입입니다. 하나의 컴포넌트는 props라 불리는 파라미터를 사용하고, render 메서드를 통해 표시할 뷰 계층 구조를 반환합니다.render 메서드는 랜더링하길 원하는 내용을 반환하면 React는 그 내용을 가져와 스크린에 랜더링합니다. 특히 render는 랜더링할 간단한 내용인 React 엘리먼트를 반환합니다. 대부분의 React 개발자들은 이 구조를 더 쉽게 작성할 수 있게 해주는 JSX라는 특별한 문법을 사용합니다.라 쓰면 빌드 시 React.createElement('div')로 변환됩니다. 위의 코드는 아래의 코드와 동일합니다.  return React.createElement('div', {className: 'shopping-list'},  React.createElement('h1', /* ... h1 children ... */),  React.createElement('ul', /* ... ul children ... */));전체 코드는 여기에서 볼 수 있습니다.createdElement()에 대해 더 많은 내용이 궁금하다면 API reference 에 자세한 설명이 있습니다. 튜토리얼에서는 createdElement()를 직접적으로 사용하지 않습니다. 대신 JSX를 사용할 것입니다.JSX에서는 중괄호 안에 JavaScript 문법을 사용할 수 있습니다. 각 React 엘리먼트는 변수에 저장하거나 프로그램에 여기저기에 전달할 수 있는 실제 JavaScript 객체입니다.ShoppingList 컴포넌트는 내장된 DOM 컴포넌트만 랜더링하지만  코드를 작성하여 커스텀 React 컴포넌트를 쉽게 구성할 수 있습니다. 각 컴포넌트는 캡슐화되어 독립적으로 동작할 수 있습니다. 이때문에 간단한 컴포넌트들로 복잡한 UI를 구현할 수 있습니다.시작하기시작 코드를 가지고 시작해봅시다.이 코드는 우리가 구현할 틱택토 게임의 틀을 가지고 있습니다. 필요한 스타일들을 준비해두었기 때문에 JavaScript만 신경쓰면 됩니다.세 가지 컴포넌트로 구성되어 있습니다.- Square- Board- GameSquare 컴포넌트는 하나의 <button>을 랜더링합니다. Board 컴포넌트는 9개의 사각형을 랜더링합니다. Game 컴포넌트는 나중에 우리가 채워 넣어야 할 공백이 있는 하나의 보드를 랜더링합니다. 지금 이 컴포넌트들은 아무런 동작도 하지 않습니다.props를 통해 데이터 전달하기본격적으로 시작하기 위해 Board 컴포넌트에서 Square 컴포넌트로 데이터를 전달해봅시다.Board의 renderSquare 메서드에서 Square 컴포넌트 prop에 value 값을 전달하도록 코드를 변경해주세요.  class Board extends React.Component {  renderSquare(i) {    return ;  }value 값을 보여주기 위해 Square 컴포넌트의 render 메서드 안의 코드 {/* TODO */}를 {this.props.value}로 변경해주세요.  class Square extends React.Component {  render() {    return (      <button className="square">        {this.props.value}      </button>    );  }}변경 전:변경 후: 랜더링된 결과에서는 각 사각형 안에 숫자가 위치합니다.지금까지의 코드는 이곳에서 볼 수 있습니다.대화형 컴포넌트클릭 시 "X"로 채워지는 Square 컴포넌트를 만들어봅시다. Square의 render() 함수에서 반환된 버튼 태그를 다음과 같이 변경해주세요.  class Square extends React.Component {  render() {    return (      <button className="square" onClick={() => alert('click')}>        {this.props.value}      </button>    );  }}이제 사각형을 클릭하면 브라우저에서 알럿창이 뜨는걸 확인할 수 있습니다.새로운 JavaScript 문법인 화살표 함수를 사용하였습니다. onClick prop에 함수를 전달하였습니다. onClick={alert('click')} 코드를 작성하고 버튼을 클릭하면 알럿창 대신 경고가 뜨게됩니다.React 컴포넌트는 생성자에서 this.state를 설정하여 상태를 가질 수 있습니다. 상태는 각 컴포넌트마다 가지고 있습니다. 사각형의 현재 value 값을 상태에 저장하고 클릭할 때 바뀌도록 만들어봅시다.먼저 상태를 초기화하기 위해 클래스에 생성자를 추가해주세요.  class Square extends React.Component {  constructor(props) {    super(props);    this.state = {      value: null,    };  }  render() {    return (      <button className="square" onClick={() => alert('click')}>        {this.props.value}      </button>    );  }}JavaScript 클래스에서 서브클래스의 생성자를 정의할 때 super(); 메서드를 명시적으로 호출해줘야 합니다.Square의 render 메서드에서 현재 상태의 value 값을 표시하고 클릭할 때 바뀌도록 수정해주세요.- <button> 태그 안의 this.props.value 를 this.state.value로 변경해주세요.- () => alert() 이벤트 핸들러를 () => this.setState({value: 'X'})로 변경해주세요.<button> 태그는 다음과 같습니다.  class Square extends React.Component {  constructor(props) {    super(props);    this.state = {      value: null,    };  }  render() {    return (      <button className="square" onClick={() => this.setState({value: 'X'})}>        {this.state.value}      </button>    );  }}this.setState가 호출될 때마다 컴포넌트가 업데이트되므로 업데이트된 상태가 전달되어 React가 이를 병합하고 하위 컴포넌트와 함께 다시 랜더링합니다. 컴포넌트가 랜더링될 때 this.state.value는 'X'가 되어 그리드 안에 X가 보이게 됩니다.이제 사각형을 클릭하면 그 안에 X가 표시됩니다.지금까지의 코드는 이곳에서 볼 수 있습니다.개발자 도구크롬과 파이어폭스의 React 개발자 도구 확장 프로그램은 React 컴포넌트 트리를 브라우저의 개발자 도구 안에서 검사할 수 있게 해줍니다.트리 안의 컴포넌트들의 props와 상태를 검사할 수 있습니다.설치 후 페이지에서 검사하길 원하는 컴포넌트를 오른쪽 클릭하고 "Inspect"를 클릭하여 개발자 도구를 열면 오른쪽 마지막 탭에 React 탭이 보입니다.CodePen을 사용하여 이 확장 프로그램을 동작시키고 싶다면 추가적으로 필요한 작업들이 있습니다.1. 로그인 혹은 회원가입을 하고 이메일을 인증받으세요.2. "Fork" 버튼을 클릭하세요.3. "Change View"를 클릭하고 "Debug mode"를 선택하세요.4. 새롭게 열린 탭에서 React 탭이 있는 개발자 도구를 볼 수 있습니다.상태 들어올리기이제 틱택토 게임을 위한 기본 블록들이 있습니다. 하지만 아직 각 Square 컴포넌트 안에 상태들이 캡슐화되어 있습니다. 더 원활하게 동작하는 게임을 만들기 위해 한 플레이어가 게임에서 이겼는지를 확인하고 사각형 안에 X와 O를 번갈아 표시해야 합니다. 누가 게임에서 이겼는지 확인하기 위해 Square 컴포넌트들을 쪼개지 않고 한 장소에서 9개의 사각형의 value 값을 모두 가지고 있어야 합니다.Board가 각 Square의 현재 상태가 무엇인지만 확인해야 한다고 생각할 수도 있습니다. 이 방법은 기술적으로 React에서 가능하기는 하나 코드를 이해하기 어렵고 불안정하고 리팩토링하기 힘들게 만듭니다.각 Square에 상태를 저장하는 대신에 Board 컴포넌트에 이 상태를 저장하는 것이 가장 좋은 방법입니다. 이 Board 컴포넌트는 이전에 각 사각형에 인덱스를 표시한 방법과 동일한 방법으로 무엇을 표시할지 각 Square에게 알릴 수 있습니다.여러 하위 컴포넌트로부터 데이터를 모으거나 두 개의 하위 컴포넌트들이 서로 통신하기를 원한다면 상위 컴포넌트 안으로 상태를 이동시키세요. 상위 컴포넌트는 props를 통해 하위 컴포넌트로 상태를 전달해줄 수 있습니다. 그러면 하위 컴포넌트들은 항상 하위 컴포넌트나 상위 컴포넌트와 동기할 수 있습니다.이와 같이 상태를 상위 컴포넌트로 들어올리는 것은 React 컴포넌트들을 리팩토링할 때 가장 많이 사용하는 방법입니다. 이 기회를 통해 연습해봅시다. Board에 생성자를 추가하고 9개의 사각형과 일치하는 9개의 null을 가진 배열을 포함한 상태로 초기화하세요.  class Board extends React.Component {  constructor(props) {    super(props);    this.state = {      squares: Array(9).fill(null),    };  }  renderSquare(i) {    return ;  }  render() {    const status = 'Next player: X';    return (             {status}                 {this.renderSquare(0)}         {this.renderSquare(1)}          {this.renderSquare(2)}                        {this.renderSquare(3)}          {this.renderSquare(4)}          {this.renderSquare(5)}                        {this.renderSquare(6)}          {this.renderSquare(7)}          {this.renderSquare(8)}                );  }}나중에 이것을 다음과 같이 생긴 보드로 채울 예정입니다.  [  'O', null, 'X',  'X', 'X', 'O',  'O', null, null,]현재 Board의 renderSquare 메서드는 다음과 같습니다.    renderSquare(i) {    return ;  }Square에 value prop를 전달하도록 수정하세요.    renderSquare(i) {    return ;  }지금까지의 코드는 이곳에서 볼 수 있습니다.이제 우리는 사각형이 클릭되면 발생할 변경 사항을 구현해야 합니다. Board 컴포넌트는 어떤 사각형이 채워졌는지 저장하고 있습니다. 그렇기 때문에 Square가 Board가 가지고 있는 상태로 업데이트할 방법이 필요합니다. 사각형의 컴포넌트 상태가 각자 정의되고 있기 때문에 Board가 Square의 상태를 가지고올 수 없습니다.보통의 패턴은 사각형이 클릭될 때 호출되는 함수를 Board로부터 Square에 전달하는 것입니다. Board 안의 renderSquare를 다시 변경해봅시다.    renderSquare(i) {    return (              value={this.state.squares[i]}        onClick={() => this.handleClick(i)}      />    );  }가독성을 위해 리턴 안의 요소들을 여러 줄로 나누고, 괄호를 추가하여 JavaScript가 세미콜론 없이 코드를 마무리하도록 했습니다.Board에서 Square로 value와 onClick 두 개의 props를 전달합니다. onClick Square의 rennder에 있는 this.state.value 를 this.props.value로 변경하세요.- Square의 rennder에 있는 this.state.value 를 this.props.value로 변경하세요.- Square의 rennder에 있는 this.setState() 를 this.props.onClick()로 변경하세요.- 더이상 각 Square가 상태를 가지지 않도록 Square에 정의한 constructor를 삭제하세요.모든 변경 사항을 구현한 Square 컴포넌트는 다음과 같습니다.  class Square extends React.Component {  render() {    return (      <button className="square" onClick={() => this.props.onClick()}>        {this.props.value}      </button>    );  }}이제 사각형이 클릭될 때 Board로부터 전달되는 onClick 함수를 호출합니다. 어떤 일이 일어나는지 되짚어봅시다.1. 내장된 DOM <button> 컴포넌트의 onClick prop는 React에게 클릭 이벤트 리스너를 설정하라고 알립니다.2. 버튼이 클릭될 때 React는 Square의 render() 메서드 안에 정의된 onClick 이벤트 핸들러를 호출합니다.3. 이 이벤트 핸들러는 this.props.onClick()을 호출합니다. Square의 props는 Board에서 명시한 것입니다.4. Board는 onClick={() => this.handleClick(i)}을 Square에 전달하고, 호출될 때 Board의 this.handleClick(i)가 동작합니다.5. Board에 있는 handleClick() 메서드는 아직 정의되지 않았으므로 코드는 오류가 발생합니다DOM <button> 엘리멘트의 onClick 속성이 React와는 다른 의미를 가집니다. Square의 onClick prop나 Board의 handleClick 메서드와는 다릅니다. React 애플리케이션에서는 속성에 on* 이름을 사용하고 핸들러 메서드에 handle* 을 사용하여 처리하는 것이 일반적입니다.사각형을 클릭해봅시다. handleClick을 아직 정의하지 않았으로 에러가 발생합니다. Board 클래스에handleClick 메서드를 추가해봅시다.  class Board extends React.Component {  constructor(props) {    super(props);    this.state = {      squares: Array(9).fill(null),    };  }  handleClick(i) {    const squares = this.state.squares.slice();    squares[i] = 'X';    this.setState({squares: squares});  }  renderSquare(i) {    return (              value={this.state.squares[i]}        onClick={() => this.handleClick(i)}      />    );  }  render() {    const status = 'Next player: X';    return (             {status}                 {this.renderSquare(0)}          {this.renderSquare(1)}          {this.renderSquare(2)}                        {this.renderSquare(3)}          {this.renderSquare(4)}          {this.renderSquare(5)}                        {this.renderSquare(6)}          {this.renderSquare(7)}          {this.renderSquare(8)}                );  }}지금까지의 코드는 이곳에서 볼 수 있습니다.이미 있는 배열을 수정하는 대신 squares 배열을 복사하기 위해 .slick()를 호출합니다. 왜 immutability이 중요한지 알고 싶다면 이 섹션으로 이동해주세요.이제 사각형을 클릭하여 다시 사각형을 채울 수 있어야 하지만 상태가 각 Square가 아닌 Board 컴포넌트에 저장되어 있어 게임을 계속 구현해나가야 합니다. Board의 상태가 변경될 때마다 Square 컴포넌트들은 자동으로 다시 랜더링됩니다.Square은 더 이상 각 상태를 유지하지 않습니다. 이들은 상위 Board 컴포넌트로부터 데이터를 전달받고, 클릭될 때 알립니다. 우리는 이 제어된 컴포넌트 같은 컴포넌트들을 호출합니다.왜 immutability가 중요할까전의 예제 코드에서 이미 존재하는 배열을 수정하지 않고 변경 사항을 반영하기 위해 squares 배열을 .slice()연산자를 사용하여 복사하였습니다. 이는 무엇을 의미하며 왜 이 컨셉이 중요할까요.mutation을 사용한 데이터 변경  var player = {score: 1, name: 'Jeff'};player.score = 2;// Now player is {score: 2, name: 'Jeff'}mutation을 사용하지 않은 데이터 변경  var player = {score: 1, name: 'Jeff'};var newPlayer = Object.assign({}, player, {score: 2});// Now player is unchanged, but newPlayer is {score: 2, name: 'Jeff'}// Or if you are using object spread syntax proposal, you can write:// var newPlayer = {...player, score: 2};mutation을 사용하지 않더라도(기본 데이터를 변경하여도) 결과적으로는 다를게 없습니다. 하지만 컴포넌트와 전체 애플리케이션의 성능을 향상시키는 장점이 있습니다.쉽게 Undo/Redo와 시간 여행하기immutability는 이 복잡한 기능들을 훨씬 더 쉽게 구현할 수 있게 해줍니다. 예를 들어 이 튜토리얼에서 우리는 게임의 다른 단계들 사이에 시간 여행을 구현할 것입니다. 데이터 변경을 피하면 우리가 이전 버전의 데이터를 계속 참조할 수 있게 해주고 원할 때 변경할 수 있게 해줍니다.변경 사항 트래킹하기변경되는 객체가 변경 사항이 있는지 아는 방법은 변경 사항이 객체로 만들어지기 때문에 복잡합니다. 그러면 이전 버전을 복사하기 위해 전체의 객체 트리를 현재 버전과 비교하고 각 변수와 값들을 비교해야 합니다. 이 과정은 갈수록 복잡해집니다.immutable 객체가 변경 사항이 있는지 아는 방법은 쉬워집니다. 만약 참조되고 있는 객체가 이전과 다르다면 이 객체는 변경된 것입니다. 이게 끝입니다.React에서 언제 다시 랜더링할지 결정하기React에서 immutability의 가장 큰 장점은 간단한 순수 컴포넌트들이 다시 랜더링될 때를 결정하기 쉽다는 점입니다.shouldComponentUpdate()에 대해 더 배우고 싶고 어떻게 순수 컴포넌트들을 성능 최적화 할 수 있는지 알고 싶다면 이 글을 보세요.함수 컴포넌트우리는 생성자를 지웠습니다. 사실 React는 render 메서드만으로 구성된 Square와 같은 컴포넌트 타입을 위해 함수 컴포넌트라 불리는 간단한 문법을 지원합니다. React.Component를 확장한 클래스를 정의하는 것보다 간단하게 props를 가져오고 랜더링 해야할 것을 반환하는 함수를 작성하는 것이 좋습니다.다음과 같은 함수를 사용해 Square 클래스를 변경하세요.  function Square(props) {  return (    <button className="square" onClick={props.onClick}>      {props.value}    </button>  );}여기서는 this.props를 둘 다 props로 바꿔야 합니다. 애플리케이션에 있는 여러 컴포넌트들은 함수 컴포넌트로 구현할 수 있습니다. 함수 컴포넌트는 더 쉽게 작성할 수 있고 React가 더 효율적으로 최적화할 수 있습니다.코드를 깔끔하게 만들면서 onClick={() => props.onClick()}을 onClick={props.onClick}으로 바꿨습니다. 함수를 전달하는 것은 이 코드만으로 분합니다. onClick={props.onClick()}는props.onClick을 호출하기 때문에 동작하지 않습니다.지금까지의 코드는 이곳에서 보실 수 있습니다.변화 가져오기지금 우리의 게임의 단점은 오로지 X만 플레이할 수 있다는 점입니다. 고쳐봅시다.기본적으로 첫 이동을 'X'가 되도록 설정해봅시다. Board 생성자에서 초기 상태를 수정해주세요.  class Board extends React.Component {  constructor(props) {    super(props);    this.state = {      squares: Array(9).fill(null),      xIsNext: true,    };  }이동할 때마다 xIsNext의 불린 값은 바뀌면서 상태에 저장되어야 합니다. Board의 handleClick 함수를xIsNext 값이 바뀔 수 있도록 수정해봅시다.    handleClick(i) {    const squares = this.state.squares.slice();    squares[i] = this.state.xIsNext ? 'X' : 'O';    this.setState({      squares: squares,      xIsNext: !this.state.xIsNext,    });  }이제 X와 O가 순서대로 번갈아 나타납니다. 다음에 무엇이 표시될 때 보여주기 위해 Board의 render에서 "status" 텍스트를 바꿔봅시다.    render() {    const status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');    return (      // the rest has not changed변경 사항을 적용한 Board 컴포넌트는 다음과 같습니다.  class Board extends React.Component {  constructor(props) {    super(props);    this.state = {      squares: Array(9).fill(null),      xIsNext: true,    };  }  handleClick(i) {    const squares = this.state.squares.slice();    squares[i] = this.state.xIsNext ? 'X' : 'O';    this.setState({      squares: squares,      xIsNext: !this.state.xIsNext,    });  }  renderSquare(i) {    return (              value={this.state.squares[i]}        onClick={() => this.handleClick(i)}      />    );  }  render() {    const status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');    return (             {status}                 {this.renderSquare(0)}          {this.renderSquare(1)}          {this.renderSquare(2)}                        {this.renderSquare(3)}          {this.renderSquare(4)}          {this.renderSquare(5)}                        {this.renderSquare(6)}          {this.renderSquare(7)}          {this.renderSquare(8)}                );  }}지금까지의 코드는 이곳에서 볼 수 있습니다.승자 알려주기언제 게임에서 이기는지 표시해봅시다. 파일 맨 하단에 헬퍼 함수를 추가해주세요.  function calculateWinner(squares) {  const lines = [    [0, 1, 2],    [3, 4, 5],    [6, 7, 8],    [0, 3, 6],    [1, 4, 7],    [2, 5, 8],    [0, 4, 8],    [2, 4, 6],  ];  for (let i = 0; i < lines>    const [a, b, c] = lines[i];    if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {      return squares[a];    }  }  return null;}Board의 render 함수에서 누가 게임에서 이겼는지 확인할 수 있도록 호출할 수 있습니다. 또 누군가 이겼을 떄 "Winner: [X/O]" 상태 텍스트를 표시할 수 있습니다.Board의 render에서 status를 선언을 수정해주세요.    render() {    const winner = calculateWinner(this.state.squares);    let status;    if (winner) {      status = 'Winner: ' + winner;    } else {      status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');    }    return (      // the rest has not changedBoard에서 handleClick을 일찍 반환하여 이미 누군가 이긴 게임에서 클릭하거나 이미 칠해진 사각형을 클릭하는 경우 무시하도록 변경할 수 있습니다.축하합니다! 틱택토 게임을 완성하셨습니다! 이제 React의 기초를 알았습니다. 여기서 진짜 승자는 여러분입니다.지금까지의 코드는 이곳에서 볼 수 있습니다.히스토리 저장하기보드의 이전 상태로 되돌려 이전 상태가 표시되도록 만들어봅시다. 이동이 있을때마다 새 squares 배열을 만들었습니다. 덕분에 이전 상태의 보드를 쉽게 저장할 수 있습니다.상태에 이와 같은 객체를 저장해봅시다.  history = [  {    squares: [      null, null, null,      null, null, null,      null, null, null,    ]  },  {    squares: [      null, null, null,      null, 'X', null,      null, null, null,    ]  },  // ...]우리는 이동 리스트를 표시하여 응답할 수 있는 더 수준 높은 Game 컴포넌트를 만들고 싶습니다. 그래서 Square 상태를 Board로 들어올린 것처럼 Board의 상태를 Game으로 들어올려 최 상위 레벨에서 필요한 모든 정보를 저장해봅시다.먼저 생성자를 추가해 Game의 초기 상태를 설정해주세요.  class Game extends React.Component {  constructor(props) {    super(props);    this.state = {      history: [{        squares: Array(9).fill(null),      }],      xIsNext: true,    };  }  render() {    return (                                              {/* status */}         {/* TODO */}                );  }}그 다음 Board를 수정하여 props를 거쳐 squares를 가져오고 이전에 Square에서 했던 것처럼 Game에서 지정한 onClick prop를 만들어줍시다. 각 사각형의 위치를 클릭 핸들러로 전달하여 어떤 사각형이 클릭되었는지 알 수 있습니다. 필요한 변경 사항은 다음과 같습니다.- Board의 constructor를 삭제하세요.- Board의 renderSquare에 있는 this.state.squares[i]를 this.props.sqaures[i]로 대체하세요.- Board의 renderSquare에 있는 this.handleClick(i)를 this.props.onClick(i)로 대체하세요.변경 사항을 반영한 Board 컴포넌트는 다음과 같습니다.  class Board extends React.Component {  handleClick(i) {    const squares = this.state.squares.slice();    if (calculateWinner(squares) || squares[i]) {      return;    }    squares[i] = this.state.xIsNext ? 'X' : 'O';    this.setState({      squares: squares,      xIsNext: !this.state.xIsNext,    });  }  renderSquare(i) {    return (              value={this.props.squares[i]}        onClick={() => this.props.onClick(i)}      />    );  }  render() {    const winner = calculateWinner(this.state.squares);    let status;    if (winner) {      status = 'Winner: ' + winner;    } else {      status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');    }    return (             {status}                 {this.renderSquare(0)}          {this.renderSquare(1)}          {this.renderSquare(2)}                        {this.renderSquare(3)}          {this.renderSquare(4)}          {this.renderSquare(5)}                        {this.renderSquare(6)}          {this.renderSquare(7)}          {this.renderSquare(8)}                );  }}Game의 render는 히스토리 전체를 보고 게임 상태를 계산하여 가져올 수 있어야 합니다.  render() {    const history = this.state.history;    const current = history[history.length - 1];    const winner = calculateWinner(current.squares);    let status;    if (winner) {      status = 'Winner: ' + winner;    } else {      status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');    }    return (                                  squares={current.squares}            onClick={(i) => this.handleClick(i)}          />                        {status}         {/* TODO */}                );  }Game에 상태를 랜더링하고 있기 때문에{status}를 지우고 Board의 render 함수로부터 상태를 계산하는 코드를 지울 수 있습니다.  render() {    return (                      {this.renderSquare(0)}          {this.renderSquare(1)}          {this.renderSquare(2)}                        {this.renderSquare(3)}          {this.renderSquare(4)}          {this.renderSquare(5)}                        {this.renderSquare(6)}          {this.renderSquare(7)}          {this.renderSquare(8)}                );  }그 다음 Board에서 Game으로 handleClick 메서드를 옮겨야 합니다. Board 클래스에서 잘라내기를 하고 Game 클래스로 붙여넣을 수 있습니다.Game 상태는 다르기 때문에 수정해야 할 것이 조금 있습니다. Game의 handleClick은 히스토리 항목을 연결하여 새로운 배열을 만들어 스택에 푸시해야 합니다.  handleClick(i) {    const history = this.state.history;    const current = history[history.length - 1];    const squares = current.squares.slice();    if (calculateWinner(squares) || squares[i]) {      return;    }    squares[i] = this.state.xIsNext ? 'X' : 'O';    this.setState({      history: history.concat([{        squares: squares,      }]),      xIsNext: !this.state.xIsNext,    });  }여기에서 Board는 renderSquare와 render만 필요합니다. 상태 초기화와 클릭 핸들러는 둘 다 Game에서 동작합니다.지금까지의 코드는 이곳에서 보실 수 있습니다.이동 표시하기지금까지 게임에서 진행된 이동을 표시해봅시다. 이전에 React 컴포넌트가 클래스로 JS 객체이고 그 덕에 데이터를 저장하고 전달할 수 있다고 배웠습니다. React에서 여러 아이템들을 랜더링하기 위해 React 요소의 배열을 전달했습니다. 배열을 빌드하는 가장 흔한 방법은 데이터 배열에서 map을 이용하는 것입니다. Game의 render 메서드에서 해봅시다.    render() {    const history = this.state.history;    const current = history[history.length - 1];    const winner = calculateWinner(current.squares);    const moves = history.map((step, move) => {      const desc = move ?        'Go to move #' + move :        'Go to game start';      return (                 <button onClick={() => this.jumpTo(move)}>{desc}</button>             );    });    let status;    if (winner) {      status = 'Winner: ' + winner;    } else {      status = 'Next player: ' + (this.state.xIsNext ? 'X' : 'O');    }    return (                                 squares={current.squares}            onClick={(i) => this.handleClick(i)}          />                        {status}         {moves}                );  }지금까지의 코드는 이곳에서 볼 수 있습니다.히스토리의 각 단계에서 <button>이 있는 리스트 아이템을 만들었습니다. 이 리스트 아이템은 우리가 곧 구현할 클릭 핸들러를 가지고 있습니다. 코드에서 다음과 같은 경고 메시지와 함께 게임에서 만들어지는 이동 목록을 볼 수 있습니다.Warning: Each child in an array or iterator should have a unique “key” prop. Check the render method of “Game”.경고: 배열이나 이터레이터에 있는 각 자식은 유니크 "key" prop을 가져야한다. "Game"의 render 메서드를 확인해보세요.이 경고의 의미가 무엇인지 얘기해봅시다.Keys아이템 리스트를 랜더링할때 React는 항상 리스트에 있는 각 아이템에 대한 정보를 저장합니다. 만약 상태를 가진 컴포넌트를 랜더링한다면 컴포넌트가 어떻게 실행되는지와 관계없이 상태는 저장 되어야 하고 React는 네이티브 뷰의 뒤에 참고할 것을 저장한다.리스트를 업데이트할 때 React는 무엇을 바꿀지 결정해야 합니다. 리스트에 아이템들을 추가하고, 지우고, 재배열하고, 수정할 수 있습니다.이 코드가 아래의 코드로 변경된다고 상상해봅시다.  Alexa: 7 tasks leftBen: 5 tasks leftBen: 9 tasks leftClaudia: 8 tasks leftAlexa: 5 tasks left사람의 눈에는 Alexa와 Ben의 자리가 바뀌고 Claudia가 추가된 것처럼 보인다. 하지만 React는 단순한 컴퓨터 프로그램이므로 여러분의 의도를 알지 못합니다. React는 리스트의 각 요소에서 key 속성을 지정해달라고 요청합니다. 문자열은 형제로부터 각 컴포넌트들을 구분합니다. 이 경우에 alexa, ben, claudia는 구분할 수 있는 키가 됩니다. 만약 아이템들이 데이터베이스의 객체와 일치시켜야 한다면 데이터베이스 ID을 사용하세요.{user.name}: {user.taskCount} tasks leftkey는 React에서 제공되는 특별한 속성입니다(ref에서 더 확장된 기능). 엘리먼트가 만들어질때 React는 key 속성을 가져오고 반환된 엘리먼트에 직접적으로 key를 저장합니다. key가 props의 한 부분으로 보일지라도 이것은 this.props.key로 참조할 수 없습니다. React는 어떤 하위 엘리먼트가 수정될지 결정하는 동안 알아서 key를 사용합니다. 컴포넌트가 자신의 키를 알 수 있는 방법은 없습니다.리스트가 랜더링될 때 React는 새로운 버전의 각 엘리먼트를 가져오고 이전 리스트에서 매칭되는 키를 가진 것을 찾습니다. key가 세트에 추가될 때 컴포넌트는 만들어집니다. 키가 삭제될 때 컴포넌트는 소멸됩니다. 키들은 React가 각 요소를 구별할 수 있도록하여 다시 랜더링하는 것을 무시하고 상태를 유지할 수 있게 합니다. 만약 컴포넌트의 키를 바꾼다면 완전히 지운 후 새롭게 생성됩니다.동적으로 리스트를 빌드할 때마다 적당한 키를 할당할 것을 강력 추천합니다. 만약 적당한 키를 가지지 못한다면 이를 위해 데이터를 재구성하여야 할지도 모릅니다.특정한 키를 구분하지 못한다면 React는 경고를 주고 배열 인덱스를 키로 사용합니다. 이는 올바른 선택이 아닙니다. 만약 리스트에 있는 엘리먼트들을 정렬하거나 리스트에 있는 버튼을 통해 지우거나 추가하면 명시적으로 key={i}를 전달하는 방법을 사용한다면 경고를 표시하지는 않지만 동일한 문제를 발생시키므로 대부분의 경우에 추천하지 않습니다.컴포넌트의 키가 전부 다를 필요는 없지만 관련있는 형제들 사이에서는 유니크해야 합니다.시간 여행 실행하기이동 리스트를 위해 우리는 각 단계에서 유니크 ID를 가졌습니다. Game의 render 메서드에서 키는로 추가하면 경고는 표시되지 않습니다.    const moves = history.map((step, move) => {      const desc = move ?        'Go to move #' + move :        'Go to game start';      return (                 <button onClick={() => this.jumpTo(move)}>{desc}</button>             );    });지금까지의 코드는 이곳에서 보실 수 있습니다.아직 junmTo가 정의되지 않았기 때문에 이동 버튼을 클릭하면 에러가 발생합니다. 지금 표시된 단계가 무엇인지 알기 위해 Game 상태에 새로운 키를 추가해봅시다.먼저Game의 constructor에  stepNumber: 0를 추가해주세요.class Game extends React.Component {  constructor(props) {    super(props);    this.state = {      history: [{        squares: Array(9).fill(null),      }],      stepNumber: 0,      xIsNext: true,    };  }그 다음 각 상태를 업데이트하기 위해 Game의 jumpTo 메서드를 정의해봅시다. 이 메서드에서는 xIsNext를 업데이트하고, 이동의 인덱스가 짝수라면 xIsNext를 true로 설정합니다.Game 클래스에jumpTo 메서드를 추가해주세요.handleClick(i) {    // this method has not changed  }  jumpTo(step) {    this.setState({     stepNumber: step,      xIsNext: (step % 2) === 0,    });  }  render() {    // this method has not changed  }Game handleClick에 상태를 업데이트 하기위해 stempNumber:history.length를 추가하여 새로운 이동이 있을 때마다  stepNumber를 업데이트 합니다. 현재 보드의 상태를 읽을 때 handleClick이 stepNumber라고 보고 클릭하는 시간대로 상태를 되돌릴 수 있습니다.  handleClick(i) {    const history = this.state.history.slice(0, this.state.stepNumber + 1);    const current = history[history.length - 1];    const squares = current.squares.slice();    if (calculateWinner(squares) || squares[i]) {      return;    }    squares[i] = this.state.xIsNext ? 'X' : 'O';    this.setState({      history: history.concat([{        squares: squares      }]),      stepNumber: history.length,      xIsNext: !this.state.xIsNext,    });  }이제 히스토리의 각 단계를 알기 위해 Game의 render를 수정할 수 있습니다.  render() {    const history = this.state.history;    const current = history[this.state.stepNumber];    const winner = calculateWinner(current.squares);    // the rest has not changed지금까지의 코드는 이곳에서 보실 수 있습니다.이제 이동 버튼을 클릭하면 보드는 즉시 그때 표시된 게임으로 변경됩니다.마무리틱택토 게임을 플레이 해보세요.- 틱택토 게임을 플레이 해보세요.- 한 명의 플레이어가 게임에서 이길 때를 이를 알려줍니다.- 게임이 진행되는 동안 이동 기록이 저장됩니다.- 게임 보드의 에전 버전을 표시하기 위해 시간을 되돌릴 수 있습니다.잘 동작하네요! React가 어떻게 동작하는지 잘 아셨기를 바랍니다.최종 결과물은 여기에서 확인하세요.시간이 더 있거나 새로운 스킬들을 연습해보고 싶다면 해볼 수 있는 몇 가지 아이디어가 있습니다. 점점 더 어려운 순으로 배치해두었습니다.1. 움직임 리스트에서 (col, row) 형태에 각 움직임 위치를 표시하세요.2. 움직임 리스트의 선택된 아이템을 볼드처리하세요.3. 하드 코딩한 것들 대신 사각형을 두 개의 루프를 사용하여 Board를 다시 작성하세요.4. 오름차순 혹은 내림차순 뭐든지 움직임을 정렬하는 버튼을 추가해보세요.5. 누군가 이겼을 때 무엇 때문에 이겼는지 세 개의 사각형을 하이라이트하세요.튜토리얼이 진행되는 동안 우리는 엘리먼트, 컴포넌트, props, 상태를 포함한 React의 수많은 컨셉들을 다뤘습니다. 각 주제에 대한 깊은 설명을 원한다면 남은 문서를 확인하세요. 컴포넌트 정의에 대해 더 많이 배우고 싶다면 이 문서를 확인하세요.#트레바리 #개발자 #안드로이드 #앱개발 #Node.js #백엔드 #인사이트 #경험공유 #React #리액트 #리액트가이드 #한글 #번역 #문서번역
조회수 184

[모집]진짜 하고싶은 일을 찾고 싶다면

그동안 분노캔들 워크숍을 하면서 굉장히 다양한 사람들의 스트레스를 들을 수 있었는데요. 그 많은 스트레스들 중 가장 의외였던 스트레스는 바로 생각보다 많은 사람들이 자신이 하고 싶은 것을 모르고 있으며 그런 자신을 자책하고 있다는 것이었습니다.위의 스트레스를 적은 분들은 모두 직장인들이었습니다. 이미 자신의 일을 갖고 있었지만, 그럼에도 불구하고 자신의 일에 만족하지 못하고 미래를 불안해하고 있었습니다.  사람들은 같은 일에 종사하면서도 일에 대한 의미를 형성하고 일을 보는 방식이 다르다고 합니다. 이는 일을 바라보는 틀이 다르기 때문인데, 이와 관련해서 심리학자인 벨라와 동료들(Bellah et al., 1985)은 개인이 일과 관계 맺는 방식을 직업(job), 경력(career), 소명(calling)으로 구분했는데요. 자신의 일을 직업으로 보는 사람은 일을 통한 물질적 보상에만 관심을 가지며, 자신의 일을 경력으로 보는 사람은 일에 개인적인 투자를 많이 하며 조직 내에서 승진을 중요시합니다. 그러나 자신의 일을 소명으로 인식하는 사람은 일을 자신의 삶과 구별할 수 없는 것으로 생각하며, 소명을 지닌 사람에게 일의 목적은 금전적 보상이나 승진이 아니라 일을 통해 깊은 성취감을 얻는 것이라고 합니다. 여러분은일과 어떤 관계를 맺고 싶으신가요?그런데 소명이란 건 어느 날 갑자기 계시처럼 내려오는 것일까요? 현재 나의 상태를 제대로 파악하고 더 나은 나를 위해 노력하는 과정에서 발견할 수 있는 것일까요?  얼마 전 대학생들을 만나 깊은 이야기를 나눌 기회가 있었는데요. 한 친구가 꿈을 찾아준다는 프로그램을 다 들어봤는데, 들을 때는 정말 좋았고, 끝나고 나면 꿈을 찾을 수 있을 거라는 기대에 부풀었었지만, 결국 지금도 자신이 뭘 하고 싶은지 모르겠다는 이야기를 털어놓더군요. 그 이야기를 들으며 많은 생각이 들었습니다. 저의 대학시절은 방황 그 자체였으며, 직장인 디자이너로 일했던 20대의 저 또한, 디자인이 제가 진짜 원하는 일이라고 생각해서 그 일을 시작했던 것은 아니었기 때문입니다.조형예술을 전공한 그것도 사진으로 졸업한 저는 왜 그래픽 디자이너라는 직업을 택했던 걸까요? 그때 제가 디자이너를 선택했던 이유는 아주 간단했습니다. 지금은 내가 하고 싶은 것이 없지만, 디자인을 배워두면 내가 하고 싶은 것이 생겼을 때 도움이 될 거라고 생각했기 때문입니다. 그리고 그 생각은 아주 현명했습니다. 제가 스트레스컴퍼니를 만들고 지속적인 생산자로서 살아가는 데 있어서, 디자인을 할 수 있다는 것은 정말 큰 도움이 되었고 앞으로도 그럴 것이기 때문입니다.20대에자신이 원하는 것을 명확히 알고그 꿈을 향해 달려갈 수 있다면굉장히 운이 좋은 것입니다. 그렇지만 저 또한 그랬듯, 아직 모른다고 해도 저는 그것 또한 괜찮다고 생각합니다. 왜냐하면 20대는 충분히 방황해야 하는 시기이기 때문입니다. 그렇지만, 제가 말하는 방황은 술 먹고 노는 것이나 아무것도 하지 않고 하릴없이 시간을 보내는 것을 뜻하는 것이 아닙니다. 손톱만큼이라도 관심 가는 것이 생겼다면, 충분히 경험해보고 실패하는 과정을 통해서 자신의 진짜 경험을 쌓는 방황을 뜻 하는 것입니다. 그래야 30대의 내가 그 힘을 바탕으로 세상을 딛고 일어설 수 있습니다.   다른 누구도 아닌 내가 원하는 삶을 살기 위해서는, 진짜 내가 원하는 것이 무엇인지 알아야 합니다. 그러기 위해서는 내가 좋아하는 것, 내가 잘하는 것만이 아닌 내가 싫어하는 것, 내가 못하는 것, 나를 화나게 하는 것들도 알아야 합니다. 그것들도 진짜 내 모습이니까요. 알아야 피할 수 있고, 인정할 수 있어야 바꿀 수 있습니다.여러분들이 마음속 감정을 이해하고 받아들여 누가 뭐라고 해도 자신을 믿을 수 있는 용기를 갖고 자신의 미래를 스스로 선택할 수 있도록, 스트레스컴퍼니에서 마이 콜링 프로그램을 시작합니다.이런 분 오세요최대 8명 정원(그럴리는 없겠지만, 정원을 넘을 경우, 신청 동기에 따라 선정합니다)  - 학교를 다니고 있어도 내가 원하는 공부가 아닌 것 같은 사람- 직장을 다니고 있어도 내 일이 아닌 것 같은 사람- 일을 통해서 성취감을 얻고 싶은 사람  - 매주 과제를 충실히 수행할 수 있는 사람- 무엇이든 시도해 볼 용기가 있는 사람이어야 함 프로그램은 이렇습니다 마이 콜링 프로그램 8주 (시작 단계)1. 나는 이런 사람 / 마음을 녹이다      /  1주 차  분노캔들을 태우며 나를 힘들게 하는 것들을 모조리 꺼내놓습니다. 2. 나를 바라보기 / 마음을 터트리다    /  2주 차  지난주에 작성했던 감정카드와, 워크지, 스트레스 시트를 통해자신을 발견하는 시간을 갖습니다.  3. 내가 되고 싶은 나 / 마음을 먹다     /  3주 차  / 6주 차  새롭게 발견한 내 모습을 통해 내가 사소하게 실행해보고 싶은 프로젝트를 설정합니다.  4. 나를 만들기 / 마음을 다잡다           /  4주 차  / 7주 차  생각만 하는 꿈은 이뤄지지 않습니다. 사소한 프로젝트를 현실로 실행할 수 있도록 서로 돕습니다.5. 나를 공유하기 / 마음을 나누다        / 5주 차  / 8주 차 최종 발표   실행한 프로젝트를 공유하고 피드백을 받습니다.* 8명이 서로 피드백을 해줄 수 있도록 짝꿍을 정해드립니다.충분히 경험하고 또 실패하고 성공하는 과정 속에서 자신을 깨달을 수 있도록 프로그램을 진행합니다.일정은 이렇습니다3월 22일(목)부터 5월 10일까지 8주간 매주 목요일 저녁 7:30 ~ 11:00까지 만납니다.(평일반)3월 31일(토)부터 5월 19일까지 8주간 매주 토요일 오후 2:00 ~ 06:00까지 만납니다.(주말반)매 단계별로 분노캔들과 감정 다이어리, 감정 카드 등을 활용해서 수업이 진행될 예정입니다.참가를 원하시는 분은 아래 링크를 누르세요.https://goo.gl/jfQENG어떤 분들을 만날 수 있을 지 벌써부터 두근거리네요. 그동안 해왔던 진로 강의 경험과 코칭 경험을 바탕으로 여러분들의 고민과 끝까지 함께 하겠습니다.#스트레스컴퍼니 #심리스타트업 #스트레스관리 #서비스소개 #제품소개 #마이콜링프로그램

기업문화 엿볼 때, 더팀스

로그인

/