스토리 홈

인터뷰

피드

뉴스

조회수 1885

[과거 스타트업 경험]2016년 상반기 실적 발표

저는 2013년 하반기부터 "사람은 곧 기업과 같은 유기체이다." 그리하여 "한 개인이 나 자신과 나 주위 생태계를 두고 기업처럼 생각하고 기업처럼 움직이면 위대한 기업을 일굴 수 있는 연습을 미리 할 수 있다."라고 생각을 하였습니다.그 당시 저의 롤모델 기업은 '구글'이였고 , 일단 구글이 하는 걸 사람이 하는 것처럼 따라해보자라고 생각을 하였습니다. 그래서 구글이 하는 사업과 프로젝트들을 CASE STUDY하고 그들이 관리하는 전사적 지표 OKR을 스스로한테 적용해보면서 정량적 분석을 시작했습니다. 그걸 -2013 하반기 부터 시작을 해서-2014 상반기-2014 하반기-2014(상반기+하반기)-2015 (상반기+하반기)기록하였습니다.그래서 2016년 또한 상반기 실적을 한번 분석해보고 전년도 대비 어떤 것들을 잘했고 못했는지를 판단해볼 생각입니다. 이를 통해 2016년 하반기는 더욱 전략적 한 분기를 보내어 더욱 성장할 수 있는 16년을 만들어보려고 합니다. 2x가 아닌 10x 을 목표로.[About startup]16년 1월에는 동동이라는 스타트업에서 마케팅부터 영업,기획 다양한 포지션에서 짧게 인턴을 생활을 하였습니다.이때 배웠던 것들, 업무를 했던 것들을 기록해놓았습니다.하나의 포지션에서 깊게 파고든 것이 아니기 때문에 업무에 대한 인사이트는 크지 않았습니다. 짧은 인턴동안 저는 보다 culture에 대해서 많이 배웠고, 여기에 대해 고민했던 시간이였던 것 같습니다. "어떻게 사람들을 회사의 문화로 동료들을사내 기업가가 되게할까?"16년 2월부터는 브리치라는 스타트업에 합류하게 됩니다. 2월 중순부터 ~ 3월까지는 패션 MD를 하면서 상품 등록 / 기획전들을 오픈하였습니다.사이트에 메인을 보면 맨 위에서 롤링되어 돌아가는 구좌들이 있는데, 여기를 메인 구좌라고 합니다.92volt 기획전,콘텐츠 포커싱소재/디테일 포커싱 여기에 들어갈 브랜드/샵을 정하고 상품을 정한 뒤 액셀에 콘텐츠를 기획하고 이것을 디자인쪽에 넘겨 커뮤니케이션 하면서 기획과 디자인의 fit을 맞춥니다.다 만들면 마케팅 쪽과 얘기해서 노출 스케줄을 잡습니다.스케줄 마감 기한은 협업을 하는데 있어서 매너라는 점,디자인은 예쁘게 보이게 시각화 하는 것이 아니라 사람들에게 직관적으로 메세지를 줄 수 있도록 로직을 시각화하는 것이라고 깨달았습니다.4월때부터는 조직 개편이 있으면서, 저는 상품쪽에서 -> 영업쪽으로 넘어왔습니다.(저는 영업이 천직인 것 같습니다.ㅋㅋㅋ) 이때부터 큰 퍼포먼스들을 내기 시작했습니다.제가 4월에 영업 78개, 5월에 6개, 6월은 45개,7월은 48개를 해서 4개월동안 177개를 했습니다.(5월에 급격히 갯수가 떨어진 것은 지마켓,11번가와 딜을 진행할 때 CS에 2주 투입이 되어서 영업을 거의 진행 못하였고 4월대비 6,7월달 영업 갯수가 떨어지는 것은 4월은 디자이너 온라인 영업을 진행했고 6,7월은 오프라인 매장 영업을 진행했기 때문입니다.5월에도 영업을 진행했으면 4개월 동안 한 200개는 만들었겠네요.제가 브리치 입사하기 전에 샵 DB가 150~200개정도 됬던 것 같습니다.)제가 브리치에 합류하게 되면서 영업의 속도와 양이 급격하게 변화했습니다. 그 이유는 '영업 채널'을 좀 더 효율적인 것에 투자를 했던 건데요.영업을 하기 위해 인스타 다이렉트 메세지를 활용했습니다.이를테면, 영업이라는 것도 PR하기 위해 기자들한테 메일 뿌리는 것과 흡사하다고 생각하는데요.업체 메일 주소를 리스트업 하고 한번에 제안서를 보내고 피드백이 오면 전화를 하고 미팅을 잡고 계약으로까지 이어지죠.이 방법을 중심으로 무언가 다른 영업 전략이 필요하다고 생각이 들었습니다.이렇게만 해서는 답장 올 때까지 기다려야되는 것도 있고, 움직이는 자투리 시간(출퇴근시간)에도 메일링은 하기 힘들죠. 이때 생각한 것은 "메세지 영업을 하자"가 된 것입니다.그래서 온라인쪽 디자이너 브랜드를 영업할 때에는 '인스타'채널을 활용하여 다이렉트로 영업을 했고 계약 전환율도 좋았고 모바일로 소싱하는 느낌이 꽤나 재밌었습니다. 그리고 인스타 오피셜에 보면 카톡 계정이 있는데, 카톡으로도 영업을 진행하였습니다. 좀 더 즉각적이고,실시간의 성격을 가진 채널을 활용해서 영업을 전개하니 속도가 굉장히 빨라졌습니다.인스타 다이렉트 영업 사진그리고 오프라인쪽 매장을 영업할 때에는 직접 로드에 가서 대표를 만나고, 혹은 위탁 판매 관련된 담당자를 만나서 얘기를 하는 식으로 진행되죠. 그래서 굉장히 영업 속도가 더딥니다.디자이너 브랜드에 비해 (오프라인으로 직접 가야되니깐요.) 더 빨리 소싱하기 위해선, 인스타처럼 소싱할 수 있는 채널이 필요한데, 그래서 네이버 '톡톡'을 활용하였습니다. 네이버도 저희와 비슷한 서비스인 스타일 윈도우를 운영하고 있습니다. 스타일윈도우는 오프라인 DB를 상당히 많이 보유하고 있고 저는 스타일 윈도우가 모아놓은 back data를 활용해서 효율적으로 영업을 전개합니다. 이때 스타일윈도우 혹은 스토어팜에서 고객과 샵이 소통하는 채널인 톡톡이 있는데요.저는 이것을 영업채널로 활용하였습니다. 즉 , 고객 채널을 영업 채널로 활용했던 것이죠.그래서 비약적인 갯수를 소싱할 수 있게 되었습니다.근데 제가 영업한 이 갯수들이 실질적으로 다 계약으로 전환된 건 아닙니다. 이 중에 몇 업체는 관리가 안되어 거래 진행이 안되고 있고(상품 등록), 몇 업체는 도중에 조건이 안맞아서 빠진다고 하고, 몇 업체는 입점시에 필요한 정보들의 준비가 안되고 있죠. 아마 이것들을 빼고나면 30~40개업체 정도가 빠질지 않을까 생각됩니다.그리고 제가 또 바꾼 변화로서는, 회사의 계약 문화를 아주 간편한 온라인 과정으로 바꿨는데요.이전에는 계약서 두 부를 뽑고 양쪽의 도장을 다 찍고, 두 부를 파트너사한테 보낸 다음, 파트너사가 한 부에 자기 도장을 찍고 그것을 다시 저희한테 보내는 복잡한 과정을 거쳤다면... (양쪽에서 우체국 등기로 일어나는 총 금전적 비용이 한 계약에 약 4~5천원 정도, 그러면 저는 약 140개정도 했다고 하면 140x5 = 70만원정도 절약) 현재는 모두싸인이라는 온라인 계약 서비스를 통해 간단한 회원가입을 하고, pdf 파일 계약서로 사이트에서 (모두싸인에서 1초만에 만든)도장을 찍고 메일로 주고 받는 걸로 진행하고 있습니다. 굉장히 많은 시간적 비용과 금전적 비용을 줄였고 영업 속도에도 굉장히 도움이 되었습니다.앞으로 남은 분기동안에는 영업 이외에 회사 문화가 어떻게 조직원들을 더 챌린지시키고, 동기부여시킬 수 있는 것들을 고민해보고 실제 도입해서 유의미한 결과를 가져올 수 있게 변화를 만들어낼 생각입니다.[About self-developement]블로그 글을 90개 포스팅을 하였습니다. 제 글중 현장에서 경험한 인사이트를 기록하는 공간인 '경험노트'에는 23개의 포스팅을 했습니다.전년도 대비 수치는 좀 떨어진 정도인데요.(작년도 하분기 포스팅이 약 150개) 경험의 질로 따졌을 때는 훨씬 수준이 올라와있는 정도입니다. 그리고 올해부터는 브런치 글쓰기를 조금씩 시작하기 시작했습니다. 이름하여.. O2O글쓰기인데, 글쓰는 형식은 크게 두 가지로 나눠서 쓰고 있습니다.제가 현장에서 경험하고 느낀 것들 + 제 생각을 더해 주제에 대해 좀 더 deep하게 들어가는 형식과 세미나 혹은 포럼에 참가하여 그 생생한 현장을 그대로 담는 글의 형식이죠.(여기도 조금 제 생각은 개입되구요.)에서 가장 공유가 많이 일어났던 글은 CS에 대한 글로 151개 공유수를 기록했고 에서 가장 공유가 많이 일어났던 글은 글로벌 패션 포럼에 대한 글로 182개를 기록하였습니다.글의 공유수가 획기적으로 늘어날 때는 아무래도 '인플루언서'가 제 글을 공유할 때 그렇다는 것을 확인하였습니다. 에서는 강하영님이 공유를 에서는 하정훈 이사님이 공유를 해주셨죠.제 브런치에 총 4개의 글이 실려있는데 총 공유수는 372입니다. 올해 목표는 한 포스팅이 500개 공유수를 넘길 수 있는 인사이트있는 글을 쓰는 것입니다.스타트업학회 CEO 페이스북 그룹그룹주소2016년 3월에는, 학교 과 선배와 학교 교육에 대한 문제점을 얘기나누고, 학생들의 잠재력이 발휘되지 못하는 점들을 얘기나누다가 , 이런 것들을 해결해줄 수 있는 학회가 있어야된다는 것에 목소리를 모았고, 그렇게 해서 스타트업을 연구하고 지식을 공유하고 실질적 경험을 해보는 CEO학회가 창립,첫 운영되었습니다.명지대에서는 스타트업(스타트업 바람을 넣는..ㅎㅎ?)이라는 조직을 만들고 활동을 하는 건 최초였습니다.저희는 매주 화요일 8시에 강의실에 모여 연구를 진행하였습니다.운영의 과정 속에서 느낀점은 1.사람이 살면서 혼자서 할 수 있는 위대한 일은 상당부분 제한된다는 점, 그래서 팀을 이뤄야한다는 것 2.조직을 하나의 통일된 비전 아래 모이게 하고 모두가 같은 방향을 바라보고 움직이게 하는 건 상당히 어렵다는 점 정도가 될 것 같습니다. 그리고 굉장히 뿌듯한 순간도 있었는데, 학회 인원 중 많은 도움을 받고 있다고 고맙다고 4명이 얘기해주었고 그 중 한명은 브리치에 파트타임으로 일하며 CS를 배우고 있고 그 중 한명은 WEPET에서 인턴을 하게 됩니다. 그리고 학회 친구들이 학교 '밖'으로 나가 스타트업 행사를 다니며 진짜 세계와 마주하고 있다는 사실입니다.저는 회사 다니면서 학회도 운영도 하고 커리큘럼도 기획하고, 정신이 없고 운영에 많이 미흡했지만 그 중 소수는 도움 받았고, 좋은 인사이트를 만들어가고 있다는 점이 기쁩니다.저는 이들이 더욱 성장해서 더 좋은 세상을 만들어가는데 일조할 것이라는 확실한 믿음이 있습니다.크게 스타트업,자기계발,학교를 주제로 상반기를 돌아보았습니다.제가 전년도에 부족했던 점은 (15년 글에 써놓았기를) 좀 더 빨리 실험해보고 실패하지 못했고,NO를 잘 못했고, 진짜 실력만 키우는데에 잘 집중못했다는 점입니다. 근데 이번해에는 사실 상당 부분 작년도 부족했던 부분들을 개선시켰습니다.그렇지만 빠른 실험과 빠른 실패에 대한 문제는 좀 더 잘해나가야 될 듯 합니다.이번 상반기에 가장 잘하지 못했고, 그리고 가장 중요하게 생각했던 것은 '지속성'에 대한 주제인데요. 뭔가 일을 하는데 있어서, (다짐을 했고,무엇인가 결과를 내야한다면) 지속하지 않으면 '가치'로 인정받을 수 없다는 점입니다. 아주 단순한 저의 삶 예시로는 운동이나 영어같은 것들을 들 수가 있겠네요.2016년의 하반기 목표는 운동과 영어는 정말 꾸준히 해나가고, 영업 이외에 마케팅 쪽에서 좀 더 퍼포먼스&실력을 기르면서 인재들이 최고의 역량을 뽐낼 수 있는 회사 문화를 만들어 가는 것에 집중할 생각입니다.그리고 아버지가 전기자재 도매쪽에서 사업을 오랫동안 해오셨는데, 현재는 디지털 변화에 대응하지 못하여 위기에 처해있습니다.그래서 이 부분에 대해서도 계속 고민해나가는 6개월을 보낼 것입니다.어떻게 보면 이것이 저의 인생의 최고의 기회일지도 모른다는 생각에..남은 하반기도 모두들 화이팅 하세요..!고객 만족을 위해 매일 매일 노력하는 대한민국 스타트업들 화이팅!#페오펫 #peopet #CEO #마인드셋 #경험공유 #인사이트
조회수 566

