스토리 홈

인터뷰

피드

뉴스

조회수 1340

[줌인한샘인] 한샘 신입사원 공채 OJT 우수사원 이강우사원을 만나다~!

< 한샘 신입사원 공채 OJT 우수사원 이강우사원을 만나다~! >  한샘에서 일하는 사람들은 어떤 사람들 일까요?그리고 그 사람들은 무슨 일을 할까요?한샘의 신입공채 OJT 우수사원 이강우 사원과의 인터뷰를 통해한샘에서 어떤 일을 하는지 알려드릴게요 :)  * 고객감동 OJT란?영업현장에서 고객과의 만남을 통해 시장을 이해하는 육성과정경영자 후보로서 리더십을 경험하고 조기에 경영자가 될 수 있도록 특진에 도전하는 육성과정 신입공채 OJT 우수사원 제조본부 구매팀 이강우 사원과의 인터뷰Q. OJT 기간 동안 우수한 성적으로 SM업무를 무사히 마치고현업에 배치되신 이강우 사원, 줌인한샘인에 선정되신 것을 축하 드립니다.우선 SM이 어떤 일을 하는지 사람들이 잘 모르는 것 같습니다.SM의 업무에 대해 소개 부탁드릴게요. A. 우선 OJT우수자로 선정되어 매우 기쁘고 영광스럽습니다.SM이란 Shop Manager로서,매장 운영에 필요한 전반적인 것을 계획부터 실행까지 책임지는 매력적인 직무 입니다. 매장과 관련된 모든 사람의 니즈를 파악하고 부족한 점을 개선하면서한샘 부엌영업의 전체적인 흐름을 이해할 수 있는 일입니다.  Q. OJT를 하면서 어떤 것을 느끼셨나요? SM업무를 한 것이 현업에서 어떤 도움이 될까요?A. 첫 번째로 모든 일에 있어 제일 중요한 것은‘고객’이라는 것을 느꼈습니다.또 하나는 환경의 중요성 입니다.좋은 결과가 있으려면 일을 잘 할 수 있는환경을 만들어 주는 것이 중요하다는 것을 느꼈습니다.구매팀에서는 SM업무를 하면서 느꼈던 고객과 환경에 대한 이해가 많은 도움이 될 것 같습니다. Q. 업무를 잘 하기 위해서 이강우 사원만이 가진 특별한 비법이 있다면 공유해주세요.A. 다른 분들과 마찬가지로 특별한 비법은 없다고 생각합니다.다만 업무를 할 때 제일 우선으로 생각한 것은 빠른 피드백입니다.또 SM업무를 하면서 일, 주, 월 단위 목표를 설정하고달성 현황과 원인 분석을 하는 습관을 가지게 됐습니다.목표달성의 재미를 느낄 수 있었고, 원인분석을 통해 문제점을 파악하게 됐습니다.  Q. 어려움이 있었을 땐 어떻게 극복했나요?A OJT기간동안 저를 담당하셨던 이범우 차장님이 많이 도와주셨습니다.목표의식, 환경, SM으로서의 마인드 등 모든 면에서 제게 큰 영향을 주셨습니다.또, 어려움이나 고민이 있을 때 회사 선배님들과 멘토이신 제조본부 구매팀 박상혁 대리님,동기들이 많은 도움을 주었습니다.Q. 중국에서 오랫동안 생활했다고 들었습니다.가장 크게 느껴지는 중국과 한국의 문화적인 차이점 또는 비즈니스적인 차이점이 있나요?A. 네, 저는 초등학생 때부터 2008년 까지 북경에서 생활을 했습니다.‘빨리빨리’문화를 가진 한국사람들은 중국사람과 일을 하면 속이 터진다고 하지만현재 엄청난 속도로 발전하면서 많이 빨라진 상태라고 생각합니다.한국사람들은 의리를 지키고 손님우대를 중요시 합니다.하지만 중국사람들은 좀더 과하게 하는 것이 특징이죠.생일파티나 비즈니스 접대에 있어서는과하다 느낌이 날 정도로 많은 양의 접대를 하는 것이 예의라고 생각합니다.  Q. 한샘이 중국에 진출할 때 어떤 점을 보완하면 좋을까요? A. 중국이 워낙 큰 나라라 각 지역마다 문화적으로 차이점도 많습니다.북쪽은 호탕하면서 믿음직한 느낌, 남쪽사람들은 배신을 자주하며자기 이익을 위해 잔머리를 쓴다고들 합니다.그들의 문화와 역사를 잘 이해한 중국 진출로그들에게 친근하고 머물고 싶은 한샘이 되었으면 합니다.  Q. 경험에서 우러나온 이강우 사원의 답변 잘 들었습니다.마지막으로 이강우 사원의 목표가 궁금해지네요.A. 단기적 목표는 한샘의 구매업무를 습득하여 제가 맡은 아이템의 전문가가 되는 것입니다.중기적으로는 중국 해외소싱의 길을 여는 것입니다.장기적으로는 이미 진출해 있는 북경 한샘의 업무를 맡아 중국시장을 넓히고,세계적인 한샘의 선두자가 되어보고 싶습니다. 한국에서 새로운 사람들을 만나고 많이 배워서저의 장점인 중국생활에서 얻은 경험을 살려 한, 중을 잇는 유명한 CEO가 되고 싶습니다.   아직 한국어 작문이 서툴다며 부끄러워하면서도공장에서 정말 성실하게 인터뷰에 답변해 준 이강우 사원,덕분에 이번 줌인한샘인이 더 풍성해진 것 같아요.세계적인 한샘을 위한 든든한 인재,이강우 사원의 활약이 너무 기대돼요. 여러분의 격려와 박수 부탁드립니다~!작성자 한샘#한샘 #줌인한샘인 #한샘인 #한샘신입공채 #신입공채 #고객감동OJT #한샘OJT #사원 #인터뷰 #기업문화 #조직문화 #신입사원인터뷰
조회수 1072

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

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

스푼 라디오 재입사자 Esther를 소개합니다

스푼을 만드는 사람들 일곱 번째 이야기유일하게 마이쿤(스푼 라디오)에 재입사를 한 UX/UI팀 디자이너 'Esther' 를 소개하고자 한다.같은 회사에 두 번 입사했다고요? 실화예요?(이 세상엔 정말 불가능한 일은 없나 봅니다)"하하, 네 맞아요. 저는 대학생 때 마이쿤에서 6개월간 인턴생활을 했었고, 2년 후인 2018년에 다시 입사를 하였습니다. 그리고 현재는 근무한 지 8개월 차 되었습니다." 소주를 안고 있는 에스더사내 TOP 3 애주가 feat. Soju사내에서 손꼽히는 '애주가' 사실인가요?"글쎄요.. 하하, 먼저 술을 좋아하는 건 팩트입니다. 근데 회사에 저보다 술 좋아하고 잘 드시는 분이 훨씬 많은 걸로 압니다. 저는 원래 소맥을 가장 좋아했는데, 요즘은 맥주 쪽으로 기울고 있어요. 요즘 몸이 안 따라줘요 흑흑 그래서 술을 좀 줄이고 있는 편이에요." 에스더의 마스코트 머리'Esther' 당신이 궁금합니다.Q. 본인을 한 마디로 표현한다면?흑과 백 - "저는 스스로가 흑과 백이라고 생각해요. 어떤 의미냐면, 저의 처음 이미지와 가까워지고 나서의 이미지가 무척 다르거든요. 조용할 땐 굉장히 조용하지만 또 신나면 엄청나게 신난 모습도 볼 수 있어요. 그래서 스스로를 흑과 백이라고 생각합니다."(그만큼 숨겨진 매력이 많다는 걸로 이해하겠습니다)Q. 서울살이를 6년 차 삶은 어떤가요?"맞아요. 저는 원래 울산 토박이 출신이에요. 처음에 서울에 온 건 대학 입시 준비하면서 홍대 앞에 학원을 다녀야 해서 왔었어요. 아무래도 서울이 학원도 많고, 디자인 계열 업무를 하려면 서울에 와야 했거든요. 그래서 직장도 서울로 얻게 되었어요.무엇보다 가장 큰 이유 1. 문화생활 2. 음식 서울이 훨씬 다양하고 편하고.. 처음에 서울에 왔을 때 신기하면서도 스트레스를 받았던 건, 어딜 가나 사람이 너~무 많다는 거였어요. 예를 들면 금요일의 강남역?"※ 서울살이 하면서 가장 외로울 때 "19살 때, 입시 때문에 서울에 처음 단기로 왔을 때 고시원에서 머문 적이 있어요. 그때 너무 좁은 공간에서 아무도 모르는 데다가, 몸이 아플 땐 정말 서럽더라고요"Q. 원래 디자인을 좋아하고 잘하셨나요?"사실 저는 어릴 때부터 중학교 3학년 때 까지는 피아노를 쳤었어요. 근데 고등학교에 진학하고 나서 1학년 때 선생님께서 미술에 소질이 있다고 추천해주셨어요. 그래서 그때부터 입시를 준비하기 시작했어요. 그 후 디지털 미디어 디자인과에 입학을 했어요. 그리고 무엇보다 디자인 쪽이 저에겐 선천적으로 적성에 맞는 것 같다고 생각해요. 제가 좋은 사람들만 만나서 그런진 모르겠지만, 늘 재미있고 열심히 배울 수 있었어요" 당신의 회사생활이 궁금합니다Q. 재입사하게 된 계기를 자세히 듣고 싶어요"저는 원래 모션 그래픽 쪽으로 전문성을 키워나갈 계획이었는데, 저와는 맞지 않는 분야라고 생각이 들어서 UX/UI 쪽으로 진로를 바꾸다 보니 학교를 1년 더 다니게 됐었어요. 그때는 졸업 전시회만 준비하면 됐었기에, 경험을 쌓고자 인턴을 하고자 했었고, 그때 인턴으로 6개월 입사를 하게 되었어요. 그때 제가 정말 좋은 사람들과 일을 하고 있다고 느꼈고 인턴을 끝으로도 계속 팀원들과 연락을 하고 지냈었어요.후에 졸업을 하고 다른 직장에서 2년간 UX/UI 디자이너로 근무를 했었는데, 그곳에서도 함께 일하는 사람들은 정말 좋았지만 제가 날개를 필 수 없다고 느꼈었어요. 그러던 참, 이직을 고민하고 있었는데 감사하게도 먼저 스푼에서 제안을 해주셨어요. 인턴 때 이미 느꼈지만 스푼은 제 스스로가 성장할 수 가능성과 발판이 되는 곳이고, 좋은 사람들이 함께 하는 곳이라는 걸 알고 있었기에 다시 함께 하고자 입사를 했어요."Q. 다시 입사해보니 어때요?"여러 가지가 변화되었어요. 예를 들면, 분위기가 많이 바뀌었어요. 예전에 소수의 인원에서 정말 많은 인원이 추가되다 보니 의사소통 방법도 달라졌고 무엇보다 근무 환경이 정말 좋아졌어요."Q. 에스더가 생각하는 좋은 디자이너란?1. 본인의 생각과 다른 외부적인 요인들이 조화롭게 잘 섞는 사람나의 것을 녹여내면서 확실한 시스템을 구축하는 것, 그게 정말 어렵거든요. 그런 면에서 UX/UI란 직군이 개성을 녹이기가 굉장히 힘든 직군이라고 생각해요. 그 밸런스를 잘 맞추는 디자이너가 좋은 디자이너가 아닐까 생각해봅니다.2. 의사소통을 잘하는 사람최대한 다양한 그리고 많은 사람들의 이야기를 귀담아들을 줄 알고, 나의 의견도 잘 낼 줄 아는 것이 중요하다고 생각합니다. 여러 다양한 인사이트를 얻을 수가 있거든요. Q. 부서 이동 에피소드를 듣고 싶어요."제가 다시 입사를 했을 때, UX/UI팀이 아닌 마케팅 소속으로 들어오게 되었어요. 사실 그때 정말 고민이 많았어요. 마케팅 디자인은 경험이 없었거든요. 마케팅팀 소속에서 다시 UX/UI팀으로 공석이 나서 부서를 이동했는데요. 저는 제가 마케팅팀에서 겪었던 경험이 정말 많은 도움이 되었고 앞으로도 될 거라고 생각해요. 마케팅 관점에서 디자인을 볼 수 있게 되었고, 새로운 인사이트를 얻는 시간이었거든요. 그 전에는 UX/UI 디자이너로서만 바라보았더라면 이제는 왜 마케팅 관점에선 무엇이 다른지 감을 익혔달까요? 무엇보다 두 팀 모두 좋은 분들이 계셔서 행복했고, 행복합니다."Q. 면접 볼 때 가장 중요하게 생각하는 점은?아무래도 저는 디자이너이다 보니, 포트폴리오를 가장 중요하게 생각하고요. 스토리텔링 능력을 봅니다. 자기만의 확고한 의지, 메시지가 있는 사람이야 말로 의도가 명확하고 똑 부러진 사람이라고 생각하거든요. 당신의 사생활이 궁금합니다Q. 마라탕 일주일에 몇 번 드시나요?Sunny 曰: "에스더와 런치메이트가 되면, 중경 마라탕을 먹으러 가는 날이라는 소문을 들었습니다. 그만큼 마라탕을 좋아하시는 걸로 알고 있는데.."Esther 曰: "저는 원래 중식을 좋아하는데, 원래 국물류 자체를 정말 좋아해요. 얼큰하고, 찌개 같은.. 그런 안주용(?) 자극적인 음식을 좋아해서요!" (그렇게 인터뷰 후 함께 마라미면을 먹으러 갔습니다)Q. '돼지'를 좋아하신다고요?"돼지 너무 귀엽지 않아요? 돼지 되게 매력 있는데.. 시판에 나온 돼지 캐릭터들은 뭔가 예쁘지 않은데, 사실 돼지는 정말 귀엽거든요. 제가 좋아하는 인형도 돼지인데 이 친구 이름은 '꾸꾸'라고 해요. 아! 그리고 저, 돼지고기도 좋아합니다.."Q. 울산이 노잼이라는 것에 동의하십니까?Sunny 曰: "제가 얼마 전 이 짤을 보았는데요. 확인 좀 해주시죠. 대전 VS 울산 노잼 도시.."출처: 원룸 만들기Esther 曰: "대체 이런 건 어디서 찾으시죠..? 음 저건.. 과장된 부분이 있다고 생각하지만, 동의하는 부분도 있어요. 서울이나 타 큰 도시에 비해선 문화 생활면에선 부족한 부분이 많은 것 같아요! 그래서 저는 앞으로도 서울이나 서울 외곽에서 쭉 살고 싶어요. 그리고 제 친구들도 다 서울에 있거든요. 그거 아세요? 울산은 밤 12시가 되면 진짜 모든 곳이 문을 닫아요.."Q. 앞으로의 계획이라던지 꿈이 있나요?"저는 원래 어릴 때 꿈은 선생님이었어요. 근데 어느 순간부터 애들을 예전만큼 안 좋아하더라고요. 현재로서는, 제가 감을 잃지 않는 이상은 디자인으로 무언가를 계속해나가고 싶어요. 진짜 나중에 디자인 관련 사업도 해보고 싶고요. 무엇보다 그저 좋은 사람들과 일하고 싶은 마음이 커요 앞으로도"UX/UI팀이 Esther를 한마디로 표현한다면?Nigel 曰: '조급 스더' -  내부 업직종 변경으로 인해 조급해 보이는 면이 있어서(앞으로의 해야 할 일로 보면 이제 겨우  10~20% 인데, 아직 가야 될 길이 많이 남았으니, 조금 천천히 가도 돼요. 지금도 아주 잘하고 계십니다^^)Mika 曰: '특 S급 인재' - 소주의 SMia 曰: '빵떡 어머니' - 빵떡이 캐릭터를 에스더가 만드셨기 때문에Simon 曰: '유고걸' - 유엑스에 대한 고찰이 깊은 여자 ㅎㅎ 자신의 일에 깊이 생각하고 고민하는 모습을 자주 볼 수 있습니다.
조회수 9266

