스토리 홈

인터뷰

피드

뉴스

조회수 2479

[직무] 고객 서비스를 넘어 고객 만족을 이끄는 CS 직무 소개

안녕하세요!MEMEBOX의 소식을 담아오는 모~뜨 입니다.미미박스는 미미박스를 통해 고객님들이 꼭 맞는 뷰티 아이템을 찾으실 수 있도록도움을 주기 위해, 90일 무료 환불 제도가 있습니다!이와 같은 제도 뿐만 아니라, 접점의 단계에서고객의 소리에 귀기울이고 문제 해결을 도와주시는 분들은바로 CS팀 입니다!오늘은 미미박스의 CS팀 직무를 소개 해드릴게용!짜란짜란짠짠!Q. CS팀은 어떤 일을 하나요?A. CS팀은 하루 종일 고객을 만나고 미미박스 플랫폼의 업체와 소통을 해요. CS 팀은 고객과 업체의 의견을 조율해 주는 딱 중간 지점에 있는 것 같아요. 때로는 고객과 통화를 하는 것 만큼이나 많이 업체나 기사님들과도 통화를 해요.주로 고객들의 불편 사항, 예를 들어 교환∙반품∙배송문의 등을 해결해드리고 있어요. 또한 업무를 하는 과정에서 개선이 될 부분이나 마련 되었으면 좋을 사항에 대해 일주일에 한 번씩 팀 회의를 해요. 서로 의견을 공유하면서 CS팀만의 프로세스를 만들고 그에 따라 고객 응대를 진행합니다.기본적인 고객 응대 외에도, 미미박스에서는 ‘미미SOS’ 라는 서비스를 제공하고 있어요. 미미SOS란  고객 한 분 한 분의 개인적인 뷰티 고민(피부∙메이크업)을 해결하는 것에 포커스를 두어 진행하고 있는 프로그램이에요. 일반적인 CS 문의(배송, 교환,반품) 는 창구가 있지만, 1:1 문의를 통해서 뷰티 고민에 대해 얘기하시는 분들은 거의 계시지 않거든요. 고객님들이 어떠한 고민을 갖고 있는 지가 궁금했고, 그러한 고민들에 대한 이야기를 듣고 피드백을 드리면서 미미박스와 고객들 사이의 관계가 조금 더 좋아지고,  밀착이 될 수 있을 것이라고 생각했어요.Q. 미미박스 CS팀은 고객을 만족시키기 위한 어떠한 전략을 가지고 있나요?A. 미미박스에서는 고객의 소리를 들을 수 있는 ‘VOC(Voice of Customer)체험 프로그램’을 운영하고 있어요. 타 부서 직원들이 VOC 프로그램을 체험하며 CS의 업무나 방향을 살펴보고 실제로 고객 응대도 진행하고 있어요. 미미박스의 핵심 가치가 FOCUS ON PEOPLE 인 것처럼 고객들의 소리를 직접 들어보지 않으면, 고객들이 진짜로 무엇을 원하는지 어떤 것들 때문에 미미박스에 찾아 오시는지 잘 모르는 경우가 많거든요. 어떻게 보면은 고객들을 짐작할 뿐이지, 진짜 만나본 고객들은 아닌 것이에요. Tech팀도, 각 팀의 리더분들과 최근에는 인턴분들도 오셔서 직무체험을 하셨어요. 미미박서분들이 고객이 원하는 것이 어떤 것인지 새로운 관점을 얻어가실 수도 있는 것 같아요. 예를 들어 Tech팀에서는 ‘고객이 결제하실 때, 이러한 부분이 불편하시겠구나.' 등 새로운 관점을 얻어가실 수도 있는 것 같아요.  이렇게 진짜 고객의 소리를 들으며, 진짜 고객이 원하는 것을 찾아갈 수 있다는 점에 있어서 미미박스만의 타 부서의 CS교육이나 체험이 굉장히 메리트 있는 점이라고 생각해요.미미박스의 목표는 상품과 서비스를 제공할 때 고객의 입장에서 고객을 대변해서 생각하고 최종적으로 고객 '만족'을 이끄는 것이에요. 그렇게 함으로써 좋은 경험을 가지신 고객분들이 계속해서 미미박스에 방문하시게끔 하는 것이 최종적인 목적이고, 이를 위해 CS팀도 꾸준히 공부하고 각자 맡은 분야에서 최선을 다하고 있습니다.Q. CS 업무를 잘 수행하기 위해 갖춰야 할 자질은 무엇인가요?A. 상대방의 말에 경청하는 것과 상대방에 대한 선입견을 갖지 않는 것이 가장 중요해요. CS팀은 고객을 전화로만 마주하기 때문에 단어 하나 하나, 호흡 하나에도 고객의 기분을 상하게 할 수 있고 혹은 별 것이 아닌 말에도 고객의 마음을 누그려뜨릴 수 있는 요소가 있어요.따라서 고객의 말을 끝까지 경청하고, 고객들의 목소리나 억양만 가지고 고객이 어떤 사람인지에 대해 선입견을 갖지 않는 것이 중요해요. 선입견을 갖기 시작하면, 고객을 진심으로 응대할 수 없게 되는 것이 있어요. Q. 고객이 앞으로 미미박스를 어떻게 바라보길 원하세요? A. 현재 미미박스는 고객 개인화에 따른 뷰티 정보를 제공하고 있는 서비스인 미미SOS를 진행하고 있있는 것처럼, 저는 개인적으로 고객들로 하여금 화장품∙피부고민∙뷰티라는 카테고리를 놓고 이야기를 할 때 가장 먼저 떠올릴 수 있는 플랫폼이 미미박스가 되었으면 좋겠어요.예를 들어 ‘왜 이렇게 각질이 일어나지?’ ‘메이크업이 갑자기 왜 이렇게 뜨지?’ ‘왜 트러블이 올라오는 거지’ 등 무엇인가 고민들이 생겼을 때, 부담없이 친한 친구나 옆집 언니에게 가장 친근하게 물어볼 수 있는, 제일 먼저 찾을 수 있는 플랫폼이 되었으면 좋겠어요. 제 개인적인 바람이기도 하고 미미박스도 그렇게 되기를 바라고 있지 않을까 생각을 해요. Q. CS직무를 희망하시는 분에게 한마디 남겨주세요!A. CS 라는 업무는 누구든 도전해볼 수 있는 업무이기는 하지만, 아무나 할 수 있는 업무는 아니라고 생각해요. 그만큼 감정적인 소모도 많고 어떤 부정적인 감정을 느꼈을 경우. 고객에게 반사하지 못하고 그 순간 스스로 흡수해야 하기 때문에 힘이 들 때도 있을거에요. 하지만 결과적으로 타인의 불편을 해소하고 그로 인해 고객의 만족을 끌어내며 기업과의 좋은 관계를 유지하는 것을 이끌어주는 중요한 역할을 하고 있다고 생각해요. 물론 스트레스를 안 받을 수는 없겠지만, 스트레스를 받기보다는 자부심을 가지셨으면 좋겠어요. 단순히 콜센터에서 고객님들의 민원 전화를 받거나 욕을 먹는 것에 익숙해지는 등 본인의 직무를 낮춰서 생각하지 않으셨으면 좋겠어요. 더러 힘든 고객도 만나게 되는 경우도 있지만,  어떠한 곳에서 CS 업무를 하시든 간에, 기업을 보고 찾아와주는 고객의 최전방에서 고객의 만족을 이끌어내는 부서라는 것에 대한 자부심을 가지셨으면 좋겠습니다. 고객의 최전방에서,고객의 만족을 이끌어내는 CS팀의 직무 이야기는 어떠셨나요?다음 번에는 새로운 직무 이야기를 가지고돌아오겠습니다 !기대해주세용
조회수 1416

우리는 인연이 아닌가 봐요