귀한 인연2. 렌딧 이미나 이사 aka 꼬날님

2011년 여름, 국내 IT 계의 전설적인 연쇄창업가 노정석 대표님으로부터 스타일세즈(StyleSays)가 엔젤 투자를 유치하게 되면서 가로수길에 있는 아블라컴퍼니 사무실에 방문하였다. 이때 잠깐 뵙고 인사드리게 된 꼬날님. 얼굴 도장만 찍는 수준으로 잠시 인사드린 것이지만 전설적인 두분(노정석 대표님, 꼬날님)을 뵌 것만으로 마냥 설레었던 기억이다.그후 미국으로 돌아와서 두차례 정도 꼬날님께 연락드려 홍보에 대해 조언을 구했다. 많은 이야기를 나누지는 못했지만 그동안 한번도 만나보지 못했던 강한 긍정의 에너지가 느껴지는 "신기한" 분이었다. 미국에서 지내다보니 한동안 연락이 끊겼다가 다시 연락이 닿게 된건 작년 4월, 렌딧이 알토스벤처스(Altos Ventures)로부터 15억원의 씨드 투자를 받았을 때였다. 홍보에 대한 경험과 지식이 부족해서 무작정 꼬날님께 도움을 요청했고 너무 감사하게도 많은 도움을 주셨다.그리고나서 9월 어느 토요일. 불쑥 꼬날님을 찾아뵙고 정식으로 함께 일하고 싶다고 말씀드렸다. 아마도 꼬날님은 갑작스럽게 느끼셨겠지만, 꼬날님만큼 많은 영감과 자극(inspiration)을 주는 인연이 정말 드물다는 것을 잘 알기 때문에 망설임이 전혀 없었다. 항상 긍정과 열정의 에너지로 가득한 동료이자 멘토, 꼬날님꼬날님과 함께 일한지 이제 10개월이 지났다. 짧은 시간이지만 그동안 만난 모든 인연 중에서 가장 깊은 영감과 자극을 주시는 동료이자 멘토이다. 홍보 뿐만 아니라 회사 전반에 대한 많은 조언을 구하고는 하는데, 무엇보다도 본인의 일을 진심으로 사랑하며 즐겁게 일하시는 모습이 정말 큰 자극이 된다. 몸담으신 4개의 스타트업 회사들 모두 수백억원대 큰 성공을 거두면서 "행운의 여신", "홍보 여신" 이라는 별명을 얻으신게 단순히 운에 의한 것이 아님을, 왜 그 회사들이 그렇게 성공할 수 있었는지 알 것만 같다.앞으로 10년, 20년 함께 일하며 많이 배우고 성장하고 싶은 귀한 인연. 
조회수 1375

브랜드별 체계적 관리로 온라인 패션몰 시장에서 승승장구

   전자상거래 시장의 규모가 하루가 다르게 커져가고 있다. 이제 대부분의 소비자는 오프라인 매장보다는 인터넷쇼핑몰을 더 선호하는 흐름을 타고 있다. 굳이 발품을 안팔아도 되고 가격비교도 편하기 때문이다. 전자상거래 시장의 성장과 함께 관련 기업들 또한 동반 성장하고 있다. 그 중 하나가 바로 웹뜰이다. 본지는 고객과의 신뢰를 가장 중요시 하며 최고의 맨파워로 책임경영을 펼치고 있는 웹뜰의 이태경 대표를 만났다.   최근 전자상거래 시장의 성장과 맞물려 귀사는 패션브랜드 e-비즈니스 사업을 활발히 펼치고 있는 것으로 알고 있다. 우선 회사에 대해 간략히 소개해 달라.   웹뜰(주)는 패션브랜드의 성공적인 온라인 비즈니스 모델을 컨설팅하고, 기획 및 판매 운영하는 회사다. 온라인 유통 분야의 전문가들이 모여 여러 패션브랜드들과 파트너십을 갖고 성공적인 사례를 만들어가고 있다. 우리는 위탁, 매입, 생산, 컨설팅 등의 형태로 패션브랜드들의 온라인 쇼핑몰 판매를 주력사업으로 삼고 있다.   지난 2008년 설립돼 10년차를 맞이했다. 회사를 설립한 배경은? 그리고 그 간 걸어온 길에 대해 알고 싶다.   본인은 의류학과를 전공했고, 패션브랜드에서 온라인 팀장으로 근무하면서 이 분야에 관심을 가지게 돼 본격적으로 일을 시작하게 됐다. 직장생활을 하면서 해당 업무를 성공적으로 수행해 제법 인정을 받았고 여러 회사로부터 스카웃 제의도 받았으나 큰 관심이 없었다. 솔직히 말하면 사회 초년생 시절부터 사업을 하고자 하는 의지가 있었다. 회사 설립 배경을 살펴보면 온라인 마켓이 성장하는 시기에 체계적으로 판매하는 업체가 많지 않다는 것을 파악하고 처음에는 간단히 컨설팅을 하다가 그 누구보다 잘 판매하고 운영할 자신이 있어서 본격적으로 사업을 시작하게 된 것이다.   현재 조직은 어떻게 구성돼 있나? 또 물류센터 등 회사 인프라에 대해서도 궁금하다.   크게 MD, 물류, CS, 웹디자인, 경영관리 부서로 구성돼 있다. 물류는 3군데서 운영하고 있는데 한군데가 직영이며 2곳은 3자물류를 활용하고 있다. 향후 물류센터 구축에도 관심을 가지고 있다.   패션, 온라인 판매 사업 주력   전자상거래와 관련, 현재 다양한 사업을 전개하고 있는 웹뜰의 가장 주력 사업이 무엇인지 궁금하다. 그리고 그 이유는?   다양한 사업이 있지만 패션 카테고리 온라인 판매 사업이 주력 사업이다. 그 이유는 이 사업이 처음으로 펼친 사업이고, 회사에서 가장 큰 매출을 차지하기 때문이다. 간단 명료한 이유다.   주요 고객사는 어떻게 형성돼 있나? 그리고 향후 타겟층이 궁금하다.   판매처는 오픈마켓, 소셜커머스, 패션전문몰, 종합몰, 백화점몰, 폐쇄몰 등이다. 자세히 언급하면 하프클럽, 패션플러스, 11번가, 옥션, G마켓, 티몬, 위메프, 쿠팡, GS이숍, 롯데닷컴, 신세계몰, H몰, AK몰, 카카오톡 선물 등 꽤 유명한 기업들이다. 우리는 향후 국내 온라인 외에 해외 판매를 준비하고 있다.   귀사는 고객과의 신뢰를 가장 중요시 여긴다고 했다. 고객과의 신뢰 구축을 위해 가장 신경써야 할 부분은?   무엇보다도 정확한 상품 정보 제공과 정확한 배송이다. 그리고 고객과의 신뢰도 중요하지만, 저희가 신뢰를 언급했던 부분은 상품 공급처와의 신뢰 구축도 포함된다. 상품 공급처의 목적에 맞게 운영 계획을 짜고 공급받은 물량 기준 판매율, 매출 목표 달성을 반드시 이행하도록 하면서 신뢰를 구축해 나가고 있다. 그래서 오랫동안 거래하고 있는 브랜드들이 많아지고 있는 것이다. 파크랜드, 인디에프, 아이더 등이 대표적인 경우다.   고객사 제품 브랜딩 초점   그렇다면 경쟁업체 간 우위를 점하기 위한 귀사의 특징 및 장점에 대해 설명해 달라.   우선 브랜드별 체계적인 관리력이 우수하고 브랜드별 매출 효율 가장 높다. 다음으로 촬영, 디자인 등 브랜딩을 위해 노력하고 있다는 점이다. 우리는 새로운 시도를 통해 리딩 업체로 거듭나고 있다. 또 빠르게 변화하는 온라인 시장에 가장 빠르게 대응하고 적응해 앞서가는 점도 눈여겨 볼 부분이다. 미자막으로 위탁 판매 외 매입, 온라인 전용 상품 기획에 참여해 높은 판매율 기록하고 있다.   이태경 대표님의 경영철학에 대해 듣고 싶다.   입점몰, 고객, 직원과의 약속 이행을 가장 중요하게 생각한다. 다시 말해 신뢰를 소중히 여기는 것이다. 그리고 좋은 상품을 좋은 가격에 소싱해서, 대중에게 제공하는 것도 중요하다고 생각한다. 뿐만 아니라 가장 먼저, 가장 열심히, 가장 정직하게 업무를 해나간다면 성공할 수 있다고 생각한다.   갈수록 조직문화가 발달하는 이 시대에 웹뜰의 복지현황 및 사회 공헌활동에 대해서 알고 싶다.   우선 월별로 팀비를 지원해 팀 단합을 고취하고 있으며 체력단력비, 도서, 각종 교육비, 소모임 활동비 등을 지원하고 있다. 이와 함께 쾌적한 휴계실를 완비하고 있다. 또 전사적으로 분기별로 문화 활동, 체육대회, 워크숍을 진행하고 있으며 장기근속자에게 포상을 하고 여름휴가일수를 추가적으로 지급해 애사심을 갖게 만들고 있다. 이와 함께 매월 목표달성에 따른 인센티브, 매월 우수사원 선정 인센티브, 매년 최우수사원 선정 인센티브, 매년 손익 분배 전직원 인센티브를 지급해 직원들을 만족시키고 있다. 여성 직원들이 많은 편이라 여성 직원들을 위해 작은 것 하나까지 신경쓰려고 하고 있다.   화주사가 물류기업을 선택할 때 가장 중요하게 생각하는 부분에 대한 대표님의 견해는?   물류기업 대표와 센터장, 우리 책임자가 얼마나 책임을 지고 실무에 관여하는지를 중요하게 생각한다. 그리고 약속이행을 잘하고 신뢰도가 높고 믿을 수 있는 사람인지를 중점적으로 본다. 이를 위해 온라인 판매, B2C를 다양하게 경험했고, 현재 운영하고 있는지를 따져본다. 아울러 여러 가지 변수에 빠르게 대응하고 인력수급이 원활한지를 살펴본다. 인프라의 경우 비용 측면(평수, 인력, 시설 등)에서 얼마나 효율적으로 운영을 잘하는지 알아본다.   중소기업에게 길잡이가 되는 것   회사를 이끌어 오시면서 가장 보람된 순간과 힘들었던 순간은 언제인가?   가장 보람된 순간은 온라인 매출이 적었던 브랜드를 매출 1위로 만들었을 때와 고객이 역시 웹뜰이라고 할때다. 그리고 웹뜰 출신의 직원들이 업계에서 중요한 역할을 하고 있을때와 회사에 애사심을 갖는 직원들이 조금씩 늘어날 때 뿌듯하다. 그리고 소기업들에게 작게나마 길잡이가 되어줄때 보람을 느낀다. 힘들었던 순간은 지속적으로 성장시킨 브랜드가 정치적인 요인으로 계약이 갑자기 종료될 때 많이 안타까웠다. 그리고 오랫동안 아끼던 직원이 퇴사할때 심정이 착잡하다.   웹뜰의 중장기적인 비전에 대해 듣고 싶다. 또 향후 목표가 무엇인지 알고 싶다.   패션 외 카테고리를 확장하는 것이다. 특정 카테고리에 한정되지 않고 다양한 좋은 상품들을 지속적으로 소싱하는게 목표라고 할 수 있다. 또 국내 뿐 아니라 해외 브랜드를 수입하고 국내 상품들을 해외에 수출해 글로벌한 기업으로 커 나가는 것도 또다른 목표다. 다른 한편으로 디자인, 아이디어, 생산력만 가지고 있는 소기업들의 고민인 유통을 해결해주고 싶기도 하다. 인재양성 측면에선, 실력있는 온라인MD를 업계에 계속 전문적으로 양성하는게 목표다. 솔직히 이 분야에 전문인재가 너무 없는 것 같다.   마지막으로 <물류와 경영> 독자들에게 인사말 한마디 부탁 한다.   유통의 절반이 물류라고 생각한다. 최근 유통이 진화하고 있는데 유통과 함께 물류가 동반 성장하길 진심으로 바란다.      원문 링크 #웹뜰 #인터뷰 #대표인터뷰 #해외브랜드 #브랜드관리 #온라인패션몰 #패션 #MD 