AWS 비용 얼마까지 줄여봤니?

최근 들어 스타트업의 인프라는 DevOps의 유행과 함께 IDC에서 클라우드로 급속도로 이전해가고 있습니다. 많은 클라우드 업체가 있지만 그중에서도 Amazon Web Service (AWS) 가 가장 선호되고 있고 잔디도 AWS를 이용하여 서버 인프라를 구성하고 있습니다. 하지만 AWS 비용은 예상보다 만만치 않습니다. 잔디에서는 비용을 줄이기 위해 여러 가지 노력을 하고 있는데 이 글에서는 스케쥴링 기능을 이용하여 비용을 줄이는 방법에 대해 공유하도록 하겠습니다.AWS는 저렴한가?AWS는 ‘저렴한 비용’을 자사 서비스의 큰 강점이라고 홍보하지만 실제 사용해보면 막상 ‘과연 정말 저렴한가?’ 라는 의문을 가지게 됩니다. 여러 클라우드 업체의 비용을 비교한 리포트를 보더라도 AWS는 절대 저렴하지 않습니다. 오히려 클라우드 업체 중 가장 비싼 곳 중 하나입니다. 그렇다고 이제 와서 클라우드 업체를 옮기는 건 배보다 배꼽이 더 클 수도… (들어올때는 맘대로지만 나갈땐 아니란다.)예약 인스턴스? 스팟 인스턴스? 온디맨드?AWS에서는 제공하는 요금 할인 방법은 예약 인스턴스나 스팟 인스턴스를 이용하는 것입니다.예약 인스턴스는 계약 기간에 따라 최대 60%까지 저렴한 가격으로 이용할 수 있습니다. 하지만 정확한 기간과 수요예측을 하지 못한다면 잉여 인스턴스가 될 수 있습니다.스팟 인스턴스는 입찰가격을 정해놓고 저렴할 때 이용할 수 있습니다. 하지만 그때가 언제일지도 알 수 없고 인스턴스를 가져갔다고 하더라도 더 높은 입찰가격을 제시한 사용자에게 인스턴스를 뺏길 수 있습니다. 마치 KTX를 입석 티켓으로 빈 좌석에 앉아서 가다가 좌석 티켓 주인이 나타나 ‘내 자린데요?’ 하면 얄짤없면 좌석을 내줘야 하는 느낌입니다. 그때 느끼는 그 서러움은 느껴보지 못한 자는 알 수 없습니다.온디맨드는 사용한 만큼 할인 없이 비용을 지불하는 것입니다. 언제든지 필요할 때 사용하고 사용한 만큼만 과금되어 가장 적절해 보이지만 예약이나 스팟에 비해 역시나 비쌉니다. 비싸지만 현실적으로 가장 많이 사용됩니다.개발서버는 얼마 안쓰는데 좀 깍아줘!일반적으로 개발서버도 라이브와 같이 구성합니다. 고가용성은 고려하지 않더라도 아키텍쳐는 똑같이 구성하게 됩니다. 그리고 아키텍쳐가 복잡해질수록 구성하는 서버도 많아지고 언제부턴가는 개발서버도 비용을 무시할 수 없는 수준에 이르게 됩니다. 하지만 개발서버는 24시간 사용하지도 않고 업무시간에만 사용합니다. 이쯤 되면 한 번쯤 이런 생각을 하게 됩니다. ‘개발서버는 실제로 얼마 쓰지도 않는데 좀 깍아줘야 되는 거 아냐?’ 개발서버뿐만 아니라 정해진 시간만 사용하는 모든 서버들이 해당될 것입니다.EC2 SchedulerAWS는 이러한 원성(?)을 들었는지 EC2 Scheduler 라는 간단한 솔루션을 소개했습니다. 내용을 보면 설정된 시간과 요일에 자동으로 EC2 인스턴스가 자동으로 켜지고 꺼집니다. 하루 10시간 가용한다면 주말 제외 월~금요일만 작동시켜 비용을 70%나 절감할 수 있습니다.이대로만 된다면 왠만한 스팟이나 예약 인스턴스보다 더 저렴하게 개발서버를 이용할 수 있습니다. 하지만 이 솔루션을 그대로 도입하기에는 문제점들이 있었습니다.EC2 Scheduler 의 문제점EC2 Scheduler는 다음과 같은 문제점들이 있습니다.서버 아키텍쳐에 따라서 의존성이 있어 서버 실행 순서가 보장되어야 하는 경우가 고려되지 않는다.단순히 EC2 한두 대 띄워서 사용하는 게 아니고 훨씬 더 복잡한 서버 의존 관계를 가지게 됩니다. 예를 들어 DB -> Middleware -> API -> Batch 같은 관계가 있다고 한다면 의존관계에 있는 서버들이 순차적으로 실행되어야 합니다.스케쥴 시간이 UTC로만 작동한다.UTC로만 작동하기 때문에 시간 설정을 할 때는 항상 UTC 기준으로 변환해야 하는 불편함이 있습니다.스케쥴링의 예외적인 상황이 고려되지 않는다.평일이 공휴일인 경우에는 서버를 작동할 필요가 없고 평소보다 서버를 일찍 켜야 하거나 야근을 하게 되어 중지 시간을 변경해야 되는 경우에는 해당 일자에만 변경이 가능해야 했습니다.EC2에 대해서만 작동하도록 되어 있다.EC2보다 비싼 RDS도 최근에 Stop 시킬 수 있도록 추가되었습니다. Aurora는 미지원잔디의 서버 아키텍쳐는 훨씬 복잡하여 서버의 실행 순서가 맞지 않으면 정상작동을 하지 않기 때문에 1번은 반드시 해결되어야 하는 가장 치명적인 문제였습니다.AWS Instance SchedulerEC2 Scheduler의 문제점을 보안한 Instance Scheduler를 소개하겠습니다. EC2나 RDS 모두 하나의 서버를 Instance로 부르기 때문에 Instance Scheduler라 하였습니다. Instance Scheduler는 Serverless 아키텍쳐인 Cloudwatch + Lambda를 이용하여 구성되어 있습니다.작동방식Cloudwatch Event를 이용하여 Lambda를 함수를 실행시키고 Dynamo DB에 저장된 스케쥴 정보와 Instance의 Tag 값을 기반으로 RDS와 EC2를 조회하고 Instance를 시작하거나 중지합니다. 그리고 JANDI의 Incoming Webhook을 이용하여 토픽에 알림 메시지를 보내줍니다.Cloudwatch EventInstance Scheduler Lambda 함수를 작동시키는 트리거는 Cloudwatch Event를 이용합니다. 5분마다 작동시키도록 되어 있으며 각각의 사용 환경에 따라 변경할 수 있습니다.Cron 식 0/5 * * * ? *, 대상은 Instance Scheduler Lambda를 지정합니다.Dynamo DBDynamo DB에는 Schedule, Schedule 예외 설정, Schedule 서버 그룹에 대한 정보가 정의되어 있습니다.1. ScheduleSchedule 작동에 대한 기본 정보를 정의하고 있습니다.{ "ScheduleName": "Development", "TagValue": "Development", "DaysActive": "weekdays", "Enabled": true, "StartTime": "09:30", "StopTime": "22:00", "ForceStart": false } ScheduleNameSchedule 이름 입니다.TagValue적용 대상 Instance를 조회할 때 참조하는 Tag 값입니다. Instance를 Schedule에 적용 대상에 포함시키기 위해서는 해당 Instance의 Tag에 ScheduleName이라는 Key에 TagValue를 Tagging 하면 됩니다.DaysActiveSchedule 적용 요일입니다. 아래와 같은 옵션이 적용됩니다.all : 매일weekdays : 월~금mon,wed,fri : 월,수,금요일EnabledSchedule의 작동 여부입니다.StartTime, StopTime서버 시작 시간과 중지 시간입니다.ForceStartSchedule 강제 시작 여부를 나타냅니다. (Enabled 여부에 상관없이 작동합니다.)2. Schedule Server Group하나의 Schedule에는 N 개의 서버 그룹을 정의할 수 있고 각각은 먼저 실행되어야 하는 의존관계 서버 그룹을 정의하고 있습니다. 의존관계에 있는 서버 그룹의 Instance Status를 확인하여 시작 여부를 결정하도록 하였습니다. 그러면 의존관계가 없는 서버 그룹부터 시작하고 의존관계의 Depth 가장 깊은 서버 그룹은 가장 늦게 시작하게 되어 서버 실행 순서를 보장하게 됩니다.{ "Dependency": [ "GROUP1", "GROUP2", "GROUP3", "GROUP4" ], "GroupName": "GROUP5", "InstanceType": "EC2", "ScheduleName": "Development" } Dependency의존관계 서버 그룹 목록입니다.GroupName서버 그룹 이름입니다.InstanceTypeEC2와 RDS를 지원합니다.3. Schedule Exception공휴일이나 야근 등으로 인해 스케쥴을 미작동 시키거나 시간을 변경해야 하는 경우에 예외사항들을 정의하고 있습니다.{ "ExceptionUuid": "414faf09-5f6a-4182-b8fd-65522d7612b2", "ScheduleName": "Development", "ExceptionDate": "2017-07-10", "ExceptionType": "stop", "ExceptionValue": "21:00" } ScheduleName예외 적용 대상 Schedule의 이름입니다.ExceptionDate예외발생일 (YYYY-MM-DD)ExceptionTypestart : 시작stop : 중지ExceptionValueNone : 미작동H:M : 변경시간LambdaInstance Scheduler의 Lambda 코드는 Python으로 개발되었으며 Github에 오픈소스로 공개하였습니다. boto3는 배포 package에 Dependency를 추가하지 않아도 Lambda 실행환경에서 가용 라이브러리로 사용할 수 있습니다. 하지만 현재 기본적으로 사용할 수 있는 boto3 버전에서는 RDS Instance를 stop 할 수 있는 함수가 없기 때문에 최신 버전이 필요합니다. 따라서 boto3 버전을 변경하여 함께 packaging 하여 업로드하여야 합니다. 배포는 Lambda 관리 도구인 Apex를 이용합니다. Apex를 이용하면 Dependency package 및 Lambda 생성 및 업데이트, 환경 변수 설정 등을 모두 한 번에 할 수 있습니다.참조 : Lambda Execution Environment and Available LibrariesAWS SDK는 Python boto3 (botocore:1.5.75, boto3:1.4.4) 를 이용합니다.TimeZone 설정Lambda는 기본적으로 UTC TimeZone으로 설정되어 있으며 Instance Scheduler에서는 TimeZone을 변경할 수 있도록 하였습니다. 기본 설정은 Asiz/Seoul이고 아래 코드를 수정하여 변경할 수 있습니다.os.environ['TZ'] = 'Asia/Seoul' time.tzset() JANDI 메신저와 연동Instance Scheduler는 JANDI 메신저의 Incoming Wehbook 을 이용하여 Webhook URL을 Lambda의 환경 변수에 설정하면 서버의 시작과 중지에 대한 알람과 중지 10분 전부터 곧 서버가 중지된다는 알람을 발송하여 필요하다면 서버 중지 시간을 연장할 수 있도록 합니다.Incoming Webhook 설정JANDI의 토픽에서 Incoming Webhook을 연결하고 Webhook URL을 복사합니다.배포된 Lambda 함수의 Code 탭에서 Environment variables에 WEBHOOK_URL을 설정하거나 function.json에서 변경 후 재배포 하여도 됩니다.Instance Scheduler 알람서버 그룹이 시작되면 아래와 같이 알람 메시지를 표시합니다.서버가 중지되기 전에 알람 메시지를 표시합니다.정리Instance Scheduler는 EC2 Scheduler에 비해서 다음과 같은 기능이 추가되었습니다.스케쥴 시간의 타임존 적용서버 그룹 설정 및 의존관계 설정스케쥴의 예외 설정RDS 스케쥴 추가스케쥴에 상관없이 강제 시작 및 중지메신저로 상태 알람EC2 Scheduler에 비해 아쉬운 부분이나 예외사항에 대해서 좀 더 유동적으로 대응할 수 있도록 개선하였습니다.다음 장에는 스케쥴을 컨트롤을 위한 Bot 적용기를 소개하도록 하겠습니다.#토스랩 #잔디 #JANDI #AWS #서버개발 #개발 #개발자 #개발팀 #경험공유 #인사이트 #후기 #일지
조회수 1670