콜라보레이션!스타트업들 간의 협업은언뜻 멋져 보인다.취지도, 명분도뭔가 그럴듯해 보인다.우리가 강한 경쟁자를 상대하기에부족한 것들을 같은 처지의 스타트업끼리뭉쳐 이겨낼 수 있을 것 같다.이론상 참 좋은 연합이다.(출처: 만화책 "드래곤볼카이" 중에서 퓨전합체)그런데 실제로는 어떠할까?나도 콜라보레이션의 취지는 좋게 생각한다.분명 장단점이 있고,콜라보를 통해 서로 시너지를 낸 선례들도 있다.근데 그게 그냥 "같이 합시다"라고 뭉친다고잘 되는 게 아니라더 신경 쓰고, 양보하고, 신뢰해야 하며,에너지가 많이 소비되는 형태이다.부족한 것은 상대방이 채워줄 것 같지?아니, 상대방도 너를 의존하고 있고,너에게 기대하는 바가 크기에제대로 뭉치지 않으면오합지졸 당나라 군대가 돼버리기 쉽다.우리 함께 연합해서 Win-win 하자고?괜히 어설프게 연합하다간함께 Lose-lose 할 수도 있다.무작정 뭉친다고 강해지는 게 아니다.오히려 서로에게 악영향이 되고,서로에게 감정만 상할 수도 있다.그럼 콜라보레이션은어떻게 해야 제대로 운영될 수 있을 까?1. 리더가 필요하다.양 무리에도 리더가 있다.둘 이상의 콜라보에서 동등한 의사결정이이상적으로 보일지는 몰라도업무를 수행하는 데 있어서 누군가는 전체 연합을조율하고, 이끌어가야 할 보다 강한 리더십이 있어야 한다.스타트업들 간의 연합의 취약점은바로 체계가 없음이다.동등한 위치에서,평등한 의사결정을 꿈꾼다면평행선을 달릴 일도 많아진다.우리에게 시간이 넉넉하고,자금이 풍족하다며시장이 우리의 제품/서비스를 기다려 준다면그 사이에 우리 모두 웃음꽃 피우며좋은 게 좋다고 끝없는 토론의 장을 가질 수 있겠지.한정된 시간과늘 부족한 자금과눈 깜빡할 새 변하는 변덕스러운 시장을순간순간 체크해야 하는데...누군가는 앞서서 진두지휘를 해야 한다.이게 참 말이나 글로 적긴 쉬운 건데실제로 적용되는 건 어려운 일이다.이리저리 신경 쓰기엔창업자가 할 일이 참 많잖아.2. 목적이 명확해야 한다.콜라보로 우리가 얻을 수 있는 것이 무엇인지에 대한명확한 목표/목적이 있어야 한다.양보할 수 있는 부분은 무엇이고,물러 설 수 없는 부분은 무엇인지를 확실하게 알려야 한다.이게 어정쩡하면,뒤에서 아쉬운 소리가 나올 수밖에 없다.두 가지 문제가 있더라.일단 뭔가를 잘 정의를 못 내리는 문제.우리가 왜 콜라보를 해야 하고,무엇을 위해서 해야 하는지 그다지 선명하지 않았다.두 번 째는상대방의 목적이 무엇인지 모르겠더라.뭐 상생이라던가,파트너십이라던가 참 듣기는 좋은 말인데...그래서 어쩌라는 건지,뭘 어떻게 하자는 건지너무 두리뭉실하다 보니...결국 거절을 하였다.서로의 목적이 다르면,서로 딴 주판을 튕기게 되고,그 끝은 서로에 대한 원망과 후회가 남는다.그나마 서로의 목적이 다르다는 것을 알기라도 한다면의견을 조율하고, 협의를 할 수 있겠지만서로 무슨 목적을 가지고 있는지 관심이 없을 때도 있다.그보다 콜라보를 해야 할 자신들의 근거조차스스로 모를 때가 더 많다고 해야 하나?3. 서로 신뢰할 수 있어야 한다.상대방을 믿을 수 있느냐가 가장 큰 벽이다.스타트업과 스타트업 간의 협력은대표들끼리 쿵짝쿵짝 코드 맞춘다고 돌아가는 게 아니다.구성원들 모두가 공감하고커뮤니케이션이 원활해져야 하는데...더군다나 자주 만나지도 못 하고,어쩌다 이슈가 생길 때만서로 연락 주고받는다면콩가루 스타트업 연합이 되지 않을까?사실 우리에게도 몇 번인가 콜라보 제의가 들어왔었다.그중 두 번 진행을 해봤다.한 번은 Good case, 한 번은 Bad case처음에는 뭣도 모르고  바로 계약서 준비하려 한 때가 있었다.(상대 쪽 대표가 착하고, 좋아서...)분쟁의 소지를 미연에 방지하기 위해서계약서는 큰 도움이 되는 것은 사실이니까.하지만 다시 생각해보니계약서는 굳이 쓸 필요를 못 느끼겠더라.괜히 계약서에 싸인 잘 못 했다가,우리 멤버들이 고생은 고생대로 하고,우리 방향에서 벗어날까 봐하는 노파심이 들었다.그래서 우리는 콜라보 제의에크게 비중을 두지 않은 상태에서확인 작업을 한다.아주 작은 사소한 일을 함께 해 본다.그리고 일이 진행되는 과정을 확인한다.그러다 몇 번의 소소한 미팅이 동반되는작은 일을 같이 해 본다.그리고 결과적으로신뢰할 수 있는 상대라고 판단되면,계약서를 준비한다.최근에 두 곳과 이런저런 일로작은 일을 진행하고 있는데...글쎄...좀 시간과 거리를 두고더 신중하게 접근하고 있다.신뢰라는 것은갑자기 생기는 것이 아니라관찰과 행동에서 나오는 것이다.팀빌딩에 신중했듯이,협업도 신중해야 하고,확인해야 하고, 복기해야 한다.힘들 때,우리는 누군가를 의지하고 싶어 진다.외로울 때,우리는 누군가 공감해 줄 사람이 그리워진다.그러한 감성적인 이유는콜라보레이션의 타당성을 주지 못 한다.논리적이고 합리적인 타당성이 없는콜라보레이션은 서로에게 죄를 짓는 것이다.오랜만에 스타트업 대표들끼리식사를 한 적이 있다.그 자리에서 한 분이연합 이야기를 꺼내셨다.어떤 대표들은 박수를 치며 환호를 하였지만,어떤 대표들은 고개를 절레절레 흔들었다.(출처: 게임 삼국지10, 황건동란, 도원결의)삼국지의 유비, 관우, 장비의 도원결의에 대해지극히 현실적이고 냉철하게 상상해보자.뜬금없이 술 한잔 나누면서 뭉친 모습으로상상하고 있는 건 아니겠지?그들이 서로를 몰랐겠는가.유비가 누구이고, 어떤 상황에 놓여 있는지,관우는 어떤 사람이고, 무엇을 중요시 여기는지,장비는 성격이 어떻고, 무엇이 관심사인지...그리고 그들이 공통적으로 꿈꾸는 목적이무엇인지 제대로 나누지도 않은 채그냥 꽃잎 날리는 복숭아나무 아래에서술 한 잔 주거니 받거니 하며의형제를 맺었겠는가.서로 다른 환경에서다른 삶을 살아왔던셋이 모여 리더(유비)를 정하고,더 필요한 누군가(공명)를 영입하고,후원자와 병사들을 모으고황건적의 난이라는 시기적절한 타이밍에그들이 전면에 등장하지 않았던가.단지,동지애만으로,즉흥적인 분위기에 휩쓸려서,아는 사람들이니까,백지장도 맞들면 낫다니까이런 말도 안 되는 이유로연합하자는 것은다 죽자는 거다.혼자 가는 길보다는 같이 가는 길이더 좋을 거라 착각하지 말자.같이 가는 길이 같은 방향일 때,같이 가는 동료가 서로에게 도움이 될 때,동행이 의미있고, 행복한 길이 되는거지무작정 함께라고 꽃길이 되지 않는다.함께 동행한다고 안심했는데그 길이 낭떠러지로 향하는 길일 수도 있다.이 글을 쓰는 말미에 꼭 남기고 싶은 말이 있다.스타트업 간의 연합 또는 콜라보레이션이나쁘다는 주장으로 오해하지 마시라.어정쩡한 콜라보레이션을 피하자는 것이다.방향이 없는, 목적성이 없는, 신뢰가 없는그런 연합을 만들지 말라는 것이다.실제로콜라보레이션이 성공한 케이스는너무나도 많다.그들이 성공한 이유는서로에게 시너지를 줄 수 있는제대로 된 콜라보레이션이었기 때문이다.한 가지만 더 첨언하자면,우리가 좋은 스타트업과 함께 동행하길 원한다면,우리도 상대에게 좋은 스타트업으로 준비되어 있어야 한다.세상은 Give and Take!줄 것이 있어야 받을 것이 있고,우리에게도 무언가가 있어야상대방의 필요를 채워 줄 수 있다.오늘도스타트업 창업자 동지들을 응원합니다.#클린그린 #스타트업 #스타트업창업 #초기창업 #창업자 #고민 #응원 #인사이트
조회수 847

순서대로 척척, ORDER BY

ORDER BY 는 원하는 순서대로 자료를 출력하고 싶을 때 사용합니다. 편의를 위해 이전 글의 예제에서 MBR_NM 의 INDEX 인 IX_MBR_BAS_02 를 제거하고 진행하겠습니다. 이번 글에서는 이해-적용-출력-활용의 순서로 살펴볼게요. 지난 글 보기: 단일 TABLE을 SELECT하자!이해: ORDER BY의 오름차순과 내림차순SELECT     MBR_NM FROM test.TB_MBR_BAS ORDER BY     MBR_NM  ; 기본적인 ORDER BY는 위와 같이 사용합니다. 오름차순과 내림차순으로도 정렬할 수 있습니다. 오름차순일 때는 컬럼 뒤에 옵션을 넣지 않거나 ASC를 사용하고, 반대로 내림차순일 때는 DESC를 사용하면 됩니다.[오름차순]ORDER BY      MBR_NM ORDER BY      MBR_NM ASC [내림차순]ORDER BY      MBR_NM DESC 위의 Query(오름차순) 의 실행계획을 보면 아래와 같이 표시됩니다.결과는 다음과 같습니다. (수행시간 3초)내림차순 Query의 실행 계획을 보면 아래와 같이 표시됩니다.결과는 다음과 같습니다. (수행시간 3초)오름차순과 내림차순 정렬 Query를 보면 실행계획은 같고 결과는 다르게 나타납니다.실행계획을 보면 이렇게 표시됩니다.- table : TB_MBR_BAS - type : ALL - Extra : using filesort Extra의 using filesort는 DBMS에서 정렬을 한다는 의미로 퀵소트 알고리즘을 사용합니다. 실행계획의 내용을 풀어보면 “TB_MBR_BAS 을 전부(ALL) 읽은 후 정렬한다(using filesort)” 정도로 보면 됩니다.적용: INDEX와 정렬의 관계이번에는 삭제했던 MBR_NM의 INDEX인 IX_MBR_BAS_02를 다시 생성하고 수행해보겠습니다.CREATE INDEX IX_MBR_BAS_02 ON test.TB_MBR_BAS (MBR_NM); SELECT     MBR_NM FROM test.TB_MBR_BAS ORDER BY     MBR_NM  ; INDEX를 생성하고 실행계획을 보면 아래와 같이 표시됩니다.실행계획을 보면 몇 가지 달라진 게 눈에 띕니다.1. type : ALL -> index 2. key : 없음 -> IX_MBR_BAS_02 3. Extra : using filesort -> Using index 특히 Extra는 using filesort에서 Using index 로 바뀐 것을 알 수 있습니다. using filesort가 정렬을 한다는 것인데, 정렬을 하지 않고 어떻게 정렬해서 보여준다는 것일까요? INDEX를 이해하면 바로 알 수 있습니다. 일반적인 INDEX는 기본이 BTree INDEX 입니다. MySQL의 BTree INDEX는 오름차순 정렬 상태로 저장되어 있습니다. 이미 정렬한 상태로 저장되어 있는 INDEX를 사용하기 때문에 Query를 수행할 때 다시 정렬할 필요가 없죠. 그래서 using filesort가 나타나지 않는 겁니다.출력: Query 실행다음으로 성이 김 씨인 사람들의 이름을 순서대로 출력해보겠습니다. 여기서는 두 가지 Query를 이용해 비교해보겠습니다.예시 1)SELECT     MBR_NM FROM test.TB_MBR_BAS WHERE MBR_NM LIKE '김%' ORDER BY     MBR_NM  ; 예시 2)SELECT     MBR_NM FROM test.TB_MBR_BAS WHERE SUBSTR(MBR_NM,1,1) = '김' ORDER BY     MBR_NM  ; 예시를 보면 WHERE 절이 다릅니다. 예시1은 “MBR_NM이 ‘김’으로 시작하는 것을 오름차순 정렬해 보여주라는 것”이고, 예시2는 “MBR_NM의 첫 번째 글자가 ‘김’인 것을 오름차순 정렬해 보여주라는 것”입니다.이제 두 개의 Query 실행계획을 비교해보겠습니다.예시 1)예시 2)여기서 주의 깊게 봐야 할 컬럼은 type입니다. 다른 컬럼들은 TB_MBR_BAS의 테이블을 조회하면서 IX_MBR_BAS_02 INDEX만을 사용해 보여주겠다는 내용을 갖고 있습니다. IX_MBR_MAS_02 INDEX가 MBR_NM으로 정렬되어 있기 때문에 using filesort가 나타나지 않은 것입니다. 그렇다면 type에 range와 index는 어떤 차이가 있는 것일까요?range : where 조건에 조회하는 범위가 지정된 경우 나타납니다.예시1은 TB_MBR_BAS를 조회하는데 IX_MBR_BAS_02 INDEX의 MBR_NM에서 ‘김’이 시작되는 위치부터 끝나는 위치까지 조회해 보여주라는 의미입니다. IX_MBR_BAS_02 INDEX를 이용해 ‘김’이 시작되는 위치로 바로 접근할 수 있는 것이 핵심입니다.index : index를 처음부터 끝까지 읽는다는 의미입니다.예시2는 TB_MBR_BAS를 조회하는데 IX_MBR_BAS_02 INDEX를 순서대로 읽어서 MBR_NM의 첫 글자가 ‘김’인 것을 보여주라는 의미입니다.두 개의 차이점을 꼽자면, range는 원하는 범위로 바로 접근해 값을 가져올 수 있는 것이고, index는 처음부터 끝까지 읽어서 그 값이 조건에 맞을 경우 가져오라는 것입니다. 따라서 예시1이 휠씬 성능이 뛰어난 Query라고 볼 수 있습니다. 결과는 모두 아래와 같이 출력됩니다.수행시간은 차이를 보였습니다. 예시1은 0.0041초, 예시2는 0.5초였는데요. 예시에서는 건수가 적기 때문에 큰 차이가 없는 것처럼 보이지만, 자료가 10배 또는 100배 많아진다고 생각해보세요. 엄청난 차이겠죠.활용: Query를 만들고 DISTINCT !마지막으로 Query 하나를 만들어보겠습니다. 1) MBR_NM의 중복을 제거하고2) 김 씨이면서3) 이름이 ‘혜’로 시작하는 사람을 먼저 출력하고4) 이외의 사람은 그 다음부터 오름차순으로 출력하려면 어떻게 만들어야 할까요?중복을 제거할 때는 일반적으로 DISTINCT 와 GROUP BY 두 가지를 사용합니다. 이번 글에서는 DISTINCT를 사용하겠습니다. 다음으로는 오름차순 정렬할 때 김 씨를 먼저 출력하는 것인데 조건문을 사용하여 김 씨인 것과 아닌 것을 구별해 우선순위를 주겠습니다. 다른 것은 위의 Query를 이행하면 됩니다. 먼저 DISTINCT를 넣고 수행해 보겠습니다.SELECT     DISTINCT     MBR_NM FROM test.TB_MBR_BAS ORDER BY     MBR_NM  ; 실행계획은 다음과 같습니다.DISTINCT를 수행하면 Extra가 나타나며 group by로 표시됩니다. 여기서는 IX_MBR_BAS_02를 이용하여 gorup by(중복제거)하여 보여준다는 의미입니다. 수행하면 다음과 같은 값이 나옵니다.다음으로는 MBR_NM이 ‘김혜’로 시작하는 것을 먼저 보여주기 위해 ORDER BY 절에 CASE WHEN문을 사용하겠습니다.SELECT     DISTINCT     MBR_NM FROM test.TB_MBR_BAS ORDER BY     CASE         WHEN MBR_NM LIKE '김혜%'    THEN 0         ELSE 1     END     ,MBR_NM  ; 실행계획은 다음과 같습니다.ORDER BY에 조건이 들어가면서 INDEX의 순서대로 정렬한 것을 그대로 보여줄 수 없기 때문에 Extra에 Using temporary, Using filesort가 나타납니다. Using temporary는 가상 테이블을 만들어 사용하는 것인데, 다시 말해 가상 테이블을 만들어 다시 정렬하는 것입니다. 이에 대한 출력값은 다음과 같습니다.‘김혜’로 시작하는 사람이 먼저 나왔군요.글을 마치며지금까지 ORDER BY와 연관된 조건 처리를 알아봤습니다. 데이터를 더욱 체계적으로 나타내고 싶으신가요? ORDER BY를 이용해서 원하는 목적을 달성해보세요.글한석종 부장 | R&D 데이터팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발자 #개발팀 #인사이트 #경험공유
조회수 1575