조회수 867

2018 소셜미디어 트렌드 읽기 ② 카카오스토리, 네이버 블로그, 인스타그램

소셜미디어 트렌드 조사 ② 카카오스토리, 네이버 블로그, 인스타그램소셜미디어 이용 행태 변화가 각 소셜미디어에 어떤 영향을 미치는지 궁금한 시점입니다. ‘소셜미디어와 검색 포털에 관한 리포트 2018’ 내용 중 카카오스토리, 네이버 블로그, 인스타그램의 데이터만 추려서 좀 더 깊게 살펴봤습니다. | 카카오스토리: 특정 세대 집중과 하향세의 기로본 조사를 시작한 2016년부터 카카오스토리의 이용빈도는 꾸준히 감소하고 있습니다. 이는 전체 응답자에게 주로 이용하는 소셜미디어가 무엇인지만 물어도 알 수 있습니다. 올해 주 이용 소셜미디어로 카카오스토리를 꼽은 응답자는 9.6%에 불과하기 때문입니다. 페이스북과 근소한 차이인 24.6%로 전체 2위를 기록했던 재작년과 비교하면 빠른 감소 추세입니다.이어서 전체 응답자에게 지난 한 달간 카카오스토리를 이용한 적 있는지를 물었습니다. 2016년은 65.4%, 2017년은 62.2%, 올해는 55.4%로 매년 조사할 때마다 지난 한 달간 카카오스토리를 이용한 적 있다는 응답자는 꾸준히 줄고 있습니다.연령별 편차가 흥미롭습니다. 지난 한 달간 카카오스토리를 이용한 20대는 33.1%인 반면, 30대부터 각각 53.2%, 68.5%, 66.7%로 연령이 오를수록 늘어나는 추세를 보였습니다. 작년 대비 이용 빈도가 증가했는지를 물을 때 역시 연령별 경향이 나타납니다. 카카오스토리의 이용 빈도가 작년보다 늘었다고 답한 4050 세대는 각각 23.6%와 30%인 반면, 20대는 4%, 30대는 12.3%에 그쳤기 때문입니다.이는 전 글에서 다룬 ‘세대적 특성이 뚜렷해지고 있는 밴드’의 사례와 유사한 듯 좀 다릅니다. 밴드와 달리 카카오스토리를 주로 이용한다는 응답자는 콘텐츠에 대한 만족도가 높지 않기 때문입니다. 정보의 흥미성, 유익성, 신뢰성에 대해 만족하는지 물을 때 각각 37.5%, 31.3%, 33.3%만이 그렇다고 답한 것입니다.주 이용 소셜미디어의 정보 만족도(소셜미디어 트렌드리포트 조사, 2018)위와 같은 결과를 콘텐츠가 아닌 네트워킹 중심의 소셜미디어의 특성이라고 해석하기는 힘듭니다. 카카오스토리와 같이 4050세대의 친목 중심 소셜미디어인 밴드는 정보의 흥미성, 유익성, 신뢰성에 대한 만족도가 각각 48.2%, 51.8%, 50%로 높은 것이 그 이유입니다. 비슷해 보이는 두 소셜미디어의 상반된 응답은 흥미로운 비교점입니다. | 네이버 블로그: 콘텐츠를 무기로 3040세대에 인기네이버 블로그를 알아보기에 앞서 소셜미디어 이용 행태 변화를 살펴보겠습니다. 3년간 매년 전체 응답자에게 소셜미디어를 이용하는 이유를 물었는데, 설문을 통해 누적된 응답 데이터에서 특징적인 경향을 읽을 수 있었기 때문입니다.먼저 취미 및 관심사를 공유하기 위해(39.4%→41.2%→44%), 뉴스 등 유용한 콘텐츠를 얻기 위해(29.7%→32.4%→40.3%), 흥미 위주의 콘텐츠를 얻기 위해(30.5%→35.9%→38%)라는 답변은 지난 3년간 꾸준히 증가했습니다.반면, 지인이나 친구와 교류하기 위해(52.2%→46.3%→38.9%), 소셜미디어 내 커뮤니티를 활용하기 위해(15.7%→16.7%→14.3%)라는 답변은 줄었습니다. 특히 지인이나 친구와 교류하기 위해 소셜미디어를 이용한다는 응답자는 지난 3년간 매우 감소하는 추세입니다. 소셜미디어를 이용하는 주된 이유가 네트워킹에서 콘텐츠 소비 중심으로 변화하는 것입니다.네이버 블로그는 위와 같은 트렌드에 부합하는 대표적인 소셜미디어 중 하나입니다. 주로 이용하는 소셜미디어로 네이버 블로그를 꼽은 응답자에게 그 이유를 모두 알려달라고 물었을 때 뉴스 등 유용한 콘텐츠를 얻기 위해(76.5%), 취미 및 관심사를 공유하기 위해(50.6%), 흥미 위주의 콘텐츠를 얻기 위해(45.9%)라는 답변이 TOP3를 차지했기 때문입니다. 지인이나 친구와의 교류를 위해 이용한다는 응답자는 10.6%에 불과할 만큼 색깔이 뚜렷한 것입니다.네이버 블로그를 주로 이용하는 이유 TOP5 (소셜미디어 트렌드리포트 조사, 2018)이용 빈도 관련 결과 역시 긍정적입니다. 먼저 주 이용 소셜미디어가 무엇인지 물었습니다.  전체 응답자의 17%가 네이버 블로그를 꼽았습니다. 이는 작년보다 6.2% 늘어난 수치로 네이버 블로그를 주로 이용한다는 응답자가 1년 만에 눈에 띄게 증가한 것입니다. 이는 유튜브(27.6%)에 이어서 두 번째로 높은 수치기도 합니다.최근 한 달간 이용 여부를 물었을 때는 전체 응답자의 65.8%만이 그렇다고 답했습니다. 2016년(65.2%), 2017년(68.2%)과 비교하면 적은 차이입니다. 최근 한 달간 네이버 블로그를 이용한 적 있다는 응답 규모는 매년 거의 변화가 없는 데 반해 주로 이용하는 소셜미디어로 네이버 블로그를 꼽은 응답이 유독 증가한 점은 흥미롭습니다.연령별 특징도 있습니다. 네이버 블로그를 주로 이용한다는 응답자는 3040세대가 각각 24.6%, 24.2%로 주축을 이룹니다. 그 외 20대는 9.7%, 50대는 9.5%입니다. 작년 대비 이용 빈도가 증가한 소셜미디어로 네이버 블로그를 꼽은 응답자 역시 20대가 20.2%, 30대부터는 32.8%, 27.6%, 15%로 나타났습니다. 여타 소셜미디어는 연령이 낮거나 높을수록 주 이용자가 집중된다는 걸 고려하면 흥미로운 특징입니다. | 인스타그램: 친목 중심 소셜미디어 중 약진인스타그램은 2030세대에게 특히 친숙한 소셜미디어입니다. 2030 중 인스타그램을 주로 이용한다는 응답자는 각각 23.4%, 23.8%를 차지한 반면, 40대(6.5%)와 50대(5.6%) 중 인스타그램을 주로 이용한다는 응답자는 눈에 띄게 적기 때문입니다. 이렇게 세대별 이용률 차이가 큰 소셜미디어임에도 인스타그램은 불구하고 꾸준히 성장하고 있습니다.먼저 2016년부터 2018년까지의 이용 빈도 변화를 비교해보겠습니다. 최근 한 달간 인스타그램을 이용한 적 있는지 물을 때 그렇다고 답한 응답자는 지난 3년간 36.6%→43.8%→48.4%로 꾸준히 증가했습니다. 인스타그램을 주로 이용한다는 응답자 역시 7.2%→14.2%→14.8%로 나타났습니다. 작년 대비 올해 상승폭은 적은 편이지만 3년간 한 번도 하락하지 않았다는 점은 고무적입니다.인스타그램의 꾸준한 성장세는 독특한 면이 있습니다. 지인 및 친구와의 교류를 위해(52.2%→46.3%→38.9%), 사진 및 동영상을 공유하기 위해(37.9%→41.2%→36.2%) 소셜미디어를 이용하는 비율은 감소하는 추세입니다. 이에 친목이나 사진·동영상 공유를 위해 주로 이용하는 페이스북, 밴드, 카카오스토리의 이용 빈도 역시 줄고 있습니다.인스타그램 역시 친목이나 사진·동영상 공유를 위해 주로 이용되는 소셜미디어입니다. 인스타그램을 주로 이용한다는 응답자에게 이유를 물었더니 지인 및 친구와의 교류를 위해(63.5%), 사진 및 동영상 공유를 위해(59.5%) 주로 이용한다는 응답이 TOP2를 차지했기 때문입니다. 그런 인스타그램의 페이스북, 밴드, 카카오스토리와 다른 점이라면 이중 이용 빈도가 꾸준히 상승하는 유일한 소셜미디어라는 것입니다.친목중심 소셜미디어의 연도별 이용 빈도 (소셜미디어 트렌드리포트 조사, 2018)앞으로가 더욱 기대되는 소셜미디어기도 합니다. 작년과 비교해 인스타그램의 이용 빈도가 증가했는지 물으니 32.9%가 그렇다고 답했기 때문입니다. 유튜브(54.6%)에 이어 두 번째로 이용 빈도가 많이 증가한 것입니다. 작년보다 이용 빈도가 감소했다는 응답은 6.7%에 불과했습니다.또한, 인스타그램을 주로 이용한다는 응답자에게 앞으로 이용 빈도가 더 늘어날 것 같은지 물으니 55.4%가 그럴 것 같다고 답했습니다. 유튜브(72.5%), 네이버 블로그(63.5%)보다는 적지만 긍정적인 결과임은 분명합니다. 더불어 오직 8.1%만이 향후 이용 빈도가 감소할 것으로 전망합니다. 2030 친목 중심의 소셜미디어로서의 향후가 더욱 기대되는 인스타그램입니다.#오픈서베이 #데이터분석 #시장분석 #마케터 #마케팅
조회수 1974