한국의 스타트업이 어려운 이유

벤틀리라는 고급차가 있다. 가장 비싼 차라고 불리며, 가격은 기본 깡통 형태로만 봐도 2억 5천이 넘는다. 실제 사용자의 취향을 맞추고, 실제 운행할 수 있는 형태가 되면 그 가격은 정말 고가이다.다음에서 검색해본 벤틀리의 가격이다.벤틀리가 매우 흥미로운 서비스를 시작했다. 아직은 '시험'서비스이지만, 미국 캘리포니아에서 벤틀리 오너들을 대상으로 서비스를 개시한 것은 바로 '이동 주유 서비스'이다.벤틀리 오너가 스마트폰 앱을 사용해서 서비스를 호출하면 직접 주유차가 방문하여 기름을 넣어준다. 비용은 가장 가까이 있는 주유소 3곳 중의 가장 저렴한 곳의 기름값에 추가적인 배달 비용이 일부 추가된다고 한다.이름하여 '필드 포 벤틀리(Filld for Bentley)'라는 서비스가 현재 시범 서비스 진행 중이라고 한다.고급 자동차의 이미지에게 추가적으로 주유 문제의 번거로움을 해소시키기 위해서 이 서비스를 시작했다고 한다. 또한, 벤틀리의 이야기가 굳이 아니라고 하더라도 자동차의 기름량을 체크하여 기름 넣을 시기를 예측하고 적절한 장소를 예측해서 알아서 이동형 주유 서비스를 가동한다면 벤틀리 사용자들은 '주유소'에 가서 기다릴 필요 없이 편안하게 벤틀리를 몰고 다니면 된다.매우 당연하게, 꼭... 벤틀리만 그럴 필요가 있을까?실제, 벤틀리의 서비스 이외에도 앱을 통해서 주문하면 고객이 있는 곳을 찾아가서 휘발유를 주유하는 방문 주유 서비스가 실제 인기를 끌고 있다. 부스터 퓨얼즈(Booster Fuels)라는 이름의 이 업체는 로스 페로 주니어(Ross Pero Jr.)나 마이크로 소프트의 공동 설립자 폴 앨런 등의 자금 지원을 통해서 텍사스에서 사업을 시작했으며, 현재는 미국 10개 도시 이상으로 사업을 확장했다.재미있는 것은 이 서비스는 개인 서비스를 위한 환경으로 시작했지만, 차량 공유 서비스 업체들과 콜라보 하면서 그 서비스를 더더욱 확대하고 있다. 찾아가는 주유 서비스는 이미 흥미롭게 시장에 진입하였으며, 이 서비스를 사용하는 사용자들은 '주유소'를 방문할 필요가 없으므로, 시간 절약을 하는 매우 효과적인 차량 운행이 가능하다.자신의 비어있는 시간이나 행동 패턴을 고려한 '신청'과 '유지보수'체계만으로도 충분하게 서비스를 받고 있다.이 서비스들은 더욱더 발전 가능성을 가지고 있다.일반적인 완성차 서비스로 이동형 주유 서비스를 하거나, 자동차의 상태 값을 체크하고, 위치를 예측하며, 사용자의 행동 패턴을 체크하여 적절하게 주유를 계속 진행하면서 사용자는 '기름의 잔류량'체크 없이 차량을 운행할 수 있는 방법을 제공할 수 있다.전기차의 경우에도 분명하게 '배터리 교환'방식이 가능하고, 허가된 서비스 업체에서 자연스럽게 충전 및 배터리 교체를 해주는 숨겨진 서비스를 제공한다면 이는 분명 효과적이고 의미 있는 서비스가 될 것이다.그런데.. 슬프지만...한국에서는 '이동형 주유 서비스'는 불법이다.슬프지만, 한국에서 이동식 주유는 대부분이 탱크로리를 불법 개조해서 가짜 휘발유를 팔거나 하는 방법으로 이용되는 독특한 기름 체계를 가지고 있기 때문에, '이동형 주유 서비스'는 불법이다. 사실, 가짜 휘발유가 싼 것도 세금 체계 때문인 것이 거의 대부분이고, 이동형 서비스를 여러 가지 관행과 형태 때문에 '불법'으로 취급받는다.또한, 동네 주유소들이 엄청나게 반발할 것이다. 이 문제를 현재 상태에서는 어떻게 할 수 없을 것이다.소비자들에게 더 저렴한 가격이거나 더 서비스를 가능하게 하는 형태의 서비스는 만들 수 있지만, 한국에서는 안된다. 이름하여, 현재 한국의 '창조경제'스타일이며, 기존의 관습과 악습, 관행을 모두 그대로 두고, 새로운 아이디어를 통해서 기존의 생태계가 살아날 방법을 구성하라는 것이 '창조경제'의 핵심이다.슬프지만. 그런 방법은 없다. 절대 불가능하다.왜? 기존의 주유소와 기존 생태계를 위해서 의미 있는 서비스가 왜 사용되지 못할까?마치, 근대시대에 자동차가 만들어지면서 영국에서 자동차가 보급되면서, 마차를 몰고 다니는 마부들이 일자리를 잃을 처지가 되었고, 궁여지책으로 이들 마부들에게 시내를 달리는 자동차의 앞에서 길을 터주는 임무를 주었다는 환경은 왜 이리도 반복되는 것일까?슬프지만, 이런 현상은 대한민국 사회의 전체를 뒤덮고 있다. 동네약국을 보호하기 위해서 의약품 배송은 안되지만, 원격의료는 하자는 의료환경도 황망하고, 차량 공유 우버 서비스는 영업용 택시의 환경을 보호하기 위해서 선택될 수 없다.분명한 것은 정치적으로 변화되는 생태계를 받아들이고, 이를 재교육하는 환경으로 빠르게 전환되어야 한다. 엄청나게 빠른 속도로 초고령 사회로 돌입하고 있고, 최저 생계비를 보전하는 사회제도의 변화 등이 요구되는 것도 이런 4차 혁명이라고 불리는 사회변화를 받아들여야 하기 때문이다.엄청나게 빠르게 진화되고 있는 비즈니스 모델들을 언제까지 버틸 수 있을까? 결국. '경쟁력'자체가 고속화되는 미국이나 일본 등의 해외 선진국의 움직임을 주목해야 한다고 생각한다.당연하지만, 이미 가시화된 4차 혁명을 버티기 위한 사회보장체계도 동시에 진행되어야 하며, 진취적인 업체들의 움직임 들고 흥미롭게 발전하며, 기존 업체들과 경쟁하게 해야 한다.대기업의 동네 빵집은 가능하고, 스타트업이 기존의 업체와 경쟁하지 못한다는 것은 무슨 '힘싸움'문제 정도 평가해야 할까?정치도 선진화되고, 사회복지나 제도도 발전적이어야 한다. 기존 생태계에 종사했던 사람들에 대한 예의도 있어야 하지만, 이미 글로벌 경쟁은 너무도 당연한 시대가 되었기 때문에 경쟁력도 가져야 한다. 사회적인 합의를 위한 어른들도 계셔야 하고...하지만, 그 어느 것도 답답한 현재의 환경에서... 생계형 군대 비리를 허구한 날 보는 현재 상황이 정말 답답할 뿐이다. 절대다수의 사람들의 변화도 없는 모습... 하지만, 포기하지 않는 대한민국의 젊은 사람들의 스타트업은 계속된다는 것이 그나마 희망 아닌 희망일까 한다.연매출 100억대 정도의 적정한 캐시카우를 만들 수 있는 사업모델을 기반하면서도 한국적 관습적 생태계를 파괴하는 스타트업의 탄생을 기대한다.
조회수 1067

Team Profile: Meet Jinyoung

As a yet minuscule startup, each member holds a significant power over the overall atmosphere of the team. And in our ultimate quest to make big waves in the data world, we need to make sure that the people at the helm are at least kind of cool. We think we’ve done a pretty good job so far in assembling a society of unique but equally driven members.So we bring you this seven-part series, one of each devoted to interviewing each of our members in detail, to give you an in-depth glimpse into the people responsible for bringing you the future of machine learning with Daria. Plus, we peppered the interviews with questions from Dr. Aron’s “The 36 Questions that Lead to Love”*, cherry picked to make work appropriate and concise, but interesting.(*actually falling in love with our members highly discouraged)The CEO and co-founder of XBrain, Jinyoung was motivated to start the company while working at a security firm, with a vision to make machine learning “intuitive and accessible to all”. Apropos of his role as headliner of our mission to introduce machine learning to every corner of the world, Jinyoung has varied interests in literature and music, and hopes to be a patron of the arts someday. Learn more about him here!What is your role at XBrain?JY: I am currently the CEO of XBrain, and head of business development. This includes everything from managing sales to developing and carrying out business plans. I spend most of my time meeting new customers and partners, outside of the office. Other than that, I’m trying to develop a new business model other than the one we’re operating on currently.What does a typical work day at XBrain look like for you?JY: I have frequent appointments outside the office, so my days aren’t as regular. But I usually try to schedule any outside meetings in the morning, because we all try to be present at the office from 1–5 PM, which is our coworking time. After dinner I try to work on more mundane stuff, like paperwork.What are the aspects of your job that you most enjoy?JY: First and foremost is meeting new people. Helping people is something that I really enjoy, and I feel it the most when our customers are actually satisfied with the work that Daria is doing. I just like that I get to talk to many different people during the day.What about the parts that you least enjoy?JY: I least enjoy doing housekeeping duties, like keeping track of receipts, but just because it’s a pain in the neck. Something I find most challenging is always interpersonal tasks, which I enjoy at the same time.Can you tell us about the items on your desk that say something about you?JY: I have these Hulk and Iron Man Lego figures, which I put together myself. I like the process of making toys like that, and I always try to keep myself from being too serious. My desk itself is always representative of my state of mind — sometimes it’s clean, sometimes it’s messy.So what made you want to go into startups, or more specifically, XBrain?JY: It was actually quite intuitive. There was no established plan, or rules that I set for myself. I’d always led a life where I was constantly trying new things, new challenges, which led me to XBrain. And I was fortunate enough to have mentors around me who could offer business advice, and investors who supported the venture financially.Jinyoung puts on his CEO face when workingAs our CEO, do you have a specific vision for XBrain?JY: I think about this a lot — I really want Daria, and any of our future products, to be an integrated part in people’s everyday lives. I want our products to be in the background as useful tools, not just because it’s buzzable technology. Team-wise, I really want to provide a community in which each of our members could live out their dreams.Do you have a go-to-playlist when you’re working?JY: I don’t really listen to music when I work…What can you tell us about the JY ten years from now?JY: I will have a family. I will hopefully be a little wiser, and just as receptive to new ideas and knowledge as I am now, if not more.What, in your opinion as its co-founder, has changed the most about XBrain?JY: We’re definitely more established as a community and team. The fact that we’re conducting interviews like this one, and working on a blog, is proof of that. Of course we’ve grown more sophisticated in terms of business and product development.Share with us a memorable moment at XBrainJY: Probably when we had our team dinner in late June…we’d almost finished branding, and it was just a chance to take a breather for us.If you had to have dinner with one XBrain member, who would it be?JY: EK! Not just because she’s leaving soon, but because I think we’d have a lot to talk about, and she’s pretty different from the rest of the team, characteristically speaking.Would you like to be famous? In what way?JY: I would like to be influential — if fame is a prerequisite for that, then yes. I think that in order to bring about the change I want to see in the world, I need to reach a certain position.What would constitute a “perfect” day for you?JY: Probably a day when any issue has been resolved, with good results?If you were able to live to the age of 90 and retain either the mind or body of a 30-year-old for the last 60 years of your life, which would you want?JY: My answer right now is the mind of a 30-year-old. I would still like to be hungry for something, even when I’m old. But then again, this is me talking as my healthy, under-30 self — who knows how my answer will change in a couple of decades?For what in your life do you feel most grateful?JY: For the fact that I have been lucky enough to be born into an environment where I have been free to try new things, and for the people I’ve met.If you could wake up tomorrow having gained any one quality or ability, what would it be?JY: I would like to be healthier, both in mind and body, and to have a stronger drive to keep cultivating the two.If a crystal ball could tell you the truth about yourself, your life, the future or anything else, what would you want to know?JY: I like the anticipation of finding out…that’s why I never even watch movie trailers.Is there something you’ve dreamed of doing for a long time? Why haven’t you done it?JY: I’ve always wanted to do community service regularly — I volunteer from time to time, but I do want to do it more consistently. I think I’ve subconsciously pushed it back to a time when I’ll have more time for things like that, but if I really stop to think about it, I’ve always had the time, just never made it.What is the greatest accomplishment of your life?JY: Probably founding XBrain, and teaming up with AC(co-founder), because casting aside all other matters of competence, we just have the same ideas and aspirations for the organization, and work well together.If you knew that in one year you would die suddenly, would you change anything about the way you are now living? Why?JY: I’d spare more time to do new things. For example, when I was in Helsinki for the annual Slush conference, I had the chance to ride in a reindeer sleigh and see the northern lights, but couldn’t because of scheduling conflicts. I’d probably go do that first.If you were going to become close friends with someone, please share what would be important for him or her to know.JY: I think the people I’m closest to are aware of their own self-worth, and that’s really the first step to recognizing the same value in others as well.#엑스브레인 #팀원소개 #팀원인터뷰 #기업문화 #조직문화 #팀원자랑
조회수 2574

