스토리 홈

인터뷰

피드

뉴스

조회수 1047

[Buzzvil People] Asella Jeong, Business Development Manager

 Buzzvil People에서는 다양한 배경과 성격 그리고 생각을 지닌 버즈빌리언들을 한 분 한 분 소개하는 시간을 갖습니다. 어떻게 버즈빌에 최고의 동료들이 모여 최고의 팀을 만들어가고 있는 지 궁금하시다면, 색색깔 다양한 버즈빌리언들 한분 한분의 이야기가 궁금하시다면, Buzzvil People을 주목해주세요.1. 간단한 자기 소개 부탁드립니다. 안녕하세요. 버즈빌 Business Development 팀의 Asella 라고 합니다. 이름이 조금 특이한 편인지라, 어떻게 Asella (아셀라O, 아쎌라 X, 아세로라 X, 아스렐라 X)라는 이름을 선택한 것인지에 대해 질문을 많이 받는데요. 버즈빌에서 삼행시를 처음으로 유행시킨 사람으로서 삼행시로 답변드리겠습니다.. 아: 아주 어릴 때부터, 부모님이 지어주신 이름이 아니라 제가 지은 이름으로 삶을 살고 싶다는 생각이 있었어요. 셀: 셀 수 없이 많은 이름 중 ㅇ,ㄴ,ㄹ, ㅁ 과 같은 울림소리가 들어가면서, 호적은 아니더라도 어딘가에 문서로 만들어 질 수 있는 공식적인 (?) 이름을 짓고 싶었어요. 라: Like Asella! ‘이 이름이다!’라는 결정이 선 후에는, 바로 6개월의 교리과정을 신청하고 교적에 이름을 올리게 되었습니다. 약 25년 간의 할머니의 권유에도 세례를 받지 않았었는데, 인생은 참 재밌는 것 같아요. 최근 1년간은 본명보다 Asella라는 이름으로 훨씬 많이 불리게 되면서, Asella라는 이름을 더 사랑하게 됐어요. 이처럼, 저는 삶을 주어진 대로 살기보단 제 뜻에 따라 살고 싶어 하고, 마음이 끌리는 뭔가가 있으면 행동에 옮겨야 행복한 사람이에요. 2. 어떻게 버즈빌에 오시게 되셨나요? 첫 직장을 그만두고 일본에 있는 친구 집에서 유유자적하게 재취업준비 생활을 즐기던 중 헤드헌터분의 추천을 받게 되었어요. 디즈니랜드에서 헤드헌터분의 전화를 처음으로 받았는데, 주위가 너무 시끄러워서 몇 번이나 제안을 되물어 보고 얼떨떨해 했던 기억이 아직도 선명하네요. 당시에 헤드헌터분께서 버즈빌을 정말 많이 칭찬하시면서, 저에게 제안은 했지만 합격은 쉽지 않을 것이라고 거듭 강조하셨거든요. 그래서 통화 후에 ‘도대체 얼마나 대단한 회사이길래 이러시는 걸까?’라는 생각을 했어요. 사실 이전 회사를 그만둔 지 얼마 안 됐을 때라 여유를 즐기고 싶은 마음이 컸거든요. 네, 더 놀고 싶었습니다. 하지만 블로그, 뉴스, 채용 사이트 검색, 구글링 등 모든 방법을 총동원해서 버즈빌을 알아본 결과, 제가 가고 싶어 했던 기업에 부합한다고 생각되어 열심히 면접을 보고 합격하게 됐어요. 당시에 제가 원했던 기업의 조건은 아래와 같아요.   실무자에게 업무의 자율성을 보장하는 기업 자유로운 조직 문화를 가진 기업 좋은 사람들이 근무하는 있는 기업 (좋은 사람: 업무는 물론 업무 태도, 커뮤니케이션까지 훌륭한 사람)  근무하고 있는 지금도 버즈빌이 위 조건에 부합한다는 생각은 변하지 않아 헤드헌터분께 늘 감사해하고 있답니다. 3. 버즈빌에서 어떤 업무를 담당하고 계신가요? 제가 맡고 있는 직무는 Business Development (국내 사업개발) 입니다. 버즈빌 B2B 사업의 파트너사들을 확장 및 관리하는 업무를 맡고 있어요. ‘확장’ 및 ‘관리’가 굉장히 포괄적인 의미를 가진 단어인 것처럼 제 업무의 scope 또한 매우 넓은 편이에요. ‘확장’적인 측면에서는 다양한 파트너사 분들에게 버즈빌의 Product를 제안하고 제휴 관계를 맺어나가는 영업적인 업무를 진행하고요. ‘관리’의 측면에서는 계약서 작성, 매출 관리, CS 대응, 정산, 마케팅 제안, 기술 이슈 대응 등 파트너사와 관련된 업무라면 모두 관여하고 있다고 보시면 됩니다. 이렇게 회사 대내외적으로 수많은 분과 커뮤니케이션하면서 업무를 진행하고 있기 때문에, 파트너사 분들은 물론 사내 각 담당자분들께 늘 감사하는 마음을 가지고 있어요. 그분들이 업무를 차질 없이 진행해주시기 때문에 저도 제 업무를 완성해나갈 수 있으니까요. 4. 스타트업에서 혹은 광고업계에서 일하는 느낌이 어떠세요? 사실 광고 업계에서는 저도 처음으로 근무를 하고 있고 스타트업도 인턴 이후로는 두 번째이기 때문에 업계 자체에 대해 이렇다 저렇다 말씀드리는 것 어려울 것 같아요. 다만 ‘버즈빌을 통해’ 느낀 광고 업계와 스타트업계에 대해서만 말하자면 제 생각은 아래와 같습니다. 광고 업계 : 매우 매우 빠르게 변화하는 업계라고 생각해요. 미디어, 플랫폼의 변화에 따라 거의 동시다발적으로 광고 상품이 나오고 업계에 변화가 생기니까요. 인스타가 생기니 CPInsta라는 상품이 생기고, 유튜브가 활성화되니 CPS (유튜브 구독하기 상품) 가 생기는 것처럼요. 개인적으로 ‘변화’를 좋아하는 편이라고 생각했음에도 불구하고, 광고 업계는 따라가는 게 쉽지 않다고 느껴요. 하지만 그만큼 세상의 변화에 빠르게 반응하는 업계이기 때문에 낡은 사람 (늙은 사람 X)이 되는 속도를 늦출 수 있는 곳이라고 생각합니다. 스타트 업계 : 편안하지만 냉정한 업계라고 느껴요. 업무의 자율성, 수평적인 문화는 일하기에 정말 편안해요. 일하는 데 있어서 소위 ‘정치질’ 같은 것을 신경 쓰지 않아도 되고 업무수행 방식에 대한 터치가 거의 없는 편이니까요. 하지만 그렇게 자율적으로 일하는 만큼 스스로 요구하는 기준선 자체가 높아요. (그렇지 않다면 회사가 자율성을 주지 않았겠죠?) 늘 그렇게 높은 기준을 가지고 달려가는 사람들 사이에 있다 보니, 저도 저 자신에게 높은 기준을 요구하게 되고 또 그렇지 않으면 금방 도태될 거라는 걱정을 아주 자연스럽게 하게 돼요. 실제로 평가 또한 투명하게 이루어지기 때문에 저 자신에게 나태하면 그 결과가 그대로 나올 확률이 높고요. 그런 면에서 스타트 업계란 편안하지만 절대 나태해질 수 없는 곳이라고 생각해요. 5. 이것만큼은 버즈빌이 참 좋다! 어떤 게 있으실까요? 사람. 피플 블로그 애독자로서 80~90%의 분들이 저와 비슷한 대답을 하신 것으로 알고 있는데요. 정말 그 정도로 버즈빌리언들은 좋은 분들이에요. 먼 훗날(?) 버즈빌을 떠날지 말지에 대해 결정해야 하는 날이 온다면, 끝까지 저를 고민하게 만드는 것 역시 ‘사람’일 정도로요. 뛰어난 능력에 나이스한 태도. 아직도 종종 ‘어떻게 집단의 거의 모든 구성원이 이런 자질을 갖추고 있을 수 있을까?’라는 생각을 해요. 그런 분들과 함께 하다 보니 업무의 고됨과는 상관없이 ㅎㅎ 늘 유쾌하게 업무 수행할 수 있고, 저 자신도 다른 분들께 좋은 동료가 되기 위해 노력하게 됩니다. 롤모델이 자이언트 팬더인 저를 이렇게 만들다니… 버즈빌은 정말 대단한 곳이에요. ^.^ 6. 개인적인 목표나 꿈이 있으신가요? 있다면, 버즈빌에서의 경험이 어떻게 도움이 된다고 생각하시나요? 최근에 친한 친구와 얘기하면서 제 궁극적인 목표가 뭔지 결론지었어요. 저는 ‘멋진 사람’이 되고 싶습니다. 제가 생각하는 멋진 사람은 자기 일을 사랑하고 (혹은 약간 미쳐있고), 일하는 과정과 결과에 있어 자타가 인정할 수밖에 없는 높은 퀄리티를 보여주는 사람이에요. 2번 질문에서 말했던 ‘좋은 사람’과도 일맥상통한다고 볼 수 있겠네요. 앞서 여러 번 말씀드렸다시피 버즈빌에는 일의 과정과 결과 두 가지 모두를 훌륭하게 해내는 분들이 많아요. 함께 일을 하다 보면 다양한 버즈빌리안들의 업무수행 방식을 관찰하고 제 것으로 익히게 되기 때문에, 버즈빌의 경험은 ‘멋진 사람’이라는 제 목표를 이뤄가는 것에 있어 늘 실질적인 도움이 되고 있어요. 제가 사랑하는 혹은 사랑하게 될 일이 무엇이든 간에, 최선을 추구하는 방식은 큰 도움이 될 테니까요.
조회수 1379

졸림방지! 여러분의 카페인을 책임지는 클럽YDM 크루

안녕하세요! 멋진 옐로모바일 패밀리사의 서비스와 팀문화를 소개하는 옐친소, 그 21번째 이야기:) 이번에는 조금 특별한 팀을 소개합니다! 갑자기 찾아온 무더위에 지친 YDM 임직원들에게 없어서는 안될 ‘클럽YDM’의 크루입니다! 다들 얼굴은 아는데 이름은 모르고, 인사는 하고 싶은데 어색하셨죠? 그들의 비하인드 스토리, 지금 시작합니다! 안녕하세요, 클럽YDM 크루 여러분:) 옐로인들에게 크루 소개 좀 부탁드려요! 박동욱 매니저: 안녕하세요! 저는 클럽YDM 크루를 이끌고 있는 박동욱 매니저라고 합니다:) 이대호, 강혜빈, 이렇게 세 명이서 카페를 담당하고 있어요크루 중에 특별한 이력을 가진 분이 계시다고 들었어요!이대호: 네, 그게 바로 접니다ㅋㅋㅋ 카페에 오기 전 6 개월 가량 아이돌그룹 순정소년 맴버로 있었어요:) 지금은 개인 사정으로 그만 두게 되었지만요강혜빈: 이름부터 엄청 강렬하지 않나요?ㅋㅋㅋ아이돌 그룹이라니! 나중에 클럽YDM에서 콘서트도 여시나요?이대호: 그건 생각해 보겠습니다ㅋㅋㅋㅋㅋ 늘 바쁘시겠지만, 그래도 가장 바쁜 시간대는 언제인가요? 강혜빈: 늘 오전이 바쁜 편인데요, 그 중에서 특히 화요일 오전이 제일 주문량이 많아요. 왜 월요일이 아닌 화요일인지 저희도 늘 미스터리입니다:)그리고 모두들 점심 드시고 커피 한잔 씩 하시니 점심시간 직후에도 바쁘죠. 박동욱 매니저: 참 신기하게도 금요일에는 사람이 정말 없어요. 다들 빨리 일 끝내고 칼퇴 준비를 하시는 것 같아요ㅎㅎㅎ화요일 오전에는 피해서 오겠습니다! 아메리카노를 제외하고 가장 많이 팔리는 음료는 무엇인가요? 이대호: 페리에요! 다이어트의 계절이 다가와서 그런지 페리에를 물처럼 많이 드시더라고요. 클럽YDM에는 간식도 정말 많은데요! 간식 중에서는 어떤 메뉴가 제일 잘 나가요? 강혜빈: 맥X봉이 가장 많이 팔리고 있어요:) 가장 많이 팔릴 때는 하루에 100개가 넘게 팔리기도 해요.지난 1월에 겨울메뉴 투표를 진행하셨어요. 1위로 뽑힌 음료는 무엇이었나요? 박동욱 매니저: 당시 후보에 있던 음료가 고구마라떼, 밀크티, 대추차, 생강차, 율무차, 숭늉 이렇게 6가지 였습니다. 댓글로 인기투표를 한 결과 밀크티가 1위로 뽑혔는데요, 실제로 겨울 한정 메뉴로 판매를 했었어요:)이대호: 밀크티 같은 경우에는 정말 인기가 많았어요. 지금도 재판매 요청이 지속적으로 들어오는 메뉴고요. 그래서 여름에도 판매할 수 있게 아이스 밀크티도 판매를 할까 해요. 와, 저도 밀크티 정말 좋아하는데!! 밀크티 외에 재판매 요청이 있었던 메뉴가 있나요? 강혜빈: 유자차요! 유자차도 사실 겨울 한정 메뉴였는데 인기가 정말 많았어요. 재판매 요청이 계속 이어진다면 아이스 유자차로도 판매할 생각입니다.신메뉴 개발도 크루분들이 직접 하시나요? 박동욱 매니저: 그럼요. 클럽YDM에 맞는 메뉴를 계속해서 논의하고 있습니다. 저희 카페에 오시는 직원분들 수와 붐비는 정도에 따라 어떤 음료를 개발하면 좋을지 결정을 하거든요. 그렇게 회의를 거쳐 개발된 메뉴는 카페에 오시는 YDM 임직원 분들이 직접 시음하고 피드백도 주시고요:)이대호: 드시고 싶은 메뉴가 있다면 언제든 편하게 아이디어를 주세요! 여러분의 아이디어를 먹고 성장하는 클럽YDM입니다:)이번 여름은 특히나 덥다고 하는데요! 여름 메뉴는 생각해 놓으신 게 있나요? 강혜빈: 블렌더 종류를 준비하고 싶기는 해요. 늘 생각은 하고 있는데, 오전에는 아메리카노 만드는 것 만으로도 주문이 많이 밀려서 가능할지는 모르겠어요ㅠㅠ박동욱 매니저: 주문제를 도입하면 가능할 것 같은 데요? 몇 시에 픽업 오시겠다고 미리 주문해주시면 충분히 가능할 것 같지 않아요?이대호: 맞아요 맞아요! 또 단체로 미팅하실 때도 미리 주문 해 놓으시면 서로 수월할 것 같아요ㅎㅎ전날 회식하시고 남은 숙취에 힘들어 하는 분들이 있을 것 같아요. 본인이 생각하는 숙취해소에 가장 도움이 되는 음료 하나씩 말씀 주세요! 이대호: 저는 아이스아메리카노요! 술 엄청 많이 마신 다음날 물 마시면 술 맛나는 거 아시죠?ㅋㅋㅋ 시원하기도 하고 숙취 해소에 도움이 되더라고요. 강혜빈: 새콤달콤한 레모네이드요! 박동욱 매니저: 이 사람들이 과학적이지가 못해ㅋㅋㅋㅋ 숙취해소엔 당연히 두유죠! 그런데 이렇게 말하다 보니, 헛개수나 꿀물같이 숙취음료 메뉴도 만들어보면 좋을 것 같네요.클럽YDM에서 일하면서 가장 기억에 남는 에피소드는 무엇인가요? 강혜빈: 카페 오픈 첫날에 커피머신이 작동을 안했어요ㅋㅋㅋㅋ 다들 카페 첫 오픈일이라 엄청 기대하셨을 텐데, 커피종류가 전부 안돼서 너무 당황스러웠어요ㅠㅠ박동욱 매니저: 그때 진짜 저희 셋 다 멘붕이었는데, 다음날에는 사원증 찍는 포스가 고장났답니다ㅠㅠ덕분에 당일 음료가 무려 공짜였어요!열일중인 클럽YDM 크루!클럽YDM에서 일하면서 이럴 때 가장 보람찬 순간은 언제예요? 이대호: 맛있게 먹었다는 인사 한마디에 저희 세명의 하루 컨디션이 달라집니다:) 전 예전에 직원분이 여행 다녀오셔서 그 나라의 특색있는 커피를 사다 주신적이 있는데, 정말 고맙고 일할 맛이 나더라고요. 그날 정말 힘내서 일했습니다!  그렇다면 반대로 이럴 때 가장 힘들다거나 옐로인들에게 건의하고 싶은 것이 있나요? 강혜빈: 크게 힘든 점은 없는데요, 딱 한가지! 음료 주문하시고 저희가 사원증 찍어 달라고 말씀 드린 후에 찍어 주셨으면 좋겠어요. 정말 가끔가다 주문 말씀하시자 마자 사원증을 찍는 분이 계신데, 그러면 기계 오류가 뜨게 되거든요ㅠㅠ커피를 사랑하는 옐로인들에게 한 말씀 부탁 드려요:)박동욱 매니저: 카페 첫 날부터 포스도 안되고 커피머신도 고장나고.. 이것저것 부족한 게 많았는데 많이 이해를 해 주셔서 정말 감사해요:) 앞으로도 여러분의 카페인 충전을 위해 최선을 다하는 클럽YDM 크루가 되겠습니다!
조회수 1666