개발자의 시간 벌기

Overview지루한 작업은 저와 어울리지 않습니다. 한마디로 귀차니즘이 가득한 개발자입니다. 반복적인 일을 하고 있으면 딴 생각이 많이 떠오릅니다. 특히 개발 과정은 쿼리를 작성하고, 프로그램에 적용하고, 검증하는 일이 자주 발생하는데 필요 이상으로 내 시간을 낭비한다는 생각이 들었습니다. 매번 다시 작업해야 하는 쿼리의 조합을 책상 서랍에 착착! 정리해둔 물건처럼, 코드도 언제든 쓸 수 있게 착착! 준비해두면 시간도 절약되고, 업무도 편리해지지 않을까요. 도대체 최종 결과는....?개발언어를 PHP로 전향하면서 제일 오래 걸리는 부분은 프로그램에서 발생하는 쿼리를 다시 조합하고, 검증하는 작업이었습니다. 프로그램에 사용하는 조건을 체크하고, 대입되는 변수들을 체크하고, 치환할 부분에 넣어주는 작업을 반복해야 하고, 야근하고, 건강 잃고… 쿼리가 정상적으로 조합되지 않으면 어느 부분이 틀렸는지 매번 확인해야 합니다. 이 번거로운 작업을 안드로이드 개발에서 사용하는 logcat 같은 기능으로 만들면 좋을 것 같았습니다. 그래서 PHP용 Log 프로그램을 간단하게 만들기 시작했습니다.Logcat 화면, 한결 보기 편해 보인다. ㅂㄹ개발 컨셉손으로 쓱쓱 그려 보았습니다.PHP 쿼리 요청 코드// sql 디버깅 코드: 쿼리 시작 if (ENVIRONMENT == 'testing') {     if(function_exists('localDebugger')) localDebugger( 'sql_start', "0,".$sql);  } // Run the Query if (FALSE === ($this->result_id = $this->simple_query($sql)))  {     // 소스 생략     if ($this->db_debug)      {              // 소스생략 ...            $this->trans_complete();              // sql 디버깅 코드: 쿼리 에러           if (ENVIRONMENT == 'testing') {               if(function_exists('localDebugger'))  localDebugger( 'sql_error', '0, -- Error  Number: '.$error_no  ."\n--  message: ".$error_msg."\n");           }              // 소스생략 ...      }     return FALSE;  } // 소스 생략 // sql 디버깅 코드: 쿼리 종료 if (ENVIRONMENT == 'testing')  {     if(function_exists('localDebugger')) localDebugger( 'sql_done', ($em + $es) - ($sm + $ss).",");  } PHP 디버그 서버에 요청 코드$callNo = time();           /**           *로컬서버에 디버깅 메세지           * 지정된 서버에 디버깅 메세지 전달           * @access public           * @author BoseungChun           * @param string $message   디버깅할 메세지           */ function localDebugger( $type, $message ) {           global $callNo;           //debugger server           $url = 'http://127.0.0.1:3000';           $ch= curl_init($url);            // 요청 파일 분석           $trace= debug_backtrace();           $fileName= substr( $trace[1]['file'],strrpos($trace[1]['file'], '/') );           $line= $trace[1]['line'];           $fileName2= substr( $trace[2]['file'], strrpos($trace[2]['file'], '/'));           $line2= $trace[2]['line'];             // POST로 로깅 서버에 메세지 전달            curl_setopt($ch, CURLOPT_POST, 1);           curl_setopt($ch, CURLOPT_POSTFIELDS, $callNo.' '.$type.' '.uri_string().' '.$fileName2.':'.$line2."\n".$fileName.':'.$line.' '.$message);           curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);           $response = curl_exec($ch);           curl_close($ch);     } nodejs 일부 코드 // 서버 기동 const http = require('http');   const hostname = '127.0.0.1';  const port = 3000;   const server = http.createServer((req, res) => {       res.statusCode = 200;       res.setHeader('Content-Type', 'text/plain');       var body = '';       req.on('data', function (chunk) {           body += chunk;       }).on('end', function () {           var pos = body.indexOf(' ');           var no = body.substring(0, pos);           body = body.substring(pos+1);           pos = body.indexOf(' ');           var type = body.substring(0, pos);           body = body.substring(pos+1);           pos = body.indexOf(' ');           var uri = body.substring(0, pos);           body = body.substring(pos+1);           pos = body.indexOf(' ');           var file = body.substring(0, pos);           body = body.substring(pos+1);           pos = body.indexOf(',');           addSqlBlock( no, uri, file, body.substring(pos+1), body.substring(0, pos), type );      })      res.end('');  });   server.listen(port, hostname, () => {       console.log('Server running at http://${hostname}:${port}/');   }); // 코드 생략   function addSqlBlock( no, uri, file, sql, ms, type ) {      // UI를 구성해서 코드 블럭를 관리하는 태그에 붙여준다.   } 코드는 위의 코드와 같이 간단한 것들을 사용했습니다. 아래의 이미지는 nodejs를 이용해서 디버깅 메시지를 받을 서버를 만들고, 포트를 열어둔 것입니다. 정리하면 PHP 코드에서 발생하는 쿼리의 최종 내용을 디버깅 서버에 HTTP post 방식으로 전달해주는 구조입니다. 코드는 몇 줄 안 되지만, 꽤나 강력한 도구가 만들어졌습니다."어때요. 참 쉽죠?"짜란~~~ Logger 베타 버전이 도구는 페이지를 요청하는 즉시 쿼리가 잡힙니다. 어떤 페이지 요청에서 어떤 쿼리가 발생하는지 쉽게 분석할 수 있으니 번거롭게 쿼리를 조합하는 과정은 자연스럽게 사라졌습니다.색상으로 쿼리의 속도를 표현했다.이 프로그램의 제작자이지만, 유일한 사용자이기도 합니다. 불편한 게 느껴지면 바로 수정해야 했습니다. 어렸을 때 학습지 좀 풀었던 실력으로 알아서 척척척 스스로 기능을 보강했습니다. 위의 이미지처럼 색상만 추가해도 쉽게 분별할 수 있습니다. 쿼리 실행시간을 추가해 어떤 쿼리가 병목을 잡는지도 빠르게 찾을 수 있습니다.PHP 요청 패스를 넣었더니 개 이득!디버깅에 유용한 정보까지 추가했습니다. 요청된 경로, 쿼리가 실행된 파일의 이름, 라인 위치 모델을 요청한 상위 파일의 이름과 라인 위치를 추가해 트래킹을 보강했습니다. 이쯤 되니 거의 절대반지급입니다. 쿼리 이즈 마이 프레셔스..개발에 필요한 정보들이 노출되니 기쁘지 아니한가!이외에도 현재까지 아래의 기능들을 추가했습니다.쿼리 카피 기능과 신텍스 하이라이트, 쿼리 라인쿼리 에러 메시지 로깅url 요청 단위로 쿼리 묶어주기시간이 지난 쿼리 자동 지우기키워드 검색 기능필요한 걸 직접 만들어 사용하는 것이 귀찮을지도 모릅니다. D.I.Y도 아닌데 말입니다. 하지만 자신의 개발 능력을 활용해 업무 환경을 개선하고, 개선된 만큼의 시간을 다시 투자해 선순환 구조를 만든다면 행복한(?) 개발이 될 거라 생각합니다. (=더 많은 일을 하게 되는 건 안 비밀)오늘은 업무 전, 반복 작업을 개선하면 어떨까요. 참고(사용기술)nwjsPHP (codeigniter)CSS3 + HTML5JQuery글천보성 팀장 | R&D 개발2팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #기업문화 #조직문화 #업무환경 #인사이트 #경험공유
조회수 1022

직방 이야기 - 포항을 위한 직방의 작은 노력

'포항' 하면 뭐가 떠오르세요? "구룡포과메기, 바다, 물회, 호미곶, 포항공대, 손바닥 조형물..."  포항하면 연상되는 맛있는 음식과 멋진 풍경들, 하지만 포항은 지금 힘든 시간을 겪고 있어요.차는 부서지고 건물 벽은 벌어지고 갈라졌다. 학교 건물 외벽이 무너져내렸다. 수업을 받던 학생들은 놀라 뛰쳐나왔다. 15일 강진이 덮친 경북 포항은 한순간에 아수라장이 됐다.[르포] 뒤틀리고 갈라지고 부서지고…포항이 무너져 내렸다2017년 11월 15일 경상북포 포항에서 발생한 5.4 규모 지진으로 사람이 다치고, 집과 건물이 무너졌습니다. 이재민들은 거처가 마련될 때까지 대피소 생활을 해야만 했는데요..직방은 포항 지진 피해 이재민 분들을 어떻게 도울 수 있을까 고민했어요.                                                       마침 대피소에서 전기장판이나 열풍기 등의 전열기를 쓰지 못한다는 이야기를 들었는데요, 단체로 전기를 쓰면 화재가 날 수 있다고 하더라고요. 그래서 이재민 분들이 조금이라도 따듯하게 대피소 생활을 할 수 있는 방법이 뭐가 있을까 생각했어요.고민 끝에 직방은 따듯함의 의미를 담아 수면바지와 수면양말, 그리고 아이들을 위한 실내복을 보내드리기로 했습니다. 좋은 품질의 제품을 선별해서 대피소에 계신 분들이 모두 받을 수 있도록 1300여 세트를 보냈어요!이 물건들은 구호물품 보관소인 포항 한마음체육관으로 무사히 전달했습니다.직방 CEO 안성우님이 포항시청 이동삼 팀장님께 물품을 전달하는 모습이예요.또 피해 이재민 물품지원과 별개로 ‘포항 어린이집 복구’ 프로젝트를 진행했는데요. 지진에 취약했던 교육 시설 중 특히 어린 아이들이 머무는 어린이집에서 지진 피해가 컸다고 하더라고요. ㅠㅠ어린이집의 놀이터 지반이 10cm 가량 내려 앉았고.벽에 금이 가거나 유리, 타일이 깨진 경우도 흔했다고 해요.이 어린이집은 한쪽 벽이 무너지고, 화장실 타일과 거울이 깨지고, 놀이터의 지반이 내려앉는 등의 피해를 입었는데요, 선생님들의 빠른 대처 덕에 다행이 인명 피해는 없었다고 합니다. 너무나 다행이죠.ㅠㅠ직방 구성원은 모금을 통해 지진 피해가 가장 심각한 ‘시립 양덕어린이집’의 인테리어 복구를 지원하기로 결정했습니다. 직접 어린이집 피해 현장을 둘러보고 있는 안성우님과 이언주님.아이들과 원장님, 선생님들이 얼마나 놀라셨을까요.. 50여명의 아이들은 인근에 안전한 공간에서 돌봄을 받고 있었습니다.어린이집 공사는 1월까지 진행됩니다. 튼튼하고 멋진 공간에서 아이들이 즐겁게 뛰어노는 모습을 하루 빨리 보고 싶어요~!더 안전한 공간으로 태어날 수 있도록, 직방이 힘쓸게요.어린이 여러분, 안전하고 따듯한 곳에서 해맑게 뛰어 놀아요!우리가 포항을 방문한 날은 하늘도 파랗고, 파도도 잠잠하고 그저 아름다운 포항의 모습 그대로였어요.그리고 불과 며칠 전, 크리스마스에 포항에서는 또 다시 3.5 규모 지진이 발생했다고 합니다. 11월에만 발생한 여진이 73차례라고 하네요.. 부디 더 이상의 피해 없이 빠르게 복구되길 바랍니다.#사회공헌 #공생 #프로젝트 #조직문화 #사내문화
조회수 1200