PHP CI 환경에서 완전한 Vue 사용하기

편집자 주Vue 또는 VUE로 혼용하나 공식 사이트의 표기에 맞춰 아래와 같이 통일함-Vue-Vuex-Vue-Router목차1.Controller2.VIEW3.webpack Vue 소스 진입점4.webpack 설정5.Package.json6.Vue-Router7.Vuex8.공통 처리 mixin9.요약10.마치며시작하며드디어 브랜디 관리자 서비스에 Vue를 도입하고자 떠났던 여정의 마지막 장입니다. 브랜디 관리자 서비스는 PHP Codeigniter와 jQuery로 구성되어 있습니다. 사실 잘 운영되고 있는 서비스에 리스크가 큰 신기술을 도입하는 것은 도박에 가깝습니다. 몇 시간만 운영이 정지되어도 회사에 엄청난 피해를 안겨줄 수도 있으니까요. 하지만 여러 번의 검증과 실험으로 도박에서 이길 확률을 100%에 가깝게 끌어올린다면 한번 도전해볼 만하지 않을까요?이전 글인 PHP Codeigniter 환경에서 VUE 사용해보기에서 기본적인 webpack + Vue + Codeigniter 환경 구축 방법을 알아봤는데요. 하지만 단순히 webpack과 Vue만 적용했다고 해서 “우리 시스템은 UI 프레임워크로 Vue를 사용하고 있습니다.”라고 말할 순 없습니다. 아주 중요한 숙제가 남았죠.Vue에는 활용도를 대폭 끌어올려주는 Vue-Router와 Vuex Store1)가 있는데 그중 Vue-Router를 이번 글에서 자세히 다루려고 합니다.2) Vue-Router는 Vue.js의 공식 라우터입니다. 공식 홈페이지의 소개는 아래와 같습니다.중첩된 라우트/뷰 매핑모듈화된, 컴포넌트 기반의 라우터 설정라우터 파라미터, 쿼리, 와일드카드Vue.js의 트랜지션 시스템을 이용한 트랜지션 효과세밀한 내비게이션 컨트롤active CSS 클래스를 자동으로 추가해주는 링크HTML5 히스토리 모드 또는 해시 모드(IE9에서 자동으로 폴백)사용자 정의 가능한 스크롤 동작한마디로 정리하면 입력된 URL에 반응해 부분에 해당 URL의 view를 보여주는 기능인 것입니다. 다시 말해 URL이 변경될 때 한 페이지에서 화면 전체를 갈아끼우거나, 화면의 일부분(부분)을 치환해주는 역할을 한다는 것이죠. 더 나아가 해당 화면이 로드되기 전후로 전처리, 후처리 기능까지 가능합니다.착안점Vue와 Vue-Rotuer를 알게 되었을 땐 PHP 기반 프로젝트에 Vue-Router를 적용할 수 없으니 처음부터 새로 만들어야 한다고 생각했습니다. 로그인 인증 문제, 메뉴의 권한 관리 등 모든 것이 Vue 아래에 있어야 한다고 생각했기 때문입니다.어느 날 관리자 서비스에 TDD를 구현해보려고 Python Flask + webpack + Vue 프로젝트를 구성하고 있었습니다. 그러던 중 우연히 Flask + Vue-Router에서 404 페이지를 처리하려면 Flask Fallback 페이지를 Vue-Router 메인 페이지(가 있는 페이지)로 보내고, Vue-Router에서 진짜 매핑된 URL이 없으면 404 처리를 하는 식으로 구성한다는 글을 읽고 문득 호기심이 생겼습니다.‘관리자 서비스에서도 컨트롤러로 여러 URL을 한 가지 페이지로 보낸다면?’PHP를 거쳐 페이지로 이동한 것이므로 권한 관리와 메뉴 트리까지는 PHP에서 처리되면서 URL이 변할 것이고, 실제로 화면을 보여주는 Contents 영역만 를 사용한다면 어떻게 될지 궁금해졌습니다. 바로 하던 일을 멈추고 관리자 소스에 Vue-Router를 활용한 테스트 소스코드를 작성해봤습니다.예상했던 대로 PHP의 로그인 인증 처리를 거치면서 실제로 보이는 부분에는 부분만 정상적으로 치환되었습니다. 이 간단한 실험을 바탕으로 통계 시스템의 일부를 구현하는 데에 Vue-Router와 Vuex Store, 공통 처리 Mixin을 추가해 제작했습니다.1.Controller4개의 페이지를 가진 통계 시스템의 Codeigniter 컨트롤러 모습입니다. 기존의 서비스 URL들이 존재하기 때문에 Fallback을 통으로 Vue-Router로 보낼 순 없었고, 라우터를 사용할 페이지들을 하나의 페이지로 보냈습니다.1-1) /application/controllers/[컨트롤러 경로]... 생략 /* [라우터 view]에서 태그를 포함하고 있습니다. */ public function salesAnalysisProduct() { $this->load->view('[라우터 view]'); } public function salesAnalysisSeller() { $this->load->view('[라우터 view]'); } public function trendAnalysisProduct() { $this->load->view('[라우터 view]'); } public function trendAnalysisSeller() { $this->load->view('[라우터 view]'); } ... 생략 2.VIEWCodeigniter 환경에 반영하는 것이므로 CI에서 인식시킬 PHP view와 webpack에서 빌드 결과를 자동으로 바인딩할 html 파일로 구성됩니다.2-1)/application/views/[Vue용 view 경로]/index.php// [index.php] Vue 를 매핑할 php파일 컨트롤러의 view로딩용 [라우터 view]입니다. ... header, menu 생략 ... //바인딩될 부분 //자동매핑 html 인클루드 <?php include('index.html'); ?> ... footer 생략 ... 2-2)/application/views/[Vue용 view 경로]/index.html webpack의 빌드 결과로 자동으로 생성되는 파일입니다. [removed][removed] 위는 webpack의 HtmlWebpackPlugin에 의해 자동으로 바인딩된 모습입니다. 빌드되기 전 index.html은 다음 항목에 있습니다.3.webpack Vue 소스 진입점관리자에서는 프로젝트 폴더 안에 webpack과 Vue 용 서브 폴더를 두고 webpack.config.js에서 output 옵션을 통해 빌드 결과를 삽입하는 구조입니다. webpack 루트 폴더는 application 폴더와 같은 레벨에 위치하며, 폴더 구조나 파일 위치는 어디에 둬도 상관없습니다. webpack.config.js에서 entry 속성으로 잡아주시면 됩니다.3-1)/[webpack루트]/index.html// HtmlWebpackPlugin으로 스크립트를 삽입하기 위한 빈 템플릿 파일 3-2)/[webpack루트]/index.js/** * 진입용 index.js */ import Vue from 'vue' import axios from 'axios' import router from './router' import App from './App.vue' Vue.prototype.$http = axios new Vue({ el : '#app', router, components : { App }, template : '' }); 3-3)/[webpack루트]/App.vue [removed] import mixin from './common/common-mixin.js' import store from './vuex/store' export default { store, name : 'App' } [removed] Vuex와 통신 모듈 axios, Vue-Router 등을 루트 Vue 객체에 추가해줍니다. 브랜디 관리자의 webpack은 babel을 사용하고 있기 때문에 위의 store처럼 축약해서 작성하면 빌드된 파일에는 store: store와 같이 입력됩니다.Vue-Router는 태그에 자동으로 매핑되며, 위와 같은 구조로 상위 컴포넌트에서 할당되어 있어야 합니다. Vuex와 Vue-Router 설정은 글 아래에서 다루겠습니다.4.Webpack 설정이번에 Vue-Router와 Vuex를 도입하면서 webpack의 설정도 실제 서비스용과 개발용으로 분리했습니다. 폴더는 편의상 추가하였으며, package.json에서 자신이 설정한 경로로 설정하면 됩니다.Webpack 설정 파일은 Webpack의 시작과 끝이라고도 할 수 있습니다. Webpack 설정 파일에서 빌드할 소스의 경로와 빌드 결과 파일의 명명 규칙을 정하고, html 파일에 스크립트파를 자동으로 주입시키거나, Babel 플러그인을 통해 최신 스크립트 작성법을 브라우저를 신경쓰지 않고 사용할 수도 있습니다.그중에서도 중요한 옵션이 있는데 바로 Code Splitting에 관련된 옵션입니다.관리자 초기 Vue 모델에는 Vue-Router가 없었기 때문에 js 번들 파일의 크기가 그렇게 크지 않았습니다. 하지만 Vue-Router를 사용해 싱글 페이지 어플리케이션이 되거나 화면의 UI가 복잡해 컴포넌트 수가 많아지면 번들 js 파일의 크기가 매우 커집니다. 즉, 캐시를 사용하지 않는 익스플로러라면 소스에서 한 글자만 바뀌더라도 모든 페이지에서 거대한 번들 js를 새로 로딩하게 되고, 상당한 서버 자원을 소모합니다.Code Splitting 적용 전위의 이미지는 Code Splitting을 적용하기 전의 번들 js 정보입니다. 실제로 완성된 Vue 프로젝트의 번들 js는 더욱 큽니다. 정말 단순한 페이지 하나를 띄우는데 매번 뚱뚱한 js를 로딩해야 하는 것은 서비스 제공자와 서비스 사용자를 모두 괴롭게 할 것입니다.Code Splitting 적용 후하지만 위처럼 작은 조각으로 나눠 필요한 시점마다 필요한 번들 js만 로드하면 매우 빠른 페이지를 제작할 수 있습니다. 따라서 Code Split 기능은 매우 중요한 이슈입니다.물론 개발을 진행하다 보면 역시 어느 것 하나 쉽게 넘어가지지 않습니다. 관리자의 웹팩은 4.x 버전대를 사용하고 있습니다. 예전에 TF에서는 Webpakc 3.x 버전대를 사용하였는데 당시에는 CommonChunkPlugin 설정을 통해 Code Splitting을 사용할 수 있었습니다. 그대로 관리자에 적용하려 했는데..Removed라고 쓰여 있습니다. 찾아보니 CommonChunkPlugin이 옵티마이즈 옵션 하위의 splitChunk 속성으로 들어가면서 설정 방법이 바뀌었더군요. 머리를 싸매고 설정을 잡습니다.4-1) /[webpack루트]/build/webpakc.config.js : 공통 설정파일'use strict' const HtmlWebpackPlugin = require('html-webpack-plugin'); const { VueLoaderPlugin } = require('vue-loader'); const path = require('path'); module.exports = { entry: { //string, object, array 가능 - 기본은 ./src app: path.join('[스크립트 파일 경로]', 'index.js') //진입점 스크립트 파일입니다. }, output: { path: '[빌드된 js 목적지 경로]', publicPath: '[이미지등의 웹상 리소스 경로]', filename: './[name].[chunkhash].js', // 엔트리 파일명명규칙 chunkFilename: '[id]_[chunkhash].js', // chunk파일 명명 규칙 // --mode development에서는 [id]에도 chunkName들어갑니다. }, //vue와 js, css 로드 규칙을 설정합니다. module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', include: [ /[Vue 소스 경로]/ ] }, { test: /\.js$/, use: { loader: 'babel-loader?cacheDirectory', }, include: [ /[Vue 소스 경로]/ ] }, { test: /\.css$/, oneOf: [ { use: [ 'vue-style-loader', 'css-loader' ] } ] } ] }, resolve: { alias: { '@': '[Vue소스 경로]', // 편의상 소스단축경로를 설정합니다. }, //파일 확장자 자동인식 임포트시 해당 확장자는 생략가능합니다. extensions: ['.js', '.vue', '.json'], }, plugins: [ // Vue 파일 로더 new VueLoaderPlugin(), // html 자동 바인딩 // 아래의 플러그인으로 인해 index.html에 해시네임으로 빌드된 index.js가 자동으로 매핑됩니다. new HtmlWebpackPlugin({ // index.php에서 include할 파일이 생성될 경로와 파일명 입니다. filename: path.join('[View경로]', 'index.html'), // 자동으로 매핑할 진입점파일을 지정합니다. template: path.join('[Vue소스 경로]', 'index.html'), inject: true, minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true } }), ], optimization: { //웹팩 4.x 버전에서 옵티마이즈 속성으로 추가된 CodeSplitting 기능입니다. splitChunks: { //initial - static파일만 분리, async - 동적로딩파일만 분리, all - 모두 분리 chunks: 'async', minSize: 30000, minChunks: 1, maxAsyncRequests: 5, //병렬 요청 chunk수 maxInitialRequests: 3, //초기 페이지로드 병렬 요청 chunk수 automaticNameDelimiter: '_', //vendor, default등 prefix 구분문자 (default : '~') name: true, //development모드일때 파일에 청크이름 표시여부 cacheGroups: { default: { minChunks: 2, //2개 이상의 chunk priority: -20, reuseExistingChunk: true //minChunks이상에서 사용할경우 공통사용 }, //axios, vue 같은 공통 모듈은 vendor로 관리합니다. vendors: { test: /[\\/]node_modules[\\/]/, priority: -10 } } } } }; 4-2) /[webpack루트]/build/webpack.dev.config.js 개발용 설정 파일 (네이밍은 자유)'use strict' const merge = require('webpack-merge') const webpack = require('webpack') const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin const baseWebpackConfig = require('./webpack.config') const config = require('../config').dev //개발용설정 const devWebpackConfig = merge(baseWebpackConfig, { //mode는 chunk[id], 디버깅 코드 등에 영향을 줍니다. webpack 3.x 버전에서는 Env 속성을 통해 관리했다고 합니다. mode: 'development', plugins: [ new BundleAnalyzerPlugin(), //번들 무게 분석기 제대로 스플릿 되었는지 확인할 때 사용합니다. new webpack.DefinePlugin({ env : config.env }), ], watch: true, //코드의 변화를 감지해 자동으로 재빌드해주는 옵션입니다. cache: true, //캐시 사용을 활성화하면 변경사항이 있는 코드만 재빌드합니다. optimization: { //uglify 플러그인 코드 압축 여부를 설정합니다 압축 시 용량을 매우 줄일 수 있으나 빌드 속도가 크게 저하되므로 개발 시에는 꺼줍니다. minimize: false, } }) module.exports = new Promise((resolve, reject) => { resolve(devWebpackConfig); }) 4-3) /[webpack루트]/build/webpack.prod.config.js 서비스용 설정파일 (네이밍은 자유)'use strict' const merge = require('webpack-merge') // 설정파일 결합에 사용합니다. const webpack = require('webpack') const baseWebpackConfig = require('./webpack.config') //베이스 설정파일 const config = require('../config').prod //서비스용 설정 const prodWebpackConfig = merge(baseWebpackConfig, { mode: 'production', //chunk[id], 디버깅 코드등 영향 있음 plugins: [ new webpack.DefinePlugin({ env : config.env }), ], //개발용과 반대로 용량은 줄이고 필요 없는 기능은 꺼줍니다. watch: false, cache: false, optimization: { minimize: true, } }) module.exports = prodWebpackConfig 5.package.json웹팩 설정 파일이 분리되면서 package.json의 런 스크립트도 변경했습니다.... "scripts": { "build": "webpack --config build/webpack.prod.config.js --progress", "build-dev": "webpack --config build/webpack.dev.config.js --progress" }, ... 6.Vue-RouterVue-Router는 위에서 설명한 대로 Vue의 컴포넌트와 밀접하게 결합된 라우터입니다. 그런데 여기서 webpack의 Code Split을 사용하려면 컴포넌트 import 방법이 매우 중요한데요.import './testComponent' 위처럼 import 구문을 사용해 컴포넌트를 불러오면 코드가 쪼개지지 않고 한 덩어리로 빌드되므로 아래와 같은 형태로 사용해야 합니다.const testComponent = () => import('./testComponent') webpack 공식 문서에도 나와있듯이 위처럼 ES2015 Loader spec에 있는 import()를 사용하여 컴포넌트를 생성해야 번들 js가 제대로 분리되며, Dynamic Import가 가능해집니다.Vue-Router를 쓰는 순간 싱글 페이지 어플리케이션이 되기 때문에 이곳에서 설정을 잘못 잡아주는 순간 육중한 컴포넌트 한 덩어리가 튀어나오면서 Code Splitting은 물거품이 되어버립니다. 조심합시다!또한 import 함수 안쪽엔 아래와 같은 주석을 달아야 청크 이름이 적용됩니다.const testComponent = () => import( /* webpackChunkName: '[청크이름]'*/ './testComponent') 라우터 경로 속성인 path 와 Codeigniter의 컨트롤러 경로를 맞춰주는 것이 포인트입니다!6-1) /[webpack루트]/router/index.js - 경로와 파일명은 자유입니다!import Vue from 'vue' import Router from 'vue-router' // 주석의 webpackChunkName = 코드 스플릿 chunk Name으로 사용됩니다. // 꼭 컴포넌트와 청크 이름을 같게 설정할 필요는 없습니다. const SalesAnalysisProduct = () => import(/* webpackChunkName: "salesAnalysisProduct" */ '[컴포넌트 파일 경로]') const SalesAnalysisSeller = () => import(/* webpackChunkName: "salesAnalysisSeller" */ '[컴포넌트 파일 경로]') const TrendAnalysisProduct = () => import(/* webpackChunkName: "trendAnalysisProduct" */ '[컴포넌트 파일 경로]') const TrendAnalysisSeller = () => import(/* webpackChunkName: "trendAnalysisSeller" */ '[컴포넌트 파일 경로]') Vue.use(Router) const router = new Router({ mode: 'history', routes: [ /* 통계 */ { path: '[CI컨트롤러 url]/salesAnalysisProduct', name: 'salesAnalysisProduct', component: SalesAnalysisProduct }, { path: '[CI컨트롤러 url]/salesAnalysisSeller', name: 'salesAnalysisSeller', component: SalesAnalysisSeller }, { path: '[CI컨트롤러 url]/trendAnalysisProduct', name: 'trendAnalysisProduct', component: TrendAnalysisProduct }, { path: '[CI컨트롤러 url]/trendAnalysisSeller', name: 'trendAnalysisSeller', component: TrendAnalysisSeller }, ] }) // 아래의 함수로 전처리 후처리도 가능합니다! router.beforeEach((to, from, next) => { // ... }) router.afterEach((to, from) => { // ... }) export default router 7.Vuex앞서 Vue와 Vuex, 컴포넌트간 통신과 상태 관리에서 소개했던 상태 관리와 통신을 위한 Vuex도 추가합니다. Vuex는 하나의 Store만 쓸 경우 상태 변수의 과포화로 인해 유지 보수가 어려워질 수 있으므로 namespace: true 옵션을 통해 도메인별로 관리합니다.7-1) /[webpack루트]/vuex/store.js - Vuex 진입파일import Vue from 'vue' import Vuex from 'vuex' // 각 도메인별 store들이 들어있는 modules 를 임포트해줍니다. import * as modules from './modules/index' Vue.use(Vuex) export default new Vuex.Store({ state : { }, getter: { }, mutations : { }, actions : { }, modules : modules.default }) 7-2) /[webpack루트]/vuex/modules/index.js - 도메인별 Store 자동 바인딩 스크립트const files = require.context('.', false, /\.js$/) const modules = {} //자신(index.js)를 제외한 파일들을 파일이름을 Key로 modules에 담습니다. files.keys().forEach((key) => { if (key === './index.js') return modules[key.toLowerCase().replace(/(\.\/|\.js)/g, '')] = files(key).default }) export default modules 7-3) /[webpack루트]/vuex/modules/statistics.js(통계 store 파일) - 예시입니다.export default { namespaced : true, //해당 속성을 통해 파일명을 namespace로 사용합니다. state: { /* 상태값 및 데이터 */ ... }, getters: { }, mutations: { /* state 변경처리 */ ... }, actions: { /* 통신처리 */ ... } } namespace: true로 되어있으므로 파일명인 statistics를 namespace로 사용하게 됩니다. 따라서 store 각 항목에 대한 접근은 다음과 같이 이뤄지며 computed 속성에 state: this.$store.state.statistics 처럼 정의해두면 편리합니다.dispatch는 this.$store.dispatch(‘statistics/[action 이름]’)commit은 this.$store.commit(‘statistics/[mutation 이름]’)state 변수 접근은 this.$store.state.statistics.[state 이름]8.공통 처리 mixinapi 통신에 사용되는 통신 라이브러리와 그 라이브러리의 복잡한 설정 코드, 단순한 Toast 출력 함수, 로딩 이펙트를 보여주는 함수 등 모든 항목들이 매 페이지마다 있으면, 통일되지 못한 UI, 페이지마다 일관되지 못한 설정 등으로 휴먼 에러가 발생할 확률이 높아집니다. 유지 보수 측면에서도 비용이 높아집니다. 이러한 단순 반복 코드들은 한번만 정의하고 재사용하는 것이 바람직합니다. 나중에 수정할 때도 용이하죠.공통사항을 묶어 Vue 전역 믹스인으로 Vue 루트 객체에 추가합시다. 단, global 옵션인 만큼 조심해서 써야 합니다. 시스템에 영향을 줄 것 같으면 하위 컴포넌트 mixins 속성에 넣어 해당 스코프에서만 사용하는 것이 바람직합니다.8-1) /[webpack루트]/common/common-mixin.js (파일이름, 경로는 자유입니다!)import Vue from 'vue' import Vue from 'axios' import Cookies from 'js-cookie' const TIMEOUT = '[타임아웃 시간(ms)]' /* mixin의 기본 형태는 Vue 컴포넌트의 형태와 동일합니다. 주로 전역 통신과 상태 관리는 vuex store에서, 전역 data 속성과 전역 함수는 mixin에서 관리합니다. */ Vue.mixin({ /* 전역 사용 data속성 선언 */ data: () => { return { ... //이곳에 선언하는 data 속성은 전역에서 this로 접근 가능합니다. } }, created: function() { // 공용 axios 객체 생성 this.axios = axios.create({ timeout: TIMEOUT, withCredentials: true, //공통해더는 여기에 headers : { } }); //axios 의 success와 error를 mixin method에서 처리 하도록 등록 this.axios.interceptors.response.use(this.onSuccess, this.onError) }, /* 전역 사용 함수 선언 */ methods: { /* axios의 response handling 함수*/ onSuccess : response => { }, onError : function (error) { }, /*GET, POST 등의 통신 함수, Toast(alert) 표출함수, 에러핸들링함수 등 선언*/ /*... 내용이 너무 길어서 생략 ...*/ } }); 9.요약지금까지의 내용은 파일 경로를 토대로 요약하면 다음과 같습니다. 참고로 아래의 폴더 구조는 절대적인것은 아닙니다. 모든 폴더 구조는 자율이며, 폴더 구조에 맞게 webpack.config.js에서 조정해주면 됩니다.[프로젝트 루트] └ [웹팩 루트] └ package.json └ [Vue 소스 루트] └ [common] └ [router] └ index.js // 라우터 설정파일 - CI 컨트롤러와 url 맞춰줘야함 └ [vuex] └ index.js // 도메인별 store module export 스크립트 └ [modules] └ 도메인별 store.js └ [컴포넌트 폴더] //예시에서는 ststistics └ App.vue //진입점 vue파일 Vuex와 전역 mixin 세팅 └ index.html //index.js가 주입될 껍데기 └ index.js //진입점 js Vue-Router와 App.vue 세팅 └ [build] // 빌드파일경로 └ webpack.config.js //베이스 설정파일 └ webpack.dev.config.js //개발용 설정파일 └ webpack.prod.config.js //서비스용 설정파일 └ [application] //Codeigniter 루트 └ [controllers] └ [컨트롤러 경로] // 예시의 통계부분 └ [views] └ [웹팩빌드 결과 폴더] └ [index.php] // CI 에서 로드하는 view (index.html include) └ [index.html] // js 번들이 자동 주입된 빌드결과 파일 └ [include] └ [scripts] └ [빌드결과 js 경로] //public path 속성 경로 └ 빌드 결과 js chunk들 마치며관리자 서비스에서 완전한 Vue를 사용하기 위해 꽤 험난한 과정을 거쳤습니다. 지금도 잘 돌아가는 서비스에 리스크를 감수하면서도 새로운 것을 도입하려는 이유를 찾아야 했고, 한동안은 레거시와 Vue로 된 소스를 2중으로 개발해야 했습니다.게다가 이 글을 작성하기 시작했을 땐 Code Splitting 설정 방법이 바뀌어 적용하지도 못한 상황이었기 때문에 사실 Code Splitting 내용이 없었습니다. 그런데 글을 작성하면서 splitChunk옵션을 성공해버렸어요! 덕분에 이 글도 모두 수정해야 했죠. Vue의 도입을 고려하는 개발자분들에게 도움이 되길 바라는 마음으로 글을 마칩니다.참고1)Vuex Store는 Vue와 Vuex, 컴포넌트간 통신과 상태 관리에 자세히 정리해두었다.2) 브랜디 관리자 서비스는 jQuery로 작성되어 있다. 따라서 jQuery를 베재할 수만은 없는 상황이었다. 이에 따라 기존 jQuery 컴포넌트들에 대한 해결책은 천보성 팀장님이 작성한 JQuery 프로젝트에 VUE를 점진적으로 도입하기를 참고했다. props와 emit 기능을 이용해 jQuery로 제작한 컴포넌트를 깔끔하게 Wrapping 하는 방법에 대해 자세히 기술되어 있으며, 이를 활용하면 레거시 UI 플러그인을 마치 네이티브 Vue 플러그인처럼 사용할 수 있다.글강원우 과장 | R&D 개발2팀kangww@brandi.co.kr브랜디, 오직 예쁜 옷만
조회수 1309