RxJava2 함수 파헤치기!

Overview지난 글 Rxjava를 이용한 안드로이드 개발에서는 RxJava의 Android 연결 방법과 기본적인 사용법을 다뤘습니다. 이번 글에서는 RxJava의 강력하고 다양한 함수들을 살펴보고자 합니다. Android에서 복잡하게 구현되는 내용들을 단 몇 개의 함수로 처리할 수 있는 RxJava를 꼭 사용해보길 권합니다.1. just2. fromArray/fromlterable3. range/rangLong4. interval5. timer6. map7. flatMap8. concatMap9. toList10. toMap11. toMultiMap12. filter13. distinct14. take15. skip16. throttleFirst17. throttleLast18. throttleWithTimeout참고: 공통적으로 사용하는 구독(수신) 클래스는 아래와 같습니다.static class CustomSubscriber<T> extends DisposableSubscriber<T> { @Override public void onNext(T t) { System.out.println(Thread.currentThread().getName() + " onNext( " + t + " )"); } @Override public void onError(Throwable t) { System.out.println(Thread.currentThread().getName() + " onError( " + t + ")"); } @Override public void onComplete() { System.out.println(Thread.currentThread().getName() + " onComplete()"); } } 1. just파라미터를 통해 받은 데이터로 Flowable을 생성하는 연산자입니다. 최대 10까지 전달할 수 있고, 모든 데이터가 수신되면 onComplete() 수신됩니다. 기본적인 Flowable 생성자 함수로 볼 수 있으며 단순 작업에서 많이 사용합니다.public static void just() { //파라미터 값을 순차적으로 송신하는 Flowable 생성 Flowable<String> flowable = Flowable.just("A", "B", "C", "D", "E", "F"); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 main onNext( A ) main onNext( B ) main onNext( C ) main onNext( D ) main onNext( E ) main onNext( F ) main onComplete() 2. fromArray/fromIterablefromArray, fromIterable 함수는 파리미터로 배열 또는 Iterable(리스트 등)에 담긴 데이터를 순서대로 Flowable을 생성하는 연산자입니다. 모든 데이터를 순차적으로 송신 후 완료됩니다. 반복적인 데이터 변환 작업 같은 경우 for 문 대신 대체할 수 있습니다. 결과를 보면 main Thread 에서 작업 결과가 나오지만, flatMap 을 사용한다면 별도의 Thread로 main Thread의 부하를 막을 수 있습니다.1. fromArray public static void fromArray() { //fromArray 배열로 파라미터를 전달 받는다. Flowable<String> flowable = Flowable.fromArray("A", "B", "C", "D", "E"); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 main onNext( A ) main onNext( B ) main onNext( C ) main onNext( D ) main onNext( E ) main onComplete() 2. fromIterable public static void fromIterable() { List<String> list = Arrays.asList("A", "B", "C", "D", "E"); //fromIterable 리스트로 파라미터를 전달받는다. Flowable<String> flowable = Flowable.fromIterable(list); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 main onNext( A ) main onNext( B ) main onNext( C ) main onNext( D ) main onNext( E ) main onComplete() 파라미터와 함수는 다르지만 동일하게 처리된다. 3. range/rangLongrange 함수는 지정한 숫자부터 지정한 개수만큼 증가하는 Integer 값 데이터를 송신하는 Flowable를 생성합니다. rangLong 함수는 range와 동일하며 데이터 타입은 Long을 사용합니다. 두 함수 데이터 송신을 마치면 onComplete를 송신합니다.1. range public static void range() { //range(int start, int count) //start : 시작 값 //end : 발생하는 횟수 Flowable<Integer> flowable = Flowable.range(10, 5); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 main onNext( 10 ) main onNext( 11 ) main onNext( 12 ) main onNext( 13 ) main onNext( 14 ) main onComplete() 2. rangLong public static void rangeLong() { //range(int start, int count) //start : 시작 값 //end : 발생하는 횟수 Flowable<Long> flowable = Flowable.rangeLong(10, 5); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 main onNext( 10 ) main onNext( 11 ) main onNext( 12 ) main onNext( 13 ) main onNext( 14 ) main onComplete() 4. interval지정한 간격마다 0부터 시작해 Long 타입 숫자의 데이터를 송신하는 Flowable을 생성합니다. 데이터는 0, 1, 2, 4 순차적으로 증가된 데이터를 송신합니다. Android 에서는 반복적인 작업인 TimerTask를 대신해서 interval로 간단하게 처리할 수 있습니다. UI 변경이 필요한 부분에서는 interval scheduler를 AndroidSchedulers.mainThread() 를 변경해 적용할 수 있습니다.public static void interval() { //(long time, TimeUnit unit, Scheduler scheduler) //time : 발생 간격 시간 //unit : 간격 시간 단위 //scheduler : 발생 scheduler를 변경하여 사용할 수 있습니다. // ex)AndroidSchedulers.mainThread() // - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 // 1초 간격으로 데이터 요청을 송신하다. Flowable<Long> flowable = Flowable .interval(1000L, TimeUnit.MILLISECONDS).take(10); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 0 ) RxComputationThreadPool-1 onNext( 1 ) RxComputationThreadPool-1 onNext( 2 ) RxComputationThreadPool-1 onNext( 3 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onNext( 5 ) RxComputationThreadPool-1 onNext( 6 ) RxComputationThreadPool-1 onNext( 7 ) RxComputationThreadPool-1 onNext( 8 ) RxComputationThreadPool-1 onNext( 9 ) 5. timertimer 함수는 호출된 시간부터 일정한 시간 동안 대기하고 Long 타입 0을 송신 및 종료하는 flowable을 생성합니다. interval이 조건까지 반복적으로 송신한다면, timer는 한번만 송신하고 종료됩니다.public static void timer() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd hh:mm ss"); System.out.println("현재시간 : " + simpleDateFormat.format(System.currentTimeMillis())); //(long time, TimeUnit unit, Scheduler scheduler) //time : 발생 간격 시간 //unit : 간격 시간 단위 //scheduler : 발생 scheduler를 변경하여 사용할 수 있습니다. // ex)AndroidSchedulers.mainThread() Flowable<Long> flowable = Flowable.timer(1000L, TimeUnit.MILLISECONDS); //구독을 시작한다. flowable.subscribe(value -> { System.out.println(" timer : " + simpleDateFormat.format(System.currentTimeMillis())); }, throwable -> { System.out.println(throwable); }, () -> { System.out.println(" complete"); }); } 결과 현재시간 : 2019.04.29 09:09 56 timer : 2019.04.29 09:09 57 complete 6. mapFlowable 에서 송신하는 데이터를 변환하고, 변환된 데이터를 송신하는 연산자입니다. 하나의 데이터만 송신할 수 있으며, 반드시 데이터를 송신해야 합니다. 혹여 송신되는 데이터가 null 을 포함하면 map 대신 아래의 flatMap 을사용하는 것이 좋습니다.public static void map() { Flowable<String> flowable = Flowable.just("A", "B", "C", "D", "E") //map(Function mapper) //mapper : 받은 데이터를 가공하는 함수형 인터페이스 //알파벳 값을 소문자로 변경하여 return 한다 .map(value -> value.toLowerCase()); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 main onNext( a ) main onNext( b ) main onNext( c ) main onNext( d ) main onNext( e ) main onComplete() 7. flatMapflatMap은 map과 동일한 함수이지만, map과는 달리 여러 데이터가 담긴 Flowable을 반환할 수 있습니다. 또한 빈 Flowable를 리턴해 특정 데이터를 건너뛰거나 에러 Flowable를 송신할 수 있습니다.파라미터 mapper에서 새로운 Flowable의 데이터 전달이 아닌 다른 타임라인 Flowable로 작업하면 들어온 데이터 순서대로 출력을 지원하지 않습니다. 타임라인 Flowable(timer, delay, interval 등)에서는 가급적 사용을 피하거나, 순서에 지장이 없을 때 사용하는 것이 좋습니다.public static void flatMap() { Flowable<String> flowable = Flowable.range(10, 2) //flatMap(Function mapper, BiFunction combiner) //mapper : 받은 데이터로 새로운 Flowable를 생성하는 함수형 인터페이스 //combiner : mapper가 새로 생성한 Flowable 과 원본 데이터를 조합해 새로운 송신 데이트를 생성하는 함수형 인터페이스 //첫 번째 데이터를 받으면 새로운 Flowable를 생성한다. //take(3) : 3개까지만 발생한다. .flatMap(value -> Flowable.interval(100L, TimeUnit.MILLISECONDS).take(3), (value, newData) -> "value " + value + " newData " + newData); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( value 10 newData 0 ) RxComputationThreadPool-2 onNext( value 11 newData 0 ) RxComputationThreadPool-1 onNext( value 10 newData 1 ) RxComputationThreadPool-2 onNext( value 11 newData 1 ) RxComputationThreadPool-1 onNext( value 10 newData 2 ) RxComputationThreadPool-2 onNext( value 11 newData 2 ) RxComputationThreadPool-2 onComplete() 결과를 보면 각기 생성된 Flowable이 비동기식으로 송신 되기때문에 서로 다른 스레드에서 실행돼 데이터를 받는 순서대로 송신하지 않는다는 점을 주목하자 8. concatMap받은 데이터를 Flowable로 변환하고 변환된 Flowable을 하나씩 순서대로 실행해서 수신자에서 송신합니다. 다시 말해 여러 데이터를 계속 받더라도 첫 번째 데이터로 생성한 Flowable 의 처리가 끝나야 다음 데이터로 생성한 Flowable을 실행하는 것입니다.생성된 Flowable의 스레드에서 실행되더라도 데이터를 받은 순서대로 처리하는 것을 보장하지만, 처리 성능에 영향을 줄 수 있습니다.public static void concatMap() { Flowable<String> flowable = Flowable.range(10, 5) //map(Function mapper) //mapper : 받은 데이터를 가공하는 함수형 인터페이스 .concatMap(value -> Flowable.interval(100L, TimeUnit.MILLISECONDS).take(2) .map(data -> ("value : " + value + " data : " + data))); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( value : 10 data : 0 ) RxComputationThreadPool-1 onNext( value : 10 data : 1 ) RxComputationThreadPool-2 onNext( value : 11 data : 0 ) RxComputationThreadPool-2 onNext( value : 11 data : 1 ) RxComputationThreadPool-3 onNext( value : 12 data : 0 ) RxComputationThreadPool-3 onNext( value : 12 data : 1 ) RxComputationThreadPool-4 onNext( value : 13 data : 0 ) RxComputationThreadPool-4 onNext( value : 13 data : 1 ) RxComputationThreadPool-5 onNext( value : 14 data : 0 ) RxComputationThreadPool-5 onNext( value : 14 data : 1 ) RxComputationThreadPool-5 onComplete() 결과를 보면 생성된 Flowable 스레드와 데이터 순서대로 출력이 보장된다 것을 알 수 있다. 9. toListtoList는 송신할 데이터를 모두 리스트에 담아 전달합니다. 한꺼번에 데이터를 List로 가공해서 받기에 좋습니다. 하지만 많은 양의 데이터를 처리할 경우 버퍼가 생길 수 있고, 쌓은 데이터 때문에 메모리가 부족해질 수도 있습니다. 또한 수신되는 데이터는 하나이므로 Flowable이 아닌 Single 반환값을 사용합니다.public static void toList() { Single<List<String>> single = Flowable.just("A", "B", "C", "D", "E", "F") .toList(); // 구독을 시작한다. single.subscribe(new SingleObserver<List<String>>() { @Override public void onSubscribe(Disposable d) { System.out.println(Thread.currentThread().getName() + " onNext()"); } @Override public void onSuccess(List<String> strings) { //최종 완료된 리스트를 순서대로 출력한다. for (String text : strings) { System.out.println(Thread.currentThread().getName() + " onSuccess( " + text + " )"); } } @Override public void onError(Throwable e) { System.out.println(Thread.currentThread().getName() + " onError() " + e); } }); } 결과 main onNext() main onSuccess( A ) main onSuccess( B ) main onSuccess( C ) main onSuccess( D ) main onSuccess( E ) main onSuccess( F ) 10. toMaptoMap은 송신할 데이터를 모두 키와 값의 쌍으로 Map에 담아 전달합니다. 나머지는 toList의 특징과 같습니다. 송신되는 데이터 타입은 Map에 담아서 송신하는데 동일한 key에서 value는 마지막 데이터가 덮어 씁니다. 요청되는 값보다 결과 값이 적을 수도 있습니다. List 값을 손쉽게 key, value로 분리할 수 있는 함수이기도 합니다.public static void toMap() { Single<Map<Long, String>> single = Flowable.just("1A", "2B", "3C", "1D", "2E") //toMap(Fuction keySelector, Function valueSelector, Callable mapSupplier) //keySelector : 받은 데이터로 Map에서 사용할 키를 생성하는 함수형 인터페이스 //valueSelector : 받은 데이터로 Map 넣을 값을 생성하는 함수형 인터페이스 .toMap(value -> Long.valueOf(value.substring(0, 1)), data -> data.substring(1)); //구독을 시작한다. single.subscribe(new SingleObserver<Map<Long, String>>() { @Override public void onSubscribe(Disposable d) { System.out.println(Thread.currentThread().getName() + " onNext()"); } @Override public void onSuccess(Map<Long, String> longStringMap) { //최종 완료된 map을 순서대로 출력한다. for (long id : longStringMap.keySet()) { System.out.println(Thread.currentThread().getName() + " onSuccess( id : " + id + ", value " + longStringMap.get(id) + " )"); } } @Override public void onError(Throwable e) { System.out.println(Thread.currentThread().getName() + " onError() " + e); } }); } 결과 main onNext() main onSuccess( id : 1, value D ) main onSuccess( id : 2, value E ) main onSuccess( id : 3, value C ) 11. toMultiMap키와 컬렉션 값으로 이루어진 Map을 데이터로 변환하여 송신하는 함수입니다. 나머지 특징은 toList, toMap과 같습니다. toMap에서 중복되는 value를 관리하는 건 없었지만, value를 collection으로 관리하여 전달되는 데이터를 모두 수신할 수 있습니다.public static void toMultiMap() { Single<Map<String, Collection<Long>>> single = Flowable.interval(100L, TimeUnit.MILLISECONDS) .take(5) //toMultimap(Function keySelector, Function valueSelector) .toMultimap(value -> { //value가 홀수인지 짝수 인지 판단해서 key값을 리턴한다. if (value % 2 == 0) { return "짝수"; } else { return "홀수"; } }); //구독을 시작한다. single.subscribe(new SingleObserver<Map<String, Collection<Long>>>() { @Override public void onSubscribe(Disposable d) { System.out.println(Thread.currentThread().getName() + " onNext( " + d + " )"); } @Override public void onSuccess(Map<String, Collection<Long>> stringCollectionMap) { for (String key : stringCollectionMap.keySet()) { StringBuffer stringBuffer = new StringBuffer(); for (long value : stringCollectionMap.get(key)) { stringBuffer.append(" " + value); } System.out.println(Thread.currentThread().getName() + " onSuccess( id : " + key + ", value " + stringBuffer.toString() + ")"); } } @Override public void onError(Throwable e) { System.out.println(Thread.currentThread().getName() + " onError() " + e); } }); } 결과 main onNext() RxComputationThreadPool-1 onSuccess( id : 짝수, value 0 2 4 ) RxComputationThreadPool-1 onSuccess( id : 홀수, value 1 3 ) 12. filterfilter는 받은 데이터가 조건에 맞는지 판단해 결과가 true인 값만 송신합니다. 위의 just, fromArray, interval이 반복적인 케이스였다면, filter는 if문처럼 조건문의 역할을 할 수 있습니다. 반복문 함수와 조건문 함수를 같이 사용해 몇 줄 안에 for, if와 똑같이 구현할 수 있죠.public static void filter() { Flowable<Long> flowable = Flowable.interval(300L, TimeUnit.MILLISECONDS) //짝수만 통과한다. 3개만큼 .filter(value -> value % 2 == 0).take(3); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 0 ) RxComputationThreadPool-1 onNext( 2 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onComplete() 13. distinct이미 처리된 데이터를 다시 볼 필요가 없을 때 사용하는 함수입니다. 송신하려는 데이터가 이미 송신된 데이터와 같다면 해당 데이터는 무시합니다. 이 함수는 내부에서 HashSet으로 데이터가 같은지 확인합니다.public static void distinct() { Flowable<String> flowable = Flowable.just("A", "a", "B", "b", "A", "a", "B", "b") //distinct(Function keySelector) //keySelector : 받은 데이터와 비교할 데이터를 확인하는 함수 //모두 소문자로 변환하여 알파벳 기준으로 데이터를 판단한다. .distinct(value -> value.toLowerCase()); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 main onNext( A ) main onNext( B ) main onComplete() 14. take1.taketake 함수로 지정된 횟수만큼 받은 데이터를 송신합니다. 지정된 횟수에 도달하면 완료를 송신해 처리 종료합니다.2.takeUntil지정된 조건까지 데이터를 송신하는 연산자입니다. 조건이 되면 완료를 송신해 종료합니다.3.takeWhile지정된 조건이 해당할 때만 데이터를 송신하는 연산자입니다.4.takeLast데이터의 끝에서부터 지정한 조건까지 데이터를 송신하는 연산자입니다.take 함수는 한 화면에 출력되거나 칠요한 데이터만큼 리스트에서 값을 하나씩 수신할 때 사용합니다. 예를 들어 화면에 데이터가 6개가 필요하면 take를 이용해 원하는 만큼의 데이터를 가져올 수 있습니다.Flowable.take(6) 또한 이후에 나올 skip 함수를 같이 사용하면 두 번째 화면에서 필요한 데이터를 6개 가져올 수 있습니다.Flowable.skip(6).take(12) 1. take public static void take() { // 100 밀리세컨드만큼 반복하며 총 5개를 출력후 종료한다. Flowable<Long> flowable = Flowable.interval(100L, TimeUnit.MILLISECONDS) .take(5); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 0 ) RxComputationThreadPool-1 onNext( 1 ) RxComputationThreadPool-1 onNext( 2 ) RxComputationThreadPool-1 onNext( 3 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onComplete() 2. takeUntil public static void takeUntil() { // 100 밀리세컨드만큼 반복하며 값이 5가 될때까지 송신한다. Flowable<Long> flowable = Flowable.interval(100L, TimeUnit.MILLISECONDS) .takeUntil(value -> value == 5); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 0 ) RxComputationThreadPool-1 onNext( 1 ) RxComputationThreadPool-1 onNext( 2 ) RxComputationThreadPool-1 onNext( 3 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onNext( 5 ) RxComputationThreadPool-1 onComplete() 3. takeWhile public static void takeWhile() { // 100 밀리세컨드만큼 반복하며 값이 5가 아닐경우까지 송신한다. Flowable<Long> flowable = Flowable.interval(100L, TimeUnit.MILLISECONDS) .takeWhile(value -> value != 5); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 0 ) RxComputationThreadPool-1 onNext( 1 ) RxComputationThreadPool-1 onNext( 2 ) RxComputationThreadPool-1 onNext( 3 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onComplete() 4. takeLast public static void takeLast() { //100밀리 세컨트만큼 반복하며 5개의 출력중 뒤에 2개만 송신한다. Flowable<Long> flowable = Flowable.interval(100L, TimeUnit.MILLISECONDS) .take(5) .takeLast(2); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 3 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onComplete() 15. skip1.skip함수로 지정된 횟수만큼 받은 데이터 송신을 제외합니다. 지정된 횟수가 초과되면 나머지 데이터를 송신합니다.2.skipUntil지정된 조건까지 데이터 송신을 제외하는 연산자입니다. 조건이 되면 나머지 데이터를 송신합니다.3.skipWhile지정된 조건이 해당될 때만 데이터 송신을 제외하는 함수입니다.4.skipLast데이터의 끝에서부터 지정한 조건까지 데이터 송신을 제외하는 함수입니다.take와 반대의 기능을 갖고 있습니다. 보통 페이저나 리스트에서 paging을 처리할 때는 take와 skip을 혼용합니다.1. skip public static void skip() { //100 밀리세컨드만큼 반복하며 5번 발행하고, 처음 2개를 제외합니다. Flowable<Long> flowable = Flowable.interval(100L, TimeUnit.MILLISECONDS) .take(5) .skip(2); //구독을 시잔한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 2 ) RxComputationThreadPool-1 onNext( 3 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onComplete() 2. skipUntil public static void skipUntil() { //300밀리 세컨드만큼 반복하며 5개를 발행하고, 1000 밀리세컨드 제외 후 송신합니다. Flowable<Long> flowable = Flowable.interval(300L, TimeUnit.MILLISECONDS) .skipUntil(Flowable.timer(1000L, TimeUnit.MILLISECONDS)) .take(5); //구독을 시잔한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-2 onNext( 3 ) RxComputationThreadPool-2 onNext( 4 ) RxComputationThreadPool-2 onNext( 5 ) RxComputationThreadPool-2 onNext( 6 ) RxComputationThreadPool-2 onNext( 7 ) RxComputationThreadPool-2 onComplete() 3. skipWhile public static void skipWhile() { //300밀리세컨드만큼 반복하며 5개를 발행하고, 데이터 3이 올때까지 데이터를 제외힙니다. Flowable<Long> flowable = Flowable.interval(300L, TimeUnit.MILLISECONDS) .skipWhile(value -> value != 3) .take(5); //구독을 시잔한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 3 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onNext( 5 ) RxComputationThreadPool-1 onNext( 6 ) RxComputationThreadPool-1 onNext( 7 ) RxComputationThreadPool-1 onComplete() 4. skipLast public static void skipLast() { //1000 밀리세컨드만큼 반복하며 5개를 발행하고 마지막 2개는 제외합니다 Flowable<Long> flowable = Flowable.interval(1000L, TimeUnit.MILLISECONDS) .take(5) .skipLast(2); //구독을 시작한다. flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 0 ) RxComputationThreadPool-1 onNext( 1 ) RxComputationThreadPool-1 onNext( 2 ) RxComputationThreadPool-1 onComplete() 16. throttleFirst데이터를 송신하고 지정된 시간 동안 들어오는 요청을 무시합니다. 이 함수는 View의 Event 처리에서 많이 사용됩니다. 중복되는 처리를 막기 위해 최초 실행 후 일정 시간 동안 View의 클릭 이벤트나 API 이벤트를 막을 수 있기 때문에 비동기 처리와 화면에 직접적인 피드백이 발생했을 때 throttleFirst를 자주 사용하고 있습니다. //데이터 요청이 30 밀리초마다 5번 발생합니다. //데이터 요청 발생시 100 밀리세컨트 동안 들어오는 데이터 요청을 무시합니다. // — 0 — 1 — 2 — 3 — 4 interval 30 밀리초 마다 // — — -*- — throttleFirst 100 밀리초 무시 Flowable<Long> flowable = Flowable.interval(30L, TimeUnit.MILLISECONDS) .take(5).throttleFirst(100L, TimeUnit.MILLISECONDS); flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 0 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onComplete() 17. throttleLastthrottleLast 함수는 데이터를 송신하고 지정된 시간 동안 들어오는 마지막 요청을 송신합니다. 이 함수도 throttleFirst처럼 반복적인 선택 이벤트 처리에 유용하게 사용할 수 있습니다. 간단하게 장바구니 카운트 변경을 요청할 때 마지막 변경 이벤트 데이터만 처리하면 되므로 값이 선택되고 일정 시간이 지났을 때 API를 요청해 리소스 낭비를 줄일 수 있습니다.public static void throttleLast() { //데이터 요청이 1 초 마다 6번 발생합니다. //데이터 요청 발생시 2 초 동안 들어오는 마지막 요청을 송신하다. // - 0 - 1 - 2 - 3 - 4 interval 1 초 마다 // - - -* - throttleLast 2 초의 마지막 값 송신 Flowable<Long> flowable = Flowable.interval(1, TimeUnit.SECONDS) .take(5) .throttleLast(2, TimeUnit.SECONDS); flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( 2 ) RxComputationThreadPool-1 onNext( 4 ) RxComputationThreadPool-1 onComplete() 18. throttleWithTimeoutthrottleWithTimeout 함수는 데이터를 송신하고 지정된 시간 동안 다음 데이터를 받지 못하면 현재 데이터를 송신합니다. 완료 시엔 마지막 데이터를 송신하고 종료됩니다.public static void throttleWithTimeout() { Flowable<String> flowable = Flowable.<String>create(emitter -> { emitter.onNext("A"); Thread.sleep(1000L); // 1000 밀리세컨드 슬립 // 500 밀리세컨드 동안 데이터 다음 데이터 요청이 없으므로 A 송신 emitter.onNext("B"); Thread.sleep(300L); // 300 밀리세컨드 슬립 emitter.onNext("C"); Thread.sleep(300L); // 300 밀리세컨드 슬립 emitter.onNext("D"); Thread.sleep(1000L); // 1000 밀리세컨드 슬립 // 500 밀리세컨드 동안 데이터 다음 데이터 요청이 없으므로 D 송신 emitter.onNext("E"); Thread.sleep(100L); // 100 밀리세컨드 슬립 emitter.onComplete(); //완료 요청 시 마지막 데이터 송신 후 종료 }, BackpressureStrategy.BUFFER) .throttleWithTimeout(500L, TimeUnit.MILLISECONDS); flowable.subscribe(new CustomSubscriber<>()); } 결과 RxComputationThreadPool-1 onNext( A ) RxComputationThreadPool-1 onNext( D ) main onNext( E ) main onComplete() ConclusionRxJava에서 많이 사용되고, 또 알고 있으면 좋은 함수들을 살펴봤습니다. 브랜디에서도 이 함수들을 응용해 그동안 다양한 기능을 구현했고, 복잡한 함수도 사용하고 있습니다. 지금까지는 Flowable로 송신과 수신이 1 : 1 로 진행되었지만, 다양한 수신자를 사용해 하나의 Flowable로도 다른 화면에서 여러 수신자를 등록하여 반복적인 작업을 할 수 있습니다. 덕분에 같은 작업을 코드 중복 없이 간단하게 구현할 수 있죠.다음 글에서는 2개 이상의 Flowable을 결합해 사용하는 방법과 Android View에서 RxJava를 응용하는 방법, 구독을 관리하는 방법 등 Android에서 유용하게 쓰는 방법들을 알아보겠습니다.글고재성 팀장 | R&D 개발MA팀[email protected]브랜디, 오직 예쁜 옷만
조회수 835

제니퍼소프트가 말하는 APM의 진짜 가치(1)

“있으면 좋은 제품”에서 “꼭 있어야 하는 제품”으로지난 2000년대 초 중반 인터넷 서비스가 다양하게 등장하면서 급부상한 분야가 있다. 바로 APM(Application Performance Management)이다. 당시 APM은 금융 업종의 기업들을 중심으로 엔터프라이즈 IT 분야의 화두이자 주요 트렌드로 등극했다. 한국에는 글로벌 벤더가 먼저 APM을 소개했고, 시장이 갓 형성된 2000년대 초반에는 기술 우위를 앞세운 와일리·베리타스와 같은 글로벌 벤더들의 솔루션들이 주목을 받았지만, 이내 제니퍼소프트와 같은 한국 솔루션이 시장을 주도했다. 무겁고 분석적인 측면이 강한 외산 제품에 비해 고객들의 미션 크리티컬한 측면을 적극적으로 수용하면서도 실시간 성능 분석까지 제공한 까닭에, 한국 고객들의 까다로운 구미를 맞추며 시장에서 선전할 수 있었다. 제니퍼는 이런 강점을 바탕으로 일본, 중국에서도 인정을 받아 아시아 시장에도 APM을 서서히 알리게 시작했다.그러나 APM 분야에 대한 전망은 당시에도 마냥 낙관적이지 않았다. 조금씩 차이가 있지만 시장조사기관들은 대략 2010년부터는 포화상태에 달하고 성장보다는 유지에 머무를 것으로 관측했다. 애플리케이션의 성능을 모니터링하고 관리해야 할 필요성이 일부 업종에서만 있을 것으로 예상됐기 때문이었다. 일종의 ‘있으면 좋은 제품’으로 인식됐던 것이다.하지만 APM 시장은 예상과는 다르게 지속적으로 성장했다. 한국IDC 리서치 자료에 따르면 APM 시장은 2010년 이후에도 매년 꾸준히 성장했다. 가트너 또한 2014년의 APM 시장 규모를 26억 달러로 추산하며 2013년 대비 15.8% 증가했다고 보고했다. 참고로 이는 ITOM(IT operations management) 분야에서 가장 높은 성장률에 해당한다.APM 시장의 성장세는 심지어 앞으로도 계속 이어질 것이라는 전망인데, 도대체 무슨 일이 벌어지고 있는 것일까? 왜 점점 더 많은 기업들이 ‘있으면 좋은 제품’으로 여겨졌던 모니터링 솔루션을 확대 도입하고 있는 것일까? APM은 어떻게 ‘꼭 있어야 하는 제품’ 이 되었을까? 경제 불황 혹은 저성장이라며 허리띠를 졸라매는 기업 사정을 감안하면 쉽게 이해하기 어려운 동향이다. 어려운 시기 왜 APM에 투자할까?웹 서비스가 사내 시스템뿐 아니라, 기업 비즈니스의 거의 모든 분야에 활용되면서. 그 중요성이 함께 높아졌다. 자연스레 이를 모니터링 하는 APM에 대한 투자가 지속적으로 늘어나게 되었다. 특이한 사실은 글로벌 금융위기를 포함하여 최근 몇 년 동안의 어려운 비즈니스 환경 속에서도 APM시장은 한국뿐 아니라 글로벌에서도 지속적으로 성장하고 있다는 사실이다. 이러한 원인은 어디에 있는지 알아보도록 하겠다. 복잡해진 IT 환경을 안정적으로 운영APM 확산의 주요 원인 중 하나로는 IT 환경의 복잡성 증가가 있다. 초기 APM 시장은 금융 기관들이 주도했다. 하지만 해를 거듭할수록 경쟁력 확보를 위해 IT가 필요했던 일반 기업들도 점차 IT 인프라를 도입하고 확장했다. 다량의 시스템을 도입한 기업들은 복잡해진 IT 환경으로 인해 관리에 어려움을 겪게 됐고, 시스템 장애에 따른 비즈니스 위험이 큰 곳부터 APM 수요가 확대되었다. 한편 이러한 경향은 APM 업계에 다시 영향을 끼쳤다. 오늘날의 APM은 새로운 최근 IT환경의 복잡성 증가에 따른 안정성 확보를 위해 웹 애플리케이션을 운영하는 다양한 시스템, 프로그램적 요소와 함께 연동되어 성능을 관리할 수 있어야 한다. 이에 따라 상용과 오픈소스 진영을 포함한 다양한 시스템 플랫폼(OS, Web Application Server, DB 등), 여기에 더해 수많은 애플리케이션 프레임워크와 문제없이 작동하는 것이 중요해졌다. 이에 따라 다양한 고객 운영환경 기반에서 안정성 및 호환성 검증된 제품이 시장에서 인정받고 있다.모바일, 클라우드로 인한 변화에의 대응APM 분야가 점점 더 중요하게 대두되는 데에는 모바일, 클라우드라는 기술적 배경이 크게 작용하고 있다. 먼저 모바일을 살펴보면 다양한 모바일 기기의 출현과 시간 및 장소에 얽매이지 않는 인터넷 사용은 트랜잭션 종류와 양적 측면에서 과거와 비교할 수 없는 수준의 변화를 초래했다. 그리고 클라우드 환경은 트랜잭션이 폭발적으로 증가하더라도 서비스를 운용하는 시스템을 확장하여 이를 수용할 수 있도록 도왔다. 이러한 변화는 기업 입장에서 더 많은 서비스를 관리하고, 더 많은 사용자의 요청을 안정적으로 서비스해야 하는 것을 의미한다. 즉, APM의 필요성이 더욱 증가하는 것이다. 이러한 모바일 및 클라우드의 확산은 장기적으로 이어지는 기술적 이슈라는 점에서 APM 분야의 성장에 오랜 기간 영향을 미칠 것으로 예상한다. 우수한 투자 효율성글로벌 금융 위기가 나타났던 2008년 글로벌 IT 시장에서는 불황 속에서도 APM 시장이 오히려 증가하는 현상이 나타났던 바 있다. 투자 대비 효과가 명확하고 가시적이었기 때문이다. 고객과 서버(기업 인프라) 사이에 존재하는 웹 애플리케이션 서버의 성능을 모니터링 하면, 웹 서비스를 사용하는 모든 고객의 요청에 대한 성능을 측정할 수 있다. 바꾸어 말하면 기업 입장에서 APM을 도입할 경우 고객이 웹 서비스를 사용하는데 문제가 되는 모든 상황을 파악할 수 있으며, 이를 통해 기업 핵심 비즈니스의 안정성을 높일 수 있다. 또한 APM은 폭증한 IT 인프라 관리를 간소화하고 관련 비용을 줄여주기도 한다. IT 서비스가 급증하면 서버와 애플리케이션, 네트워크 관리 업무도 함께 증가하기 마련인데, 그러면서도 관리 인력 및 여타 자원은 그대로거나 오히려 줄어드는 것이 일반적이다. APM은 적은 인력으로도 운영 중인 시스템을 효과적으로 모니터링 해 최적의 대응을 할 수 있도록 도와줄 수 있다. 단 이를 위해서는 관리 및 유지 보수 편의성을 염두에 두고 개발된 APM이 필수적이다. 자칫하면 관리를 위해 도입한 모니터링 솔루션이 오히려 관리 포인트를 늘리는 역효과로 이어질 수 있다는 점에 주의해야 한다.현업 부서의 대응성 개선현대의 기업들은 비즈니스 전반에 걸쳐 IT 서비스에 크게 의존한다. 이제는 영업, 회계, 마케팅, 고객 서비스 등 다양한 현업 부문에서 IT 서비스 상태에 촉각을 곤두세우고 있다. APM은 IT 담당자만 보는 시스템 및 서비스 현황을 다른 부서에서도 확인하고 대응할 수 있게 해준다. 일례로 서비스에 장애가 발생했을 때, IT 부문만 이를 파악하는 것과 콜 센터에서도 즉시 파악하는 것은 고객 대응성 측면에서 차원이 다른 서비스로 이어진다. 단 이러한 현업 부문 활용을 위해서는 APM이 실시간성을 지원하고 우수한 시각화 기능을 보유하고 있어야 하며 사용법이 쉬워야 한다.2편에서 계속...
조회수 1458

이케아(IKEA), 스타트업 진화의 산물

몇 년 전에 유명한 개발자 분과 의기투합하여 이런 서비스를 만들어보면 어떨까요?라고 논의하고.. 딱 5장의 기획서를 만들어서 VC를 찾아가 미팅을 한 적이 있었다. 다행히 만나 논의하는 자리까지는 가지게 되었지만, 지금 생각하면 조금 무모했다는 생각이 든다. ㅎㅎ 사실 그 다섯 장의 아이디어가 실제로 구현되고 만들어졌다면 아마도 그 모습과는 판이하게 달랐을 것이다.당연히 아이디어는 중요하다. 하지만, 기획서는 만들어지는 과정에서 큰 변화를 거칠 수밖에 없고.. 또한 론칭 이후에도 큰 변화를 겪을 수밖에 없다. 그래서 실행의 중요성이 엄청나다는 것을 뼈저리게 느끼고 있는 상황이며, 이러한 변화.. 즉, 인간이 계속해서 환경에 적응하며 진화해 온 것과 같이 스타트업의 서비스 또한 진화하지 않으면 생존하기 어렵다는 생각이다.그런데! 서비스의 진화는 기획자가 책상에 앉아서 기획서를 쓰겠다고 고민을 하다가 나오는 것이 아니라,어떻게 하면 더 만족스러운 서비스가 될 수 있을까?...라는 질문에 대한 해결책을 찾고, 실행하면서 진화해야 한다.  지금은 글로벌 가구 왕국인 이케아도 처음에는 스타트업으로 시작하였고, 그 진화의 과정을 거쳐 지금의 모습을 갖추게 되었다고 한다. 이케아의 창업 시점부터 다루고 있는 "IKEA, 스웨덴이 사랑한 이케아, 그 얼굴 속 비밀을 풀다"라는 책을 읽다 보면, 이케아의 창업 이후부터 서비스 진화를 설명해주는 부분이 있는데, 그 부분이 재미있었다.이케아도 처음부터 지금의 이케아가 아니었던 것이다.1. 이케아는 왜 조립식 가구.. 일까?이케아가 조립식 가구 형태로 판매하게 된 배경은, 통신판매업으로 여러 가지 제품을 팔던 회사(이케아의 전신)가 가구 공장을 인수하게 되었고, 역시 가구를 통신판매로 판매하기 시작했다. 그런데 가구는 배송이 까다로웠고, 이를 해결하기 위해.. 고객이 직접 조립하는 가구를 만들자!! 의 아이디어가 실행되었다. 그것도 1950년대에...  2. 왜 창고형 매장인가?이케아가 초창기 선풍적인 인기를 끌면서, 스톡홀름 매장을 오픈 었는데.. 개장하자마자 사람이 너무 많이 와서, 카운터에서 고객이 주문한 상품을 창고에서 물건을 가져오는데 시간이 많이 걸렸다고 한다. 그래서 고민 끝에 창고를 개방해서 고객이 직접 물건을 챙길 수 있도록 하였다.  3. 왜 핫도그를 싸게 파는가?쇼핑을 하느라 지치고 또는 계산대에서 줄이 너무 길었거나.. 원하는 상품을 구매하지 못한 고객들에게 즐거움을 주기 위함이었다고 한다. 보통 판매되는 핫도그의 1/4의 가격으로 핫도그를 판매해서 고객들이 계산대를 나오면 바로 즐길 수 있도록 준비하였다고 한다.  계속해서 관찰!좀 더 효율성을 높이는 서비스에 대한 고민, 고객의 대기 시간을 줄여주기 위한 고민.. 고객의 기분을 즐겁게 해 주기 위한 고민들이 모여 지금의 이케아가 된 것이고.. 이러한 관찰은 (내가 생각하기에는) 기획 부서의 사람들이라기보다는, 그 현장에서 일하는 사람들의 의견이 반영되어 이렇게 진화한 것이 아닐까?라는 추측을 해본다.진화의 주체는 책상위의 기획자가 아니라..현장 Staff들이 주체가 되어야...파펨에는 기획만을 담당하는 staff이 없다(Pie Startup). 작은 조직의 효율성을 기하기 위함이고.. 구성원 한 명 한 명이 모두 본인의 주요 업무 영역에서 일하면서 문제점을 발견하고 그것을 해결하기 위한 기획을 하며, 또한 실행 안을 만들고 적용해 보는 것이 최선이라는 생각이다. 대표의 역할은 그것의 우선순위를 정하고, 조율하며 필요한 자원을 적절하게 지원해 주는 것이다.파펨도 계속해서 진화하고 있다. 패키지에 대한 변화도 조금씩 이루어지고 있고, 또한 고객들이 파펨을 사용하면서 생기는 불편함을 해결하는 방향으로 변화해 가고 있다. 예를 들면, 고객들이 향수를 정기 구독하다가 남는 것들이 생기면 고객들은 정기결제를 중단하는 사태가 발생(어릴 적 학습지가 쌓이면 엄마에게 등짝 스매시를 당하고 당장 학습지가 끊기는 사태와 같이 ^^;;)할 수 도 있는데, 이럴 경우를 방지하기 위해 향수 팔레트를 만들어 제공하고, 고객들이 향수의 특성별로 Weather, occasion & fashion 등과 잘 어울리는 향을 쉽게 선택 및 사용할 수 있도록 돕는 tool을 제공하는 프로젝트도 진행 중에 있다.파펨도 다음주에 고객의 의견을 듣는 survey를 준비하고 있다. 좋은 말씀 부탁드립니다 .고객님!!!#파펨 #스타트업 #창업가 #창업자 #마인드셋 #인사이트
조회수 39

바로고에는 특별한 무언가가 있다~ 바로고의 비타민데이

[비타민데이]2017년이 시작된지 얼마 되지 않은 거 같은데벌써 1월이 끝나갑니다.요즘따라 날씨도 더 추웠어요.이럴때 우리는 챙겨주는 것은'바로고'뿐이다!바로고에는 특별한 무언가가 있어요.매월 1회임직원들의 건강까지 생각하는비타민데이를 진행합니다.센스있게 세팅까지 마무리한바로고의 비타민데이건조한 피부와 비타민 보충을 위해꼭! 챙겨 먹어야할 과일바로고에서는 사과, 배, 귤을 준비했어요.과일을 잘 챙겨드시면몸 안의 수분이 보충되고비타민까지 챙길 수 있어서꾸준히 잘 챙겨드시면피부도 좋아지는 효과가 있으니꼭! 챙겨 드세요^^MISURA 제품도 함께 준비했어요.아무래도 배고픔을 채우기에는탄수화물 섭취는 필수 입니다.다른 각도에서 인증샷을 찍으니좀 더 색다른 느낌.사무실이 아니라 카페에 온듯한 느낌이 드네요~인증샷 타임이 끝나자바쁘게 움직은 손들!기다렸다는 듯 비타민을 보충하기 시작 합니다.특히 아침을 잘 챙겨 먹지 못하시는 분들이제일 좋아하는 바로고 타임비타민데이 입니다.함께 비타민데이를 즐기는 모습입니다.바로고에만 있는 특별함바로고에는 특별한 무언가가 있다.임직원의 건강까지 생각하는바로고의 따뜻한 마음이 느껴지는사내 복지 중의 하나 입니다.바로고에는 임직원들을 위한다양한 복지들이 준비되어 있어요.모든 복지들이 호응도가 좋지만그 중에서도 비타민데이는임직원분들의 반응이 뜨거워요~역시 맛있는 것이 쵝오!어느새 비워져 가는 테이블든든하게 아침식사를 하고 업무를 위한 대화가 오고 갑니다.업무 외 이런 시간들이바로고 안에서 끈끈한 무언가를 만들고더 나은 바로고를 만들기 위해함께 노력하는 원천이 되는 것 같아요.앞으로도 바로고는 함께! 즐거운 마음으로 나아가겠습니다.다음에는 어떤 특별함을 찾아올지기대 많이해주세요!"바로고에는 특별한 무언가가 있다"바로고의 비타민데이 였습니다.감사합니다.
조회수 615

왜 그 일을 시작했는가?

A는 부서를 이동했다.새로운 일을 시작한다는 것은 설레기도 하고 두렵기도 한 일이다.새로 옮긴 부서는 이미 인력이 구성되어 프로젝트를 진행 중이었고, A는 뒤늦게 합류한 상황이었다. 기존 멤버들은 이미 트랙을 빠르게 돌고 있었고, A는 워밍업을 하면서 그 속도를 뒤쫒아야 하는 상황이다. A는 트랙 주변에 서서 어떤 속도로 따라가야 할지, 어떤 방향를 향해 달려야 할지 파악하고 있다. 틈틈히 달리는 기존 멤버들에게 어디로 가고 있는지, 무엇을 위해 달리고 있는지도 확인했다.A가 발견한 이상한 점은 이들이 처음에 목표한 곳을 향해 달리고 있지 않다는 것이다.음... 그래, 상황이 달라졌을 수 있으니까...하지만, 더욱 이상한 점은 달리고 있는 사람들도 이상해 하고 있었다는 점이다.처음에 목표로 한 곳은 한참 다른 방향이었고, 그 사이에 여러가지 이슈들때문에 지금 이렇게 방향이 바뀌었다고 했다. 그리고 지금은 관성을 거스를 수 없어서 계속 달리고 있는 듯했다.멈출 수가 없다고 한다.어렵게 지금까지 속도를 냈기 때문이다.이게 아닌 것 같은데, 누구도 감히 브레이크를 걸 수 없는 상황이었다.그 일을 왜 시작했는가"무엇때문에 그 일을 하고 있는가?""왜 아무도 원하지 않는 방향으로 달려가는가?"A는 사실, 이런 상황을 잘 알고있다.대부분의 조직은 '방향'이 아니라, '속도'로 평가받고 있다는 것을...
조회수 3112

리디북스 서점 GNB 리뉴얼

해외여행 중에 길을 잘 몰라 헤맸던 경험,마트에 물건을 사러 갔는데 내가 찾는 상품이 어디 있는지 몰라 당황스러웠던 경험 있으신가요?이와 비슷하게 웹사이트를 방문했을 때 어떤 곳은 메뉴 파악이 쉽고 원하는 페이지로 이동이 쉬운 반면 어떤 곳은 메뉴가 너무 복잡하거나 메뉴를 찾는데 오래 걸려 짜증이 날 때도 있습니다.이렇게 웹사이트에서 사용자 경험에 큰 영향을 미치는 요소는 바로 GNB (Global Navigation Bar) 디자인입니다. 때문에 GNB는 매우 중요한 영역이고, 구조를 변경하는 일은 드뭅니다.커머스의 경우 제품이나 서비스 등이 변경, 추가되면서 GNB가 달라지게 됩니다. 그 예로 아마존 웹사이트의 탭 내비게이션 디자인의 변화를 보면 아마존의 제품, 서비스가 어떻게 달라졌는지 한눈에 확인할 수 있습니다.출처: 아마존 탭 네비게이션의 변화리디북스 서점의 경우, 최근 몇 년간 GNB에 큰 변화는 없었습니다. 그런데 이번에 GNB 개편을 하게 된 이유는 판타지 연재 서비스를 준비하면서 ‘판타지’ 서브 메뉴로 ‘연재’를 추가하기 위한 작업이 필요했기 때문입니다. 이번 작업을 하면서 GNB의 사용성과 디자인 완성도를 위해 고민했던 그 과정을 공유합니다.다음 문제를 해결해야 했습니다.1. 메인 카테고리와 서브 메뉴의 위계가 맞지 않음a) 메인 카테고리는 일반, 로맨스, 판타지, 만화입니다.b) 서브 메뉴는 ‘베스트셀러, 맞춤추천, 이벤트’ 입니다.메인 카테고리가 서브 메뉴 보다 상위 개념인데 모바일에서는 상/하로 배치되어 있는 반면,PC는 좌/우로 배치되어 시각적으로 위계를 구분하기 어렵습니다.그림 1) 모바일 GNB 개편 전그림 2) PC GNB 개편 전2. 탭 디자인이 카테고리별로 다름그림 3) 카테고리별 탭 디자인3. 서브 메뉴에 아이콘이 있어 공간을 많이 차지하고 주목도가 높음4. 아이콘, 버튼 외곽선이 요소를 많아 보이게 함5. 메인 카테고리에 ‘BL’을 추가하기 위해 공간 확보해야 함디자인 과정1. 문제 해결에만 집중해보기처음에는 a)메인 카테고리와 b)서브 메뉴의 위계를 맞추기 위해서 서브 메뉴를 메인 카테고리 아래에 위치하도록 수정했습니다.하지만 서브 메뉴의 위치만 조정할 경우 GNB 높이가 기존보다 높아지기 때문에 최상단의 메뉴들을 검색창 우측으로 옮겼습니다. 이렇게 수정하니 a)메인 카테고리와 b)서브 메뉴의 위계는 맞출 수 있었지만 상단의 요소들은 정렬이 안 맞고 정리되지 않는 문제가 있었습니다.기존의 레이아웃 유지하면서 수정을 하기엔 한계가 있다고 생각했습니다.그림 4) 메뉴 위치만 카테고리 하단으로 아래로 수정함2. 익숙한 레이아웃으로 재배열하기위의 초기 시안을 만들고 나서 어색하다고 느낀 부분들은 무엇일까 고민하다가 다른 서비스들을 참고해봤습니다. 일반적으로 쇼핑몰에서 볼 수 있는 스키마(schema)를 분석해보면 다음과 같습니다.- 상단 : 카트, 위시리스트 등 유틸리티- 중앙 왼쪽 : 로고, 검색창- 하단 : 카테고리하지만 일반적인 레이아웃을 리디북스 서점에 적용할 경우 a) 마이리디, 카트, 위시리스트 크기가 작아지고 위치가 이동하여 사용이 불편해지고 b) 로고, 메인 카테고리, c) 검색창을 한 공간에 배치하기가 어려웠습니다.검색창은 서점에서 중요한 요소인데 좌측엔 배치할 공간이 없고, 그렇다고 메인 카테고리를 우측으로 하면 하위 메뉴들과 멀어져 연관성이 적어 보이겠죠.그림 5) 검색창을 우측에 배치한 시안3. 전체 높이 줄이기4단으로 하니 기존 메뉴들을 다 넣을 수 있지만 높이가 늘어나고 메뉴가 너무 많아 보여 한눈에 내비게이션을 파악하기 어려워 보였습니다. 또, 높이가 늘어나는 만큼 서점 콘텐츠 영역이 줄어드는 결과를 가져옵니다.그림 6) PC GNB 4단 (height: 177px)그럼 ‘3단으로 하면서 기존 메뉴들을 그대로 살릴 수 있는 방법은 없을까?’ 고민한 시안이 아래 이미지입니다.그런데 가운데 단 우측에 메뉴가 4개가 있다 보니 복잡해 보였습니다. 또 하나의 문제점은 PAPER는 리디북스 서점이 아닌 PAPER샵으로 이동하는 메뉴이고, 고객센터 / 뷰어 다운로드 / 리디캐시 충전은 리디북스 서점 페이지인데 같이 나열되는 것이 사용자에게 혼란을 줄 수 있다고 생각했습니다.그림 7) PC GNB 3단 (height: 149px)최종 시안GNB 개편 이전과 이후 시안입니다. PC에서는 ‘고객센터’와 ‘뷰어 다운로드’가 없어지고, ‘PAPER’ 좌측에 아이콘이 추가되었습니다. ‘고객센터’와 ‘뷰어 다운로드’는 기존 GNB에 있던 메뉴라서 없애는 것을 결정하기가 쉽지 않았는데, 다른 서비스에서의 경험을 바탕으로 사이트 하단 Footer에 있을 것이라고 예측 가능하다고 판단했습니다.그림 8) PC GNB 개편 전/후그림 9) 모바일 GNB 개편 전/후그림 10) PC Footer평가 및 느낀 점1) 디자인이번 작업을 통해 파란색 배경 영역을 줄이고 무거운 요소들을 조금 더 가볍게 표현했습니다. 그리고 메뉴를 더 쉽고 빠르게 인지할 수 있도록 정리했습니다.시안을 여러 번 수정하고 다시 새로 만드는 작업하면서 제가 느낀 점은 이렇습니다.“디자인 요소를 구분하려고 스타일을 너무 다르게 하면 정리되지 않는다.”“디자인 요소를 최소화하는 것이 중요하다.”특히 제한된 공간에 다양한 요소들을 욱여넣어야 했기 때문에 간격, 컬러, 선, 면, 점, 폰트 크기 등 모든 것을 세밀하게 조정해야 했습니다. 1px처럼 아주 작은 차이가 완성도를 높이는데 중요하다는 것을 어느 때보다 깊이 느꼈죠.2) 테스트 과정이번 작업을 진행하는 과정에서 기억에 남는 부분은 실제 서버에 배포하기 전에 몇 번의 테스트 과정을 거치면서 다른 프로젝트를 진행했을 때 보다 더 많은 분들께 의견을 구한 점입니다.“GNB 개편은 워낙 중요한 거라 다양한 의견을 들어보는 과정은 필수입니다.” (스토어팀 팀장님)리디북스에서 일하시는 분들은 디자이너, 개발자, 운영자, 누구 할 것 없이 우리 프로덕트의 퀄리티를 중요하게 생각하기 때문에 디자인과 사용성에 대해 높은 기준을 갖고 있습니다. 이번 작업에도 많은 분들이 디자인을 꼼꼼히 확인해주시고 의견을 주셔서 큰 도움이 되었습니다.마무리리디북스 면접 때 면접관님이 해주셨던 말씀을 기억합니다.“UI 디자인은 수없이 Make - Break - Make 해야 합니다. 이 과정을 귀찮게 생각하지 않는 마음 자세를 갖고 일했으면 좋겠습니다.”디자인 작업을 하다 보면 가끔은 끝이 없을 것 같고 인내심이 필요한 순간들이 있습니다. 그렇지만 수없이 만들고 수정하고 다시 만드는 과정의 끝에 제가 작업한 결과물이 서비스에 반영되는 순간 디자이너로서 뿌듯함을 느낍니다.#리디북스 #디자이너 #디자인 #GNB #개선 #개편 #후기 #사용성 #UI #UX #UX디자인 #UI디자인 #뿌듯함 #작업후기
조회수 1908