아띠 #19. 자칭타칭 아띠 비주얼, 마린!

Story #19. 자칭타칭 아띠의 비주얼 담당하고 있는라이더 '마린'을 소개합니다 :)자기소개 부탁해전 마린이에요. 아띠의 비주얼을 담당하고 있죠!!(하하) 어떻게 아띠를 처음 들어오게 됐어?처음에 김난도 선생님의 <내 일>이라는 책을 보고 관심이 생겨서 인터넷에서 아띠를 찾아봤어. 아띠 블로그도 보고 페이스북 좋아요도 누르면서 찾아보는데, 신입 라이더 모집기간이 이미 끝났더라고. 그래서 엄청 아쉬워했었어!(웃음)  그때 내가 군인이어서 당장 어떻게 할 방법은 없어서 그냥 평상 생활을 하는데, 내가 어느새 맨날 아띠 이야기만 하고, 아띠만 찾아보고, 아띠에 대해서 애들한테 계속 설명을 하고 있더라고. 그래서 비록 내가 지금 군인이어서 함께 할 수는 없지만, 이런 마음을 IJ한테 전달하고 싶었어. 그래서 IJ의 용기에 대해서 존경심을 표하고, 나도 기회가 되면 하고 싶다는 내용으로 편지를 썼지. 한 달 동안 답장이 안오더라고!(웃음) IJ가 처음에 답장 안 하려고 했었는데, 권이 답장하라고 해서 한 달 만에 답장을 받았어. '편지 잘 받았고 전역하면 그때 보고, 건강하게 전역하라'고. 그리고 4월에 전역한다고 하니까 구글 지원서 주소를 보내줘서 작성하고, 합격 통지를 말년 휴가 때 받았어. 엄청 기뻤지. 그래서 나는 전역한다는 기쁨보다 아띠에서 일할 수 있다는 기쁨이 더 컸어. 그래서 전역하고 바로 서울로 올라 와서 첫 날 케빈이랑 면접 보고 찜질방에서 저녁 12시에 합격했다고 문자받고 너무 좋았지. 그러면서 점점 아띠에 미쳐갔지.(웃음) 어떤 점이 그렇게 좋았어?음, 좋아진 이유에 대해서는 생각해보지 않았는데 그냥 정말 자연스럽게 좋아하게 된 것 같아. 자연의 흐름이었어.(웃음) 내가 아띠인력거라는 게 있다는 소식을 접한 이후에는 이걸 무시할 수가 없었어. 무조건 하고 싶었어. 그냥 내 속에서 그렇게 시킨 것 같아. 이성적으로 생각하고 판단했던 일이 아니고, 가슴이 시키는 일이었어. 진짜 그랬어! 그때 IJ한테 편지 쓸 때가, 새벽에 잠을 자다가 인력거 타는 꿈을 꿔서 일어나서 편지를 쓴 거야!(웃음) 그 새벽에 일어나서 렌턴 키고, '지금 아띠 때문에 잠을 잘 수가 없다, 인력거가 머리에서 떠나질 않는다'고 그렇게 편지를 썼어.  그리고 내가 처음 들어갔을 때가 영상을 많이 찍는 시즌이어서 비디오도 많이 찍고 열심히 일을 할 수 있었지. 타이밍이 좋았어. 인력거를 타면 제일 좋은 점은?크게 보면 이 세상이고, 좁게 보면 북촌인 이 곳에서 지나가는 사람들이랑 이야기를 나눌 이유가 없잖아. 그런데 내가 인력거를 탔다는 이유만으로, 그 사람들이랑 이야기를 나누고 함께 인력거를 타고서 나중에 내릴 때는 서로 친구가 되는 게 너무 재미있어! 그리고 나중에는 영어 투어의 맛을 알았지. 한국에 처음 온 외국인들이 느끼는 설레는 감정도 느껴지고, 그 사람들한테 내가 도움을 줄 수 있다는 게 기분 좋더라고.  처음 들어왔을 때는 어땠어?사실 처음에 많이 놀랐어. 제일 처음엔 케빈의 압박 면접에 놀랐어. 면접 볼 때 다른 사람이랑 같이 봤는데, 왜 아띠를 하려고 하나라는 질문에 나는 '23년 살아오면서 처음으로 하고 싶은 일이다. 내가 이렇게 하고 싶으니 좀 뽑아달라'고 말했었거든. 그런데 옆이 있는 친구는 그냥 단순히 돈을 벌려는 개념으로 왔던 거야. 그래서 그 친구는 케빈한테 많이 깨졌었지. 그때 조금 충격을 받았어. 다른 한 번은 생각보다 소통이 잘 안됐다는 느낌을 받았던 적이 있어. 그때 내가 함께 하면서 아띠에 도움을 주고 싶었고, 안 좋은 점들은 고쳐나가고 싶다고 느꼈어. 그래서 주 5회로 고정하고 시작하게 됐지. 그래도 아띠만큼 좋은 사내 문화를 가지고 있는 곳은 없다고 생각해. 우리만의 규칙들이 있잖아. 그런 것들은 정말 좋고, 잘 가꿔나갈 필요성이 있는 것 같아. 그리고 아띠에는 경쟁이 없잖아. 어느 회사에 경쟁이 없겠어? 그런데 아띠는 누구 하나가 내가 매출을 적게 벌어왔다고 뭐라고 하는 사람도 없고, 남이 나보다 매출을 많이 벌어왔다고 해서 스스로가 못났다라고 생각할 필요도 전혀 없다고 생각해. 다른 라이더들도 그냥 쟤가 운이 좋았구나 라고 생각하고 넘기니까 그런 경쟁이 없는 문화가 좋은 것 같아. 제일 힘들었을 때는?정신적으로 가장 힘들었을 때는 이번에 추억 때 집에 내려가서 친척들이 모였을 때였어. 학교 잘 다니고 있냐는 질문에 휴학하고 아띠인력거 하고 있다고 대답하니까 다들 그냥 고개만 끄덕이는 분위기였어. 아무도 나를 이해해주지 않는 분위기였지.(웃음) 그때 정말 부모님한테 가장 미안하면서 힘들었어. 아띠 나오는 뉴스 보여드리니까 아버지가 그제서야 허락해주시고 응원해주셨었지만, 속으로는 많이 걱정하셨을 거야.  그리고 내가 추석 때 아띠에 예약이 너무 많아서 가족들이랑 끝까지 못 어울리고 일찍 올라왔거든. 아띠는 남들 쉴 때 일하는 서비스업이니까, 남들 쉴 때 못 쉬는 게 좀 힘들더라. 특히 추석 때 다른 가족들은 다같이 다니는 데, 우리 가족들은 부산에 다 있고 나는 부산에서 서울로 혼자 올라와서 있으니까 제일 힘들었지.  육체적으로 가장 힘들었을 때는 무릎이 안 좋을 때인데, 정말 좋은 손님을 태웠을 때는 내가 무릎이 아픈지도, 땀이 나는지도 몰라. 라이딩을 마치고 들어오면 그때 알지. 그런데 조금 무례한 손님을 만나거나 내가 하는 이야기에 관심도 없고 왜 인력거를 타는지 모르겠는 느낌을 주는 손님을 만나면 체력적으로 정말 힘들어. 인력거가 앞으로 안 나가는 기분이야. 시간도 안가고. 그런데 좋은 손님들 만나면 1시간, 2시간 정말 금방 가. 어떤 손님이 제일 기억에 남아?어떤 노부부가 있었어. 할아버지께서 오랜 투병생활을 하셨는데, 병원에서 큰 희망이 없으니 할아버지한테 무리하게 치료는 그만하고 집에서 잘 쉬시다가 편히 보내드리자는 결정이 아띠를 타러 오기 하루 전에 났었대. 할아버지는 말씀도 잘 못하시고 거동도 힘드신데, 따님들이 인력거 예약해서 타신 거야. 1시간 동안 투어를 하고나서 할머니는 반응을 보여주셨었는데 할아버지는 말씀도 없으시고 표정 변화도 없으셔서 '재미없으셨나'생각했었거든. 그런데 인력거 투어가 끝나고 할아버지를 내려드리는데, 내 손을 딱 잡으시면서 딸들이 가자고 하시는데 안 가시는 거야. 그러면서 할머니 가방을 손으로 툭툭 치면서 나한테 용돈을 주라고 그러시는 거야. 이미 투어 비용은 지불하셨었는데도 계속 내 손을 안 놓으시면서 안 가시더라고. 그래서 결국 감사하게도 용돈을 조금 받았었어. 그리고 한 일주일 뒤에 그 따님한테서 문자가 왔었어. 할아버지가 편안하게 돌아가셨다고. 그때 나 정말 울었어.  할아버지께서는 오랜 투병생활에 지치셨는데 마지막으로 세상 구경을 나랑 함께 하신 거야. 그때 느낀 게, 우리가 인력거 타면서 정말 많은 손님들을 만나는 만큼 대부분 같은 투어루트를 돌면서 조금 지칠 때가 있어. 그런데 손님에게는 일생에 한번 뿐일 수도 있는 인력거를 타는 기회이고, 누구에게는 생에 마지막으로 세상을 구경하는 기회이고, 어떤 어린 아이에게는 처음 북촌을 구경하는 기회인 거잖아. 그래서 '그런 한 순간, 한 순간을 그 사람한테 정말 헛되이 돌려주면 안되겠구나'라는 그런 생각이 들더라고. 그때 그 할아버지를 통해서 그리고 할아버지께서 너무 좋아하셨고 만족하셨고 고맙다고 하는 문자를 받으면서 많은 생각이 들었어. 정말 잊혀지지 않을 손님이야.  그래서 나는 아띠를 버릴 수가 없어!(웃음) 난 지금 내가 아띠에 많이 스며들었다고 생각해. 내 욕심인데, 내가 없으니까 아띠가 안 굴러갔으면 좋겠어! 내가 없는 아띠를 생각하기도 싫어.(웃음) 아띠가 즐거운 순간에 내가 항상 있었으면 좋겠어.  마지막으로 하고 싶은 말사실 지금 아일랜드로 6개월간 가는 건데 겁이 안나. 왜냐면 내가 지금 아띠를 6개월 했는데 6개월 전에 처음 서울 올라왔을 때 나한테 아무것도 없었어. 그런데 지금은 이렇게 같이 밥을 먹고, 같이 무언가를 하자고 얘기 해주고 이제 잠시 떠난다고 하니까 같이 이런 슬픔을 공유해주는 좋은 가족들이 생긴거야. 딱 6개월이었어.그래서 나는 아일랜드에 가서도 똑같을 거라고 생각해. 어딘가에 던져졌을 때도 버틸 수 있는 힘이 생긴 것 같아. 아무튼 지금 이렇게 처음부터 끝까지 함께 해주는게 아띠인 것처럼, 아띠는 나에게 너무 너무 소중해. 나 스스로도 자아가 성립되는 기간이었어. 나중에 되돌아보면 이렇게 즐겁게 많은 사람들을 만나고, 많은 에너지를 얻을 수 있었던 순간을 꼽으면 지금 요 근래 6개월일 거라고 생각해. 많이 생각날 꺼야, 아띠!자석에 이끌리는 것처럼, 상사병에 걸린 것처럼,아띠를 알게 된 순간부터 인력거와 사랑에 빠진 마린의 러브스토리였습니다!마린이 아띠를 많이 생각하듯, 아띠도 우리 간판 라이더 마린이 많이 생각나네요~ :)아일랜드에서도 마린답게 몸도 마음도 씩씩하게 잘 지내리라 믿습니다.건강히 돌아와 아띠와 다시 즐겁게 라이딩하길 바래봅니다!#아띠라이더스클럽 #팀원소개 #팀원인터뷰 #팀원자랑 #기업문화 #조직문화 #사내문화
조회수 1472