Semantic Versioning 소개

Semantic Versioning 소개Versioning?소프트웨어 개발 생태계는 수많은 사람들이 서로의 기술과 성과를 이어받아 오며 믿을 수 없는 수준의 협력 체제를 구축해오고 있습니다. 의존성은 이러한 협력체제에서 나오게 된 요소로, 다른 사람들이 만들어온 기능을 다시 만들 필요 없이 손쉽게 가져와서 재활용하는 방식으로 빠르게 소프트웨어를 만들 수 있게 되었습니다.하지만 이렇게 여러 사람에게 이용되는 패키지가 새롭게 업데이트될 때, 생각보다 다양한 문제에 직면하게 되었습니다. 기능의 사용법을 바꾸어버리거나 동작 방식의 변경 같은 변화들은 그에 의존하는 다른 소프트웨어를 의도대로 동작하지 못하게 하므로, 새로운 변화와 기존의 것을 구분할 필요가 생겼습니다. 버전이라는 개념은 이러한 패키지의 변화를 구분하기 위해 사용하기 시작하였습니다.Semantic Versioning?버전이라는 코드 형태의 구분방식은 많은 핵심 문제를 해결해주었지만, 아직 여러 과제가 남아있었습니다. 버전 명의 작성 방식에 관한 기준이 패키지마다 제각각 다른 것이 문제였습니다. 0.x와 1.x의 차이, 1.0.0 혹은 1.000. 선행 배포와 정식 버전의 구분 방법 등 모든 소프트웨어, 패키지는 저마다의 기준을 가지고 있었으며, 이는 어느 정도의 적당한 공통점이 있었지만, 그 점이 미묘하게 모두 차이가 있어 버전에 따른 의미 해석을 어렵게 하였습니다.Semantic Versioning은 Github의 공동창업자인 Tom Preston-Werner가 위의 문제를 해결하기 위해 기존의 현안을 모아 만든 제안입니다. 스펙 문서는 RFC 2119에 의해 규칙을 표기하여 의미적 엄격함을 높이고, 패키지 개발 생명주기에 발생할 수 있는 여러 상황을 포괄적으로 담아 일관성과 유연성을 균형 있게 갖추고 있습니다.규칙다음은 Semantic Versioning(v2.0.0-rc1)의 스펙을 한국어로 번역한 내용입니다.1. Semantic Versioning을 쓰는 소프트웨어는 반드시 공개 API를 정의해야 한다. 이 API는 코드 자체에 정의되어 있거나 명시적으로 문서화 되어있어야 한다. 이 과정은 포괄적이며 정확해야 한다.2. 일반 버전 명은 반드시 X.Y.Z 형태를 보여야 하며 X, Y, Z는 음이 아닌 정수이다. X는 주요한 버전이며, Y는 작은 버전, Z는 패치버전이다. 각 요소는 1씩 차례로 증가해야 한다. 예: 1.9.0 -> 1.10.0 -> 1.11.0.3. 주요 버전 숫자가 올라갈 때, 작은 버전 숫자와 패치 버전 숫자는 0으로 재설정되어야 한다. 작은 버전 숫자가 올라갈 때, 패치 버전 숫자는 0으로 재설정되어야 한다. 예: 1.1.3 -> 2.0.0, 2.1.7 -> 2.2.04. 버전 명이 주어진 패키지가 한번 공개되면, 해당 버전의 내용은 절대 수정되어선 안된다. 어떤 수정도 반드시 새로운 버전으로 공개되어야 한다.5. 주요 버전 0 (0.y.z)은 초기 개발을 위한 것이다. 언제든 변경될 수 있다. 공개 API는 안전하지 않다고 여긴다.6. 버전 1.0.0은 공개 API를 정의한다. 이 공개 이후의 버전 숫자가 바뀌는 방법은 공개 API와 변경 방법에 따라 결정된다.7. 패치 버전 Z (x.y.Zx > 0)는 하위호환을 하지만 버그 수정이 있을 때 올라간다. 버그 수정은 내부적으로 잘못 처리되고 있는 것을 고치는 것을 의미한다.8. 작은 버전 Y (x.Y.zx > 0)는 새로운 기능이 추가되었지만 기존의 공개 API가 하위호환되고 있을 때 올라간다. 공개 API가 하나 이상 deprecated될 시에도 올라가야 한다. 부가적인 새 기능이나 개선이 내부 코드 (private code)에 있을 시에도 올릴 수 있다. 이는 패치 수준의 변화를 포함할 수 있으나, 작은 버전이 올라가면 패치 버전은 꼭 0이 되어야 한다.9. 주요 버전 X (X.y.zX > 0)는 하위호환되지 않는 변화가 추가될 때 반드시 올라가야 한다. 이는 패치 수준과 작은 수준의 변화를 포함할 수 있으나, 주요 버전이 올라가면 작은 버전과 패치 버전은 꼭 0이 되어야 한다.10. 선행 배포 버전은 대시(-)와 점으로 나누어진 식별자들의 묶음을 패치 버전 뒤에 표시한다. 식별자들은 ASCII 영숫자와 대시로만 구성되어야 한다. [0-9A-Za-z-]. 선행 배포 버전은 연관된 일반 버전보다 낮은 우선순위를 가진다.11. 개발 버전은 더하기(+)와 점으로 나누어진 식별자들의 묶음을 패치 버전 뒤에 표시한다. 식별자들은 ASCII 영숫자와 대시로만 구성되어야 한다. [0-9A-Za-z-]. 빌드 버전은 연관된 일반 버전보다 높은 우선순위를 가진다.12. 우선순위는 주요, 작은, 패치, 선행 배포, 빌드 식별자 내 숫자 순으로 계산되어야 한다. 주요, 작은, 패치 버전은 항상 숫자로 비교되어야 한다. 선행 배포와 빌드 버전의 우선순위는 반드시 각 점으로 나누어진 식별자들이 아래 규칙에 따라 비교되어야 한다: 1. 숫자로만 이루어진 식별자는 숫자로 비교 (2) 문자와 대시가 포함된 식별자는 ASCII 정렬 순서대로 비교. 숫자 식별자는 숫자가 아닌 식별자보다 낮은 우선순위를 가진다. 예: 1.0.0-alpha < 1>응용여러 오픈소스 프로젝트들이 이미 Semantic Versioning에 따라 버전 명을 표기하기 시작하였으며, 해당 규칙에 기반을 둔 버전 비교 라이브러리도 만들어지고 있습니다.•node.js: https://github.com/isaacs/node-semver•PHP: https://github.com/GordonSchmidt/SemVer•Python: https://github.com/k-bx/python-semver•Ruby: https://github.com/iantruslove/SemverStringerseaport는 node.js 에서 서비스 클러스터들이 Semantic Versioning에 따라 버전 의존성을 가지게 설계할 수 있어 보다 안정적인 버전 협상이 가능하도록 하고 있습니다.server.js:var seaport = require('seaport');var ports = seaport.connect('localhost', 9090);var http = require('http');var server = http.createServer(function (req, res) {res.end('beep boop\r\n');});server.listen(ports.register('web@1.2.3'));client.js:var seaport = require('seaport');var ports = seaport.connect(9090);var request = require('request');ports.get('web@1.2.x', function (ps) {var u = 'http://' + ps[0].host + ':' + ps[0].port;request(u).pipe(process.stdout);});output:$ node server.js &[1] 6012$ node client.jsbeep boop마치며비록 작은 통일일지는 모르나, 버전 명을 작성하는 훌륭한 기준이 있다는 것은 장기적으로 개발 생태계를 더욱 빠르고 긴밀하게 협력하도록 도와줄 것이라 생각됩니다. 의미적 해석이 가능한 코드는 의존성 문제를 더 똑똑한 수준으로 자동화할 수 있기 때문이죠. 버전 명을 지으실 때 좋은 안내서가 되었으면 좋겠습니다.#스포카 #개발 #개발자 #개발팀 #꿀팁 #인사이트
조회수 1258