프론트엔드 개발자라면!

Angular의 A마크를 알아본 프론트엔드 개발자님!이 글은 새로운 플랫폼을 개발하고 있는 타운컴퍼니 개발팀으로 당신을 모셔보려는 글이에요.이들이 당신과 함께 일하고 싶은 동료입니다..타운컴퍼니팀은 알고 있습니다.잘 만들어진 편리한 앱과 고객의 이탈률이 얼마나 밀접한 관계가 있는가를요.1%의 스타트업에는 1% 개발자가 필요하며 그들이 1%의 플랫폼을 만든다는 것을요.자율적이며 열정이 넘치는 팀으로 즐겁게 높은 수준의 개발을 할 수 있는 환경이죠!당신에게 즐거운 회사, 좋은 동료가 되어 줄 수 있습니다.급여는 협의 후 결정이니 원하는걸 말해봐요!좋은 동료를 얻을 수 있다면 그정도가 어렵겠어요 ; )우리는 현재 플랫폼(townus.co.kr)이 많이 부족하다는걸 알고 있어요.그래서 완전 멋있게 새롭게 만들고 있는 중입니다 :)일단 우리는 협업툴 JIRA와 Confluence, Slack을 사용하고 있어요.우리팀은 Agile 칸반을 바탕으로 테스트 주도 개발, 코드 리뷰, 페어프로그래밍으로 프로젝트를 진행하고 있죠.도메인이 잘 분석된 명세서가 Confluence에 정리되어 있고 사용자를 위한 깊은 고민이 녹아있는 디자인이 Zeplin에 올라가고 있어요.- Back-End는 Django(DRF) 기반으로 개발되고 있고, AWS, Vagrant, Docker같은 기술을 사용해요.- Front-End는 Angular 5를 사용해서 개발하고 있고, Less, RxJS, Webpack 등의 기술을 사용하고 있어요.Angular 상용 프로젝트 개발 경험이 있다면 격하게 환영하며 모십니다. 리엑티브 프로그래밍, Ionic 경험이 있다면 더 좋구요!엥 이거 완전 나 아니냐!? 라는 생각이 들었다구요? 그렇다면 얼른 지원해야지 뭐해요!무엇보다 개발을 즐기고 오픈소스활동을 좋아하는 사람이라면,종종 맛있는것도 먹으면서 많은 대화를 나눌수 있지 않을까요? :>우리 개발자는 맥주제조도 할 줄 알거든요 (겁나 맛이 좋더라구요)물론 당신에 대해 알 수 있는 Github 주소와 이력서를 보내준다면 우리가 연락하기 더 쉬울거에요!아! 참고로 보충역 산업기능요원 편입도 가능하니 문의가 필요하다면 언제든 환영이에요!타운컴퍼니팀에게 연락하고 싶다면 02–561–0950 잊지말아요,[email protected]로 메일 보내준다면 언제든 답변줄게요 :D#타운컴퍼니 #개발자 #채용 #팀빌딩 #조직문화
조회수 1156