스타트업을 시작하며... 1

기록으로 남겨보고 싶었다.사업이 성공적으로 launching되고 나서, 지금의 고민이 나중에 어떻게 증명될 수 있을까에 대한 호기심이랄까? ^^;; 새로운 서비스를 만들어가는 과정에 대한 기록을 남기는 것이 이 글의 목적이다. Brunch에 쓰기 전에 다른 곳에 남겼던 기록들을 이곳으로 옮겨왔다.Phase 0. 향수 서비스를 고민하기 시작하다.사실 지금 고민하고 있는 서비스는 어떤 특정한 problem을 해결하겠다는 접근에서 시작된 것이 아니었다. 원향(Fragrance oil)을 제조하는 회사와 business 관계가 있었고.. 4년 전 처음 그 회사(DROM fragrance)와 업무가 시작될  때부터 그 향을 어떻게 사용해 볼 수 있을까에 대한 고민을 하고 있었다. 그러던 중, Kukka 서비스를 보면서 향을 subscription 해주면 어떨까? 라는 아이디어를 떠올리고 비즈니스 모델을 생각하기 시작하였다. 향수는 지금까지 강력한 브랜드 가치를 통해 "오만한" 가격을 받고 있으며.. start-up에게 깨져본 적이 없는 영역이었다.Phase I. 서비스 모델을 구체화해 나가다..향수를 SPA업체들과 같이 트렌디하게 빨리 만들어서, 그 시점의 trend에 맞게 또한 날씨, fashon 및 occasion을 세팅하여서 한 달 정도에 사용 가능한 5ml 정도를 보내준다면 남기지 않고 잘 사용하고 버릴 수 있지 않을까?Phase II. 문제를 define 해보기 시작하다.사실 문제를 발견하고 그것을 어떻게 서비스화 할 것인가에 대한 고민이 순서에 맞다고 생각하지만, 향수라는 토픽을 정해 두고 시작하니 문제를 오히려 찾아야 하는 상황이다..  파우더 룸 같은 유명 female 카페에 가서 향수 카테고리를 뒤져보니..  남자친구나 저에게 어울리는 향이 무엇일까요? 가 problem number 1이고..   향수 소분 해서 팝니다... 연락 주세요! 가 problem number 2이고..  내가 생각하는 것은.. 향이 50ml, 100ml 이렇게 팔다 보니 너무 많이 집에 쌓아있다는 점.  나에게 어울린다고 생각하는 향수가.. 날씨, occasion 등을 모두 cover 할 수 있을까?   향수를 들고 다니기 쉽게 해서 사용하게 하면 어떨까?   브랜드 좀 있다고 하는 향수들 너무 비싼 거 아님? 공급자의 입장에서는 개발에 들인 공이 있고, 대량 생산을 해야 하기 때문에.. 양을 적게 해서 팔기 어렵다.  언제 어떤 상황에 어울리는지에 대한 story line이 없다.. Phase III. 현실 세계를 둘러보기 시작하다.향수를 만드는 공장을 방문해 보았다. 공장은 한 번의 batch를 돌리기 위한 최소한의 물량이 필요하고.. 이 공장에서는 50ml 기준이라면 불량률 15% 정도를 고려해서 3,000병 정도가 최소한의 물량이라고 한다. 물론 더 적은 양을 만들어 줄 수 있으나.. 단가가 올라갈  수밖에 없다.그리고, bottle 뚜껑은 screw 타입으로 할 것인지, 아니면 clipping type으로 할 것인지?  라벨은 자동 라벨 기를 사용할 것인지? 분사 양은 어느 정도로 할 것인지 등등 현실의 문제가 다가오기 시작한다.Phase IV. 주변의 인물들에게 의견을 구해보기 시작하다.일단은 물어보기 시작한다. 와우 좋은데.. 될 것 같은  비즈니스야!라고 하는 사람부터 음.. 미안한데 난 안 쓸 것 같아!라고 하는 사람 등등 다양한 사람들이 존재한다. 흠.. 그렇다면 이것을 받아들이겠다고 한 사람들의 의견을 모아서 작은 시장에서 시작할 것인가? 아니면 모두가 만족하는 서비스로 계속해서 수정을 할 것인가?뭐가 되든.. 소비자를 push 할 수 는 없다. 좋은 제안을 주고.. 그것에 따라오는 고객이 있다면 그 고객들을 더욱 만족시킬 수 있는 방향으로 진화하는  수밖에..Phase V. "이건 안되지 않을 이유가 없어요"를 주의하라.새로운 서비스를 기획하는 사람의 입장에서는 대부분 밝은 면 만을 볼  수밖에 없다. 어느 정도의 의견은 귀에 들어오지만, 비판적인 의견에 대해서는 귀에서 튕겨내는 것이 특징이다. 그러던 중, 한 선배에게서 "내 서비스가 안되지 않을 이유가  없어요"라고 말하는 것 같이 들린다는 의견을 들었다. 현실의 망치로 뒤통수를 맞아봐야 정신을 차리는 법이다.#파펨 #스타트업 #창업가 #창업자 #마인드셋 #인사이트
조회수 1915

왜 나는 버닝맨을 갔는가