사랑과 매출

#1. 2012년 두바이, 삼성전자 사원공항을 나오자 바람이 뜨겁다. 사막의 열기가 나를 덥친다. 가슴이 답답해졌다. 나는 노트북을 움켜쥐고 급히 택시를 탔다. 입사 2년차 첫 출장이었다. 대한항공을 타고 8시간을 날던 중 문득 두려움이 엄습했다. '책상머리에 앉은 백면서생일뿐인 내가 무얼 할 수 있을까.'보고서 외엔 할 줄 아는 게 없는 인생. 난 새로운 길을 찾을 수 있을까."웰컴 투 두바이"금발의 리셉션 여성이 환하게 맞아준다. 에드워드 호퍼의 그림같은 복도를 지나 객실로 들어온다. 캐리어를 내려 놓으니 이제야 쓸쓸해진다.      다음 날 첫 출근길. 오피스는 도보로 10분이었다. TF 멤버는 총 4명이었다. Global Strategy Team 출신의 인도인 엘리트 팀장, 본사 한국인 부장, 두바이 현지 매니저, 그리고 막내인 나.  TF는 초반부터 난항을 겪었다. Kick-off는 연신 미뤄졌다. 프로젝트 추진안은 일주일 넘게 계속 바뀌었다. 팀장과 부장의 의견차가 좁혀지지 않았다. 현지 매니저는 회의실 전화와 인터넷을 설치해준 이후 잘 보이지 않았다. 현지 파견 유럽인 컨설턴트는 이건 말이 안돼라며 난색을 표했다. 나는 어리숙하고 무능력한 사원일 뿐이었다.어느 날 현지 영업왕으로 불리는 부장과 인터뷰를 했다. 짙은 눈썹, 부릅뜬 눈, 불독같이 생긴 그는 아랫배만큼은 인자함을 드러내고 있었다. 그의 사무실 벽에는 '2013년 매출목표 $XXX 달성'이라는 커다란 현수막이 달려 있었다. 부장은 자신이 얼마나 잘 나가는지, 영업을 얼마나 잘 하는지, 매출이 얼마나 높은지를 연신 자랑했다. 20년 넘도록 매일 매출을 위해 살아온 그였다. 그의 눈빛에서 짙은 자부심과 열정이 느껴졌다. 주말엔 공원에 갔다. 나는 잔디밭에 누워 생각했다.'언젠가 내가 하루종일 내뱉는 단어들이 매출, 실적, 보고 이런 게 아니라 사랑, 희망, 기적 이런 것들이었으면 좋겠다.'#2. 2018년 서울, 퇴사학교 대표월요일 아침부터 비가 쏟아진다. 이런 날은 정말 출근하기 귀찮다. 출근을 안 해도 아무도 뭐라고 하지 않지만 내 안의 또 다른 내가 말한다. "그래도 오늘은 주간회의잖아. 팀원들과의 약속을 지키라구."창업 후 2년이 지났다. 첫 1년은 미치도록 일만 했다. 일 말고는 아무것도 보이지 않았다. 작은 회사, 아니 아직은 회사라고 부를 수도 없는 어떤 조직. 이 조직을 정말 멋지게 만들고 싶었다. 회사와 개인의 비전이 일치되고 각자가 행복한 일을 찾는 그런 조직. 내가 만든 회사도 그러길 바랬고, 내가 만나는 사람들이 다니는 회사도 그러길 바랬다. 좀 더 오버해서, 대한민국 회사와 개인들이 모두 그런 방향으로 갈 수 있기를 바랬다. 거기에 내가 조금은 기여할 수 있기를, 지난 2년간 의욕적으로 바래 왔었던 것 같다. "고단하네요."오늘 워라밸 워크숍에서 내가 한 말이다. 워라밸. 나에게 그런 건 없었다. 워크와 라이프가 하나니까. 두 개가 다르지 않으니 밸런스 같은 건 의미가 없었다. 그냥 워크가 곧 라이프고 라이프가 곧 워크인 삶. 장점도 있고 단점도 있다. 좋을 때도 있고 힘들 때도 많다. 인생은 복합적이다. 늘. 항상 한 쪽만 비추는, 또는 한 쪽만 보려는 관점은 내겐 늘 버겁다. 이제 나는 6년 전과는 많이 달라졌다. 미팅을 하고 출장을 다니고 강의를 하고 제안을 한다. 관리를 하고 운영을 하고 챙기고 혼내고 가르치고 거절당한다. 매일 산을 넘고 강을 열댓번 건너고 비를 맞고 바람에 흔들거린다. 이젠 책상머리 서생은 아니지만, 여전히 삶에선 백면서생이다. 나는 이제 그 두바이의 부장이 부럽다. 하루종일 내 입에서 '매출, 실적, 보고'와 같은 단어를 말하지만, 아직 그 부장같은 눈빛을 지을 순 없다.나는 지금 사랑보다 매출을 원한다. 그래도 언젠가는 다시 꿈 꾸고 싶다. 매출보다 사랑을 내뱉는 날을 다시 꿈꾸고 싶다. 에드워드 호퍼, 밤을 지새우는 사람들, 1942#퇴사학교 #인사이트 #경험공유
조회수 1028