다함께 써봐요 Google Web Designer!

안녕하세요. 이번 기술 블로그 글을 맡은 spoqa 디자이너 Been입니다 ^^ 회사에서 그래픽디자인을 맡고 있으며 기술 블로그 글을 쓰는 건 처음입니다.회사 프로젝트를 진행하며 접하게 된 Google Web Designer 베타버전에 대해 글을 쓰려 합니다. Google Web Designer로 프로젝트를 진행하며 알게 된 기능과 느낀 점에 관한 이야기입니다.먼저 Google Web Designer 는요, 근래에 구글에서 개발한 웹 디자인 프로그램입니다. 위키백과에 검색해보니 이렇게 설명이 되어있더군요.Google Web Designer is a program for Windows and Mac from Google for creating interactive HTML5 sites and ads for any device.웹 페이지를 만들거나 웹 배너를 만들기 위한 프로그램이라고 생각하시면 됩니다^^실행해보니 기능이 디자이너와 프로그래머가 협업하기 좋은 프로그램입니다. 디자인하듯 그리거나 배치한 것이 HTML/CSS 언어로 바로 변환돼 표시 됩니다. * 구글에 검색하시면 쉽게 내려받으실 수 있습니다.최근 크리스마스를 맞아 저희 SPOQA에서 이 프로그램을 활용하여 각 매장 태블릿기기에 들어갈 간단한 애니메이션을 제작했습니다. (도도 매장을 방문하시면 태블릿 기기로 감상하실 수 있습니다.) 이제부터 제작하며 프로그램에 관해 느낀 점과 그에 관련된 짤막한 기능들을 설명하겠습니다.우선 간략하게 작업 창을 설정하는 방법을 알려드리겠습니다.1. 설치한 Google Web Designer를 더블클릭하면 구글같이 생긴 아래 이미지가 뜹니다.2. 파일 - 새 파일을 누르면 작업 창 설정 창이 뜹니다.3. 플래시처럼 레이어를 생성해 소스를 하나하나 움직이기 위해서 새 파일에서 배너를 선택, 태블릿 해상도(or 원하는 크기, 저는 태블릿에 들어갈 애니메이션을 만들어야 했기에 태블릿 해상도에 맞췄습니다.) 크기에 맞춰 작업 크기를 설정해 줍니다. 파일의 이름을 지어준 후 애니메이션 모드는 고급 모드로 설정 후 확인을 누릅니다. (빠른모드에서는 레이어 생성을 할 수 없습니다.) * 파일은 html로 저장됩니다.4. 짠작업 창이 떴습니다. 이제 작업을 시작할 수 있겠죠? ^^ 저 하얀 작업 창에 소스를 집어넣고 이것저것 움직임을 주면 대강 이런 모습이 나옵니다. 평소 디자인 프로그램을 사용해보신 분들이면 그리 어렵지 않게 다루실 수 있다고 생각합니다.사용해보니 마치 일러스트레이터 + 플래시 + 드림위버 미니 버전 같습니다.다음으로 작업하며 사용했던 기능에 대해 몇 가지 말씀드리겠습니다.소스소스들은 파일 창에서 작업 창으로 드래그하셔서 쓸 수 있습니다. 소스를 옮겨놓으면 자동으로 images라는 폴더가 생성되는데 그 안에 옮겨놓은 소스가 들어있습니다. 같은 소스를 또다시 끌어다 놓으면 자동으로 복제됩니다. (작업 창과 images 폴더에) 일러스트레이터나 포토샵처럼 상단 메뉴바에서 이미지를 불러올 수는 없습니다.레이어소스가 작업 창으로 옮겨지면 레이어가 생성되는데 이 레이어의 이름을 지정하고 싶으면 오른편 속성 창에서(오른쪽이미지) 요소 밑에 있는 ID로 이름값을 지정해 주면 됩니다. HTML스럽네요. 아무리 레이어에서 더블클릭을 하고 우클릭을 해도 이름 변경이 안 됩니다. 레이어의 위아래 순서는 끌어 옮겨서 바꿀 수 있고 레이어를 선택하고 Ctrl+c, Ctrl+v 하면 선택된 레이어가 복제됩니다. 상단 메뉴바의 수정에서도 가능합니다. (타임라인 복제가 아니라< 레이어=화면의 소스>만 복제됩니다.) 각 레이어를 클릭하면 오른편 스타일 창에서 해당 코드를 보여줍니다. 레이어 오른편에 휘어진 화살표를 클릭하면 해당 레이어 재생 수를 지정할 수 있습니다. (없음/2회/무한) 세 가지 옵션입니다. 그래서 옵션을 무한으로 설정하면 해당 동작이 계속해서 반복합니다.타임라인타임라인의 시간 범위를 설정할 수 는 없습니다. 그저 원하는 마지막 시간위치에 키프레임을 놓는 것이 범위 설정 방법입니다. 원하는 위치에서 우클릭을 하면 키프레임을 삽입할 수 있습니다. 타임라인을 복사해서 다른 레이어에 붙일 수 없습니다. 타임라인 위의 키프레임들이 중복 선택이 안 될뿐더러 alt+탭을 눌러 개별 복사하는 기능도 먹히지 않습니다. 키프레임과 키프레임 사이에 마우스를 대고 우클릭을 하면 easing(이징) 기능이 있습니다. 움직임의 가속과 감속을 조절할 수 있는 기능입니다.기타기능타임라인 윗부분에 코드 보기를 누르면 디자인한 작업의 전체 코드를 작업 창에서 보실 수 있습니다. 그 옆의 미리 보기를 누르면 브라우저로 작업물을 확인할 수 있습니다. 브라우저는 크롬과 인터넷 익스플로러 두 가지입니다. 타임라인의 재생버튼을 누르면 작업창 안에서 작업물이 동작하는 모습을 볼 수 있습니다. 재생버튼 옆의 휘어진 화살표를 누르면 재생이 계속 반복해서 됩니다. 맨 오른쪽의 게시버튼은 작업물을 추출할 수 있는 버튼입니다. 이미지를 선택하시고 상단 메뉴바의 변환컨트롤이라는 부분에 체크를 하시면 해당 이미지의 크기나 각도를 조절 할 수 있습니다.그 옆은 오브젝트들을 정렬할 수 있는 기능입니다. 맨 오른쪽은 사진의 설명처럼 레이어의 순서를 바꿀 수 있는 버튼입니다. 그 외 3D기능, 간단한 오브젝트를 그리고 칠할 수 있는 기능 등이 있습니다.이제 마지막으로 작업한 결과물을 추출하는 방법을 알아보겠습니다.추출법다 만든 작업물을 추출하는 것은 미리 보기 옆의 게시 버튼을 눌러 할 수 있습니다. 추출하면 zip으로 압축되어 나오고 그 안에 Index.html과 사용한 소스파일들이 들어있습니다. 아래는 게시버튼을 누르면 나타나는 창입니다. 원하는 이름과 위치를 지정해 주고 파란 게시버튼을 누르면 끝! 이렇게 완성된 도도 크리스마스 애니메이션은 곧 혹은 이미 도도 매장의 iPad로 확인하실 수 있습니다. ^^ (아쉽게도 갤럭시 노트 10.1은 프레임 문제로 지원하지 않아요.) 만약 구글 크롬이나 파이어폭스를 쓰신다면 PC에서도 확인하실 수 있습니다.이상 제가 알게 된 구글 웹디자이너 프로그램 기능에 관한 글이었습니다 ^^ 정말 필요한 기능들만 모아 간결하게 만들었네요. 복잡하게 여러 메뉴를 거치지 않고 바로 보이는 것들로 기능을 실행할 수 있는 점이 그렇게 느끼게 하지 않았나 싶습니다. 기존 디자인 툴과 크게 다르지 않은 배치와 생김새가 프로그램에 빠르게 익숙해지는 데 일조했습니다. 하지만 사용한 기능 중 가장 아쉬웠던 부분은 타임라인 조작인데요, 타임라인 선택복사가 되고 복수선택이 되어 전체복사가 되면 좀 더 편리하고 참 좋지 않았을까 싶네요.처음 접하시는 분들께 도움이 되었으면 좋겠습니다. 혹시 기능 설명에 잘못된 부분이 있다면 알려주세요. ^^ 미흡한 글 읽어주셔서 감사합니다. ^^참고위키 백과공식 사이트#스포카 #디자인 #디자인팀 #디자이너 #구글 #웹디자이너 #구글웹디자이너 #꿀팁 #스킬스택 #스택소개 #인사이트 #경험공유
조회수 1418

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팀gojs@brandi.co.kr브랜디, 오직 예쁜 옷만
조회수 945

[마케터]창업일기2

#퇴사학교 #꼬꼬마 #마케터 #창업일기 #조교일기"H님은 사실, 사람을 엄청 좋아하는데, 좋아하는 사람들로부터 받은 상처들이 많아서 마음 열기 무서워하는 것 같아요."내 말 한 마디에 그 분의 눈에는 금세 눈물이 핑 돌았다. 왜 그런지 모르겠다고 말했다. 사실 그게 나를 착즙하듯 쥐어짜는 회사 생활과 나의 일상 중에서 '애써 잊어 왔던' 자신의 모습인데.1퇴사학교라 하면, "오늘 회사가기 싫다" "그냥 다 짜증나니, 회사 때려치우고 싶다." 뭐 이런 식의 가벼운 마음으로 온다고 생각하는 사람들이 꽤나 있다. 혹은 '퇴사'를 가지고 장난질한다는 헐뜯기도 있었다. 2공동창업자로서 처음부터 1년 넘게 퇴사학교라는 커뮤니티를 만들어가며, 확실히 말할 수 있는 것은 퇴사학교는 그런 곳이 아니다. 퇴사를 권장하고, 멋대로 살라고 하는 무책임한 곳은 더더욱 아니다. 장난질하기 위해, 사람을 그저 자원이니, 소모품이니, 돈이니 뭐 이런 시각으로 보는, 무책임한 곳은 더더더욱 아니다.3사회의 정답, 주변 사람의 기대들을 나의 가치라고 생각해오며 정말 최선을 다해 열심히 살아왔건만 "무엇을 위해 이렇게 살아야 할까." 퇴근길 지하철에서 이게 인생의 전부인가, 공허함, 허무함이 몰려오는 순간.내가 좋아하는 것, 하고 싶은 것, 일하는 이유조차 생각해보지 못한 채 그저 조급한 마음에 내달려왔지만, 열심히 달릴수록 정작 갈 길을 잃고 무슨 일을 해야 할 지 인생의 방향조차 잡지 못하는 순간.그저 '나'라는 모습 있는 그대로 행복하게 살고 싶을뿐인데, 의미없는 숫자놀음, 사람이 사람을 사람으로서 존중하지 못하는 비상식적 환경, 언제든 대체가능할 것만 같은 '자원', '부품'으로서의 삶이 허무한 순간.그 속에서 대체 나는 무엇을 위해 삶을 살며, 이 일을 해야 하는 것인지. 삶의 이유를 찾고자, 사람들은 퇴사학교라는 곳을 찾는다. 그저 아주 조금만이라도 의미있는 일을 하고 싶은 소망, 그리고 지금보다 조금만 더 행복하게 일하고, 가치있게 내 삶을 주체적으로 살고 싶은 작은 불씨를 가지고.4"나도, 지금보다 더 나은 일과 삶이 있진 않을까?""내 삶에 변화를 만들기 위해, 무언갈 시작할 수 있을까?""내가 꿈꾸던 무언가, 새로운 것에 나도 도전해볼 수 있진 않을까?"한 사람 한 사람의 있는 그대로의 모습, 내면의 가능성보단 "너가 성공못한 건 노~력을 안해서야. 너가 못나서야." 늘 so what? 성과주의적인 사고와 '정답'을 따라가야 한다는 압박, 튀어 보이면 깎아내려야 하고, 늘 기존의 방식대로만 안주해야 하고. 끝도 없이 비교하고, 깎아내리고, 있는 그대로의 모습을 존중해주지 않는 수많은 상황들. 그리고 조급함, 불안함, 번아웃.그런 상황 속에서도 그동안 꾹꾹 숨겨만 왔지만, 마음 한 켠엔 막연하지만 더 나은 일과 삶을 스스로 만들고 싶은 겨자씨만한 불씨를 가진 사람들이 모이는 그런 곳이 퇴사학교라 생각한다.비록 이들은 고민하고 방황하고 흔들리고, 현실적이지 않아 보이는 '이상'을 꿈꾸기도 한다. "뭐, 그런 진지한 생각을 해? 원래 다들 그렇게 살아. 버텨." 주변의 압박 속에서 어쩌면 한없이 불안하고 나약하고 철없고 비현실적으로 보이기도 하는 사람들.하지만 사실은 이들이 세상에서 가장 용기 있는 보통의 위대한 사람들이라 생각한다. 오롯이 나라는 사람으로 서기 위해 내 안의 불안함, 두려움들을 온전히 마주하는 사람들이니까. 5퇴사학교는 그런 사람들이 모여, 각자의 있는 그대로의 모습을 존중해주고, 각자의 삶에 변화를 만드는 커뮤니티의 공간이다. 그리고 사람간의 커뮤니케이션으로 더 많은 사람들의 인식의 변화를 만들어가며, 조금씩 사회를 변화시키는 곳이다. 그렇게 믿고 있고, 만들고 싶고, 그렇게 만들어갈 것이다.6"좀 가벼운 마음으로 왔는데, 저에 대해 이렇게 깊게 고민하는 건 처음이에요. 정말, 인생의 전환점이 되어준 곳이에요. 더 많은 사람들이 퇴사학교를 왔으면 좋겠어요. 너무 감사해요."누군가가 슬쩍 이렇게 말해줬다. 마음이 참 가벼우면서도, 무거웠다. 현실이 슬프기도 하면서도 한편으로는 기쁜 마음이었다. 아이러니하다.7.앞으로 더 많은 사람들이 인생의 방향성을 제대로, 그리고 주체적으로 찾아갈 수 있는 세상이 되었으면 좋겠다. 그래서 그런 세상을 만들기 위해, 오늘 이 순간 내 앞에 있는 사람들에게 그렇게 말해주기로 했다."괜찮아. 사실 너는 지금도 충분히 괜찮아. 너무 귀하고, 너무 예쁘고 멋져. 다른 누군가가 되기 위해, 스스로를 옭아맬 필요는 없어.""괜찮아. 잠시 쉬어가도 돼. 지금껏 너무나 열심히 달려왔고, 최선을 다해왔고, 너무 고생해왔어. 잠깐만 자신을 뒤돌아보면서 조금은 쉬어도 돼. 조급해하지 않아도 돼. 아직 인생은 길잖아. 지금은 그래도 돼."그리고 눈을 지긋이 보며 이렇게 물어보고 싶다."그럼, 너는 무엇을 할 때 가장 행복해? 너는 어떤 삶을 살고 싶니?그리고 너를 가장 보람있게 만들고, 행복하게 만들고, 너를 움직이는 '일'은 무엇일까? 그냥 자유롭게, 있는 그대로의 너의 생각을 들어보고 싶어."> 사진 : 퇴사학교 <아이덴티티 워크숍>
조회수 1066