1. 첫 번째 이유: 다른 사람들국내 한 컨퍼런스에서 Zappos의 토니쉐이를 연사로 초빙하고 싶어 한 적이 있다. 연락을 한 끝에 강연비 7000여만원을 줄 수 있으면 온다는 피드백을 받았다. 꼭 초대를 하고 싶었던 주최측은 그러겠다고 회신을 했고 얼마 후 두번째 피드백을 받았다. 토니쉐이가 내가 꼭 가야하는 이유가 무엇이냐는 질문과 함께 자기 생각에 가야 할 특별한 이유가 없다며 거절한다고 말이다. 이럴거면 처음부터 싫다고 하지 왜 이래저래 돌려 말했을까 하는 생각이 들었다. 추측컨데 일단 강연비가 비싸면 대부분 자연스럽게 포기할거라 생각했는데 그러지 않으니 결국 진짜 이유를 댄것이 아닌가. 그 정도 돈으로도 바꿀 수 없는 바쁘고 중요한 일정을 사는 CEO니 당연하지 않을까 하는 생각도 들었다. 결국 토니쉐이를 초대하는 것은 물거품이 되었고 다른 연사를 초대하는 것으로 일단락이 되었던 걸로 기억한다. 1년쯤 지났을까, 해외 지인들이 버닝맨에 참가한다는 이야기를 들었다. 함께 가자는 제의도 받았다. 버닝맨은 몇년전부터 알고 있었던 행사라 궁금하기는 했지만 비용도 있고 일정도 길어 결정이 쉽지 않았다. 마음의 갈등을 조금 했지만 당시에는 한국에서 해야 할 일들에 부담감을 가지고 있던 터라 결국 포기를 했다. 두어달 쯤 후에, 지인들이 버닝맨을 다녀와서 찍은 사진을 볼 기회가 생겼다. 깜짝 놀라지 않을 수가 없었다. 지인 사진에 그 Zappos의 토니쉐이가 앞에 누워서 함께 이야기를 듣고 있는 것이 아닌가. 처음에는 설마 했는데 매년 며칠씩 머물다 간다는 이야기까지 들었다. 7000여만원을 줘도 한국에 오지 않던 그가 자비로 그것도 며칠씩 참여를 한다는 것이 무엇 때문인가? 구글의 창업자들과 에릭 슈미트도 참가한다는 이야기는 익히 알고 있었지만 토니 쉐이의 참가는 내게 더 피부에 와닿는 호기심을 불러 일으켰다. 게다가 테슬라의 엘론 머스크, 에어비엔비의 칩 콘리, 페이스북의 마크 저커버그도 참가했다고하니 분명히 뭔가가 있다. 물론 실리콘밸리 기업가들이외에도 윌 스미스, 수잔 서랜든 같은 유명한 헐리우드 스타들를 비롯하여 수많은 가수, 모델들이 버닝맨에 참가한다는 것[1]을 구글링만 해봐도 쉽게 알 수 있다. 나같은 사람도 바쁘다고 그 시간과 비용을 들이지 못했는데, 이들이 참여를 한다면 무엇인가 내가 모르는 엄청난 가치가 있을 것 이라는 데 생각이 미쳤다. 어지간한 돈으로 살 수 없는 시간을 사는 사람들이 왜 자신이 비용을 들여 참여하는가? 진짜 이유가 궁금 해 졌다. 2. 두 번째 이유: 버닝맨 그 자체1986년에 시작되었으니 30년이 넘었다. 이제는 매년 7~8만명이 찾는다. 도대체 사람들은 왜 버닝맨에 오는가도 의문점이지만 어떻게 아무 것도 없는 사막에 열흘간 도시가 생기고 사람들의 욕망을 담았다가 완전히 사라지는 일을 30여년간 반복 할 수 있을까? 참가하는 사람들도 독특하고 그 안에서 시도되는 실험들도 다양한 버닝맨이라고 불리우는 이곳, 그 자체가 궁금했다. 실리콘밸리 문화와 결을 같이 한다는 말도 들었고, 단순히 축제의 장이 아니라 사람들이 만나 깊이있는 관계가 되고 그것을 바탕으로 새로운 아이디어와 비즈니스가 실행된다고도 하는데 도무지 어떻게 그것이 가능한지 정말 궁금 해 졌다.  구글의 문화와 철학이 버닝맨과 닮아있다 하는데 그 비밀은 무엇이며 버닝맨의 어떤 것 들이 구글을 경쟁력있게 만들었을까. 인터넷에서 버닝맨을 검색만 해봐도 알수있는 견줄수 없을 만큼 독특하고 특이한 이 축제가 도대체 구글이나 실리콘밸리의 특별함과 무슨 관계란 말인가? 엘론머스크(Elon Musk)[2]도 버닝맨에 참가하고 나서 '가보지 않았다면, 그냥은 알수없다’라는 말을 남겼다. “If you haven’t been, you just don’t get it. You could take the craziest L.A. party and multiply it by a thousand, and it doesn’t even get fucking close to what’s in Silicon Valley.” 버닝맨에 뭔가 엄청난 것들이 숨겨져 있을 것만 같은 기대와 호기심이 생겼다. 구글 혁신의 비밀을 발견하고 싶었고 실리콘밸리가 생태계로서 지속가능성과 문화를 지탱 해 내는 힘을 이해하고 싶었다. 3. 세 번째 이유: 나 자신자주 받는 질문이 있다. 도대체 메인직업이 무엇이냐? 무슨일을 하느냐?예전 삼성에서 일했던 10년간은 한번도 받아보지 않았던 질문이다. 그 때는 삼성전자에서 R&D를 한다고 하면 더 이상의 설명이 필요없을 정도로 사람들은 쉽게 이해를 했다. '삼성전자 연구원이다' 그러면 '하드웨어냐 소프트웨어냐, 모바일이냐 가전이냐' 정도 추가 질문이 있을 뿐 그 아이덴티티는 너무도 확고했다. 하지만 삼성전자를 나와 지금은 사물인터넷 솔루션을 개발하는 일과 아시아의 혁신가들이 연결되는 플랫폼을 만드는 일, 기술을 통해 세상에 의미를 가져 올 프로젝트들, 컨텐츠와 혁신프로그램 개발, 강연, 방송, 투자, 자문 등 다양한 일들을 하다보니 사람들은 그것을 이해하는 데 불편한 마음을 드러낸다. 도대체 넌 누구냐?내가 하는 일 중 한두가지만을 알고 있는 사람들은 혼동스럽지 아니하고, 반면에 나를 아주 깊이 아는 사람들은 이 모든게 연결되어 있다는 것을 이해하기에 복잡한 아이덴티티이지만 공감한다. 하지만 대부분은 나를 적당히 알고 있는 사람들이다. 그들은 일관성없어 보이는 나의 일들(Randomness)이 무척이나 의아하다. 설명도 어렵다. 이 모든 걸 관통하는 의미로 future designer, innovation catalyst란 타이틀로 나를 소개하지만 낯선 타이틀에 대한 공감은 요원하다. 그래서 흔들릴 때가 있었다. 내가 제대로 살고 있는 것인가. 이렇게 사는것이 바람직한 것인가. 어떤 사람은 하나라도 잘하라고 하고, 어떤 사람은 정체성이 없어 보인다 했을 것이니 말이다.     삼성에 근무할 때 사내방송에 출연하여 신기술에 관한 인터뷰를 한적이 있다. 담당피디가 타이틀을 어떻게 표기할까를 물어왔다. 삼성전자 연구원이라 쓰라했더니 다른 타이틀이나 경력이 없냐고 물어 본다. 다들 삼성전자 연구원이니 뭔가 전문성을 더 드러낼 수 있는 책의 저자라던가, 다른 타이틀이 있느냐는 것이다. 없다 했다. 그리고 고민을 했던 기억이 난다. 모두가 같은 타이틀을 가지고 있을 때, 오롯이 나를 담아내려면 난 무엇이라야 하는가. 이때부터 시작된 고민의 답을 찾기 위해 회사를 그만두고, 시도하고, 새로 해 온 일들이 오히려 지금은 반대의 상황을 만들어 내고 있다. 2016년, 버닝맨 웹사이트를 둘러보다 낯선 단어를 하나 발견한다. Polymath위키피디아[3]를 찾아보면 Polymath는 르네상스맨처럼 '다방면에 박식하고 전문적인 깊이를 가지고 있는 사람’을 의미한다. 버닝맨은 매년 달라지는 주제에 맞춰 참가자를 칭하는 단어를 하나 정해서 티켓에 표기를 한다. 2016년은 'Davinci’s Workshop’이라는 주제였고 여기에 맞춰 레오나르도 다빈치같은 다재다능한 분야의 전문가이며 다양성을 기반으로 혁신적인 실험과 결과를 만드는 사람을 칭하려 한것 같다. 한가지에 전문가가 되기도 힘든 세상에 복합적이고 다양한 분야의 전문성을 가진다는 것이 다빈치나 미켈란젤로같은 천재가 아니면 가능할까하는 의문이 잠깐들었지만, 순간 내 고민의 지점과 겹치는 느낌이 들었다. 이런 사람들의 정체성은 무엇인가? 예술가로 알고 있던 다빈치이지만 사실 그의 업적은 엄청 다양하지 않은가. 그는 예술가인가? 과학자인가? 철학자인가? 작가인가? 그의 존재가 그 자체로 복잡하고 설명하기 힘든 정체성을 가지고 있지 않은가? 뭔가 그 곳에 가면 내가 가지고 있는 고민의 답을 발견할 것 같은 느낌, 또 그런 사람들을 만나면 얼마나 좋을까하는 바램이 함께 생기는 순간이었다. 그제서야 트위터에서 한 미국인 친구가 나한테 인터뷰를 해달라고 했던 일이 떠올랐다. 'Polymathic generalist’에 관한 책을 쓰는데 내 경력을 보고 인터뷰를 하고 싶다 했던 것으로 기억한다. 쉽게 설명할 수 없는 새로운 일과 영역을 만들어낸다고 믿고 있지만, 그것을 한단어로 대체할 수 없는 정체성의 고민을 가지고 있던 나에게 가까이 다가가서 알아내고 싶은 욕망이 생겼다. 사실 부끄러운 고백을 하나 하자면, 직접 가보지도 않았던 내가 가끔 방송이나 강연때 버닝맨이 만든 혁신과 실험정신이 구글 그리고 실리콘밸리와 닮아 있다고 사례로 들곤 했다는 것이다. 진짜 그 기저에 있는 본질은 겪어 보지 못한채로 버닝맨을 이야기 해 온 것이 늘 마음에 걸렸는데, 이 아쉬움은 버닝맨에 꼭 가야겠다는 욕망에 기름을 부었고, 명분을 주었다. 진짜를 보고 진짜를 이야기하고 싶어졌다. 이렇게 버닝맨은 갈망을 흔들며 내 안을 비집고 들어왔다. [1] http://www.vogue.com/13300515/famous-burning-man-attendee[2] http://www.inc.com/tess-townsend/tech-titans-love-burning-man.html[3] https://en.wikipedia.org/wiki/Polymath#라이프스퀘어 #스타트업 #창업자 #창업가 #마인드셋 #조언원문출처 : 브런치
조회수 3774

린더를 만들고 있는 이유 3.0

지난 토요일 매우 더웠던 어느 여름밤, 관심일정 구독 서비스: 린더가 앱스토어 라이프스타일 16위에 올랐다.물론 출시에 맞추어 마케팅을 진행하다 보면 초기에 순위 상승 효과가 다소 있기 마련이고, 요즘 같은 시대에 앱스토어 순위 좀 올랐다고 그게 그리 큰 대수냐랴고 말하는 사람도 있겠지만서도, 이 앱을 스토어에 올리기까지의 험난했던 과정을 누구보다도 잘 아는 사람으로서 비록 잠깐이지만 한여름밤의 꿈 같았던 이 과정과 결과를 글로 간직하고 싶었다.모든 스타트업, 아니 작은 중소기업이 그렇겠지만 우리는 매우 소수의 인력으로 구성되어있고, 그 소수의 인원 하나하나가 정말 많은 일을 담당하고 있다. 관심일정 구독 서비스: 린더는 다소 독특한 서비스 구조 특성상 사업 초기부터 B2B, B2C 모두를 대상으로 운영이 되고 있으며, 하루하루 예상치 못한 새로운 일들의 연속이 이어진다. 혹자는 이를 도전적이고 진취적인 경험이라 포장할 수도 있겠지만, 당장 어제는 한 번도 해본 적 없는 B2B SEO 작업을 하다가 오늘은 또 ASO 전문가가 되어야 하는 우리 당사자들 입장에서는 이러한 일련의 과정이 매우 가혹할 수밖에 없다.린더를 만들어 가는 과정에서 정말 많이 다퉜다(물론 앞으로도 많이 다투겠지만). 앞서 말한 가혹한 과정 속에서 여유를 가지고 서로가 서로를 대하기는 쉽지 않았기에, 당장 회사가, 서비스가 몇 달 후에도 계속 존재할지 아무도 모르는 상황에서 희망을 품고 모두가 함께 서비스의 미래를 바라보기는 정말 쉽지 않았다. 하지만 그 다툼의 근간에는 제품에 대한 기대와 열망이 있었다는 것을 모두가 알고 있었고, 기능 하나하나 쉽게 양보하지 않았지만 결국 하나의 공통된 목표 하에 조금씩 타협해나갈 수 있었다. 그렇게 우리는 현재 '린더'라는 이름을 달고 세상에 태어난 총 5개의 서비스를 운영하고 있다.'린더웹'으로 불리우는 기본 캘린더 연동 서비스는 작년 6월에 출시되어 현재까지 약 20만 명의 사용자를 확보하였고, 올해 4월, 7월에 각각 출시된 '린더안드로이드앱'과 '린더iOS앱'은 현재까지 총 2만여 다운로드와 1만 MAU를 확보하였다. 이 과정에서 우리와 협업을 희망하는 기업들을 위해 별도의 관리툴을 솔루션 형태로 제작, '린더 파트너스'라는 기업용 일정 마케팅 솔루션을 바탕으로 롯데자이언츠, 두산베어스, 아디다스 코리아 등 20여 개의 기업과 함께 협업하고 있으며, 빠르고 정확한 일정 데이터 생산을 위해 일정 데이터 형태에 최적화된 데이터 관리툴 '린더 CMS'를 개발하여 최소한의 인력과 비용으로 일정 데이터 생산이 가능케 했다.일정 구독 플랫폼: 린더지난 1년간 우리 팀은 사용자들의 구독 니즈를 충족시키기 위해 밤낮으로 다양한 일정들을 찾아 헤맸고, 어느덧 300여 개가 넘는 여러 캘린더를 운영하게 되었다. 그리고 지속적으로 높은 일정 데이터 생산 비용을 감당해야 했었던 이전에 비해 이제는 20만 명이 넘는 사용자들의 빗발치는 일정 제보와 20여 개가 넘는 파트너들의 일정 공급을 바탕으로 보다 효율적인 운영이 가능해졌다. 밤낮으로 일정을 찾아 헤매던 기존의 과정은 체계화된 시스템 덕분에 상당 부문 개선되어 변동성 높은 일정 데이터의 정확도를 지속적으로 향상 시켜나가고 있다.일정 제보 화면이제 우리는 감히 린더를 단순 구독 '서비스'를 넘어 국내 유일의 일정 구독 '플랫폼'이라고 부를 수 있는 자신감이 생겼다. 사용자들은 하루에도 몇 번씩 새로운 일정을 제보하는 동시에 구독을 희망하는 새로운 캘린더를 요청하고, 마찬가지로 '입점'을 희망하는 기업의 니즈 또한 지속적으로 증가하여 지난주에만 스포츠, 학교, 공연 3개의 각기 다른 분야에서 '일정 구독 제공'에 대한 문의가 들어왔다. 이들은 '일정'이라는 공통된 포맷 하에 각자 자신들의 일정을 팬, 학생, 또는 고객들에게 제공하기를 희망하였다.린더와 VUX(음성 기반 사용자 경험)   최근 AI 스피커 시장이 확장됨에 따라 각 회사들은 VUX기반 컨텐츠 확보에 열을 올리고 있다. 카카오가 NUGU를 운영하는 경쟁사 SKT에 멜론뮤직의 음악 컨텐츠를 공급하지 않을 것은 불 보듯 뻔한 사실이고, 결국 SKT는 자체 음악 서비스인 '뮤직메이트'를 새로이 시작했다. 역으로 네이버에게 배달의민족과의 협력 기회를 뺏긴 카카오는 '주문하기' 기능을 확대하여 자체 배달 서비스를 시작했다. '음악 컨텐츠'가 되었건, '배달 컨텐츠'가 되었건, 날씨 알려주는 것 외에 딱히 할 줄 아는 게 없는 현시대의 인공지능들에게 린더의 일정 컨텐츠는 높은 활용 가치가 있을 수 있다.단순히 내 캘린더와 연동되어 내가 어제 입력했던 일정들을 읊어주는 것이 아니라, 내가 좋아할 만한, 필요로 할만한 일정들을 미리 찾아서 알려줄 수 있다면 정말 멋지지 않을까. 캘린더에 표시도 안 한 2학기 수강신청을 10분 전에 내게 먼저 알려줄 수 있는 앱이 있다면, 아침에 일어나자마자 고대하던 신상 구두가 출시되었음을 알려주는 스피커가 있다면 분명 그 사용자 경험은 어디에서도 쉽게 경험할 수 없는 수준일 것이다.린더의 타이밍 타이밍은 중요하다. 비트, 풀러스 등 높은 제품 퀄리티 및 운영 능력에도 불구하고 시대가 받아들일 준비가 되지 않은 서비스들의 말로를 먼발치에서 지켜보았다. 약 1년 전 내부적으로 우리의 타이밍에 대해 논의를 진행했던 적이 있었고, 당시 우리가 내린 결론은 린더의 타이밍이 결코 늦으면 늦었지 빠르지는 않았다는 것이었다. 이미 사람들은 일정을 받아보는 경험을 받아들일 준비가 되어있으며, 1년 간 린더를 통해 일정을 받아보는 경험을 누리고 있는 20만의 사용자가 이를 방증한다.우리가 생각한 그 '타이밍'이 틀리지 않았다면, 꼭 '린더'라는 이름이 아니더라도 '일정을 받아보는 경험'을 만들어가는 것은 반드시 누군가가 성공해야만 하는 일이다. 지도로 길을 찾으며 불편함을 느끼지 못했던 세상에 누군가가 네비게이션을 선사한것처럼, '일정을 받아보는 경험'은 근 미래에 없어서는 안 될 선물이 될 것이다.    일정 구독 플랫폼은 분명 많은 이들의 삶에 변화를 줄 수 있다. 작게 보면 좋아하는 공연의 티켓팅을 놓쳐 매번 공연에 참여하지 못할뻔한 어느 팬의 하루를 행복하게 바꾸어 놓을 수 있고, 크게 보면 복수전공 신청 기간을 깜빡하고 놓쳐 복수 전공을 하지 못할뻔한 어느 대학생의 삶을 송두리째 바꾸어 놓을 수 있다.이 일은 반드시 누군가가 해내야만 한다. 그냥 있어 보이고 싶어서, 스타트업다워 보이고 싶어서 내뱉는 말이 아니라, 진심으로, 사력을 다해 누군가는 반드시 이 일정 구독 플랫폼을 만들어 내야만 한다. '일정을 받아보는 경험'이 일상화 되었을때 비로소 우리의 삶은 조금 더 질적으로 풍요로워질 수 있다.린더가 앱스토어 10위권에 오른 이번 사건이 완전히 새로운 형태의 일정 구독 플랫폼의 시작을 알리는 출발선이 되었으면 한다. 다시 또 높은 순위권으로 올라오기 위해서는 아마 한동안 많은 노력들이 필요로 될 것으로 예상되기에, 우리는 앞으로도 화장품 세일, 아이돌 스케줄, 대학교 학사일정, 스포츠 경기, 마트 휴무일, 공연, 전시 등을 넘어 사람들이 필요로 하는 새로운 일정 컨텐츠를 찾아 헤맬것이다.세상 사람 모두가 일정을 받아보는 날이 오기를 꿈꾸며, 와, 근데 이번 여름밤은 정말 더워도 너무 덥다.#히든트랙 #챗봇 #기술기업 #개발자 #개발팀 #인사이트 #경험공유
조회수 1066