혼자서 어찌어찌 하다보니 1억을 넘겼다.

연말이 되어가고 있어요. 그러니 매출과 비용정리를 해야해요. 세금을 내야하니까요. 어김없이 이 맘때쯤 되면 지난 한 해동안 뭘 얼마나 벌고 살았나...하면서 회고를 하게 되죠. 그 끝은 늘 우응어어어어엉 내인생은 망했어어어.... 통곡! 하나님! 애솔! 댐잇.... 뭐 이런 식인데 올해도 마찬가지였어요.젠장 갓대밋!하지만, 올해의 조금 다른 점이 있다면 나름 유의미한 목표수치를 넘겼다는 거예요. 연매출이 드디어..(4년만에) 1억을 넘겼어요. 작년이 5천이 조금 넘은 수치였으니 수치상으론 두 배로 뛰었네요. 기분이 좋아요. 그렇다고 남는 돈이 그만큼 남았냐.. 음음 그렇지 않죠. 돈은 늘 은행에 있는 거지, 나에게 있는 것이 아니예요.그냥 느낌적으로 유의미한 것 뿐이죠.사실 개인사업을 하면서 1억매출은 큰 게 아니예요. 오히려 4년만에 1억이면... 그동안 뭐했니?... 라는 소릴 들어도 시원찮을 액수랄까요..-.- 그런걸 생각하면 좀 시무룩하기도 하지만, 어차피 인생 다 마이페이스가 있는 것 아니겠어요? 내년에 또 두 배를 하면 되지! 라고 생각하고 그냥 덮으려고 해요. (정신승리)오늘의 글은 자랑이 아니예요.  한 해 동안 잘 먹고 살 수 있게 많은 도움을 주신 분들과 한 해를 대강 정리하며 좀 차분하게 생각해보려고 해요. 뭘 어떻게 해서 묵고 살았는지 말이죠. 그리고 내년엔 어떻게 묵고 살지에 대해서 말입니다.올 한해 디자인 작업을 도와준 녀석은 단명하신 제 2016년 그램과 새로 얻은 2018그램입니다. 맥이 있긴 하지만 녀석은 올해 좀 쉬었어요. 올데이그램이라곤 하지만 사실 올데이는 아닌 것 같고 그냥저냥 오래 잘 살아있다...는 느낌정도인 것 같아요. 그램의 최대장점은 그냥 가벼움이니까 가벼움으로 모든 걸 커버치겠어요. 타닥타닥 하는 가벼운 키감이 처음엔 시끄러워서 거슬렸는데 어차피 전 헤드셋을 끼고 일하니 제 타자소리가 들리진 않아요. 독서실같은 곳에선 일하기가 좀 그렇긴 하더라구요. 응 고생했어. 수고했으니까 청소해줄께또..음. 올 한해의 1등 BGM은 역시 나루토짱이었습니다. 나루토질풍전 ost는 차크라를 증폭시켜주고, 불의 의지에 대해 다시 생각하게 해주죠. 초심을 잃지 않게 만들어주는 훌륭한 배경음악이라고 할 수 있겠습니다.오레노 닌도다!또.. 올 해의 코스튬은 유니클로 후드티에게 영광을 돌리고 싶네요. 유니클로 보들보들 후드티는 가성비측면에서 가히 오진다고 할 수 있겠습니다. 특히 보들보들한 면소재때문에 엎드려 잘 때 볼에 닿는 느낌이 꽤나 좋다는 잔점(단점+장점)이 있습니다. 덕분에 잘 잤습니다. 마약같은 후드...자 그럼 헛소리 그만하고 1월부터 한 번 생각해볼께요.1월작년에 브런치에서 뿌앙! 터진 이후로 여기저기서 글써달란 의뢰가 몇 번 들어왔는데, 그 중 꽤 괜찮은 페이로 웹매거진 기고를 요청한 곳이 있었어요. S사였죠. 편당 70이었나? 그랬던 것 같아요. 6개정도로 호다닥 써서 드리게 되었죠. 페메로 연락이 왔고, 이래저래 커뮤니케이션의 미스가 있었어서 초반엔 좀 아리까리했었어요. 이게 맞나....? 싶었기도 하구요. 사실 다른 콘텐츠도 계속 만듭시다!~ 라고 했는데 상황도 상황이고, 뭔가 결이 좀 다른 것 같아서 리젝하게 되었답니다.하지만, 글로도 수익이 날 수 있다는 걸 알게 된 프로젝트여서 유의미했던 것 같아요. 그리고 책읽찌라 대표님이 서평써달래서 '생산성' 이란 책의 서평을 쓰고 소정의 용돈을 받았지요. (넙죽)작년12월부터 2월까진 부산에서 플젝을 했었거든요. 그때 저의 부산라이프를 행복하게 만들어주신 양대표님이 또 잊지않고 무슨 추가비용을 주셔서(뭐였는진 잘 기억이 안남..) 그것도 용돈이 조금 되었어요. 1월매출 = 250만원2월2월엔 서울로 호다닥 올라왔답니다. 부산생활이 끝난터라 적응도 안되고 막 정신도 없었지만...사실 올라오자마자 바로 미팅을 하고 일을 시작했어요. 뭐였냐면 S사의 웹소설 플랫폼을 만드는 일이었어욤. 사실 웹디자인은 그렇게 깊이있게 해본 적이 없어서 처음에 얼마나 후덜덜 했는지 몰라요. 사실 대표님께서 솔직하게 말씀드렸었거든요. 하아..이걸 내가 잘 할 수 있을 지 모르겄다...근데 그냥 하라고 하시더라구요. 개쿨했다. 3개월동안 세상 시원시원한 프로젝트를 했어요. 대표님이 이거 하자! 개발자님이 안된다! 나도 안된다! 대표님은 그래!하지말자! 이런 식의 우주적 커뮤니케이션을 경험했답니다. 이 세상 회의가 아니다.....아직 돈은 안받았어요. 돈은 3월, 4월에 걸쳐서 나눠 받기로 했지요.2월엔 1월에 하던 기고 잔액을 받았고..한 250만원? 정도 됬어요. 그리고 IR자료 하나 만들어드리고 한 200정도 받았던 것 같고, 브런치북 프로젝트 상금이 들어왔다는!! 세금떼고 96만원 정도가 쏘옥..(꽁돈기분).그리고 부산프로젝트 잔금도 이 때 들어왔어요. 200만원 정도. 그리고 서울에서 쪼꼬미하게 강연한거 17만원.2월매출 = 738만원3월3월엔 강의건이 크게 있었어요. 3일에 걸쳐서 18시간인가? 하는 극강의 온종일 워크샵이었죠. 포토샵이랑 기타 등등 스타트업에 취업하고 싶은 취준생들 대상으로 디자인실무 강의해주는 거였는데, 오랜만에 학식 돈까스를 먹어서 굉장히 뜻깊었습니다. 충남대까지 왔다갔다하면서 대전의 겨울을 맛보았죠. (다를게 없었음). 이것도 브런치 때문에 막 뜨면서 섭외가 들어온 건이었어요. 그걸로 한 300만원 정도 들어왔었어요.그리고 기획재정부 산하 KDI에서 프로젝트를 하나 맡아서 했었죠. 어떻게 알게 되었냐면..음 저랑 페친님이 제 브런치 팬이었는데..... 그 페친님이 자기 여친님께 절 소개했나봐요. 그 여친님이 KDI담당자분이셨고, 그렇게 저렇게 둘러둘러 연락이 오게 된 케이스랍니당. 전시관 소개서와 기타 등등 몇 가지를 만들고 320만원 정도.. 했던 것 같아요. 이건 능력자 디자이너님인 조경하 디자이너님과 함께했었어요!그리고 이 때 책 인쇄들어가면서 선인세 100만원 받았구, 아까 웹디자인 프로젝트 중도금 받았죠 :) 야호! 그리고 IR자료 만드는거 한 건 더들어와서 400만원 플러스!3월매출 = 1,891만원4월아까 KDI에서 추가로 백드롭월이랑, 현수막 등 제작 몇 개 맡겨서 그거 한 건 처리했어요. 그리고 웹디자인 프로젝트 끝나면서 잔금+추가비용 받았죠! 4월은 웹디자인 마무리 짓고 드러누워 요양하느라 아무것도 못한 달이예요... 4월매출 = 925만원5월얼레?강의 한 건 뛰고..암 것도 안함.. 요양(사실상 강제요양..일 안들어옴..)5월매출 = 42만원6월어떡하지...6월도 암것도 ..안...아니 못함... 일 하나도 안들어와서  내 인생은 종착역을 발견한 여름이었어요. 돈 좀 벌었다고 새로 이사하면서 무인양품에서 250만원 어치를 사서 들여왔는데 아씨..내가 왜 그런 짓을 했을까..를 하루12번 되뇌었죠. 혹시라도 이것을 중고나라에 되판다면 착불로 해야하나 어째야하나 진지하게 고민해보기도 했습니다.6월매출 = 0원7월KDI에서 포스터를 만들어달래서 야호!!! 거렸어요. 사실 공공기관 포스터는 딱히 큰 비용은 아니지만..그래두 지난 2달간 10손가락을 번갈아 빨아먹으며 연명하던터라 마냥 기뻤죠. 그리고 Y사에서 회사 아이덴티티를 위한 워딩(회사소개문구와 슬로건 등)을 짜달라는 의뢰가 왔어요. 싱기방기... https://brunch.co.kr/@roysday/218이것을 참고해주세용!~ 이 일과 더불어 강의 2개 정도를 뛰었어요. 작년부터 잡코리아와 계속 일을 하고 있는데, 올해도 어김없이 불러주셔서 간간히 예상치 못한 용돈을 받고 있지요. 7월매출 = 275만원8월휴우 살았다. 보릿고개 클리어8월엔 신촌에 박스퀘어라는 소상공인 플랫폼이 만들어지면서 거기 입점매장 대상으로 브랜딩을 도와주는 역할을 조금 했어요. 이 때 담당하시던 이사님이 예전에 제가 잡코리아에서 강의할 때 그 때 연을 맺게 된 분이었는데 나오셔서도 찾아주시더라구요 :) 너무 감사함...그리고 패스트캠퍼스에서 강의를 3개월간 쭈우우우욱....진행했던 게 끝나서 비용을 톡 받았고. 강의 4개정도 뛰면서 다시 삼시세끼를 챙겨먹게 되었어요.8월매출 = 360만원9월박스퀘어 브랜딩을 계속 진행했어요! 그리고 두번째책을 웨일북과 계약하면서 선인세를 조금 받았답니다. 9월은 계속 박스퀘어 일을 하면서 후다다다다닥 바빴던 것 같아요. 그리고 이 때 아주 소중한 인연을 맺게 된 분이 생겼죠.9월매출 = 292만원10월9월은 사실상 한 템포 쉬어가는 달이었어요. 사실 이땐 비수기라기보단 한참 프로젝트가 될랑말랑하다가 다 엎어져버린 달이었거든요. 루이까또즈랑 대전시랑 뭐 이것저것 있었는데..프로젝트가 연기되고, 캔슬되고, 비딩떨어지고 뭐... 이것저것 우주만물이 저보고 아무것도 하지 말라고 외치는 듯한 기분이었어요. 잠시 멘붕을 겪을 뻔 했는데.... 10월이 대박쓰. 계속 자료가 안와서 하는건지 마는건지 애매하던 프로젝트가..오픈되었고. IR과 원페이지 회사소개서 제작이... 시작되었죠. 약 20개업체의 소개페이지를 제작하기 시작했어요. 10월은 그거 쳐내느라 정신을 못차렸어요. 그 프로젝트의 계약금을 받았답니다! 참고로 이 클라이언트님과는 두 해째 함께 하고 있는데..정말정말 클리어하고 깔끔하세요. 정말 뒤끝도 자잘한 간섭도 없고 원하는 것만 빨리 정확히 잘 만들어드리면 바로바로 오케이 해주시는... 하아.. 열두번 절받으세요.10월매출 =  1571만원11월이번 달이예요. 이번달은.... 그 20개업체가 다 끝났어요. 그리고 추가 외국 스타트업들의 IR자료...그것 더하기 또 다른 지원사업에 참여하는 스타트업들의 소개서제작..(또 20개업체...) 등등 뭐 엄청나게 우르르르르 제작을 해야해요. 이번달은 네 그냥 딱 내 몸은 클라이언트의 것이다..생각하고 자본주의의 섭리에 저를 내맡기려고 합니다. 이 프로젝트는 1월10일까지 계속되요!!~그리고 패스트캠퍼스 두번째 강의가 오픈되었고....강의가 5개정도 잡혔고... 책도 쓰고 있고...(11월 뭐지?!)....그렇습니다. 11월매출 = 1476만원12월12월은 아마 잔금들이 우르르 들어오겠죠. 12월10일부턴 잠시 여행을 슝 다녀올 계획이지만...지금 상태라면 아이슬란드의 오로라를 보면서도 오브젝트 선 따고 있어야 할지 모르겠다는 생각이 들어요. 여튼 12월엔 잔금이 호로록 들어오면.. 이제 올해의 매출이 땋 끝나고..종소세 신고를 해야하죠. 12월매출 = 2,224만원그래서..이것저것 막 다 합쳐보니 1억 4백만정도가 나왔어요. 증말 간신히...턱걸이로 넘겼네요.지난 1년간 하루는 널널하고 하루는 지옥같은 일상이 반복되었던 것 같아요. 하지만 다행스럽게도 저와 함께 일해준 클라이언트님들과 협력업체 사장님들, 동료디자이너님들이 너무너무 좋으신 분들이어서 또 이렇게 행복하게 1년을 마무리 지을 수 있었습니다. 이빨까는 게 아니라 진심입니다.올해 1월엔 과연 올해 내 목표매출을 찍을 수 있을까...하고 엄청 고민하고 불안해했었어요. 작년에 브런치글이 여기저기 퍼지면서 연락이 많이 온터라 부담도 되었고... 이 성과가 내 것이 아닌 것 같아서 방향을 잡기가 어려웠거든요. 하지만...정말 이 대표님의 말처럼(제가 존경하는 멘토님..) 사업은 생각하고 고민하는게 아니라 행동하는 거라는 말이 맞는 것 같아요. 그냥 하다보니 이렇게 왔고.. 의도하지 않았지만 의도처럼 되어버리기도 하거든요.전 여전히 내년을 걱정하고 있어요. 내년에도 또 새롭고 신기한 것들을 해볼 생각인지라 설레기도 하지만... 여전히 두렵고 떨리죠. 하지만.. 내년에도 여전히 좋은 사람들이 많을 거고, 제 그램도 쌩쌩 잘 돌아갈 것 같아요. 과감하게 두 배 매출을 한 번 고려(?)해보려고 합니다...뭐 어케 되겠지.고려를 하겠다고 했지 할 수 있다고는 안했다.
조회수 3160