제발 해결책 좀 가져 오라고 하지말자.

많은 회사에서 직원들에게 요구한다. "회사에 문제가 있다면 불만을 갖기 전에 스스로 해결책을 생각해라." 나도 이 이야기를 철석같이 따랐다. 하지만 이제는 더이상 통하지 않는 이야기다. 우리는 현재 문제 해결보다 공유가 더 중요한 시대를 살고 있기 때문이다. 문제가 있으면 빨리 공개하는 문화예전에는 문제에 대핸 공개 전에 해결책 부터 마련하자고 외치고 다녔는데, 이제 부터 내가 주장할 내용은 "문제가 있으면 빨리 공개하라"이다. 지금까지 기업의 문화는 수직적인 체계를 갖추었기 때문에 문제의 해결은 위에서 이루어 지는 경우가 많았고 실제로 조직의 관계를 통해 문제를 해결 할 수 있었지만 스타트업과 같이 수평적이면서 일 중심적인 문화에서는 기존의 문제 해결 방식이 통하지 않는 경우가 많다. 그럼 왜 문제가 있을 때 해결 방안을 고민하는 것보다 문제 제기를 하는 것이 더 중요한지 따져 보자. 1. 수평적인 문화에서는 문제 상황이 더 빈번하게 발생한다.  기존의 수직적인 체제에 익숙한 경우 수평적이고 개인의 역량에 더 많이 의존하는 과정에서 발생하는 스타트업의 문제 상황은 혼돈 그 자체로 보인다. 정형화 되지 않는 수많은 문제들에 대해 혼자 고민하는 것이 이제는 본인에게도 별로 도움이 되지 않는다. 해결에 대하 고민보다 공유에 대한 고민이 더 중요해 지고 있다. 2. 프로세스 보다 원칙에 의존하는 문화 업무를 중심으로 움직이게 되면 각자의 정해진 역할보다는 목표를 중심으로 움직이게 되고. 이 과정에서 프로세스는 다양해 지는 것이 아니라 점점 더 줄어들게 되고 일에 대한 원칙만 준수하는 문화로 발전하게 된다. 이 과정에서도 수많은 문제점들이 발생하게 되는데, 이 문제를 해결하기 위해 프로세스를 만드는 것은 또 다른 문제를 발생시킬 경우가 많다. 3. 문제 해결보다 공유와 공감 훌륭한 많은 기업들이 프로세스의 개선을 통해 문제를 개선 해 왔다. 하지만 당신의 회사가 프로세스로 동작하지 않는 스타트업이라면 어떻게 이 문제들을 해결해야 할까? 위에서 이야기 했듯이 일 중심의 문화가 프로세스보다는 원칙에 의존한다면 원칙의 테두리 안에서 생기는 대부분의 문제들은 공유와 공감을 통해 해결해야 한다. 그리고 원칙을 바꿔야 한다면 모든 구성원의 충분한 논의를 통해 변경해야 할 것이다. 4. 드러나지 않는 문제는 해결되지도 않는다.회사를 운영하는 입장에서 가장 중요한 문제이다. 많은 기업들이 이런 이야기를 한다. "왜 회사에 있는 문제에 대해 아무도 의문을 제기하지 않는가?" 그게 바로 문제 해결을 원하는 문화 때문이다. 문제에 대한 해결 방법을 찾지 못하면 말도 하면 안되도록 우리가 강요하는 문화를 만들었던 것이다. 많은 대표들이 이 부분에 대해 이해하지 못한다. 대표들은 문제를 보면 해결책을 찾는데 익숙한 사람들이다. 어쩌면 그런 일련의 행동이 익숙하기 때문에 대표가 된 것일 수도 있다. 그런 대표들은 직원들이 회사의 문제들에 관심이 없다고 생각하며 불만을 제기한다. 하지만 회사의 직원들 또한 회사에서 다양한 문제들을 겪고 있으며 관심도 엄청 많다. 다만 해결책을 혼자 찾을 수 없으니 말을 안할 뿐이다. 5. 공유와 공감을 위한 문화 만들기 공유와 공감을 위해 제일 먼저 해야 할 일이 있다. 해결책을 찾도록 문제를 공개하는 사람들을 인정하는 문화를 만들어 가는 것이다. 회사의 문화는 보상, 승진, 해고의 과정을 통해 구성원들이 직접 체감하며 만들어지므로 해결책을 찾도록 문제를 공개하는 사람들을 처벌하지 않고 포상과정을 통해 만들어 가야 할 것이다. 이에 대한 이야기는 아래 벤 호로위츠의 하드씽에서도 읽을 수가 있다. 건강한 기업 문화는 나쁜 소식을 나누도록 직원들을 장려한다. 사내의 문제들을 공개적으로 자유롭게 논의하면 훨씬 빠르게 해법을 찾을 수 있다. 문제를 숨기는 회사는 그 문제와 관련된 모든 사람들을 좌절시킨다.그렇다면 건강한 기업 문화를 만들기 위해 CEO는 무엇을 해야 할까. 답은 오로지 하나뿐이다. “해결책을 찾도록 문제를 공개하는 사람들을 처벌하지 않고 포상하는 문화를 형성하라.”그러자면 먼저 정보의 자유로운 흐름을 방해하는 잘못된 격언들을 경계해야 한다. 그중 대표적인 것이 “문제를 가져오려거든 해결책도 가져오라.”는 구닥다리 경영 규범이다. 그 중대한 문제를 해당 직원이 해결할 수 없다면 어쩔 텐가. 예컨대 한 엔지니어가 제품의 출시를 준비하던 중에 심각한 결함을 발견한다면 어떻게 할 것인가. 그에게 문제를 은폐하라고 지시할 것인가. 경영과 관련된 이런 뻔한 격언들은 직원들에게 추상적인 동기를 고취하는 데는 좋을지 몰라도, 정보의 자유로운 흐름에는 최악의 적이 될 수 있다. 그리고 정보 흐름의 단절은 회사의 건강에 치명적인 손상을 불러올 수 있다.하드씽 | 벤 호로위츠, 안진환 저 관련 글“회사의 진정한 문화는 보상, 승진, 해고가 결정한다”-남태희예스24 하드씽송파구에서 일을 더 잘하는 방법 11가지#와탭랩스 #기업문화 #조직문화 #인사이트 #경험공유
조회수 3275

LG화학 2019년 상반기 입사 대비!