일본 스타트업 적응기#4 「지금」

언제부터였을까,학창 시절디자인을 공부하던 학생으로서스름 없이 도전하고, 특이해지길 겁내지 않던 나는사회생활을 시작하면서부터,갑옷 같이 정제된 옷을 입고,상명하복 문화에 스스로를 맞추고살은 찌고, 눈빛은 흐려지고..점점 '사회화'된 다수 속에 한 명으로 바뀌어가고 있었다.10대 말,몸이 막 어른이 되어가며 만들어지는 호르몬,아직 그 균형을 맞추지 못해, 못난 사춘기처럼20 대 말,이제 막 사회화되던 나는 그 균형을 맞추지 못하고, 못난 20대의 모습을 하고 있었는지 모른다.설익은 어른 놀이에 옛 추억만 뒤적거리고언제부터 이렇게, 속된 말로 찌질해졌는지어쩌다 찍힌 사진 속에서도 난 왜 그렇게 고개 숙인 모습이 많았는지살은 찌고, 눈빛은 흐려지고, 축 늘어져있고..대학생이 돼서야 고등학교 때 사진을 보고,아 정말 못났었구나를 느끼게 되는 것처럼삶의 패러다임이 바뀌고야, 그땐 정말 못났었구나를 새삼 뒤돌아보게 된다.그럼, 지금은 어떻길래?어쩌다 닿은 옛 친구의 연락 "요즘 어떻게 지내?""나? 더할 나위 없이 행복하게 지내고 있어"나도 이런 이야기를 하게 될지 몰랐고 또 믿지도 않았지만,그렇다. 더할 나위 없이 행복하게 지내고 있다.내 삶은 학생이라는 단계를 넘어서아직은 미숙한 사회인의 단계를 보내고 있지만,내 표정은, 내 사진은다시 행복한 미소를 짓고 꿈을 꾸었던예전 모습으로 돌아간 듯 하다.무엇이 나를 이렇게 만들었을까내 안에 쌓여있던 독을 빼내고,안에서부터 변화를 만들고 있을까를 생각하지만-글을 쓰지만 -글 실력이 부족한지 왜 죄다 상투적이기만 한 것인지그냥 만화 속에 캐릭터가 된 것 같은 기분이다.꿈을 좇는 해적선에 몸을 실은,하나하나 특성이 그리고 포지션이 분명한사람들 속에서 나도 하나의 캐릭터로그 특성과 포지션을 인정받으며동료들과 함께 신나는 항해를 해나가는 기분이다.화혜복지소의, 복혜화지소복禍兮福之所倚, 福兮禍之所伏불행 속에 행복이 있고,행복 속에 불행이 있으며이는 끊임없이 순환한다고 하지만  없어질 사탕이라면닳기 전에 충분히 즐기며젊음을 행복한 기억으로  채워나가야겠다.나이가 들 수록 선천적으로 타고난 모습을 떠나스스로 변화하는 모습에 책임져야 한다는데,10년 후,나는 여전히 꿈꾸고천진난만한 미소를 지을 수 있을까오늘은 그냥꾸밈없이 담백한 글을 담고 싶었다.#Fuller #일본 #스타트업 #해외취업 #스타트업합류 #일상 #인사이트
조회수 816

Android Wear 개발하기