퇴사 후 2년

1.퇴사 후 2년이 지났다.입사 후 5년보다 퇴사 후 1년 더 많은 일들이 있었다.마찬가지로 퇴사 후 1년보다, 그 이후의 1년 더 많은 일들이 있었다.작년 이맘때 퇴사 후 1년 이라는 글을 썼다.퇴사 후 1년은 앞이 보이지 않는 어두운 터널 속에서 우왕좌왕 더듬던 시간이라면,퇴사 후 2년은 이제 바닥을 찍고 다시 일어서는 근육을 기르는 시간이었다.퇴사 후 1년까지는, '회사가 전쟁터라면 밖은 지옥'이었다.퇴사 후 2년이 되자, '회사 밖은 지옥이 아니라 그냥 또 다른 전쟁터'일 뿐이었다.다만 회사 안의 전쟁터에서는 내가 병졸로서 총알받이 역할을 했다면, 회사 밖 전쟁터에서는 그래도 일군의 장수가 되어 게릴라 전이라도 진두지휘하는 역량을 기르고 있다.퇴사 후 1년까지는 동물원의 호랑이에서 야생의 고양이로 작아졌다면, 퇴사 후 2년이 되자 그래도 살쾡이 정도는 되는 것 같다.지금 돌아보면 1년 전의 나는 아직은 풋풋하고 조금은 어설프며 약간의 허세도 있었다.그러나 퇴사 후 2년이 지난 지금,나는 조금 더 조급해지고, 더 저속해졌으며, 더 정직하게 인생을 바라보게 되었다.출처 : 단행본 <퇴사학교>, 오미선 디자이너2.퇴사 후 2년, 나는 더 조급해졌다.달성할 목표, 추구할 가치, 신경쓰일 사람들, 챙길 것들이 더 늘었다.<퇴사학교>를 창업하면서 1년차 초보 창업가로서 온종일 사업, 가치, 팀 그런 것들에만 관심을 갖는다.'사업이 곧 나이자, 내가 곧 사업'인 인생이 되었다.매출이 오르면 하루가 즐겁고매출이 떨어지면 하루가 우울하다.난 그렇게 일희일비해졌다.그러나 그만큼 하루하루를 충실히 온전히 다 살아간다.일희일비한다는건 내 시간의 기준이 일주일, 한 달, 일 년이 아니라 하루, 시간, 분 단위라는 사실.그만큼 숨가쁘게 매순간을 던져 울고 웃고 느끼고 살며 나를 만끽한다.한껏 흐트러지게 피어나다 후두두둑 지고 마는 봄 꽃들처럼.꽃은 조급하다.봄은 조급하다.언제 피고 언제 사라질지 조마조마하다.한 순간 만끽하다 이내 사라진다.내 인생이 그와 같음을 느낀다.시간을 허투루 쓰지 않게 되었다.멍 때리고 유유자적하는 여유는 잃어버린 지 오래다.휴식 시간조차 철저히 계획되고 관리되어야 할 정도로인생이 빠듯해졌다.  아끼고 관리하며 내가 가장 중요하게 여기는 것에 집중하고자 노력하고 있지만아직은 여전히 조급하다.일희일비 : 매출이 오르면 하루가 즐겁고 매출이 떨어지면 하루가 우울하다 (아큐브 토크콘서트 중)3.퇴사 후 2년, 나는 더 저속해졌다.우선순위가 바뀌었다.과거엔 먼 미래가 중요했다.늘 먼 훗날의 좋은 일, 나중에 가치 있고 의미있는 일, 사회에 기여하는 선한 영향력, 미래의 비전과 언젠가 자아의 실현 등의 형용사와 같은 것들이 중요했다.그러나 지금은 생존이다. 오로지 현재다.미래의 가치도 중요하지만, 현재의 생존 없이는 무의미하단 걸 깨달았다.형용사보단 동사가 더 중요하다.살아야 한다. 먹고 살아야 한다.굶지 않고 주눅들지 않고 무너지지 않고망하지 않고 버려지지 않고 살아내야 한다.잘 먹고 잘 살아야 한다.오직 생존만을 염원한다.그러기 위해선 지금 행동해야 한다.그래서 하루하루가 전쟁터이다.매일 긴장하고 매일 경계한다.오늘 하루도 무사히 보냈음에, 이번 한 달도 무사히 생존했음에 감사하다.  그러나 내일은, 다음 달은 어떤 일이 일어날지 아무것도 안심할 순 없다.동물원에는 두 종류의 동물이 있다고 한다.사람에게 다가오는 류.사람이 다가오는 류.전자는 먹이를 찾아 사람의 손 위로 날아오는 새다.늘 긴장하며 먹이를 탐색하고 저 사람들이 나를 해치지 않을까 경계하면서도 다가가야 한다.후자는 통 안에서 뒹굴거리는 햄스터다.하루 세 끼 정해진 시간에 따박따박 먹이가 나온다. 사람들은 귀엽다고 쓰다듬고 좋아한다.햄스터는 편안하다. 더 안락하고 평화롭다.그러나 금방 죽는다고 한다.새는 불편하다. 더 긴장되고 불안하다.그러나 더 건강하다. 더 오래 살고 자유롭게 활공을 한다.본인 손으로 직접 먹을 것을 찾는 근육은 매일 새롭고 강하게 단련이 된다.출처 : 혼자를 기르는 법, 김정연4.퇴사 후 2년, 나는 더 정직해졌다.한 만큼쓴 만큼군더더기 없이.필요없는 건 하지 않고쓸데없는 건 하지 않으려 한다.모든 것이 제한된 상황 속에서내게 주어진 자원과 시간에 집중하여최대한 군더더기 없는 레이저처럼 조탁해야 한다.그럴려면 정직해져야 한다.나는 내가 투입하는 시간만큼만 성장한다.내가 가치를 느끼는 곳, 가장 나다울 수 있는 곳에 시간을 써야 한다.시간을 투입할수록 내가 더 성장하고누적될수록 가치가 더 커지는 일에 시간을 써야 한다.퇴사 후 인생에는 가속도가 붙는다.시간이 아니라 성장에 가속도가 붙는다.입사 후 5년보다 퇴사 후 1년 더 많은 일들이 있고,퇴사 후 1년보다, 그 이후의 1년 더 많은 일들이 있다.  하루 하루를 허투루 쓰지 않고 매 순간을 배움의 기회로 삼으려 한다.그러다 보니 어제보다 오늘, 오늘보다 내일 나는 더 배우고 더 성장하고 있다.시간은 오히려 더 느리게 간다. 아니, 되려 더 충만하고 더 세세하게 내게 다가온다.체감이 다르다.대기업 시절에는 일주일 한달 일년이 똑같았다. 회사 생활 초반에는 성장의 가속도가 빨리 붙는가 싶더니 몇 년차가 지나면서 점점 기울기가 시들어졌다. 어느새 매번 똑같은 출퇴근을 반복하는 나를 보며 지극히 안정적인 평소의 회사 생활을 기반으로, 오히려 회사가 아닌 것들 (이직, MBA, 자기계발, 모임, 취미, 여가 등) 로 돌파구를 찾으려 했다. 그래서 내 시간이 더 빨리 흘러갔다.퇴사 후에는 하루 하루가 새로웠다. 안정적인 것은 아무것도 없었다. 아무도 아무것도 아무에게도 정해진 바는 없었다. 모든 것이 가하나 모든 것이 불가하고, 모든 것이 중요하고 또 모든 것이 중요하지 않았다.대기업에서는 정해진 레고 조각들로 더 큰 성을 짓는 것이었다면, 퇴사 후에는 작은 찰흙들로 뭐든지 만들 수 있었다. 비록 아직은 작고 초라하지만.전략기획, 글쓰기, 독서 등 이십대 내내 쌓아왔던 것들이삼십대가 되자 하나 둘 성과로 발현되는 것을 느낀다.회사 안에서는 회사의 틀에 맞추며 내 자신을 꾹꾹 누르던 것들이퇴사 후 나다운 나를 찾는 과정에서 물 만난 고기처럼 활개를 친다.내게 맞는 옷을 찾아 입으려는 여정은 고난도 많았지만 생각보다 더욱 즐거운 것이었다.(누구 말에 따라 100배 힘들지만, 1,000배 재밌는 것)내가 해야 하는 일과 하고 싶은 일을 일치시켜 가는 과정에 있다는 사실,내가 가치를 느끼는 것을 하면서 동시에 나의 실력이 쌓여간다는 사실,앞으로 내가 가는 길에 시간과 관심과 에너지를 쏟을수록그것이 나에게 더 큰 선순환으로 돌아온다는 사실만으로도기존의 우리나라 교육제도와 조직문화가 얼마나 경색되어 있는지 생각한다.  가장 정직한 시간나 혼자만의 시간의 중요성을 절감한다.안 되는 건 안 되는 것임을 알고되는 것은 되는 것임을 안다.내가 누구인지할 수 있는 것과할 수 없는 것을 구분하기 시작했다.비교하지 않으려 한다.그냥 나다운 것을 찾기 위한 실험.나를 늘려가려 하고,내가 아닌 것은 최대한 줄이려 한다.그러나EQ를 많이 잃었다.관리와 지시에 익숙해지고,사람이 ROI로 계산되기 시작한다.잘난 척이 늘었고좌절과 실망, 분노와 짜증도 늘었다.자리가 사람을 만든다.하지만 그 자리는 내가 만든다.퇴사 후 2년,나는 더 조급하고 더 저속해졌다.여전히 생존에 허덕이고기쁜 날보다 힘든 날이 더 많다.그러나 조금은 더 생에 정직해지고어제보다 내일 더 성장함을 믿는다.앞으로 1년 뒤나는 어떤 자리를 만들게 될까?그래도 힘든 건 힘들다#퇴사학교 #인사이트 #조언 #고민 #운영 #창업 #이직 #전직
조회수 1338