LG화학 오창공장과 청주공장 선배들이 공유하는 LG화학 입사 성공기! 함께 만나보세요.2월 27일부터 시작된 LG화학 2019년 상반기 채용 일정! 많은 분이 높은 관심과 열정을 보여주고 있습니다. LG화학 입사를 준비하는 분들은 궁금한 게 참 많으시죠? 여러분을 위해 LG화학 선배들이 직접 나섰습니다. ‘면접관 눈에 확 띄는 자기소개서는 어떻게 써야 할까?’ ‘성공적인 면접을 위한 꿀팁은 무엇일까?’ LG화학 선배들의 입사 노하우! 지금 바로 알아볼까요?입사 성공 비결을 알려줄 LG화학 선배들은 누구?만나서 반갑습니다. 간단한 소개를 부탁합니다.이상훈 사원 안녕하세요. 청주공장 디스플레이 재료 생산팀에서 3년째 근무하고 있는 이상훈이라고 합니다. 디스플레이 재료에는 크게 OLED(Organic Light Emitting Diodes), LCD(Liquid Crystal Display)가 있는데, 저는 그중 LCD재료의 제품개발과 테크니컬 서비스를 맡고 있습니다.성화경 사원 반갑습니다. 저는 오창공장 광학 품질팀에서 4년째 근무하고 있는 성화경이라고 합니다. 디스플레이에 들어가는 편광판이라는 재료의 품질관리를 책임지고 있습니다. 품질관리팀에서는 생산 시 불량 최소화를 위한 모니터링과 불량상품의 고객 유출 방지 및 불량 재발 방지를 위한 대책 수립 등 중요한 업무들을 수행합니다.취업준비 도와줄 LG화학 입사 성공 꿀팁!LG화학에 지원한 동기가 무엇인가요?이상훈 사원 학창시절 화학공학을 전공하면서 ‘반도체 공정 개론’ 이라는 과목을 접했습니다. 무척 흥미로워 열심히 공부했는데, 디스플레이 역시 포토리소그래피(사진 석판술) 등 반도체 기술을 이용하는 공정임을 알게 되어 관심이 생겼습니다. 세계시장을 선도하는 혁신적인 제품을 내 손으로 직접 만들어보고 싶어 LG화학에 지원했습니다. 물론, ‘정도경영’을 고집하는 LG그룹의 깨끗한 브랜드 이미지도 지원 동기 중 하나입니다. LG화학은 도전적으로 성장하지만 정정당당한 실력을 바탕으로 한 기업, 묵묵히 사회 공헌에 이바지한 기업이기 때문입니다. 실제, 입사 후에도 ‘정도경영’은 늘 자랑스럽게 느끼는 부분입니다.성화경 사원 저는 화학공학을 전공했는데요. LG화학은 동기, 선후배들 모두 가고 싶어 하는 회사였습니다. 취업 준비를 하다 보면 여러 회사의 분위기를 전해들을 수 있는데, 특히 LG화학의 품질관리팀은 팀 결속력이 뛰어나고 의사소통이 원활하다고 알려져 있습니다. 서로 의논하면서 문제를 해결하는 팀이라면 힘든 일도 극복해가며 즐겁게 일할 수 있겠다는 확신이 생겨 지원하게 되었습니다. LG화학 입사 준비 시 가장 중점을 두고 준비한 부분은 무엇인가요?이상훈 사원 거창한 대외활동이나 자격증보다 중요한 것은 면접관이 주목할만한 진솔한 자기소개서와 자신감 있는 면접 태도라고 생각합니다. 아무리 화려한 스펙을 가지고 있어도, 자기소개서를 기반으로 한 면접에서 이를 증명하지 못하면 소용이 없겠지요? 면접 현장에서 떨지 않고 자신의 장점을 보여주려면 연습을 통해 실전을 준비하는 것이 중요합니다. 그래서, 다양한 면접 형태를 연습하고, 고쳐야 할 점은 무엇인지 주변의 피드백을 자주 받았습니다. 특히, 회사 업무 시 특정 상황에서 어떤 판단을 내릴 것인지에 대한 여러 가지 상황의 문제를 주로 분석하고 연구했습니다. 실제로 면접장에서 유사한 질문을 받았고, 끝까지 자신감 있게 대답할 수 있었습니다.저는 면접 준비에 관한 스터디 모임에 중점적으로 참여했고, 다양한 면접 형태를 연습했습니다. 특히, 회사 업무 시 특정 상황에서 어떤 판단을 내릴 것인지에 대한 여러가지 상황의 문제를 주로 분석하고 연구했습니다. 실제로 면접장에서 유사한 질문을 받았고, 끝까지 자신감 있게 대답할 수 있었습니다.성화경 사원 저도 자기소개서와 면접에 가장 공을 들였습니다. 평소 발표에 약한 스타일이라, 우선 낯선 사람들이 모이는 면접 스터디에 꾸준히 참석했습니다. 낯선 이들의 조언을 받으니 저의 약점을 조금 더 객관적으로 파악할 수 있었어요. 처음에는 작은 목소리와 어색한 시선으로 고생했지만, 훈련을 통해 약점을 극복할 수 있었습니다. 처음 가 본 장소에서, 처음 본 사람들 앞에서 모의 면접을 진행했던 것이 도움이 되었습니다. 또, 솔직하면서도 임팩트 있는 자기소개서를 쓰기 위해 수정을 거듭했습니다. 과장을 좀 보태서 100번 넘게 수정했다면 믿어지세요? 입사의 열쇠가 되어준 자기소개서, 어떻게 작성했나요?성화경 사원 주변에는 아프리카 자원봉사, 교환학생 등 특별한 대외활동 경험을 가진 친구들이 많았습니다. 그에 비해서 저는 비교적 평범한 편이었는데요. 그런데도 면접관들은 저의 이야기에 흥미를 느끼고 관심을 기울여 주셨습니다. ‘얼마나 특별한 활동을 했는지’보다는 ‘활동을 통해 무엇을 얻었는지’에 포인트를 두었기 때문이 아닐까요? 저는 문장 한 줄을 쓰더라도 신선한 느낌이 있는 강렬한 단어를 골라 사용하고, 독창적인 스토리텔링을 만들기 위해 노력했어요. 평범한 경험일지라도 풍부한 성장스토리가 녹아 있다면 인정받을 수 있을 겁니다. 눈에 띄는 스펙보다는 자신만의 스토리를 찾아보세요.이상훈 사원 면접관은 수천, 수만 개의 자기소개서를 봐야 하잖아요. 따라서, 모든 문항을 아주 꼼꼼히 살펴보지는 못합니다. 그래서 저는 문단 앞머리에 핵심적인 내용을 배치해 강조하는 방법을 사용했습니다. 빠르게 훑어보아도 쉽게 내용을 파악할 수 있도록 하기 위해서였죠. 또, 사소한 활동이라도 그 경험을 통해 얼마나 발전했는지 설득력 있게 풀어간 게 합격의 비결이 아닐까 합니다. 성공적인 면접의 비결이 있다면 무엇인가요?이상훈 사원 면접은 자기소개서를 기반으로 하니, 우선 자기소개서를 완벽히 숙지했습니다. 하지만 면접장에서는 말이 꼬이거나 순간적으로 기억이 잘 나지 않을 수 있기 때문에 마인드 컨트롤에도 큰 노력을 기울였어요.답할 때는 시선을 분명히 하고, 자신감 있는 목소리를 냈습니다. 제가 면접 볼 때, 한 지원자가 청심환을 먹고도 떠시더군요. 면접장에서 느끼는 긴장감이 얼마나 높아지는지 짐작이 가지요? 끊임없는 준비와 마인드 컨트롤을 통해 침착한 태도를 유지한다면, 떨지 않고 면접에 임할 수 있을 겁니다.성화경 사원 면접에 들어가자마자 ‘자기소개를 해보세요’라는 질문을 받았어요. 당시 저는 꼴찌를 했다가 충격을 받고 열심히 공부해서 일등을 거머쥐게 된 경험을 들려드렸어요. 그때, 면접관들의 관심이 집중되는 게 느껴졌습니다. 평범한 질문에도 눈에 띄는 대답을 할 수 있었던 비결은 자기소개서를 바탕으로 흥미로운 스토리와 임팩트 있는 멘트를 미리 준비했기 때문이에요. 학부시절 공부해 두면 특별히 도움이 되는 과목이 있을까요?성화경 사원 제 전공은 화학공학과였는데, 틈틈이 프로그래밍 공부를 조금 해두었습니다. 입사 후 프로그래밍 공부가 뜻밖에 큰 도움이 되고 있습니다. 최근 업무 트렌드가 크게 변화하면서, 데이터 관리의 중요성이 강조되기 때문입니다. 품질관리팀에서도 방대한 데이터를 통해 불량을 예측하고 방지하는 프로그램을 개발하고 있어요. 많은 회사들이 공통으로 추구하는 최신 업무 트렌드를 파악해서 관련 기술을 공부한다면, 자신만의 강점으로 어필할 수 있겠죠?이상훈 사원 디스플레이 재료 청주공장 생산팀에도 프로그래밍 기술이 활용되고 있습니다. 제품을 만들 때는 원재료마다 얼마큼의 성분을 넣을지 레시피를 작성해야 하거든요. 최근에는 이런 과정이 프로그램을 통한 자동 시스템으로 변화하고 있습니다. 이 프로그램을 개발하는 프로젝트 그룹이 따로 만들어졌고, 관련 계열사와의 협업을 통해 작업이 진행 중입니다. 저도 새롭게 배우는 것이 많습니다. 컴퓨터, 프로그래밍 등 IT 관련 기술의 중요성이 커지고 있으니 관심을 가져보세요.LG화학, 입사 후도 궁금해요!광학 품질팀, 디스플레이 재료 생산팀에 꼭 필요한 직무 역량이 있다면 무엇일까요?이상훈 사원 얼마 전, 기술적인 서비스 문제로 고생한 적이 있습니다. 기술적으로 발생하는 문제는 해결하기가 무척 까다롭습니다. 기존의 해결책으로 쉽게 풀리는 문제도 있지만, 아예 처음 접하는 낯선 문제도 발생하거든요. 이런 상황에서는 하나부터 열까지 테스트하고, 대전기술연구원으로 출장을 다니면서 직접 실마리를 찾아야 합니다. 하지만, 포기하지 않고 매달려서 기술적인 문제의 원인과 해결책을 찾아내면 정말 큰 성취감을 느낄 수 있습니다. 발생하는 문제에 일희일비하지 말고 강한 도전 의식을 유지하는 게 가장 필수적인 직무 역량이라고 느꼈습니다. 끈기와 패기가 있다면, 이미 LG화학에 도전하실 자격을 갖춘 분입니다.성화경 사원 무엇보다 필요한 것은 책임감이 아닐까 합니다. 입사 후 얼마간은 맡은 바 일을 처리하느라 업무에 대해 깊은 고민을 하지 않았습니다. 하지만 연차가 쌓일수록 불량 해결, 손실의 최소화에 대해 강한 책임감을 느끼게 되었습니다. 주인의식을 가지고 일하면서부터 업무 효율도 올라가고, 핵심성과지표(Key Performance Indicators, KPI)로 확인하는 업무 성과도 눈에 띄게 좋아졌습니다. 또, 책임감을 갖고 일할 때는 성취감과 만족감도 덩달아 커져 회사 생활도 즐거워집니다. 책임감이 강한 분이라면 LG화학에서 즐겁게 일하실 수 있을 거예요. 입사 후 특히 보람과 성취감을 느꼈던 때는 언제인가요?성화경 사원 현재 데이터를 활용하는 품질관리 프로그램을 개발 중입니다. 이는 정확한 불량 판정을 하기위한 프로그램으로, ‘딥러닝 모델’이라고 불리는데요. 저도 내부 품질관리를 맡게 되면서 본격적으로 이 프로젝트에 참여하고 있습니다.현재는 불량제품의 사진을 통해 제품상태를 체크하고, 불량일 경우 프로그램이 자동으로 어떤 불량인지 판정해 정보를 제공합니다. 그 동안 기존 불량품의 사진 데이터를 모으고, 측정 작업에 관한 지시서를 배포하는 등 까다로운 일들이 많았습니다. 그래서 특히 이 프로젝트에 보람을 느끼고 뿌듯했습니다.이상훈 사원 17년 말, 처음으로 ‘스펙인’을 경험했습니다. 고객사가 원하는 컬러 스펙을 제시하면 저희 기술파트에서는 그 스펙에 맞는 제품을 개발합니다. 고객사가 개발된 제품이 합당하다고 판단하면, 비로소 양산 단계로 넘어가는데요. 이 때 ‘스펙인’되었다고 합니다. 하지만, 최근 중국이 내수시장 활성화에 초점을 맞추면서 LCD 시장이 좁아지고 ‘스펙인’도 점점 까다로워지고 있습니다. 또, 최선을 다해 만든 제품도 온도, 시간, 기기의 차이 등 다양한 변수에 의해 불량이 되곤 하죠. 그래서 최근 경험한’스펙인’은 더욱 짜릿했습니다. 여러 시행착오 끝에 얻은’스펙인’ 소식에 그간의 피로가 한 번에 풀렸습니다. 사원으로서 새로운 목표가 있는지 들어보고 싶습니다.이상훈 사원 그 동안 업무에 적응하고 여러가지를 습득하느라 저만의 시간이 부족했어요. 작년까지만 해도 자기계발에 손을 대지 못했는데, 올해는 업무, 업무 외를 가리지 않고 무엇이든 배우려고 합니다. 먼저 인문학, 언어 등 다양한 강의를 제공하는 LG화학 사내 프로그램을 통해 스페인어와 영어 강의를 신청했습니다. 세계에서 가장 많이 쓰이는 스페인어는 기본적인 회화를 할 만큼, 영어는 유창한 대화를 나눌 만큼 공부하고 싶습니다.성화경 사원 LG화학에는 품질관리에 대한 전문적인 교육과 테스트, 과제 해결로 자격증이 부여되는 제도가 있어요. 그중에서 품질관리에 대한 통계 교육인 GB(Green Belt) 과정을 모두 수료하면 딸 수 있습니다. 저는 이미 GB시험을 통과하고 다음 단계인 BB(Black Belt) 시험에도 통과한 상태입니다. 올해는 과제를 완료해서 BB 과정을 마치고, 교육을 통해 배운 통계를 업무에 제대로 활용해보고 싶습니다. 오창공장과 청주공장의 자랑거리가 있다면?성화경 사원 오창공장에는 전기자동차 배터리를 생산하는 전지사업부가 자리하고 있습니다. 그래서 업무에 필요할 때면 전기차를 대여해 사용할 수 있습니다. 업무용이라면 임직원 누구라도 신청해서 사용할 수 있습니다. 충전기, 충전시설도 갖춰져 있고요. 일할 때라면 언제라도 빌려 탈 수 있는 친환경 자동차, 오창공장만의 명물이겠죠?이상훈 사원 청주공장에는 천연잔디 구장이 있습니다. 사내 축구동아리도 있기 때문에 축구를 좋아하시는 분들이라면 주말마다 천연잔디 구장에서 마음껏 축구를 즐길 수 있습니다. 또한 최근 청주공장에는 직원들을 위한 오락, 휴게시설이 다양해지고 있어요. 새롭게 단장해 쾌적해진 카페테리아와 새롭게 마련된 다트 게임장 등 청주공장 안에서도 재미있는 즐길 거리가 많답니다.LG화학, 용기를 갖고 도전하면 열린다!취업을 준비하고 있는 후배들에게 조언 한마디 부탁 드릴게요.이상훈 사원 저도 역시 많은 회사에 이력서를 넣어본 경험이 있습니다. 많은 이력서를 넣을수록 많은 탈락 소식을 받게 됩니다. 당연한 일인 줄 알면서도 자신감을 잃고 힘들어하곤 했습니다. 하지만 순간의 아픔을 빨리 털어버리고, 스트레스를 관리하면서 열심히 준비한다면 반드시 좋은 결과가 있을 겁니다. LG화학은 주인의식을 가진 열정적인 청년을 반드시 알아봅니다! 파이팅!성화경 사원 다른 회사 면접에 갔을 때, 면접관이 저만 빼놓고 질문을 던진 적이 있어요. 정말 서러웠는데, 마음을 다잡고 도전한 끝에 LG화학이라는 좋은 터전을 만났습니다. 준비된 열정과 참신함이 있다면, LG화학은 문을 활짝 열어줍니다. 용기를 갖고 도전해보세요. 꼭 좋은 결과 있으시길 빕니다!LG화학 선배 두 분으로부터 자기소개서 꿀팁, 면접 비결 그리고 입사 후 회사 생활에 대해서 들어보았습니다. LG화학 입사를 꿈꾸는 여러분들, 궁금증이 조금 풀리셨나요? LG화학 2019년 상반기 채용에 도전하시는 여러분 모두에게 좋은 결과 있으시길 진심으로 기원합니다.#LG #LG그룹 #LG화학 #공채정보 #직무정보 #기업문화 #채용꿀팁 #구성원인터뷰 #선배의조언
조회수 4876