사업자 등록, 다시 하면서...

생각해보면 첫 사업자 등록을 했던 때가 96년이다. 세무서를 찾아가서 두근 거리는 마음으로 등록을 하였고 일주일인가 뒤에 방문에서 사업자등록증을 받아왔다. 그렇게, 나의 벤처 생활이 시작됐다.파란만장한 산전 공중전 난장판을 다 겪었고, 만들어진 개인사업체를 법인에 귀속시키기도 하고, 법인을 만들고 부수는 것도 경험했다.어느덧 20년이 지난 2016년 필요에 의해서 사업자등록증을 만들어야 했고, 세무서를 방문해서 신청을 하려고 하니, 간단한 몇 가지 정보를 입력하고 그 자리에서 빠르게 사업자등록증을 받아서 나오는 것을 경험하니 정말 격세지감이 들었다.20대의 순진한 마음에 들떠서 사업자 등록증을 만들던 경험과 40대 중반에 사업자등록증을 받아 드는 기분은 매우 새로웠다. 사업자등록증을 받아서 나오면서 느꼈던 몇 가지 느낌은 신기한 기분이다.예전 세무서를 찾아가기 위해서 버스를 타고 걸어서 간 20대의 기억과 작년에 구입한 수입차를 타고 세무서 주차장에 주차를 하는 기분도 새로웠다. 물론, 그 사이 내가 만든 기업이 10여 개는 되지만, 처음 회사를 설립할 때에 직접 세무서를 방문한 이후로는 대부분 대리인을 보내거나 법무사를 통해서 법인을 설립했던 것이니, 직접 사업자등록증을 만들려고 세무서를 방문한 것은 정말 20년 만이다.처음 만든 회사의 이름은 '스핀 테크'라는 당시에 유행하던 테크를 붙였고, 'SPIN'은 Software, Programming, Internet, Network를 나열한 단어의 첫 단어를 결합한 단어였다. 그리고, 지금 등록한 사업자명은 요 근래 내가 하고 있는 일을 곰곰이 생각하면서 결정했다.헬스케어와 금융, 자동차 등에 사용되는 연동되어지는 정보들을 고민하고 생각하는 일을 하고 있기 때문에 Connected Information Lab이라는 이름을 만들었다. 미묘하게 등록되어진 사업자 명칭을 보면서 기분이 매우 새롭게 느껴진다.과거에 느껴지던 사업자의 무게감보다는 매우 당연하게 1인 기업을 지향하는 나 자신에 대해서 무언가 이정표를 하나 만든 것 같다.이런 미묘한 느낌은 역시, 사업자 등록을 직접 해봐야 느끼는 것 같다. 개인적으로 스타트업을 시작하는 후배들은 자신이 아무리 바쁘더라도 직접 사업자 등록을 해보기를 권장한다. 자기가 만든 이름에 대한 책임감이나 그 뉘앙스에 대해서 오랫동안 머릿속에 남을 것이다.얼마나 이름을 만들기 위해서 고민하고, 얼마나 그 이름을 위해서 일할 것인가에 대해서 생각했느냐는 결국, 해당 기업을 만들고 사멸하기까지 생사고락을 같이하는 새로운 생명체의 탄생이라는 것을 느끼게 될 것이다.아주 오래간만에 느끼는 이 기분... 그냥, 글로 남겨 본다.생각해보면 사업, 스타트업은 가장 최소한의 인원, 가장 쥐어짜듯 가장 적인 리소스로 운영이 가능하도록 해야 한다는 것을 다시 한번 생각하면서 사업자등록을 하도록 하자. ~.~ 생각해보니, 그런 마음을 가지게 된 것도 직접 사업자 등록을 하면서 그 책임감을 느낀 것 같다.사업을 시작하는 모든 사람들에게 권하고 싶다.직접, 사업자 등록을 해보자. 법인 등록이라고 하더라도 모두 대리인을 통해서 만들더라도, 서류를 챙겨 들고 세무서에 직접 다녀오기를 권장한다. 그 무게감과 느낌을 받아보시기를...
조회수 3497