실리콘밸리 최고의 마케터 션 엘리스,

진화된 마케팅 그로스해킹 책 요약 적용하기 #1편 신년을 맞이하여 핀다에서 1주일에 한 번씩 ‘진화된 마케팅 그로스 해킹'이라는 책을 가지고 총 9명의 엔지니어, 마케터, 비즈니스의 다양한 팀원들이 모여 스터디를 하기로 했다. 1권의 책을 2명씩 팀을 나눠 주요 챕터를 요약하거나 중요한 내역을 발췌하여 모두에게 설명하는 콘텐츠를 만들고, 특히 실행 전략을 현재 핀다의 이슈를 기반으로 적용 사례를 만들어보는 것을 목표로 한다.  필자는 지난 6년간 IT회사를 해왔기 때문에 서비스의 성장에 대한 그로스해킹 (Growth Hacking) 방법론을 무척이나 따르고 좋아하는 편이었다. 특히 2015년 3월 500Startup 인큐베이팅 프로그램에 참여해보며 실제로 앱과 웹 서비스의 고객획득(acquisition), 활성화(activation), 유지(retention), 수익화(revenue) 등 AARRR에 관련한 고민을 어떠한 기준과 방법으로 접근하고 적용하는지를 직접 배울 수 있는 기회가 있었는데 그 때 그간 해왔던 노력들이 헛되지 않았다는 걸 증명받는 느낌이 들었던 적도 있었다. 그 이후 한국에 다시 돌아왔고 늘 팀들에게 그로스 해킹을 통한 문제해결을 강조하고 적용사례까지 이끌어내려 애썼지만 늘 영어로된 사례들이나 참고 문헌들을 통해 우리 팀들을 완벽하게 이해시키기 어려웠었는데, 그러다가 마침 우리 투자사인 500startup에서 신년 선물로 그로스해킹의 창시자 션 엘리스와 브라운 저자의 친필 사인이 담긴 그로스해킹 한글판을 선물받게 되었다. <션 엘리스, 모건브라운의 친필 서명이 담긴 그로스해킹 책>그렇다면 최고의 마케터, 션 엘리스 그는 누구인가? 션 엘리스는 Growth Hacking이란 용어를 만든 장본인으로 Dropbox 마케팅, Eventbrite, Logmein, Uproar 등 마케팅 활동을 이끌어 시가총액 10억달러 (약 1.1조원) 이상으로 성공시킨 실리콘밸리 최고의 마케터이자 그로스해커이다. 그는 고객정보 분석, 설문조사 기업인 콸라루의 설립자이자 CEO로 수백만달러의 매출을 올리고 성공적으로 매각한 경험도 있다.  그가 그로스해킹이라는 방법론을 구현하게 된 것은 매우 자연스러운 경험에서 도출되었다고 생각한다. 어떻게 하면 서비스를 더 많은 사람들에게 알릴 수 있을까, 포털 광고는 너무 비싼데 스타트업이 할 수 있는 좋은 마케팅 전략이 없을까, 성장이 멈춘 것은 아닐까, 어떻게 하면 우리 서비스를 더 쓰게 만들 수 있을까 등을 고민하는 모든 이들이 지금 현재 직면하고 있는 문제를 그도 똑같이 경험했던 것이다.  그로스해킹의 대표 사례#1. 업로어(Uproar) 게임의 신규 사용자 획득을 위한 전략  초반에 효과는 있지만 너무 비싸고 획득할 수 있는 규모도 한계가 있는 온라인 배너, 인터넷 포털의 유료광고, 검색광고는 드롭박스에서도 겪었던 것처럼 들인 돈 만큼의 큰 효과를 내지 못했다. 새로운 유형의 광고 아이디어가 필요했고, 그는 다른 웹사이트의 방문자들에게 업로어의 신규 게임을 제공하고 하게되고, 코드 몇 줄 만으로도 어떤 웹사이트든 1인용 게임을 즐길 수 있는 ‘사이트 내장형 위젯’을 개발한다. 이 전략에서 그치지 않고 ‘이 게임을 당신의 사이트에 추가하세요' 링크를 덧붙이는 실험을 계속하여, 4만개 사이트에 업로어 무료게임 위젯을 추가하는 성공 결과를 낳는다. 동일한 성장전략의 대표적인 사례로는 유투브(Youtube)가 있는데 사이트에 내장시킬수 있는 동영상 플레리어 위젯을 설치하기도 했다.  ◎ 이슈: 어떻게 하면 값싸게 신규 이용자들을 획득할 수 있을까? (Acquisition)◎ 그로스해킹 전략: 웹사이트 방문자들에게 흥미로운 새 기능을 제공하고 값싸게 신규 고객 획득 #2. 로그미인, 랜딩페이지 다양화의 위력  가입을 했으나 서비스를 이용하지 않는 사람들에게 피드백을 얻기로 하고, 왜 로그미인과 같이 좋은 우리 서비스를 쓰지 않는지 묻는 메일을 보냈다. 그러자 놀랍게도 서비스가 정말로 무료라는 사실을 믿지 못했던 것. 마케팅팀과 엔지니어링팀을 한데 힘을 모아 랜딩페이지를 통해 서비스가 무료라는 사실을 더 잘 알리기로 하고 다양한 문구와 디자인에 변화를 주는 시도를 했으나, 안타깝게도 의미있는 성과 개선은 없었다. 그러다가 유료 버전을 구매하는 링크를 랜딩페이지에 추가했더니 실제 로그미인의 특정 기능이 정말 무료라는 것을 사용자들이 인지하게 되고, 유료 고객 전환율이 3배나 상승하는 효과를 가져왔다. 그 이후에도 다운로드하고 쓰지 않는 사람들이 더 많다는 것도 알게되고 설치 절차와 가입 단계에 변화를 주는 실험을 거듭하여 높은 전환율에 도달할 수 있었다.   ◎ 이슈: 왜 가입 이후 서비스를 잘 쓰지 않을까? (Activation)◎ 그로스해킹 전략: 메일을 보내 왜 사용하지 않는지 이유를 파악하고, 랜딩페이지에 유료 버전을 구매하는 링크를 추가하는 등 랜딩페이지 다변화를 통해 이슈를 해결, 설치 절차와 가입 단계에 변화를 주어 실제 풀장에 들어온 죽어있는 사용자들을 Active user로 전환 #3. 드롭박스, 사용자 피드백을 통한 추천프로그램 개발과 급속 실험드롭박스 역시 사용자 획득 성장에 대한 갈증이 있었고, 사용자들에게 드롭박스를 더이상 이용할 수 없게 되면 실망감이 어느정도겠습니까? 라는 설문을 하게 되었다. 매우 실망스럽다가 40% 이상으로 대단히 큰 성장 잠재력을 가지고 있었고, 드롭박스 사용자의 1/3이 입소문이 좋게나있었기 때문에, 이를 토대로 추천 프로그램을 기획하게 되었다. 추천을 하면 추가로 250MB 클라우드 공간을 제공하게 했고, 추천을 통한 가입이 60% 증가했다. 여기에 멈추지 않고 메세지 전달, 제안 세부사항, 이메일 초대, 사용자 경험, UI까지 모든 요소를 최적화하는 급속 실험을 진행했다.◎ 목적: 어떻게 하면 더 많은 사용자들이 쓰게 할까? (Acquisition, Referral)◎ 그로스해킹 전략: 사용자피드백을 통해 추천에 대한 가능성을 파악하고 추천 프로그램 개발, 그치지 않고 메세지부터 이메일, UIUX까지 급속실험을 통한 최적화 작업 진행 #4. 에어비앤비, 정교한 프로그래밍과 수많은 실험을 통해 크레이그리스트 사용자를 끌어오기 크레이그리스트에 에어비엔비 목록을 무료로 게재하는 효율적인 방법을 만들어 내, 휴가 때 묵을 곳을 임대하기 위해 주제별로 분류된 인기 부동산 사이트인 크레이그리스트를 검색할 때마다 에어비앤비 집목록도 팝업으로 나올 수 있도록 했다. 이 이야기는 좀 더 알고 싶어 별도로 그로스해킹 사이트에서 찾아보았는데 에어비앤비 초기 방을 등록하는 B2B고객들에게는 크레이그리스트에 집을 등록하는데 손쉽게 등록이 가능한 autolink를 개발하여 이메일로 제공했고, 그들을 통해 크레이그리스트에 에어비앤비의 집들을 노출시키는 결과를 가져왔다고 한다. 이에 그치지 않고 크레이그리스트에 집을 등록하는 목록이 크레이그리스트에서 어떻게 보이는지, 사용된 헤드라인이 어떤지, 목록에 대한 반응을 알아보고 크레이그리스트에서 차단되기 전까지 최적화 작업을 계속해서 실행했다.  ◎ 이슈: 어떻게 하면 네임밸류가 없었던 에어비앤비를 알릴 수 있을까? 초기 사용자를 획득할까? (Awareness, Acquisition)◎ 그로스해킹 전략: 오토링크, 크레이그리스트 #5. 페이스북, 글로벌 시장 확대를 위한 번역 엔진의 창안 그 당시 7천만 페이스북 사용자들의 대부분은 북아메리카에 거주하였고, 더이상 사용자가 크게 늘지 않는 정체기에 빠졌다. 해외 사용자들을 끌어들인다면 성장의 엄청난 도약을 이룰 것이라 판단하였고, 번역을 위한 사람을 10명 고용하여 20개의 주요 국가에 보내는 방식이 아니라, 번역 엔진을 만들게 되었다. 이 번역 엔진은 사용자 스스로가 크라우드소싱 모델 (집단지성)을 통해 페이스북 사이트를 어떤 언어로든 번역할 수 있도록 한 것인데, 오늘날 엄청난 사용자를 갖게 만든 첫 성공 기반이된 그로스해킹의 좋은 사례이다.  ◎ 이슈: 어떻게 하면 북아메리카가 아닌 글로벌 사용자들에게 페이스북을 쓰게 만들까? (Awareness, Acquisition)◎ 그로스해킹 전략: 집단지성을 이용한 번역 엔진 그로스해킹(Growth Hacking)의 개념 그리고 핵심요소 그로스해킹은 부서간 단절을 깨고 분석, 엔지니어링, 제품 관리, 마케팅 전문 지식을 지닌 직원들이 한데 모아 다기능 합작팀을 조작하여 강력한 데이터 분석과 기술적 노하우를 마케팅 지식과 효과적으로 결합시켜 성장을 촉진할 더 유망한 방법을 고안할 수 있도록 한다. 빠르게 실행하고 객관적인 지표로 평가하며, 어떤 아이디어가 가치있고 버려야 하는지 빨리 판단할 수 있다는 것이 매우 큰 장점이다. 데이터를 기반으로 빠른 속도의 다기능 실험을 통해 고속 성장을 자극하는 빈틈없는 접근법으로,공략대상을 세밀하게 설정하고, 고객기반을 넓히고, 마케팅 비용을 더 가치있게 쓰기 위해 적당한 고객을 찾고 고객으로부터 배움을 얻는 방법이다. 이 모든 과정은 한번에 끝나는 것이 아니라 계속된 작은 성공 끝에 큰 성공 결과를 나을 수 있다는 것을 염두해야 한다. 1. 마케팅과 제품 개발에 늘 있어왔던 부서간 단절을 해결하고 다양한 인재를 통합2. 정성적 연구와 정량적 자료분석을 이용해 사용자 행동과 사용자 기호에 대한 깊이있는 식견3. 아이디어를 빠르게 창출하고 실험하여 결과와 조치에 엄격한 지표 적용 평가  그로스해킹에 대해 오해하지 말아야할 사항 5가지1. 그로스해킹은 하나의 묘책을 발견하는 것이 아니다. 작은 성공들이 쌓여 성장의 순간을 만들어내기 때문에 매일같이 아이디어를 창출하고 실험하고 개선한다. 2. 멀리서 찾지 말자. 이미 있는 시그널을 활용해라. 3. 론 레이저와 같은 사람을 하나 고용하면 그가 그로스 해커로서 한번에 기업의 성장을 도모한다는 것은 크게 잘못된 생각이다. 큰 성공은 프로그래밍 노하우와 데이터분석, 강력한 마케팅 경험에서 나오며 이 모든 것에 능통한 한 사람만으로 이뤄지지 않는다. 4. 새로운 사용자나 고객을 끌어오는 일에만 적용되는 것이 아니다. 특히 고객 활성화에 노력을 기울여야 한다. 고객들을 더 적극적인 사용자와 구매자로 만들고 그들이 제품에 대한 복음을 전파하는 전도사로 변신시켜야 한다. 5. 그로스해킹은 전적으로 마케팅에 대한 것이라는 것도 오해다.  그로스해킹은 사용자에게 머스트해브 경험을 제공하는지, 적절한 고객에게 전달할 방법을 알아냈는지 분석하고, 지속적인 제품 개선을 위해 어떤 것이 성장을 촉진하는지, 어떤 것을 시도해야 하는지 우선순위를 결정하는 과정이다. 특히 제한적인 투자로 높은 기대에 부응하고, 의미있는 결과를 만들어내며 비즈니스 목표를 달성하고자 한다면? 마케팅 비용의 수익률을 최대화 하려는 모든 기업, 모든 창업자, 팀 리더, 모든 부서의 책임자와 대표가 반드시 채택해야 하는 본직적이고 필수적인 방법론인 그로스해킹을 시도해보자. 이미 당신이 속한 시장의 변화는 가속화되고 있다.#핀다 #마케터 #마케팅 #그로스해커 #미국 #실리콘밸리 #인사이트

기업문화 엿볼 때, 더팀스

로그인

/