트렐로와 슬랙 함께 쓰기

8퍼센트 컨플루언스에 올렸던 내용을 외부용으로 정리해서 다시 올린다.8퍼센트에서는 슬랙과 트렐로를 함께 사용하고 있다. 슬랙은 이제 쓰지 않는 스타트업을 찾기 힘들 정도로 대중적인 커뮤니케이션 도구가 되었다. 트렐로도 소규모 팀의 프로젝트 관리에 항상 손꼽히는 도구 중 하나이다.슬랙은 좋은 커뮤니케이션 도구지만 프로젝트 관리라는 목적에는 당연하게도 적합하지 않다. 해야 할 일들을 정리해두고, 우선순위를 할당하고 프로젝트의 상황을 시각화 하기에 "대화창"은 부족하다. 그래서 우리는 트렐로를 사용한다. 하지만 도구가 늘어나게 되면 항상 그 도구 사이의 역할 구분과 인터페이스를 고민해야 한다.도구간의 인터페이스는 최대한 간단해야 한다. 슬랙을 통해서 누군가가 프로덕트팀에 일을 요청한다고 해보자. 이 일감은 요청자 혹은 담당자가 프로젝트 관리 도구에 등록해야 한다. (지라의 경우 이슈, 트렐로라면 카드) 그리고 일감을 등록할 때 지난 대화들을 정리해서 기록해 주어야 한다. 노력이 많이 들어가는 일이다. 내가 하고 싶지는 않고 누군가가 해주었으면 하는 바람이 생긴다. 특정일을 위한 노력이 많이 들수록 실제로 그 일이 일어나기는 힘들어진다. 다시 말해 일감을 등록하기 위해 많은 노력이 필요할수록 일감은 관리되지 못한다.회사에서 트렐로를 사용하기로 결정 했을 때에도 간단한 인터페이스를 찾아보았지만 찾지 못했다. 그래서 Slash commands를 사용해서 직접 만들어서 사용했다. 기능은 간단하게/trello add 통계 페이지의 투자 금액을 원단 위가 아닌 백만 원 단위로 보여주고 싶어요.명령을 슬랙에 입력하면 프로덕트팀의 트렐로 보드에 카드를 등록해 주는 것이다. 슬랙을 떠나지 않고 해야 할일을 등록할 수 있는 것만으로 편했다. 하지만 프로덕트팀뿐만 아니라 다른 팀들도 슬랙을 통해 카드를 등록하기를 원했고, 또한 프로덕트팀 내에서도 보다 적절한 보드에 카드를 등록하기를 원했다. 조금은 불편하지만 일단 한쪽에 등록하고 주기적으로 카드를 정리하는 방식으로 사용했다.그러다가 얼마 전 슬랙 App Directory 에서 Trello Integration 을 찾았다. (나는 주기적으로 재미있는 슬랙 앱들을 찾아본다) 예전에 검색했을 때에는 트렐로의 변경사항을 슬랙으로 알려주는 것만 있었던 것 같은데 이 새로운 녀석에는 내가 원하던 기능들이 구현되어 있었다. 예전부터 있었는데 내가 못 찾았었던 건지 (그런 것이라면 억울하다!) 아니면 최근에 새로 생긴 것인지는 모르겠다. 설명을 읽어보면 다음과 같은 기능을 제공한다.슬랙에서 "/trello add" 명령을 통해 보드에 카드를 등록할 수 있다.트렐로 카드와 보드에 참가할 수 있고, 듀데이트 변경, 대화 등록등 여러가지를 할 수 있다.채널에 @trello 를 초대하면 URL을 복붙 했을 때 카드와 보드에 대한 프리뷰를 볼 수 있다.슬랙 팀 멤버를 트렐로 팀과 보드에 원클릭으로 초대할 수 있다.야호! 이거다!당장 사용해보기로 했다. 최초로 "/trello" 명령을 사용하면 슬랙과 트렐로의 계정을 연결하게 된다.계정을 연결한 후 "/trello help" 명령을 입력해 보면 다음과 같은 기능들을 볼 수 있다.항상 시작은 우리의 친구 "help" 다위 명령들이 실제로 어떻게 사용되는지 감을 잡기 위해 가상의 시나리오를 만들어서 하나씩 끼워 맞춰 보자.8퍼센트에서 Open API를 만들기로 결정했다. (개인적으로 내가 하고 싶은 일이다)1. 새로운 프로젝트가 시작된다. 프로젝트 리더는 새롭게 트렐로 보드를 하나 생성한다. 이 보드의 이름을 "오예"라고 하자. ('오'픈 '에'이피아이라서 그렇다) 그리고 적절하게 리스트를 만들어 둔다. 보통 할일, 하고 있는 일, 완료된 일의 구분을 사용한다.2. 이 프로젝트에 대한 내용을 논의할 슬랙 채널도 하나 판다. 이 슬랙 채널을 "#openapi"라고 하자.3. "#openapi"에서 카드를 등록하면 "오예" 보드로 등록되기를 원한다. 그렇다면/trello link 오예를 입력해서 슬랙 채널과 트렐로 보드를 연결한다.4. #openapi"에서 등록된 카드는 "오예" 보드의 "할 일" 리스트로 가기를 원한다. 그렇다면/trello set-list를 입력해서 "할 일" 리스트를 선택해 준다. 여기까지 하면 프로젝트를 시작하기 위한 준비가 완료된다.이제 프로젝트가 시작되었다.5.  사람들이 슬랙 채널에서 할 일에 대한 이야기를 나눈다. "채권 리스트를 API를 통해 제공하면 좋겠다"라는 주제로 이야기가 진행되어 개발하기로 결정했다./trello add 채권 리스트를 API를 통해 제공하기명령을 통해 카드를 등록한다.할일이 등록되었다. 신난다.6. 그리고 언젠가 일을 진행할 때 지금의 대화를 기록해 두는 것이 좋을 것 같으니 "Attatch Conversation"을 눌러 둔다. 카드의 설명에서 지금의 대화로 가는 링크가 저장된다.이 일을 누가 시킨것인지 왜 시킨것인지는 대화를 읽어본다.7. 누가 하는 것이 좋을까? 이야기를 나누다가 역시 만만한 내가 하는 것이 좋겠다고 한다./trello assign @hosung을 통해 담당자를 지정한다.8. 담당자까지 지정했으니 언제까지 이 일을 끝낼 것이지를 정해야 한다./trello set-due next Friday at 5pm으로 다음 금요일 5시까지 한다고 정해 둔다.이런 식으로 일감 등록이 완료된다. 실제 개발을 진행 한다.9. 중간중간 대표님이 업무의 진행 상황이 궁금하실 수 있다. 슬랙 채널에 카드의 내용을 보여주기 위해서는 카드의 URL을 복사한 후/trello https://trello.com/c/w7hrzCUa/1-api명령을 사용한다. 그리고  "어떻게 되어가고 있나요?"라고 물어본다. 물론 좀 더 간단하게/invite @trello를 해서 트렐로 봇을 "#openapi" 채널에 초대해 두면 트렐로 커멘드 없이 "https://trello.com/c/w7hrzCUa/1-api"와 같은 URL을 입력하는 것만으로 카드에 대한 프리뷰를 볼 수 있다.10. "어떻게 되어 가고 있나요?"라는 대표님의 질문에 내가 "문제없이 잘 진행되고 있어요."라고 답하면 대표님은"/trello comment 잘 진행되고 있다고 했음(두고 보겠음)"명령을 사용해 트렐로 카드에 코멘트를 등록해 둘 수도 있다.위 시나리오를 살펴보면 슬랙을 떠나지 않고 트렐로에 카드를 등록하고 필요한 정보를 업데이트했다. 물론 이 일 모두는 트렐로에서 크게 불편하지 않게 할 수 있다. 하지만 대화의 콘텍스트를 잃지 않고 일감 관리를 즉시, 적은 노력을 할 수 있다는 것, 그리고 트렐로에 대한 작업들이 슬랙에서 공유가 된다는 것은 생각보다 큰 장점이다.슬랙에서 논의된 내용을 나중에 정리해서 트렐로 보드에 등록해야지 라고 생각했는가? 이제는 그러지 말자. 일단 Trello Integration을 설치해보자.아마 우리 팀 보다 트렐로와 슬랙을 더 잘 쓰는 팀들이 있을 것이다. 이 글을 읽고 조금이라도 도움이 되신 분들은 우리 팀을 위해 하나의 팁을 남겨주면 좋겠다. 그리고 특히 트렐로 비즈니스를 쓰시는 분들은 슬랙과의 추가 기능들을 더 쓸 수가 있는데 후기를 들려주시면 좋겠다.#8퍼센트 #에잇퍼센트 #스킬스택 #트렐로 #Trello #슬랙 #Slack #협업 #협업툴 #팀워크 #협동 #팀플레이
조회수 945

초기 스타트업이 꼭 해야되는 집착 2가지