중국 역사속 인물로 보는 스타트업

 난 중국의 역사를 참 좋아한다. 열국지, 초한지, 삼국지 같은 책을 읽다 보면 현실에서 어떻게 해야 할 지 어느 정도 해답이 오기도 하고, 무엇보다 영화나 TV는 저리가라 할 정도로 드라마틱한 인생역정을 그 안에서 볼 수 있기 때문이다. 그리고 중국의 긴 역사 속에서도, 맨손으로 일어나 나라를 세웠거나, 불리한 상황을 어떻게든 역전해서 성공을 일궈낸 인물들의 일대기를 보다 보면, 이것도 하나의 스타트업이 아닌가 하는 생각이 불현듯 들 때가 있다. 오늘의 주제는 그렇게 정해졌다. 부담없이, 역사 상식 하나 얻어간다 생각하고 읽으면 딱 좋을 것 같다.1. '존버'의 대가 진 문공 흔히 '중원의 패자'나 '패자'같은 어구를 보게 된다. 이 단어를 보면서, 어릴 적에는 대체 뭘 팬다는 건지, 아니면 진 사람이라서 패자인 건지, 졌으면 왜 저렇게 띄워주는지 의아해했던 기억이 있다. '패자'라는 것은 춘추전국시대에 만들어진 단어로, 원래는 주나라 왕을 모시고(존왕) 오랑캐를 물리치는(양이) 제후국들 중에서 리더 격의 지위를 인정받은 나라의 군주를 일컫는 말이기도 하였고, 이렇게 유명한 군주 중에 '춘추오패'라는 인물들이 있다. 사전지식은 이쯤하고, 이 춘추오패의 다섯 명 중에 특히 드라마틱한 인생을 산 양반이 한 명 있으니, 그게 바로 진(晉) 문공 희중이이다.  거두절미하고 간략하게 말하면, 아버지 진 헌공이 사람을 잘못 들여서, 이 사람이 헌공의 세 아들을 서로 이간질을 시켜 태자는 자결시키고, 둘째(중이)와 셋째(이오)는 각자 도망쳤다가 헌공이 죽자 셋째아들이 돌아와 군주가 되었는데, 형이 아직 살아있으니 계속 자객을 보내 목숨을 끊으려 하는 바람에 정처없이 떠돌다가 초나라와 진(秦)나라의 도움을 받아 나라를 되찾고 중원의 패자가 된다는 스토리이다. 이렇게 말하면 별 것 아닌 몽테크리스토 백작이나 소공녀 같은 스토리라고 생각이 들 지도 모르겠다. 그러나 중요한 것은, 이 양반이 떠돌아다닌 기간이 19년이라는 것이다. 떠돌아다니면서 동네 농부들한테 모욕도 당하고(나중에 그 지방 전체를 개박살냈다고...), 조(曺)나라에 갔더니 환대를 받길래 '사람이 됐구만' 싶더니 목욕하는 걸 훔쳐보려 하기도 하고(중이는 눈에 눈동자가 둘인 중동에 갈비뼈가 통으로 되어있는 변협의 상이라는 소문이 있었다), 같은 춘추오패 중 한 명인 제 환공의 후대 아래 제나라 공녀와 결혼하여 자식을 보기도 하고, 하여간 별 일을 다 겪게 된다. 문공이 아닌 떨거지 공자 중이 시절에도, 그를 끝까지 따라다니던 가신들이 있었다. 같이 밥 빌어먹고 거지꼴이 되어가며 19년의 방랑 생활을 함께 한 인물들인데, 나중에 공의 자리에 즉위했을 때 그에 걸맞는 후한 보상을 얻은 것은 물론이다. 이쯤에서 감이 올 것이다. 진 문공이 스타트업과 무슨 관계가 있는지. 돈도 사람도 없이 초라한 유랑객에 불과했던 초기 상태에서 죽도록 고생을 하다 제 환공의 환대 아래 숨을 좀 돌리며 앞으로의 계획과 방향을 잡고(시드 투자), 초나라와 진나라에서 병력을 빌려(시리즈 A) 사업을 성공시키고 급기야는 중원의 패자 위치에까지 오르게 된 것을 보면, 스타트업의 성공과 맥락이 닿아있다는 느낌이 들 것이다. 그렇다. '존버'는 승리하는 것이다. 물론 진 문공이 자신을 도와준 사람들과 모욕한 사람들을 나누어 확실히 보답할 것은 보답하고, 응징할 것은 응징할 수 있을 만큼 대단한 인재였기 때문인 것도 있다. 실제로, 이후 초나라와 국경지대에서 싸움을 벌이게 되었을 때, 은의에 대한 보답으로 36킬로미터 정도를 그냥 후퇴해주었다는 일화를 보면 알 수 있는 부분이다. 갈비뼈 훔쳐보려고 했던 조나라는 작신작신 밟아줬다고 하고. 내가 모시는 이 사람에 대한 확신이 있다면, 이 사업 모델에 대한 확신이 있다면 우리도 19년까진 아니더라도 몇 년 정도는 '존버'하면서 대기만성을 노리는 것도 좋지 않을까.*워렌 버핏은 이런 말을 한 적이 없다.2. 혼자서는 승리할 수 없다, 초패왕 항우/듣는 리더십의 귀재, 한고조 유방 장기를 두어본 적이 한두번쯤은 있을 것이다. 아니면 장기판에서 말이 움직이는 것 정도는 보았거나. 장기판에서 해서체로 정갈하게 쓰여진 빨간색 말 중에는 '漢'이 있고, 초서체로 멋드러지게 쓰여진 초록색 말 중에는 '楚'가 있다. 초한전쟁에서 모티브를 따온 것이 그 연원이다. 요즘도 '항우장사'라는 말을 하는지는 모르겠지만, 옛날에는 기골이 장대하고 힘이 센 사람을 일컬어 항우장사라는 말을 했었다. 그만큼 힘, 무력, 용기와 담대함을 상징할 정도로 항우는 힘이 세고 용감했다는 뜻이다. 옛 초나라의 명장 항연 장군의 자손으로 명문가의 자제이기도 했다. 금수저였던 것이다. 반면 유방은, 술과 여자를 좋아하고 예의를 몰랐으며, 군신간에도 예의가 없어 술자리에서 위아래 없이 어울리고, 유학자나 선비가 지나가면 욕보여서 쫓아내는 것을 즐겨했다고 할 정도로 촌부 그 자체였다. 금수저는 커녕 흙수저 축에도 못 끼는 동네 한량이었음은 물론이다. 하지만 진시황 사후 어지러워진 중국 대륙을 통일하고, 중국인들이 아직도 숭상해 마지않는 진정한 의미의 통일국가 한나라를 세운 것은 유방이었다. 심지어 유방은 항우랑 싸우면 매번 지기만 했고, 이긴 것은 마지막 해하의 전투 단 한 번뿐이다. 짜증나게도 항우는 잘생기기까지 했다고 한다. 대체 글자도 제대로 모르는 촌놈이 명문가의 잘생기고 힘센 금수저를 이긴 비결은 무엇이었을까? 항우의 치명적인 단점은, 남의 의견에 귀를 기울이지 않았다는 점이다. 항우 세력의 대표적인 책략가 중 '범증'이라는 뛰어난 인물이 있었다. 항우가 아버지와 같다고 하여 중보(仲父)라고 부를 정도로 따랐던 이 사람은, 초나라가 유방의 세력을 박살내고 홍문에서 연회를 치렀을 때에 유방을 죽이라고 명령을 내렸지만, 항우가 듣지 않아 다 잡은 고기를 촉 땅으로 놓아주는 것을 그저 지켜볼 수 밖에 없었다. 결국 나중에 둘 사이가 악화되었고, 범증은 사직서를 쓰고 고향으로 돌아가던 중 울화병이 도져 죽게 된다. 논공행상에서도 항우의 단점은 크게 드러난다. 기분에 따라, 개인적인 사감에 따라 논공행상을 하니 바른말하고 일 잘하는 부하들의 불만이 크게 드러날 수 밖에 없다. 항우가 중국 대륙을 거의 통일했음에도 불구하고 끊임없는 반란과 배반에 시달린 것은 그 용인술에 있다. 반면 유방을 보자. 진나라를 공략할 때에 역이기라는 사람이 결정적인 정보를 손에 쥐고 유방을 찾았다. 평소부터 학자와 선비를 무시하던 그는 날도 더운지라 편안한 복장에 발을 씻으며 역이기를 맞았고, 이에 기분이 상한 역이기는 대노하며 그대로 돌아가려 했다. 유방은 뭔가 일이 잘못되었다는 생각이 들자 바로 옷을 제대로 갖추어 입고 손님을 맞는 예의로서 역이기를 다시금 맞아 사죄했다. 필요하다고 생각되면 남의 의견을 바르게 경청하고, 그에 따라 실행할 줄 아는 사람이었던 것이다. 논공행상 부분 역시 항우와 큰 차이를 보인다. 촌무지렁이 시절부터 유방을 따르던 사람 중에 소하라는 인물이 있다. 그야말로 행정의 귀재였던 그는, 유방이 항우를 물리치고 중국을 통일하여 한나라를 세우자 가장 큰 공을 인정받게 되었고, 전장에서 직접 전투를 지휘하던 장수들이 불만에 차 '목숨걸고 싸운 우리보다 뒤에서 붓만 놀리던 사람이 공이 큰 건 말이 안된다'며 항의하자, 유방은 사냥개와 사냥꾼의 비유를 들며 소하의 특권과 특혜를 유지하였다. 허례허식만을 좇고, 나의 의견이 곧 옳은 의견인 줄 아는 많은 이들에게 묻고 싶다. 집안 좋고 잘생기고 힘도 장사인 금수저가 결국 패배하여 자결하고, 필부의 집안에서 태어나 술과 여자를 좋아하던 한량이 그 금수저를 이긴 이유가 무엇인지 알고 있느냐고.*잘 듣는다는 것은 이렇게나 중요하지만, 그래도 인종차별은 하면 안 된다고 생각한다.3. 초기 멤버가 관우랑 장비네요? 촉한 소열제 유비 스타트업에서 초기 멤버의 중요성은 더 말할 것도 없을 것이다. 실패하면 같이 망하고, 성공하면 함께 그 기쁨을 누릴 수 있는 초기 멤버는, 억만금과도 바꿀 수 없는 가치가 있다고 생각한다. 모두가 알고 있을 삼국지의 그 유비이지만, 말이 좋아 황족이고 황숙이지 그저 떨거지에 불과한 양반이다. 삼국지연의에서는 '중산정왕의 후예' 운운하지만 유비가 한나라의 황실과 갖는 관계성은, 주변 사람 중에 아무나 전주 이씨 한 명을 붙잡았을 때 그 사람과 세종대왕이 어떤 관계인지 알아보는 것과 별반 다르지 않다. 황족임에는 틀림없지만, 정통 명문을 이어갔다면 촌구석에서 돗자리를 짜고 있었겠는가. 그 유비를 삼국의 한 축으로 올려놓을 수 있던 원동력은, 사람의 됨됨이를 파악하는 귀신같은 능력도 물론 있었지만, 역시 굵직굵직한 초기 멤버들의 능력이 아니었을까 싶다. 하긴 스티브 잡스도 어쩌다 만난 동네 친구가 워즈니악이었으니까, 이런 멤버 구성은 그야말로 하늘이 내려주는 것이 아닐까. 옆동네 대기업에서 스카웃 제의와 함께 핑키파이...아니 적토마를 받으면서도 형님께 갈 수 있다며 좋아하고, 삼국시대에서 유일하게 전장에서 적장의 목을 친(삼국지연의에 수많은 일기투 장면이 나오지만 실제 역사에 남아있는 건 관우가 안량을 벤 것 뿐이라고 한다) 데다가, 나중에는 한 지방의 도독을 맡을 정도의 능력을 가진 사람과, 그 관우가 '걔가 저보다 세요ㅎㅎ'라고 말해서 조조를 긴장하게 만들거나, 장판파에서 20기의 기병으로 500기의 호표기를 상대로 버텨낸 맹장이 초기 멤버라면 어디에 가도 일단 한 자리는 해먹을 수 있지 않을까 싶다. 간손미 간손미 하면서 조롱하지만 간옹, 손건, 미축같은 이들도 비범한 인재였음에는 분명하다. 거기에 제갈량이나 마초같은 인물까지 가면 굳이 설명할 필요가 있겠는가. 조조처럼 잘 나가는 환관의 자식이라 위세가 등등했던 것도 아니고, 손권처럼 지연과 혈연으로 얽힌 지방을 터전으로 삼을 수 있던 것도 아닌 유비가 결국 나라를 세울 정도로 성공한 것은 인재와 팀 구성의 중요성을 반증하는 결과라고 할 수 있다. 모사재인 성사재천이라는 말이 있다지만, 인재가 없으면 일조차 꾸밀 수 없다.*동네 친구가 얼마나 중요한 지는 말 할 필요도 없다. 이래서 친구를 잘 사귀어야 하는가 보다.4. 성공했다고 변하면 바로 훅 가는 겁니다, 진무제 사마염 요 위의 삼국시대에서 가열차게 치고 받던 위, 한, 오는 결국 사마의의 자손들이 통수를 치고 진나라를 세움으로써 결말이 나게 된다. 삼국지연의에 빠져서 열심히 책을 읽던 이들이 갑분싸라는 말의 뜻을 깨닫게 되는 부분이며, 수많은 삼국지 팬들이 후반부를 그리 좋아하지 않게 되는 이유이기도 하다. 그렇게 진나라를 세웠으면 제대로 다스려서 태평성대를 이루기라도 해야지, 3대가 채 지나기 전에 나라를 말아먹어 5호 16국 시대를 연 장본인이 바로 사마염이다. 즉위 초반에는 개념찬 인물이었다. 꿩의 머리털을 이어 만든 사치스러운 모자 중에 '치두구'라는 물건이 있었는데, 수하 중 한 명이 이것들 사마염에게 바치자 즉각 태워버리라고 말할 정도로 검소한 생활을 유지했고, 영명하고 사리분별이 밝아 그야말로 명군이 될 것이라 모두가 믿어 의심치 않았다고 한다. 그러나 지리적 이점을 이용하여 마지막까지 버티던 오나라를 멸망시키고 중국 대륙을 통일하고 나니까 긴장이 풀린 것일까, 아니면 흔히 말하는 '현타'가 온 것일까, 바로 태세를 전환하여 세상의 온갖 사치와 향락에 빠져살게 된다. 당시 중국 대륙의 호구 수가 약 1,600만명 정도였다고 하는데, 후궁 1만명을 들여 매일 밤마다 양이 끄는 수레를 타고 그 수레가 멈추는 곳의 후궁과 밤을 보냈다고 한다. 태워버리라고 했던 치두구를 산더미처럼 쌓아놓고 '이까짓게 뭐라고 그렇게 무서워했는지'라며 껄껄 웃었다는 기록도 있고, 그나마 남아있던 바른말 하는 신하가 '폐하는 후한의 환제와 영제처럼 사치하고 부패한 군주입니다'라는 말을 해도 그저 웃어넘길 뿐 아무것도 나아지는 것이 없었다고 한다. 결국 지적 능력에 문제가 있는 아들 사마충이 황위에 오르고, 팔왕의 난과 영가의 난을 통해 4대만에 진나라를 말아먹고 사마예가 동진을 세우게 되는 원인을 만든다. 동진 역시 그리 오래가지 않아 망하게 되었고. 물론 진나라가 오래가지 못한 데에는 구품관인법의 시행으로 인한 귀족들의 카르텔 형성과 심각한 권력 독점, 사치, 부패도 있었고, 어린 나이의 황제들이 휘깍휘깍 죽어나가 권위가 약화된 것도 원인이 있었지만, 그런 풍조를 제 때에 정리하고 확립하지 못한 사마염의 잘못이 가장 크다고 보는 시각이 많다. 비록 사마염은 할아버지 사마의와 아버지 사마소가 이뤄놓은 업적에 방점을 찍기만 했다는 평가를 많이 받지만, 나름 명군의 자질을 갖춘 인재였다. 99%를 이룩해도 마지막 1%를 만족시키지 못하면 결국 실패라는 점에서, 전대의 과업을 완수하는 것으로도 충분한 능력이 있음을 입증한 것은 맞다. 그러나 성공한 뒤에 초심을 잃고 사람이 변질된다면, 결국 좋은 결과를 얻기 힘들다는 것을 알 수 있다. 여담으로 구품관인법에 대해서 말하자면, 중정이라는 기관을 통해 관직에 오를 사람을 평가하고 천거하는 방식이었기에 쉽게 카르텔 형성이 가능했고, 공정한 평가가 이루어지기보다는 중정의 비위를 맞추느라 굽신거리는 사람이 벼슬에 오르는 경우가 더 많았다. 결국 뜻 있고 능력있는 이들은 죽림칠현으로 대표되는 청류파가 되어 시골 산천에 은거하게 되었으니, 누군가의 추천에 의한 채용이 어떠한 결과를 낳는지는 이렇듯 역사가 말해주고 있다. *항상 우리는 초심을 잃지 말아야 한다.성공한 뒤에도, 연애할 때도.5. 스타트업 끝판왕, 명태조 홍무제 주원장 앞서 말한 진 문공은 그야말로 떠돌이 왕자였으며, 유방은 작은 동네의 이장이라도 해먹었고 동네 사람들이 두루 따르는지라 자기 세력이 있는 사람이었다. 유비도 알게모르게 황실의 종친이라는 부분에서 대의명분이나 도덕성 면에서 얻은 이득이 많다. 하지만 명태조 주원장만큼 정말 아무것도 없는 거지에서 일국의 황제로까지 올라온 입지전적인 인물은 세계사를 찾아봐도 없다. 어떤 정도냐면, 주원장은 고아였고, 거지였다. 하다하다 먹고 살 수가 없어서 승려 생활을 했던 적도 있다. 심지어 명나라도 도적무리인 홍건적 세력을 바탕으로 세웠다. 원나라 말기에 나라가 슬슬 망조가 들고, 사람들이 온통 굶어죽어 일가친척 의지할 곳이 없자 홍건적에 가입하여 세력을 키웠고, 그렇게 슬금슬금 세력을 키워나가다 결국 중국 대륙을 통일까지 해버리고 황제의 자리에 올랐다. 인품이 썩 훌륭하지는 않았는지 탁발승 생활을 할 때의 수치심이 평생 트라우마가 되어 대머리 독(禿)자를 쓰면 목이 날아갔다거나,  왕권 강화를 위한 숙청을 너무 해서 9만 명이 넘게 죽어나갔다거나 하는 일들이 있었지만, 백성들은 풍족하고 살기 좋은 나라를 만들었다며 온통 찬양하였다고 한다.  스타트업 업계에도 유복한 가정에서 태어나 성공하는 이들이 있고, 더러는 호부 밑에 견자 없다는 말이 마냥 맞는 말은 아니라는 것을 몸으로 보여주는 이들도 있다. 중요한 것은 집안, 학벌, 재력과 같이 주어진 것이 아니라, 스스로 쟁취하고 체득하는 것들임을 보여주는 완벽한 예시가 주원장이라고 할 수 있다. 파나소닉의 창립자 마츠시타 코노스케는 초졸이었고, 손정의는 재일교포라며 머리에 돌을 맞기도 했다. 잡스와 워즈니악은 별 볼일 없는 동네 청년들이었으며, 제프 베조스는 창고에서 아마존을 시작했다....다들 대머리인 걸 보면 역시 주원장은 옳았던 걸까. 여튼 중요한 것은 무엇을 가지고 있느냐가 아니라, 무엇을 얻어내는가가 아닐까 싶다.*성공을 위해서라면 자라나라 머리머리를 외치지 않을 용기가 필요할 지도 모른다.#더팀스 #THETEAMS #역사로보는 #스타트업 #자라나라머리머리 #역사에서 #배우기\ 

기업문화 엿볼 때, 더팀스

로그인

/