비트윈 팀은 지난달 비트윈에 Android Wear 앱 기능을 릴리즈했습니다. 즐거운 개발 경험이었지만, 힘들었던 점도 많았습니다. 어떤 과정을 통해서 개발하게 되었고, 내부 구조는 어떻게 되어 있는지, 신경 쓰거나 조심해야 할 점은 어떤 것들이 있는지 저희의 경험을 공유해보려고 합니다. 이 글을 통해 Android Wear 앱 제작을 고민하는 개발자나 팀이 더 나은 선택을 하는 데 도움이 되고자 합니다.Android Wear에 대해¶Android Wear는 최근 발표된 구글의 새 웨어러블 플랫폼입니다. 공개된 지 얼마 되지 않았음에도 불구하고 완성도 있는 디바이스들이 출시된 상태이며, 기존의 웨어러블 기기보다 기능과 가격이 매력 있다는 평가를 받고 있습니다. 또한, 2014 Google I/O에서 크게 소개되고 시계를 참가자들에게 나눠주는 등, 구글에서 강하게 밀어주고 있기 때문에 상당히 기대되는 플랫폼입니다.Android Wear의 알림 기능은 연결된 mobile1 기기와 연동됩니다. 예를 들어 메시지를 받았을 때 mobile과 wear에서 모두 알림을 받아볼 수 있고, Google Now와 연동하여 교통, 날씨 등 상황에 맞는 알림을 제공합니다.또, 여러 가지 앱들의 다양한 기능을 음성으로 제어하도록 하여 사용자에게 기존의 시계와는 완전히 다른 경험을 주고 있습니다.한국에서는 Google Play Store의 기기 섹션에서 구매가 가능합니다.Android Wear 개발하기¶Android Wear는 Android 플랫폼을 거의 그대로 사용하기 때문에, Android 개발 경험이 있는 개발자라면 아주 쉽게 개발을 시작할 수 있습니다. 비트윈에서는 구글의 80:20 프로젝트를 패러디한 100+20 프로젝트를 통해 개발을 진행하게 되었습니다. (하던 일을 다 해내면서 시간을 내어 진행한다는 의미로 100+20 프로젝트입니다. 하지만 가끔은 '20' 부분에 너무 몰입하여 0+20이 되기도 한다는 게 함정입니다...)Activity, Service 등 Android의 기본 component들을 모두 그대로 사용 가능하며, 손목에 찰 수 있는 크기의 화면에서 유용하게 사용할 수 있는 WearableListView, GridViewPager 같은 새 widget들이 추가되었습니다. 구글 개발자 사이트의 wearable training 섹션에서 자세한 안내를 볼 수 있습니다.비트윈의 아이디어¶비트윈 Android Wear 기능의 컨셉은, 항상 몸에 착용하는 Wear의 특징을 살려, '커플이 떨어져 있더라도, 항상 함께 있는 느낌을 주기' 였습니다. 그래서 아래와 같은 기능들이 기획되었습니다.Feel His/Her Heart (그대의 심장박동 느끼기): 상대방의 심장박동을 진동으로 재현해주기Where He/She Is (그/그녀는 어느 방향에 있을까?): 상대방의 위치를 나침반과 같은 형태로 보여주기 (안심하세요. 여러분. 방향만 알려주고 정확한 위치는 알려주지 않습니다!)Feel Memories (메모리박스): 언제든 추억을 떠올릴 수 있도록 비트윈의 기존 기능인 메모리박스(추억상자)를 Android Wear에서 구현하지만 이 아이디어들은 하루 만에 망하게 됩니다.메인 아이디어였던 심장박동 느끼기는 사용자가 요청하면 상대방의 시계에서 심장박동이 측정되어 사용자에게 상대방의 심장박동을 진동으로 재현해주는 멋진 기능이었습니다. 하지만 이 아이디어를 낼 때 심박센서가 탑재된 Android Wear 기기가 없었던 게 함정이었습니다.다음날 Android Wear Bootcamp에 참가하여 심박센서가 작동하는 삼성 Gear Live 기기를 사용해 볼 수 있었습니다. 결과는 충격이었습니다. 생각과는 달리 심박박동 측정 결과가 나오는데 10~20초가 걸리고, 그나마도 측정되는 동안은 올바른 위치에 시계를 차고 가만히 있어야 했습니다. 결국, 이러한 제약 때문에 사용자들이 실제로 유용하게 사용할 수 있는 기능이 될 수 없었습니다.그래서 계획을 수정하여 현실적으로 구현 가능한 기능들을 먼저 만들어 보기로 했습니다.목소리로 답변하기: 상대방에게 온 메시지에 Android Wear Framework에서 제공하는 음성인식을 이용하여 목소리를 텍스트로 바꾸어서 답장하기이모티콘 답변하기: 이모티콘을 사용자가 선택하여 이모티콘으로 답장하기비트윈 메모리박스: 비트윈의 기존 기능인 메모리박스(추억상자)를 Android Wear에서 구현처음의 원대한 계획에서 뭔가 많이 변경된 것 같지만, 기분 탓일 겁니다.내부 구현¶비트윈 Android Wear 앱은 크게 두 가지 기능을 가지고 있습니다. 하나는 상대방에게 메시지를 받았을 때, 메시지 내용을 확인하고 여러 가지 형태로 답장할 수 있는 Notification 기능이고, 다른 하나는 Wear에서 원래 Application의 일부 기능을 시작 메뉴를 통하거나 목소리로 실행시킬 수 있게 해주는 Micro App입니다. 해당 기능들의 스크린샷과 함께 내부 구조를 설명하겠습니다.우선 Notification 부분입니다. 앱 개발사에서 아무 작업도 하지 않더라도, 기본적으로 Android Wear Framework이 스크린샷 윗줄 첫 번째, 네 번째 화면과 같이 예쁜 알림화면과 Open on phone 버튼을 만들어 줍니다. 여기에 추가적인 기능을 붙이기 위하여 WearableExtender를 이용하여 목소리로 답장하기, 이모티콘 보내기 버튼을 덧붙였습니다.비트윈 Android Wear 스크린샷 - Notification둘째로는 Micro App 부분입니다. 여기에는 이모티콘 전송과 메모리박스를 넣었습니다. 이 부분은 일반적인 Android 앱을 만들듯이 작업할 수 있습니다비트윈 Android Wear 스크린샷 - Micro App화면을 보면 무척 단순해 보이지만 내부 구조는 간단하지가 않습니다. 연결된 화면들을 만들어내는 코드가 한곳에 모여있지 않고, 각기 다른 곳에 있는 코드들을 연결하여야 하기 때문입니다. Notification 하나를 만들 때에 Framework에서 만들어주는 1, 4번째 화면, Notification에 WearableExtender를 이용하여 덧붙이는 2, 3번째 화면, 그리고 다시 Framework에서 만들어주는 목소리로 답장하기 화면, 그리고 Wear 쪽의 Micro App을 통해 구동되는 이모티콘 선택 화면과 같이 여러 군데에 나누어 존재하는 코드가 연결됩니다.하나의 앱처럼 느껴지는 화면이지만 각각 다른 곳에 코드가 쓰여있습니다.그러면 이번에는 각 화면이 어떻게 연결되는지 알아보겠습니다.사용자가 상대방으로부터 받은 메시지를 Android Wear의 Notification으로 확인하고, 답장으로 이모티콘을 보내고자 하는 상황을 가정해 봅시다. 사용자가 Send Emoticon 버튼을 눌렀을 때 이모티콘 선택화면을 보여주고 싶은데, 이 행동에 대한 pending intent를 wear 쪽의 micro app이 아닌, mobile 쪽에서 받게 되어 있습니다. 이 때문에 아래의 표와 같이 mobile 쪽에서 pending intent를 받은 뒤 다시 wear 쪽으로 이모티콘 선택 화면을 보여주라는 메시지를 전송해줘야 합니다.이모티콘 전송 과정이번에는 메모리박스를 보겠습니다. 메모리박스도 단순한 화면이지만 mobile 쪽과 통신하여 내용을 불러와야 하므로 생각보다 해야 하는 일이 많습니다. Android Wear Message API와 Data API를 이용하여 데이터를 주고받아 사진을 화면에 보여줍니다.메모리박스를 보여주는 과정개발 시 신경 써야 하는 점¶개발하면서 주의 깊게 신경 써야 하는 점들이 있습니다.첫 번째로 코드 퀄리티입니다.Android Wear는 아직 성숙하지 않은 플랫폼이기 때문에 많은 사람이 받아들인 정형화된 패턴이 없습니다. 앞서 살펴보았듯이, 간단한 기능을 구현하려고 해도 상당히 복잡한 구조를 가진 앱을 만들게 되기에, 코드 퀄리티를 높게 유지하기 어려웠습니다비트윈 팀에서는 EventBus를 활용하여 코드를 깔끔하게 유지하려고 노력하였습니다. 이러한 문제를 해결할 수 있는 Guava의 Concurrent 패키지나, RxJava 등의 도구들이 있으니 익숙한 도구를 선택하여 진행하는 것을 추천합니다. 또한, 구글의 Android Wear 코드랩 튜토리얼의 내용이 매우 좋으니, 한번 처음부터 수행해 보면 좋은 코드를 만들 수 있는 아이디어가 많이 나올 것입니다.두 번째로는 원형 디바이스 지원 및 에러 처리입니다.처음부터 원형 디바이스를 신경 쓰지 않으면 마무리 작업 시 상당한 고통을 받게 됩니다. 원형 디바이스에 대한 대응법은 Android 개발자 트레이닝 사이트의 wearable layout 섹션에 자세히 나와 있습니다. 현재는 원형 디바이스를 처리하는 프레임웍에 약간 버그가 있지만, 곧 수정될 것으로 생각합니다.사용자 입력이 있을 때, 그리고 에러가 났을 때 적절하게 처리해주는 것은 제품의 완성도에 있어 중요한 부분입니다. Android Wear Framework에서 제공하는 ConfirmationActivity등을 활용하여 처리하면 됩니다.마지막으로 패키징입니다.자동 설치 패키징은 비트윈 팀에서도 가장 고생했던 부분입니다. Android Wear는 본체 앱을 설치하면 자동으로 함께 설치되는데, 앱이 정상작동하기 위해서는 몇 가지 까다로운 조건이 있습니다.build.gradle 의 applicationId 를 wear와 mobile 양쪽 모두 똑같이 맞춰야 합니다.Wear app의 AndroidManifest에 새롭게 선언한 permission이 있다면 mobile 쪽에도 포함해 주어야 합니다.기본적으로, 똑같은 key로 서명합니다. 다른 key로 sign 하는 경우는 문서를 참고해서 신경 써서 합니다.위 항목들은 아주 중요한 내용이지만 아직 문서화가 완벽하지 않으니 주의 깊게 진행해야 합니다.후기¶개발 과정에서 여러 가지 어려움이 있었지만, 무척 즐거웠던 프로젝트였습니다!우선 새로운 플랫폼에서 새로운 제품의 아이디어를 내고 만들어내는 과정이 많은 영감과 즐거움을 주었습니다.두 번째로는 Android Wear를 포함한 버전 출시 이후 구글플레이의 Android Wear 섹션 및 추천 앱 섹션에 올라가게 되어 홍보 효과도 얻을 수 있었습니다. 또한, 구글의 신기술을 적극적으로 사용하고자 하는 팀에게는 구글 쪽에서도 많은 지원을 해주기 때문에 도움도 많이 받았습니다.세 번째로는 기존의 Android 개발과 비슷하여 접근하기 쉬우면서도, 원하는 것을 구현하려면 상당히 도전적이어서 재미있었습니다.다만 조심해야 할 점은, 구글에서 적극적으로 밀고 있는 프로젝트라고 해서 다 성공하는 것은 아니라는 점입니다. 얼마만큼의 시간과 자원을 투자할지는 신중하게 생각하면 좋겠습니다.정리¶Android Wear는 새로운 기술과 플랫폼에 관심이 많은 개발자, 혹은 팀이라면 시간을 투자해서 해볼 만한 재미있는 프로젝트입니다. 하지만 완성도 있는 좋은 제품을 만들기 위해서는 생각보다 할 일이 많으니 이를 신중하게 고려하여 결정해야 합니다.구글의 튜토리얼 등에서 지칭하는 것과 마찬가지로, 이 글에서도 Android Wear와 연결된 휴대폰을 mobile이라 하겠습니다.↩저희는 언제나 타다 및 비트윈 서비스를 함께 만들며 기술적인 문제를 함께 풀어나갈 능력있는 개발자를 모시고 있습니다. 언제든 부담없이 [email protected]로 이메일을 주시기 바랍니다!
조회수 2145

Kubernetes에 EBS 볼륨 붙이기

Kubernetes에서 컨테이너에 Persistent Volume을 붙이는 방법은 몇가지 있다. 여기서는 Kafka 서비스를 예로 삼아 주요 접근방법을 간단히 알아본다.Kubernetes v1.4.0를 기준으로 문서를 작성한다.Static말이 Static이지 수동 마운트를 뜻한다. 기본적으로 관리자가 EBS 볼륨을 만들고특정 Pod에 그 볼륨을 붙이는 작업을 한다. Volumes 문서에 나오는대로 하면 간단하다.apiVersion: v1 kind: Service metadata: name: kafka1 labels: app: kafka1 tier: backend spec: ports: # the port that this service should serve on — port: 9092 name: port targetPort: 9092 protocol: TCP selector: app: kafka1 tier: backend — - apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kafka1 spec: replicas: 1 template: metadata: labels: app: kafka1 tier: backend spec: containers: — name: kafka1 image: wurstmeister/kafka imagePullPolicy: Always volumeMounts: — mountPath: “/kafka” name: kafka1volume ports: — containerPort: 9092 volumes: — name: kafka1volume awsElasticBlockStore: volumeID: vol-688d7099 fsType: ext4여기서 핵심은 다음의 두 줄 뿐이다.awsElasticBlockStore: volumeID: vol-688d7099Dynamic수동으로 볼륨을 붙이는 방법은 간단해서 좋다. 하지만 Autoscaling하는 서비스에 넣기에는 아무래도 무리다. 서비스가 뜰 때 요구사항에 맞는 볼륨을 스스로 만들어 붙이는 방법도 있다. Kubernetes Persistent Volumes를 참고해 작업해본다.우선 Kubernetes 생성할 EBS 볼륨의 사양을 정한다.# storages.yaml apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: default1a provisioner: kubernetes.io/aws-ebs parameters: type: gp2 zone: ap-northeast-1a iopsPerGB: “10” — - apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: default1c provisioner: kubernetes.io/aws-ebs parameters: type: gp2 zone: ap-northeast-1c iopsPerGB: “10”default1a를 선택하면 ap-northeast-1a Availablity Zone에 기가바이트당 IOPS는 10인 General SSD EBS 볼륨을 생성한다. 이제 다시 Kafka의 돌아가면apiVersion: v1 kind: Service metadata: name: kafka1 labels: app: kafka1 tier: backend spec: ports: # the port that this service should serve on — port: 9092 name: port targetPort: 9092 protocol: TCP selector: app: kafka1 tier: backend — - apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kafka1 spec: replicas: 1 template: metadata: labels: app: kafka1 tier: backend spec: containers: — name: kafka1 image: wurstmeister/kafka imagePullPolicy: Always volumeMounts: — mountPath: “/kafka” name: kafka1volume ports: — containerPort: 9092 volumes: — name: kafka1volume persistentVolumeClaim: claimName: kafka1volumeclaim — - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: kafka1volumeclaim annotations: volume.beta.kubernetes.io/storage-class: “default1a” spec: accessModes: — ReadWriteOnce resources: requests: storage: 300Gi이제 awsElasticBlockStore가 아닌 PersistentVolumeClaim을 통해 볼륨을 할당받는다. kafka1volumeclaim은 default1을 기준으로 스토리지 정책을 정하므로Availablity Zone: ap-northeast-1aIOPS: 기가바이트당 10General SSD300Gi 이상인 스토리지를 원한다는 요구사항을 기술한다. 위의 설정은 이러한 스토리지에 부합하는 EBS 볼륨을 생성하여 kafka1 Pod에 할당한다.분석Dynamic은 Autoscaling에는 적합하나 kubectl delete [service] 또는 kubectl delete [deployment] 등의 명령을 수행하여 서비스를 내렸다가 다시 올린 경우에 기존에 쓰던 볼륨을 마운트하지 않고 새 볼륨을 만드는 문제가 있다. 물론 delete를 하지 않고 서비스를 업데이트만 하는 경우에는 볼륨이 유지되지만 이래선 아무래도 문제의 소지가 많다.그래서 또다른 시나리오를 고민해볼 수는 있다. 짧게 설명하자면관리자가 Volumn Pool을 만들어놓고 Autoscaling 서비스가 이 풀 안에서 볼륨을 할당받게 한다. 이러면 앞서 본 두 가지 방식의 장점을 골고루 흡수할 수 있다.flocker 또는 glushterfs 같은 스토리지 관리 서비스를 활용해도 좋다. 하지만 배보다 배꼽이 큰 것 같은 느낌이 들지도 모르겠다.#데일리 #데일리호텔 #개발 #개발자 #개발팀 #인사이트 #꿀팁

기업문화 엿볼 때, 더팀스

로그인

/