1) 고객 집착계속 고객한테 물어보고 그들이 원하는 걸 직접 들어봐야된다. 전화로 같이 떠들어야한다. 말은 쉽지만 생각보다 행동은 쉽지 않다. 근데 고객도 어떤 부분에선 그들도 자기가 뭘 원하고 있는지 모르고 있는 점도 있어 그들 말 속에서 어떤 욕망의 종류를 가지고 있는지 메슬로를 생각하며 끊임없이 딥하게 들어가야된다. 그리고 추상적으로 표현하는 건 계속 세그먼트 해가면서 재질문을 던진다. "좋은 것 같아요. 편한 것 같아요"같은 피드백은 인사이트가 없다. 좋다를 뭐라고 정의내리고, 편한 건 그들에게 있어서 정의가 무엇인지 아주 잘게 쪼개서 다시 질문한다. 이를 회사 차원에서 무엇을 실험해볼 수 있을지 생각해야된다. 이런 행위를 초기에는 많이 해야되는데(하는 행위는 스테이지가 올라가더라도 지속되지만 방법이 데이터 위주로 확인하고 정량적인 부분으로 A/B testing > mesuring > learning이 많아진다.) 고객이랑 친분이 없는 상태서 하면 귀찮게 하는 것 같고 짜증나니깐 처음 고객이랑 접점이 생기면 친구부터 되야한다. 고객은 첫 CS접점에서 친구처럼 느끼는 포인트들이 자주 생겨야한다. 이와 관련되서는 샤오미 얘기를 다룬 참여감이라는 책을 참조.2) 마케팅 집착마케팅 집착은 곧 회사 스테이지 별로 집착의 개념이 달라진다. 초기에는 무조건 프로덕에 집착해야된다. 위대한 제품을 만들기전까지 마케팅 개념을 외부에서 찾으면 안된다. 계속 제품안에 마케팅을 집어넣고 넣고 넣고 넣을대로 넣었다고 생각해도 또 넣고 위대하게 만들어야된다. 그 지표는 바이럴 지표다. 주변에 고객들이 아주 신나게 떠들어대고 추천하는 지표를 추적할 수 있는 고민과 방법을 조직은 가지고 있어야한다. 보통 실수를 범하는게 mvp 수준에서 얼핏 market fit 찾았다고 생각하고 sns 스폰 돌리거나 외부 마케팅을 급하게 진행한다. 또는 조금 스테이지에 있는 초기 기업은 기존 고객은 돌아가는 것처럼 보이니 신규 고객에 혈안이 된다. 투자도 받았겠다. 돈 쓰니 고객도 오겠다. 그렇게 착각에 빠져 점점 내부는 썩어간다. 보통 MVP를 만들어서 수정해서 그저 더 나은 MVP정도를 만들고 외부 마케팅을 시작하는 것이다. 근데 거기서 부터가 망하는 지름길이다. 그 다음은 MLP(minimum lovable product)를 만들어야한다. 여기까지도 많은 회사가 하지는 않는 것 같다. 근데 사랑받을 수 있는 수준도 사실 부족할 수 있다. MLP를 넘어 MGP (minimum greatable product)까지 하고 난 뒤 마케팅은 외부 영역으로 고민할 때다. 여기서부터 스케일업을 고민해야된다. 그때까지는 절대 외부 마케팅을 생각지도 못하게 위대한 프로덕에만 집착하도록 조직을 집중 또 집중시켜야된다.PPL. 페오펫에서는 위대한 개발자, 디자이너, 마케터를(CMO) 모시고 있습니다. 커피 한잔 하실 분은 연락주세요. 펫 산업에서의 완벽한 A to Z 수직 계열화를 꿈꿉니다. 한국에서 가장 밀도있는 생애주기 데이터를 압도적으로 쌓고 활용하는 데이터 플랫폼이 될 것입니다. #페오펫 #peopet #아이디어기업 #기업문화 #목표 #비전 #각오 #팀빌딩
조회수 2365

SQLAlchemy의 연결 풀링 이해하기

안녕하세요. 스포카 프로그래머 김재석입니다.SQLAlchemy는 파이썬 데이터베이스 툴킷으로는 가장 독보적인 수준으로 우아한 기능을 제공하고 있어 많은 사람이 애용하고 있습니다. 스포카에서도 파이썬 프로젝트인데 데이터베이스에 접근해야 한다면 필수로 이용하고 있죠.오늘은 SQLAlchemy의 연결 풀에 대한 기본 개념과 실전에서 연결 풀링과 관하여 알면 좋을 여러 이슈에 대해 다뤄보고자 합니다.연결 풀링 개념연결 풀링은 차후에 발생할 데이터베이스 요청에 대비하여 데이터베이스 연결을 캐싱하는 기법입니다. 빈번한 데이터베이스 요청이 여러 사용자에 의해 발생할 때, 매번 연결을 생성하고 닫는 과정을 반복하면 이에 대한 비용이 크기 때문에 이 기법을 사용하여 연결 생성 과정을 줄일 수 있습니다. 짧은 요청이 빈번하게 발생하는 웹 서비스와 같은 형태가 연결 풀과 궁합이 잘 맞습니다.SQLAlchemy의 기본 풀: 큐 풀(QueuePool)SQLAlchemy 역시 연결 풀을 기본적으로 채택하고 있는데, 그중 기본으로 제공하는 것은 큐 풀(QueuePool)입니다. 큐 풀은 설정된 pool_size와 max_overflow를 바탕으로 복수의 연결 풀을 구성해서 운용합니다. SQLite를 제외한1 모든 데이터베이스에서 기본값으로 이용하므로, 이 글에서는 큐 풀의 관리 방법을 주로 다루도록 하겠습니다.큐 풀의 생애주기큐 풀이 처음부터 연결을 미리 만드는 것은 아닙니다. 일단 0개로 시작합니다.요청이 들어올 때, 큐 풀에 유효 연결이 없으면 하나 생성합니다.설정된 pool_size까지는 더 연결이 필요하지 않은 상황이라도 연결을 종료하지 않습니다.요청이 들어올 때, pool_size까지 다 찼다 할지라도 유효 연결이 없으면 초과하여 하나 생성합니다.4번 이후부터는 오버플로 상황이기 때문에, 큐 풀은 적극적으로 오버플로를 방지하기 위해 새로 들어오는 연결을 종료하여 pool_size에 총연결 수를 맞춥니다.QueuePool이 관리하는 연결이 pool_size + max_overflow까지 다 찬 상황에서 요청이 들어오면, 일단 기다리게 합니다. 기본값으로는 30초를 기다립니다.30초를 기다려도 반환되는 연결이 없다면 TimeoutError 예외를 발생시킵니다.적절한 큐 풀 설정값서비스가 작을 때는 기본값이면 충분하지만, 서비스 사용량이 많아지고 규모 문제가 발생하게 된다면 설정을 현재 상황에 맞춰 바꿔주는 게 좋습니다. 보통 QueuePool 관련 위 언급한 2가지 값(pool_size, max_overflow)을 바꿔주는 게 좋은데 기본값은 5, 10입니다.pool_size: 현재 구성에서 연결 생성 부담을 최소화할 수 있는 가장 작은 값이 되어야 합니다.max_overflow: 현재 구성에서 데이터베이스, 웹 인스턴스가 물리적으로 버틸 수 있는 최댓값이 되어야 합니다.pool_size가 과하게 설정되어있으면 데이터베이스 입장에서 너무 많은 연결을 점유하고 있으니 비효율적입니다. 그렇다고, 너무 적게 설정한다면 오버플로가 자주 발생하여 풀링으로 얻을 수 있는 효율을 누리지 못합니다. 즉, 파이썬 측에서 비효율적입니다.max_overflow가 데이터베이스나 웹 인스턴스의 한계치보다 너무 빡빡하게 잡혀있으면 조금만 사용자 유입이 늘어도 TimeoutError를 쉽게 만나거나 서비스 속도 저하를 자주 경험하게 됩니다. 그렇다고 무한으로 두면 사용량 폭증시 이해할 수 없는 에러 파티를 경험하게 될 것입니다. (데이터베이스나 파이썬 앱, 혹은 둘 다 드러눕습니다.)결국 서비스마다 그만의 퍼포먼스와 장비 한계치가 있으니만큼 내부에서 스트레스 테스트를 통한 벤치마킹으로 적정 값을 뽑아내는 것을 추천합니다.큐 풀 관하여 자주 밟는 문제개발할 때는 문제가 없었는데, 상용 서버를 띄우면 수분 이내로 서버가 TimeoutError 예외를 발생하며 응답을 안 합니다.SQLAlchemy 쓰는 서비스를 만들어서, 개발 잘 하고 배포했는데 프로덕션에서 잠깐 잘 돌더니 TimeoutError를 내뱉으며 픽픽 죽어버리는 경험을 많이 하는 것 같습니다. 이 에러 자체는 Session이 큐 풀에 연결을 받기 위해 기다리다가 못 참고 TimeoutError를 내는 것인데요. 위의 생애주기 기준, 7번에 해당하는 상황이죠. 큐 풀의 timeout 기본값은 30이니까 30초 동안 풀의 모든 연결이 점유된 상태에서 아무것도 받지 못한 상태가 된 것이라고 보시면 됩니다.위와 같은 경험이라면 서비스 사용량이 폭증하는 쪽보다는 십중팔구 기존에 점유한 Session에서 제대로 연결을 반환해주지 않아서 발생하는 문제입니다. 특히 웹서비스라면 Flask 등에서 요청 시마다 Session이 연결을 불러다 써놓고 Pool에 돌려주는 일을 빼먹는 실수가 잦은데, Flask를 쓰고 계신다면 Flask-SQLAlchemy 등을 쓰셔서 생애주기 관리 자체를 타 라이브러리에 위임하시거나, 현재 구조상에서 요청이 끝나는 시점에 맞춰 session.close()를 적절히 호출해주시면 됩니다. (사실 Flask-SQLAlchemy가 해주는 것도 딱 이 수준입니다.)어느 날 갑자기 연결이 왕창 늘어버렸어요.역시 웹서비스 개발하다보면 발생하는 이슈입니다. SQLAlchemy를 쓰면 Session 활용을 암시적으로 하게 될 때가 많습니다. Session이 실제로 요청을 보내는 시점에서야 연결을 시도하기 때문에, 예상치 못한 기능 변경으로 연결 폭증을 겪는 것인데요. 제가 자주 본 것은 Flask의 생애주기중 before_request 구현에서 데이터베이스에 접근하는 것입니다.본래 데이터베이스 연결이 필요한 엔드포인트에서만 접속이 발생하던 것이, before_request에 붙으면서 모든 엔드포인트가 데이터베이스 연결을 하게 되면 사용량이 폭증하기 쉽게 되는데요. 이처럼 전역적인 영역에서 DB 접근을 하는 시나리오를 최소화하는 정책으로 실수를 완화할 수 있습니다.마치며SQLAlchemy의 연결 풀의 동작 방식을 이해하면 상용 서비스를 운영할 때 발생하는 데이터베이스 부하 문제를 진단하고 해결하는 데 많은 도움이 됩니다. pool_size와 max_overflow의 적정값은 서비스에 따라, 인프라의 사양에 따라 다르므로 이를 잘 파악하여 효율적으로 연결 풀이 운영될 수 있도록 세팅하는 것을 추천합니다.연결 풀을 관리하는 방법으로는 SQLAlchemy내의 기본 큐 풀을 쓰는 것 외에 Pgpool-II과 같은 미들웨어를 연결하는 안도 있습니다. 추후 이에 대해서도 다루어보도록 하겠습니다.SQLAlchemy 0.7부터 SQLite 같은 파일 기반 데이터베이스에서는 기본적으로 NullPool을 채택합니다. 파일 기반 데이터베이스에는 네트워크 연결이 일어나지 않기 때문에, 연결 비용이 적기 때문입니다. NullPool은 이름에서 알 수 있듯이 연결 풀을 유지하지 않고2 풀에 연결이 들어오는 즉시 폐기합니다. ↩큐 풀의 pool_size를 0으로 하는 것과 같다고 착각할 수 있으나, 큐 풀은 pool_size가 0일 때 pool_size가 무한대인 것으로 인식합니다. 따라서 풀을 만들지 않으려면 NullPool을 쓰는 것이 적절합니다. ↩#스포카 #개발팀 #개발자 #인사이트 #업무일지 #후기

기업문화 엿볼 때, 더팀스

로그인

/