스토리 홈

인터뷰

피드

뉴스

조회수 1054

[블랭크코퍼레이션 상생 스토리.02] 세탁조 클리너에 담은 하나된 마음! -그린코스/서울에프엔씨 | 공백세탁조크리너

제조사와 같이블랭크는 좋은 기술과 제품을 보유한 제조사를 발굴하고, 그들과 함께 생활의 문제에 대해 고민하고 있습니다. 더불어 그 제품을 소비자와 더 효율적으로 연결할 수 있도록 함께 하고 있습니다. 우리의 고민이 단발성이 되지 않도록, 함께 성장할 수 있는 가치를 만들고자 노력하고 있습니다.서울에프엔씨 공장입구. 출고를 기다리는 공백세탁조크리너가 맞이한다.세탁기 내부의 세탁조를 청소하는 친환경 세제 ‘공백 세탁조 클리너’. 이 제품을 생산하기 위해 여러 기업들이 힘을 함께 모았다.친환경 세제만을 개발해온 '그린코스'와 친환경 세제 소분업을 이어온 '서울에프엔씨'. 그들의 협력 스토리를 들어본다.Q. 기업 소개?A. 그린코스 세탁 세제와 세정제를 주력으로 만들고 있습니다. 2012년 회사를 설립한 뒤부터 세척력은 좋고 인체와 환경에는 무해한 친환경 제품을 만들기 위해 꾸준히 연구 및 개발을 해왔습니다.2016년 가습기 세정제 문제가 불거지면서 소비자 인식이 변화해 인체에 유해하지 않은 제품을 찾는 소비자가 늘었습니다. 우리 제품을 사용한 소비자 사이에서 친환경 기능성 세제라는 입소문이 퍼지면서 회사를 알리게 되었습니다. 현재는 위생용품, 화장품 등을 포함해 20여 개의 제품을 생산하고 있습니다.A. 서울에프엔씨 2013년 화학제품, 식품첨가물, 화장품 원료 등의 유통판매를 처음 시작했습니다. 식품류 OEM과 위생용품을 주로 제조하는 OEM 전문업체에서 현재는 소분업체로 성장하고 있습니다.2014년 어느 블로그에서 주부가 직접 화학제품 매장을 찾아가 베이킹소다나 구연산 등을 큰 그릇에 담아와 친환경 세제로 사용하는 것을 인상 깊게 보고 소분업을 해야겠다고 생각했습니다. 천연세제를 예쁜 포장지에 담아 판매하면서 소분업으로 방향을 전환했습니다. 식품, 세제, 세척제, 액체세제 등 다양한 소재의 소분 경험을 쌓아가고 있습니다.Q. 함께 일하게 된 계기는? A. 그린코스 블랭크에서 세탁조 클리너를 개발하려고 한다며 조언을 구해왔습니다. 블랭크가 가지는 좋은 제품에 대한 고민과 새로운 생각에 공감했기에 함께 개발하게 되었고, 최적의 세제 분량을 찾기 위해 여러 번 실험을 거듭했습니다. 한번에 세제를 150g씩 사용하는 것이 가장 효과적이라는 것을 알게 되었으나 소분 설비가 없어서 제품 생산이 어려웠습니다.기존의 소분업체는 세제보다는 식품 쪽에 치중돼 있어 소분업체를 구하기가 어려웠습니다. 블랭크는 150g씩 소분이 가능한 설비를 갖춘 소분업체 서울에프엔씨를 찾아냈습니다. 현재는 우리가 세탁조 클리너를 제조하면 서울에프엔씨가 소분하는 방식으로 협업하고있습니다.A. 서울에프엔씨지난해 하반기에 블랭크가 친환경 세제 소분이 필요하다며 같이 하기를 제안 주었습니다. 소분업체는 식품류를 소분하는 업체가 대부분입니다. 식품회사에서 식품을 소분하는 기계에 세제를 넣는 것을 꺼리기 때문에 세제를 소분하는 업체가 흔치 않습니다. 우리는 위생용품 제조허가를 가지고 있어서 세제를 소분할 수 있는 최적화된 시설을 갖추고 있었습니다.세탁조 클리너는 소분 시 분진이 발생하는 문제도 있었는데, 저희는 다양한 경험으로 분진을 잡는 노하우도 가지고 있었습니다. 분진을 잡지 못하면 완제품에 가루가 묻어 나오게 되고, 소비자 입장에서는 배송 중에 제품이 터졌거나 이상이 생겼다고 생각하기 쉽습니다. 저희만의 노하우로 분진 문제를 해결할 수 있었습니다. 그린코스에서 원료를 만들고 서울에프엔씨에서 포장을 한다.공백 세탁조 크리너가 제조되는 과정세탁조크리너를 하나하나 꼼꼼히 포장하고 직원분들세탁조 클리너에 사용한 세제는 친환경 세제로 각광을받은 제품입니다.소비자 입장에서 조언해준 블랭크 덕분에 두 번에 걸쳐 세탁조를 세척하는 방식도 채용했습니다.Q. 제품 만드는데 어려움은 없었나? A. 그린코스  저희가 만드는 세제의 원료 가운데 3가지 원료는 시중에서 구할 수 없는 자체 개발한 것입니다. 환경이나 인체에 무해한 세제를 만들기 위해 시중에 판매 중인 계면활성제를 전부 구입해서 테스트를 했습니다. 그러나 친환경 식물성 계면활성제이면서 강력한 세척력을가진 제품은 흔치 않았습니다.세탁조 클리너에 사용한 원료는 화장품에 들어가는 계면활성제로 개발된 것입니다. 세척력이 좋았고 화장품 원료이기 때문에 인체에 유해할 걱정도 전혀 없었습니다. 이 원료를 결합해 계면활성제를 개발하기 위해 많은 노력이 필요했습니다. 원료를 배합해 분말을 만들어야 하는데, 딱딱한 돌덩이가 되기도 했습니다. 계면활성제를 개발하는 데만 10개월이 걸렸습니다.A. 서울에프엔씨우리는 소분과 포장을 담당합니다. 제품 생산의 마지막 단계이다 보니 검수에 신경을 많이 쓰는 편입니다. 특히 세탁조 클리너는 제품패키지가 흰색이어서 이물질 등을 꼼꼼하게 살펴봐야 합니다. 매장에 진열할 때도 사람들의 손때 같은 것이 묻을 수 있어 흰색을 잘 쓰지 않습니다.하지만 블랭크는 소비자의 시선을 모을 수 있는 흰색 패키지를 선택했고, 저희는 이물질에 대한 검수를 더욱 철저히 했습니다. 예를 들어 박스포장업체에서 하얀색 패키지에 잉크가 찍혀 나오는 경우가 생길 수 있습니다. 이런 불량이 발생하면 사진을 찍어 전달합니다. 조심해야 하는 부분이 어떤 부분인지 정확하게 소통이 가능하기 때문입니다.Q. 시장의 반응은? A. 그린코스  시중에 세탁조 클리너 제품이 있지만 세척 효과는 별로 없었습니다. 세탁조 클리너에 사용한 세제는 친환경 세제로 각광을 받은 제품입니다. 소비자 입장에서 조언해준 블랭크 덕분에 두 번에 걸쳐 세탁조를 세척하는 방식도 채용했습니다.처음에는 10톤의 오더가 들어왔고, 이후 20톤, 30톤으로 늘어났습니다. 현재 60톤까지 주문이 들어오고 있습니다. 물량을 맞추기 위해 직원도 늘리고 쉬는 날 없이 노력하고 있습니다. 덕분에 매출도 45% 성장했습니다.A. 서울에프엔씨초반보다 주문 물량이 3배 이상 늘었습니다. 기존 세제 소분업 매출의 3배 이상의 성과를 거두고 있습니다. 제품 작업량이 늘면서 기계를 하나 더 들여 추가 라인을 구축했습니다.사실 블랭크를 만나기 전부터 친환경 세제의 소분 판매를 온라인으로 시작했었습니다. 하지만 친환경 세제가 각광을 받으면서 대기업제품이 대량 생산돼 우리 제품만으로는 시장에서 생존하기 어려워져 사업을 포기한 상태였습니다. 이번에 블랭크를 만나 공백 세탁조클리너를 생산하게 되면서 소비자 니즈에 맞는 마케팅 방식과 상품 구성이 중요하다는 것을 깨닫게 됐습니다.Q. 어떤 점이 달랐는지?A. 그린코스 다른 업체는 제조사를 잘 드러내지 않으려고 합니다. 하지만 블랭크는 달랐습니다. 특히 우리 제품은 설명이 필요한 기능성 제품입니다. 소비자에게 제품 사용법에 대해 자세히 설명을 해야 하는데 블랭크는 소비자가 이를 이해하기 쉽도록 함께 고민해주고 있습니다. 덕분에 소비자 반응이 더 좋았던 것 같습니다.제조사는 판매가 늘 걱정입니다. 제조사가 열심히 제품을 개발해도 좋은 판매전략을 만나지 못하면 그 제품은 시장에서 사장되기 쉽습니다. 지금처럼 소비자가 제품을 제대로 이해할 수 있는 마케팅이 잘 이뤄진다면 더 좋은 제품을 만드는 데 전념할 수 있을 것 같습니다. 앞으로 블랭크와 더 많은 일을 함께하고 싶습니다.A. 서울에프엔씨 소비자의 요구를 파악하고 반영하는 것도 중요하지만 협력사의 의견에도 귀를 기울이는 업체라는 점이 매력적이었습니다.충진기계를 추가하면서 기계 가격이 만만치 않아 고민을 많이 했습니다. 이를 솔직하게 말하자 우리 기준에 맞춰 결제 시스템을 일주일 단위로 조율해 줬습니다. 쉽지 않은 일임에도 불구하고 흔쾌히 들어줬습니다. 보통의 업체들은 ‘그건 사장님이 선택할 문제죠’라고 떠넘기고 책임지지 않으려고 합니다. 그런데 블랭크는 절충점을 찾아갑니다. 문제를 잘 들어주고 적극적으로 소통할 수 있어서 신뢰가 갑니다. 오래 함께할 수 있는 동반자라고 생각합니다.Lifestyle needs solutionblank.
조회수 742

아래로부터 스타트, 업(up)

저는 스타트업 경험이 없어서 그런지 핀다에 들어온 일주일 간은 서로서로 oo 님이라고 부른다는 것에 익숙하지 않았습니다. 대표님이 인턴을 부를 때에도, 인턴이 그 누구를 부를 때에도 직책이 아닌 oo 님이라고 지칭하며 존대를 하는 문화는 갓 제대한 군인에게는 오히려 부담스럽게 느껴졌습니다. 익숙하지 않았기에 더욱 의문이 들었습니다. 때론 상명하복 방식이 효율적이라고 생각하지만 스타트업에서는 왜 서로의 의견을 존중해야 하며 그렇기에 존대를 하는 것일까라는 의문이 들었습니다. 핀다에서 약 두 달간 일하며 드디어 이 물음에 대한 답을 찾은 것 같아 여러분과 공유하고 싶습니다.   #1. 스타트업에서 일하는 것은 힘듭니다. 회사의 Front 와 Back을 넘나들며 경영, 인사, 재무, 기획 때로는 개발까지 넘나들며 모든 일을  처리해야 하기 때문일까요. 불확실한 미래, 많은 업무량, 현재로서는 만족할 수 없는 월급 등 생각 없이 무작정 덤벼들기에는 포기해야 할 것들이 많습니다. 하지만 창업이라는 힘든 길을 찾아서 걷는 사람들에게는 한 가지 공통된 이유가 있습니다. 바로 회사가 이 세상에서 이루고자 하는 비전, 그 꿈을 믿고 실현시키기 위하여, 현실에서 그 꿈을 이루어 세상에 조금이라도 보탬이 되고자, 많은 것들을 포기하고도 밤을 설쳐가며 일을 하고 있습니다.   Finda, For your better Financial Decision. 당신의 더 나은 금융 선택을 위하여, 핀다.IMF 외환위기, 2009년 금융위기를 겪으며, 또 그 사태에 대해 공부하면서 대한민국의 금융 기반 시설 자체가 선진국들에 비해 매우 부족하다는 생각이 들었습니다. 저는 투자은행, 국제 금융기관을 거쳐 경험을 쌓은 뒤 금융법까지 공부하여 대한민국의 금융 시스템 발전에 조그마한 도움을 주겠다는 꿈을 가지고 있습니다. 어떻게 보면 그 큰 꿈의 목표 중 하나가 개개인의 금융에 대한 접근성, 이해성을 높이는 것이라고 생각했습니다. 개인의 금융 선택을 편리하게 만들어 사람들의 삶의 질을 높이겠다는 핀다의 비전, 저는 핀다의 그러한 클래시한 비전에 동참하고자 핀다와 함께하게 되었습니다.스타트업에서의 꿈과 현실, 그리고 고민모든 것들이 계획한 대로, 처음 꿈꾸던 대로 이루어진다면 얼마나 좋을까요. 역시나 꿈을 이뤄나가는 데에 있어서 항상 이상적으로 모든 것이 해결되는 것은 아니었습니다.  “Of course your opinion MATTERS.”#2. 비전 차원의 고민저는 두 달간  회사의 재무 계획 (financial projection)을 세우는 일을 담당하였습니다. 회사의 사업과 비용을 사용하는 모든 활동에 대한 분석을 하다 보니 의문이 들었습니다. 우리가 하려고 하는 사업과 우리가 사용하는 모든 돈은 과연 우리의 비전을 위한 것인가. 제휴사들을 위한 페이지를 만든다는 것은 과연 누구를 위한 일인 것일까. 페이스북에서 광고를 하는 것이, 타 검색 사이트에서 핀다를 노출시켜 방문자 수를 높이는 것은 얼마나 의미가 있는 것인지, 사업 초기 단계에 어떻게 해서라도 제휴사, 방문자를 늘리는 것도 중요하지만 이것이 과연 고객을 위한 일 일지, 이렇게 하는 것이 비전에서 멀어지는 것이 아닌지 걱정도 들더군요. 고객의 입장에서 항상 고민하는 핀다(Finda)새로운 사업영역을 확장하는 것에서부터, 제휴사와 협약을 맺을 때, 사이트상 노출 우선순위를 정할 때,  또는 이메일을 작성하는 가장 기본적인 회사의 업무 프로세스까지 핀다는 항상 핀다의 가치관에 따른 결정을 내리고자 노력합니다. 모든 결정과 판단이 비전과 직접적 연관이 있는 것은 아니지만 항상 비전 차원의 논의를 한다는 것이 핀다의 멋이 아닐까요. 저 또한 비록 인턴으로 일하였지만 제가 처리하는 모든 업무에 저의 결정권, 그리고 재량을 가지고 핀다의 비전을 업무 곳곳에 녹여낼 수 있었습니다. 그렇기에 인턴사원의 발언, 업무 하나하나 존중받는 아래로부터 시작하는 핀다의 문화는 매력적이었습니다. 바로 그런 점에서 핀다는 비전을 함께하는 자, 구성원 모두를 존중하기에 서로를 존대하는 것이라고 생각합니다. 때로는 그 과정이 비생산적일 수도, 결과적으로 더 돌아가는 길이기에 느릴 수도 있지만 단순히 설립자의 비전을 위해 직원들이 지시사항을 따르는 회사가 되는 것을 핀다는 거부 합니다. 꿈과 현실 사이... 금년의 투자유치 계획을 달성하는 것, 제휴사를 늘리는 것, 회사의 기업가치를 높이는 것 모두 중요한 일입니다. 하지만 그보다 중요한 것은 대표부터 인턴까지 회사의 일원 모두가 하나의 꿈을 이루기 위하여 나아가고 있다는 것, 그리고 그것을 항상 고민하며 반성하고 있다는 사실이 핀다의 클래시함입니다.  금융 선택의 길잡이가 되겠다는 장기적 계획을 가지고 꾸준히 노력한다면 언젠가 핀다를 알아주는 분들이 생길 것이라는 확신이 있습니다. 조급하지 않게 언젠가는 올 기회를 기다리며 오늘의 화려함보다는 기업의 진실됨으로 평가받고 싶고, 그렇기에 고객 중심의 서비스를 만들기 위하여 항상 노력하고 있습니다. 진정한 기업의 가치란 이러한 비전에서 나오는 것이라 믿습니다. #3. 핀다는 항상 미래를 고민하고 있습니다.한 번은 신규 사업/카테고리 론칭을 위해 900개 정도 웹상에 흩어져있는 데이터를 엑셀 파일로 한 곳에 모으는 작업을 수기로 진행한 적이 있었습니다. 단순 반복적인 작업에 심신이 피폐해져, 핀다에 조인하게 된 이유 + 열정적으로 회사의 비전에 동참하겠다는 초기의 모습과는 멀어져 있는 제 자신을 발견하게 되더군요. 이때마다 동료들의 도움이 컸습니다. 멋진 비전으로 뭉쳐져 있고 열정에 차있는 동료들을 볼 때면 제 자신을 반성하며 초심에 대해 생각하고, 회사의 거시적 방향성에 대해 다시 한번 생각을 해보게 되는 시간이 되었습니다.  때로는 일에 치여, 때로는 현실과의 타협 속에 초심을 잊어버릴 때면 핀다의 일원 모두는 항상 목표를 다시 가다듬으며 더욱 큰 꿈을 위해, 클래시 한 기업이 되기 위하여 노력하고 있고 그러한 진정한 기업가치를 높이기 위하여 노력하고 있습니다.비록 저는 이제 다시 학업을 마치기 위해 타국에 홀로 돌아와 있지만 핀다의 멋진 비전에, 열정적인 사람들과 잠시나마 함께했다는 추억은 잊지 못할 것 같습니다. 기업으로서의 격, 클래시함을 추구하는 핀다, 항상 옆에서 지켜보며 응원하겠습니다.You Stay Classy, Finda!RA from Finda최민 드림.   #핀다 #스타트업일상 #RA #기업문화 #조직문화
조회수 760

창업하다 직장인이 되며 느낀것들

 안녕하세요, 너무나 오랜만이네요 (이 사람 글 언제 쓰나.... 기다리셨던 분들에게 심심한 사과의 말씀을...)직상생활을 시작하는 바람에, 새로운 환경과 생활에 적응하느라 상당히 많은 시간이 걸렸네요 죄송합니다. 오늘은 타이틀 그대로, 첫 사회생활을 "창업"으로 시작하시는 분들에게 꼭 드리고 싶은 이야기를 해보려고 합니다.(왜냐면 저가 딱 그짝이거든요...ㅎ) 여러분들은 왜 창업을 하려고 하세요?내가 가진 아이디어가 지금 놓치기엔 너무나 좋은 아이디어라서? 딱딱하고 정형화된 회사가 싫어서? 내가 좋아하는 사람들과 하고 싶은 것들을 하고 싶어서? 정 아니라면 대기업 가고 싶은데 취직이 안돼서? 다양한 이유가 많을 것 같아요, 위에 있는 몇 가지 부분들이 저도 창업을 하게 된 이유였기도 하구요. 그러나 제가 창업을 할 수 있었던 가장 큰 이유는,"아무것도 몰랐기 때문에."라는 것도 엄청 큰 부분을 차지했던 것 같아요. 내가 사회생활이라는 것을 안 해봤으니까 그냥 무작정 시작할 수 있는 용기를 얻었던 거고요. 즐거울 것 같으니까, 재밌을 거 같으니까. (또 그렇게 좋아서 시작한 스타트업, 더 좋게 할 수 있으시도록 이렇게 제가 글을 적고 있는 것도 있죠!:) ) 그러나 본론으로 돌아와서, 지금은 다시 스타트업으로 돌아오긴 했지만, 한 달 반 동안 회사에 출근하며 제가 창업을 하면서 볼 수 없었고, 느낄 수 없었던 것들을 너무나도 많이 볼 수 있었고, "이 한 달 반의 경험이 이전에 나에게 이뤄졌으면 어땟을까..."라는 생각이 들 정도로 많은 것들을 배울 수 있었고, 이러한 부분들을 하나하나 주제별로 나누어서 알려드리고 싶네요.1. 경험이 중요해?라고 시작했지만 경험이 중요하더라고요.... 많은 분들이 스타트업을 "내 생각한걸 만들 수만 있다면 분명 대박 날 거야."라는 큰 포부로 창업을 결정하고, 주변에 많은 분들과 함께 제작을 실행할 수 있는 추진력을 가지고 진짜 서비스를 만들어 냈다! 까지만 가더라도 저는 큰 박수를 보내드리고 싶습니다 거기까지 도달한 것만으로도 정말 너무나 많은 생각과 고민을 지나오셨다는 걸 알거든요. 저는 처음부터 제가 어떤 "세상을 바꿀 엄청난 것을 만들겠다!!!"라는 큰 포부 보다는, 그냥 "내가 좋아하는 거를 만들어 보고 싶다"라는 정말 소소한 생각에서 시작한 거였고, 그렇게 나아가다 보니 하고 싶은걸 하게 된 경우거든요.... 그런데 정말 이게 다가 아니라는 게, "창업"을 한다는 것 자체가 "궁극적으로 수익을 낼 수 있는 사업을 만드는 것"인데, 그러한 수익사업에 대하여 경험해 보지 못한 다양한 사항들 때문에 간과되어 낮게 판단되는 부분들이 있다면, 그만큼 리스크를 가지고 갈 수밖에 없다는 생각을 문득 많이 하는 것 같아요. 전에 어떤 분이 스타트업 창업 콘퍼런스에서, "대학생활 끝나고 바로 창업하는 건 죽으러 가는 거나 마찬가지다."라는 이야기를 한 적이 있는데, 처음 그 이야기를 들었을 때는 "아직도 저런 나쁜 소리를 하시는 분들이 계시는구나...." 싶었는데,  경혐을 해보니. "해봤다는 것" 자체가 100% 성공을 좌우하는 것은 절대 아니지만 50% 이내의 영역은 좌우할 수 있다.라는 것이 제가 요즘 스타트업에서 일하면서 많은 분들을 보며 들게 된 생각입니다.2. 넓은 생각을 가지는 게 우선이지만, 넓은 생각만 가진다고 되는 게 아니다. "당신의 도전을 응원합니다." 같은 소리나 "창업자 정신" 같은 소리가 아닌, 내 서비스에 대해 어떻게 풀어나갈 것인지 상황을 파악하고, 적절히 도전해 나갈 수 있도록 분석하는 것은 경영자가 반드시 가져야 하는 덕목이란 것은 굉장히 중요하고, 이건 경험도 중요하지만, 경험으로 커버할 수 없는 본디 개개인이 가지고 있는 기본적인 Mind Set의 영역이라고 더 생각이 듭니다. 그러나 창업자가 이걸 잘하니깐, 다른 것들에 대해선 조금 소홀해도 될까요?여러분이 창업을 하기로 결정한다는 것은 서비스를 경영하기 위해선 하고 싶은 일들이 아닌, 해야 할 일들을 해야 하는 때가 훨씬 많아질 겁니다. 그리고 다른 영역들을 잘 하는 사람들과 일 하려면 그분들과 충분히 방향에서 타협해야 하는 방향도 생기고, 그러한 과정에서 서로서로를 이해시켜야 할 때가 생겨요. 근데 그럴 때마다 그냥 "나는 이런 생각을 가지고 있으니깐 그냥 따라와."라는 것은 절대 팀원들을 납득시킬 수 없습니다. 그만큼 더 열심히 공부하고 더 많이 알아야 한다는 것이 제 생각입니다. 단적으로 이야기한다면, 프로젝트의 총괄로서, 어떤 서비스를 어떻게 구축하고 싶다에 대한 생각만 있고 그 서비스가 어떻게 구현될지, 구축하기 위해선 어떤 방식으로 제작하는 것이 좋을지, 어떻게 업무를 관리해야 할지에 대해 명쾌하게 설명할 수 없다면, 창업은 가능하지만, 서비스를 끝까지 이뤄낼 수 있을지는 큰 의문이 드네요...3. 실력 있는 사람들을 만나는 게 다가 아닌, 내 로직이 있는 사람이 돼야 한다. 말 그대로입니다. "나 누구랑 밥 먹으면서 이런 이야기를 들었는데, 정말 좋더라."는 그냥 말에 불과합니다. 그것에 대하여 조금 더 정제할 줄 알아야 하고, 그에 대한 자신의 철학을 담아서 서비스에, 또는 서비스를 제작하는 과정에서 implant 하고 자신의 결과에 책임을 질 줄 알아야 한다고 생각해요. 그런데 그런 일들이 경험이 기반이 되어야 할 수 있는 게 많아서 또 경험 이야기를 안 할 수가 없어지네요... 스타트업이 자유로운 구조속에서 보다 빠른 의사결정을 통해 성장하는 구조라고 한다면, 그러한 성장을 이끌기 위해선, 어떤 다른 사람들의 조언을 듣고 "이거 좋겠다."라는 생각으로 일처리를 하게 되다 보면은 의사소통에서 벽이 생길 가능성이 굉장히 큽니다. 내 주관, 내 가치관을 가지고 시행하지 않는 것들은 자신의 마음속에서도 반신반의가 지속적으로 일어나기 때문에 다른 사람들을 설득할 수 있는 당위는  당연히 떨어지게 되고, 그때는 당연히 커뮤니케이션에서 큰 문제가 생기죠. 그런데 처음부터 일을 시작해 보지 않은 상태에서 그런 식의 일처리를 한다는 것이 많이 힘든 거 같다는 생각이  조금 많이 들었어요. 위에서 제가 지속적으로 말씀드리는 "경험"이라는 것의 힘이나, 경력자들의 조언, 기술적인 것들에 대한 지속적인 공부 같은 이야기들은 제가 처음 스타트업을 시작할 때는 별로 공감할 수 없었던 말들이었습니다.(정말로....) 근데 제가 이렇게 말을 할 줄은 4년 전에는 정말로 몰랐네요...ㅎㅎ 2012년의 저는 그냥 말 그대로 우물 한 개구리였어요. "그냥 내 방식대로 프로덕트를 만들기 위해서 그렇게 관리하면 되는 거고, 그냥 그렇게 보이는 데로 내가 생각하는 데로 한다면 뭐 기술적인 것들을 정리하는 것, 디테일한 것들을 챙기는 법 들은 서비스가 잘 되면 다 알아서 흘러갈 수 있는 거지..."라는 생각을 많이 했고, 그렇게 내렸던 결정들이 지금은 후회로 남네요. 근데 지금 와서 생각해보니 "그때 지금만큼 알고 생각할 수 있었다면...."이라는 안타까운 생각도 좀 들고, 조금 더 구조적으로 갖춰진 곳에서 일을 하다 보니, 그전에 보지 못했던 것들을 많이 볼 수 있어서 그냥 이 말들 해드리고 싶었어요. 그리고 나름 "창업"이란걸 해보고 스타트업이나 업무에 대한 자신감을 가지고 들어와서 일을 하다 보니, 그만큼 제가 사회생활에 대하여 몰랐던 것들도 너무 많고, 또 "내가 밥값 줄만큼 일을 잘 하는 건가..."라는 마음에 의구심이 덜어서 이런 글을 적게 되나 봅니다. 그래도 이제 군인 물 많이 빠져서 "요" 자도 많이 쓰고 많이 글이 부드러워진 것 같아 한결 좋네요.ㅎㅎ  하고 싶은 일을 말리고 싶은 마음은 추호도 없습니다! 지금이라도 도전하고 싶다면 초년생이든, 산전수전 다 겪은 분이든 언제든 하고 싶은걸 할 수 있다는 것이 얼마나 신나는 일인데요!:) 그러나 스타트업을 시작하려면 많은 준비, 혼자서 할 수 있는 "이 정도면 충분해!"하는 준비 말고, 조그만 회사에서 인턴이라도 회사생활을 한 번만이라도 경험해 보면 바로 창업을 시작하는 것보다, 정말 많은걸 볼 수 있는 시야가 생길 거 같다는 말을 하고 싶었습니다. :) 오늘도 읽어주셔서 감사합니다! 다음에는 더 재밌고 유익한 글로 찾아뵐게요!#코인원 #블록체인 #기술기업 #암호화폐 #스타트업인사이트
조회수 974

해커 준비: 좋은 코드 만들기

출처 : 구글 이미지 검색Just Hacks지난 몇 주간 저는 I/O의 devops문화 기반을 다지는 작업을 해왔습니다. 여전히 부족한 점이 많지만 그동안 일어난 변화를 지켜보면 첫 걸음은 비교적 잘 뗀듯 합니다. 지금부터는 이 devops문화가 제대로 자리잡는 일이 중요한 단계입니다. 다시말해, devops문화가 튼튼하게 뿌리내릴 수 있게 Hacking하는 것이 저의 당분간의 과제입니다.최근 devops를 연구하고 도입하는데 적잖은 시간과 노력을 쏟았기 때문에 실패할 경우 매몰비용이 만만치 않습니다. 꼭 성공시켜야하는만큼 실증적으로 엔진을 검증하기로했습니다. 그래서 지난 주부터는 저도 devops문화에 소속된 벡엔드 엔지니어로서의 일을 시작했습니다. 당분간 직접 코드를 만들어내야겠지요.설계에 그치지 않고 스프린트를 직접 참여해야만 현재 devops문화가 지닌 문제점이 무엇인지 제대로 볼수 있고 훌륭한 기술조직으로 거듭날 수 있다고 저는 믿습니다. 다시 개발자의 자세로 돌아가기 위해 가장먼저 좋은 코드를 작성하는 공부를 시작하였습니다.좋은 코드 만들기컴퓨터가 인식 가능한 코드는 바보라도 작성할 수 있지만, 인간이 이해할 수 있는 코드는 실력 있는 프로그래머만 작성할 수 있다. -마틴 파울러-SW엔지니어가 되기로한 이상, 제겐 감동까지는 아니지만 코드리뷰를 하는 짝꿍이 쉽게 이해할 수 있는 좋은 코드를 짜야할 의무는 있습니다. 그래서 지금까지 감명 깊게 읽은 고전 책들을 복습하기 시작했습니다. 그 첫 번째 책이 켄트백의 구현패턴입니다. 이 책은 설계나 디자인 패턴과 같은 추상적인 내용보다 키보드로 코드를 짜내는 순간에 고민해야하는 부분에서 교훈을 줍니다. 저는 이 책을 통해 코드를 바라보는 제 관점이 다음과 같이 바뀐듯 합니다.필드(현업)에서 생산된 코드는 코드를 작성하는데 드는 시간보다 읽는 시간이 압도적으로 많기 때문에 이를 감안해 봤을 때 읽기 “좋은 코드”를 짜는 노력이 가장 중요하다.돌이켜보면 학생 시절에는 왜 좋은 코드를 짜야하는지 당연히 모를 수 밖에 없었던 것 같습니다. 프로젝트성격의 코드만 짰기 때문에 종강하고나면 제가짠 코드를 다시는 들여다 볼일이 거의 없었거든요. 만약 대학교가 학생들의 취업경쟁력을 높이기 위해 CS 지식 뿐만아니라 Hacker 소양도 가르치고 싶다면 1학년부터 졸업할 때까지 서서히 발전되는 프로그램 하나를 만드는 4년짜리 과제를 두면 효과적일 것 같습니다.말씀드린 것처럼 필드에서 생성된 코드는 작성 시간보다 유지보수를 위해 읽혀지는 시간이 더 많은 편입니다. 특히 린스타트업을 충실하게 따르는 스타트업이라면 런칭기간이 극단적으로 짧기 때문에 제품(SW) 의 생애주기 중 99%의 시간이 유지보수 단계에 있을 것입니다. 이런 관점에 비춰보면 독자를 고려한 좋은 코드를 짜야한다는 사실은 더욱 중요해집니다.새로운 원칙지금까지 제가 견지하고 있는 좋은 코드를 만드는 원칙은 단순화와 중복제거였습니다. 이번 기회에 이 책을 다시 읽고 제 프로그래밍관에 새로운 원칙을 한 가지 더 추가하였습니다. 일관된 추상화인데요.좋은 코드는 일관된 추상화를 보여줍니다. 아래 예시 코드로 바로 확인하실 수 있습니다.void compute() { input(); flag |= 0x0080; // 나쁜 추상화 output(); }이 간단한 compute라는 함수는 제목처럼 입력(input)을 처리하고 이를 16진수 연산을 거친뒤에 출력(output)과정을 거치면서 마무리 됩니다. 그런데, 함 수 2번째 줄에 드러난 flag변수의 16진수 연산은 조금 쌩뚱 맞습니다. 암호처럼 느껴지네요. comput의 절차를 보여주는 input, output 사이에서 세부 구현사항을 친설하게 알려주려는 작성자의 배려는 되려 독자에게 혼란을 주기만 합니다. 이 혼란스러운 코드를 캡슐화를 통해서 일관된 추상화 수준으로 아래 코드처럼 리팩토링 할 수 있습니다.void compute() { input(); updateFlag(color.Brown); // 좋은 추상화 output(); }16진수 연산대신 의도가 드러나는 함수명과 인자전달을 통해 우리는 input을 처리하고 ouput을 갈색 텍스트로 출력시킨다는 사실을 자연스럽게 받아들일 수 있게 됩니다. 보시는 예제처럼 일관된 추상화는 문제해결 능력, 알고리즘 실력보다 코드를 작성하는 센스에 가깝습니다. 항상 독자를 배려하는 마음을 갖고 상대방에 입장에서 서서 코드를 작성하는 습관을 가져야 겠습니다. 이제 코드를 짜고 리뷰도 받으면서 구린내나는 코드를 신나게 리팩토링 할 일만 남았네요 :-)#스위쳐 #Switcher #DevOPS #데브옵스 #개발 #개발자 #DevOPS도입 #인사이트 #성장
조회수 559

진정성이 곧 브랜드

이젠 속일 수 없다마케터의 역할은 소비자가 가지고 있는 인식을바꾸는 일이다.자사의 상품을 인지하고 있지 않다면,고객이 그것을 인지하도록 유도하고,자사의 브랜드가 신뢰를 가지고 있지 못하다면신뢰를 만들어주는 역할을 하는 것이 마케터의 일이다.이제는 본질을 가지고 있지 않은 상품이나 서비스는그럴싸하게 포장할 수 있는 시대는 지났다.광고나 메시지로 실체를 위장할 수 없을만큼정보의 시대에 우리는 살고 있다.    브랜딩은 기업의 철학이상품이나 서비스로 발현되면서 누적되는 가치이다.외치는게 아니라 흘러 넘쳐아 하고,어쩌다 성공한 하나의 상품이 아닌일관되게 누적된 가치의 합이 곧 브랜드가 되는 것이다.누군가 떠오르지 않는가러브마크 브랜드의 특징들 중 하나는브랜드를 떠올리면 생각나는 '누군가'가 있다는 것이다.그것이 창업자나 대표일 수도 있고,특정 개발자나 디자이너, 마케터일 수도 있다.남과 다른 생각을 가진 누군가의 정신이곧 상품으로 치환되는 과정에서 브랜드가만들어진다고 생각한다.브랜드는 하나의 인격체이다.영화의 주인공처럼 자신의 개성이 분명하고,일관된 캐릭터로 주변에 반응했을 때그 실체가 분명해진다.아무 영혼도 없이,추구하는 가치도 불명확한 상품을한정된 자원으로 '브랜딩'해야하는 기업의 마케터들은고민이 많을 수 밖에 없다.풀 수 없는 숙제를 받고숙제 검사를 받을 때마다 책임을 뒤집어 써야하는숙명을 가지고 있는 것처럼 느껴지기도 했다.그럴듯한 전략으로 포장한들, 화려한 디자인으로,시선을 사로잡는 광고로 현혹한다고 하더라도지속되는 것은 진정성이 있는 것만이 가능하다.진짜인가? 그게?개성있는 사람을 키워야 한다.색깔있는 인재를 발견해야 한다.취향 뚜렷한 캐릭터를 발굴해야 한다.그리고 그들에게 맡겨야 한다.내 일을 시작하고직원의 필요성을 점차 느끼기 시작하면서직장에서 좋은 직원이라고 판단했던 기준과는느낌이 사뭇 다른 관점으로 인력을 보게 된다.브랜드도 인격체 이듯이사람도 곧 브랜드다.사람이 모든 것이다진정성 있는 사람이 핵심이고,그들이 모였을 때 힘 있는 브랜드가 탄생할 수 있다.그렇게 믿고,그렇게 찾아야 한다.
조회수 2525

리디북스 웹뷰어의 이어보기를 개발하며

최근 리디북스에서는 판타지 연재물을 웹에서 바로 볼 수 있는 기능을 새롭게 선보였습니다.기존에는 별도의 앱을 설치하고 다운로드하는 과정을 거쳐야 했기에 연재물을 보는 사용성이 좋지 않았습니다만, 브라우저에서 바로 볼 수 있는 “웹뷰어” 기능을 제공함으로써 사용성을 높일 수 있었습니다.그리고 여기에 사용성을 더하기 위해 추가된 것이 이어보기 기능입니다. 짧아도 100화 이상, 길게는 1000화가 넘는 연재물에서 다음 화로의 매끄러운 연결은 매우 중요합니다. 혹은 잠시 읽기를 중단했다가 다시 돌아왔을 때, 어디까지 보고 있었는지를 빠르게 알려준다면 호흡을 이어서 작품에 더욱 몰입할 수 있을 것입니다.이어보기가 구현된 모습리디북스에 로그인되어 있다면, 이곳에서 확인하실 수 있습니다.이번 글은 이어보기 기능에 대한 개발 후기입니다. 요구 사항에 따라 여러 저장소 솔루션을 비교해 보았으며 최종적으로 Couchbase를 선택한 이유와 간단한 벤치마크 결과, 그리고 겪었던 문제를 공유합니다.요구 사항기획된 내용을 요약하니 아래와 같습니다.연재물의 가장 마지막에 읽은 화를 알 수 있다.보았던 모든 연재물에서 가장 마지막에 읽은 연재물을 알 수 있다.사용자가 본 모든 연재물 목록을 확인할 수 있다.이를 개발자 용어로 다시 풀어보면 아래와 같습니다.연재물을 읽을 때마다 연재물 ID와 화(episode) 정보를 기록한다.보았던 연재물을 최신순으로 정렬하여 가져온다.선택된 연재물의 마지막으로 읽은 화를 가져온다.목록에서 특정 연재물을 삭제한다.이어보기는 가장 마지막에 읽은 연재물을 기억하기 위해 작품을 열 때마다 해당 정보를 기록해야 합니다. 그런데 수십 화를 연달아서 보는 연재물의 특성상 내가 어디까지 읽었는지를 조회하는 것(read)보다 내가 읽은 연재물을 기록하는 것(write)이 더 많을 것으로 판단했습니다. 즉, 읽기보다 쓰기가 더 많을 것으로 예상했습니다.NoSQL을 쓰자대부분의 연산이 쓰기(write)와 관련된 이상, 어떤 저장공간을 사용할 것인지가 주된 관심사였습니다.특히 RDBMS와 NoSQL 사이에서 어떤 것을 사용할지 많은 고민과 테스트를 했고, 결국 아래와 같은 이유로 NoSQL을 사용하는 것이 적합하다고 판단했습니다.현재 사용 중인 MariaDB를 그대로 사용한다면 마스터에 부담을 줄 수 있다.별도로 MariaDB를 구성하더라도 운영 및 쓰기 분산하기가 여전히 어렵다.반면 NoSQL은 RDBMS 대비 확장(Scale out)이 간편하므로 운영에 대한 부담이 적다.단순 Key-Value 보관 용도면 충분하다.이어보기 데이터는 독립적인 성격을 가지고 있어서 다른 사용자 데이터와 JOIN을 할 필요가 없다.이어보기 데이터는 크리티컬한 트랜잭션이 필요하지 않다.MongoDB vs. Couchbase데이터를 영속적으로 유지해야 한다는 요구 사항을 충족하기 위해, Redis 등의 메모리만 사용하는 NoSQL은 제외했습니다. 물론 디스크에 기록할 수 있지만, 성능이 급감하기 때문에 실용적이지 못 합니다. 또한, 메모리 사이즈에 기반을 두기 때문에 Scale up 비용이 크고, 서비스 확장시 Scale out 빈도가 높습니다.그래서 MongoDB와 Couchbase를 비교 대상으로 했습니다. 둘 다 도큐먼트 기반의 NoSQL이고 확장이 용이합니다. 과거에는 MongoDB가 Write lock 사용에 있어서 문제점이 있었지만, 최근 버전에서는 문제가 되지 않습니다.[1] 둘 다 기업용 서비스 및 충분한 부가 기능들을 제공하므로 선택하기 어려웠지만, 최종적으로 아래와 같은 이유로 Couchbase(CE)를 선택했습니다.1. 이미 사내에서 다른 서비스에 사용되고 있습니다.가장 중요한 요인이었습니다. 더 좋은 솔루션이 있더라도 어디까지나 서버 스택을 늘리는 것 이상의 효용이 있는지를 따져보아야 합니다. 이미 사용하고 있는 솔루션이 있다면, 검증이 되었을 뿐만 아니라 개발 및 운영 경험도 활용할 수 있습니다.2. 이어보기는 복잡한 쿼리(Query)가 필요 없습니다.이어보기에서 사용할 쿼리는 간단하기 때문에 Couchbase의 뷰(View)만으로 충분했습니다.Couchbase, 실제 성능은 어떨까?테스트를 하기 전 우리가 어떤 식으로 사용할 것인지 정리해야 합니다. 애플리케이션 액세스 패턴이나 동시성 문제, 데이터 구조화 등을 파악하고 그에 맞는 테스트를 진행해야 합니다. 이번 이어보기는 쓰기 연산이 보다 많기 때문에 이로 인한 뷰의 인덱싱(Indexing)에 초점을 맞추고 테스트를 진행했습니다.성능을 위협하는 요소들View IndexingCouchbase는 MapReduce를 이용하여 뷰를 제공합니다. MapReduce는 일반적으로 리소스를 많이 소모하는 동작입니다. 그래서 Couchbase는 버킷의 새로 갱신된 데이터만 인덱싱하는 Incremental MapReduce라는 기법을 적용해서 리소스 소모를 줄였다고 합니다.[2] 하지만 해당 작업으로 인한 부하는 여전히 발생합니다.Auto CompactionCouchbase는 데이터와 인덱스를 디스크에 데이터를 저장할 때 파일에 추가하기(Append) 모드로만 쓰기를 수행합니다.[3] 그리고 오래되고 불필요한 데이터들은 추후 한꺼번에 정리하는데, 이는 디스크 쓰기 성능을 최대화하기 위함입니다.그런데 이렇게 추가만 하게 되면 오래된 정보들은 파일의 앞에 쌓이게 됩니다. 그리고 사용하지 않게 된 데이터도 남아있습니다. 이를 주기적으로 정리해서 최적화하는 작업을 Auto Compaction이라고 합니다. 뷰의 인덱스는 디스크에 존재하기 때문에 디스크 작업이 있으면 인덱싱에 영향을 미치게 됩니다.성능 테스트Couchbase는 기본적으로 5,000ms마다 Index를 업데이트합니다.[2] 그리고 데이터를 비동기적으로 응답합니다. 비동기는 응답속도를 빠르게 하지만, 데이터 불일치가 발생할 수 있습니다. 데이터 불일치가 신경 쓰이고 이 시간이 길다고 생각되면, stale 옵션을 지정해서 뷰의 인덱스를 업데이트할 수 있습니다.이어보기는 뷰가 간단하기 때문에 응답시간에 큰 문제가 없을 것으로 예상하고 stale 옵션을 꺼두었습니다. 이 옵션은 뷰를 조회했을 때 버킷의 변경사항에 따라 뷰를 인덱싱하고 데이터를 응답합니다. 하지만 예상한 것과 같이 실제로도 응답시간이 짧은지 확인할 필요가 있습니다. 그래서 다음과 같이 테스트를 진행했습니다.테스트 환경은 아래와 같이 2-tier로 준비하고 요청을 늘려가면서 RPS를 측정했습니다.서버 구성OS: Ubuntu 14.04Application: Couchbase Server (CE) 3.1.3클라이언트 구성클라이언트 1개에서 50개의 세션으로 요청10만 사용자 가정책은 1만개의 책중 랜덤으로 선택됨요청의 70%는 책 읽기(Bucket Write)요청의 30%는 연재물의 마지막에 읽은 책 가져오기(View Read)그래프 분석성능 테스트 주요 지표RPS : Response Per SecondSP : Saturation PointBuckle zone : 시스템 과부하로 인해 내부 자원이 서로 경쟁상태나 적체 상태가 심해지기 때문에 최대 처리량보다 더 떨어지는 경우가 발생함성능테스트 결과그래프를 보면 요청이 늘어남에 따라 RPS가 선형으로 증가하지만, SP인 8,000 RPS에 도달하고 나서 Buckle zone에서 7,000 RPS로 수렴하고 있습니다. 물론 1개의 클라이언트에서 세션을 생성해서 테스트를 진행했기 때문에 서버의 성능 부족이 아닌 클라이언트의 병목 현상이 원인일 수 있습니다. 또한 JMeter나 다른 부하 테스트 툴을 사용하지 않고 간략하게 만든 테스트 툴을 사용하였기 때문에 수치가 부정확할 수 있습니다. 그러나 어디에서 병목이 있었든 현재 이 이상의 성능이 필요하지 않기 때문에 테스트 결과에 만족할 수 있었습니다.이어보기 배포 후모바일 브라우저 캐시 문제이어보기 기능을 배포하자마자 당일 저녁 이슈 하나를 접수했습니다. 아이패드와 PC를 번갈아 이용할 경우 이어보기 데이터가 맞지 않다는 것이었습니다.데이터를 쌓을 때 모든 이력을 기록하지는 않았지만, 다행히도 Couchbase에 이용기기와 시간은 기록하였기 때문에 이를 바탕으로 디버깅을 할 수 있었습니다. (서비스 초기라 할지라도 최대한 많은 이력을 남기는 것이 중요함을 다시 느꼈습니다)원인은 아이패드의 멀티태스킹으로 인한 캐시 소멸이었습니다. 아이패드 브라우저의 캐시가 소멸되면서 마지막으로 열어두었던 페이지가 강제적으로 리로딩되었고, 이때 의도치 않게 마지막 위치 정보가 덮어씌워진 것입니다.이 문제는 기술적으로 해결이 쉽지 않아 결국 기획을 수정하게 되었습니다. 사용자가 해당 책을 읽었다고 판단하는 기준이 “페이지를 열어본 즉시”였다면, 이를 “페이지를 열고 수 초 이상을 유지”하는 것으로 기준을 변경하였습니다. 물론 근본적인 해결책은 아니었지만, 실제 사용에는 지장이 없는 합리적인 해결책이라고 생각합니다.Key 구조의 변경 및 동시성 문제Couchbase는 높은 성능을 위해 메타데이터(Key + @)를 모두 메모리에 적재하는 특징이 있어서, Document 하나가 평균 350Byte를 차지하고 있었습니다. 따라서 현재 상태로 1000만개의 데이터를 저장할 경우 최소 3.5G의 메모리를, 2개의 사본(Replica)를 유지할 경우 약 10.5G의 메모리를 사용하게 될 것으로 예상되었고 이는 큰 부담으로 다가왔습니다.처음에는 단순히 “사용자ID_연재물ID” 형태의 Key를 사용하였지만, 보다 빠르게 증가할 것으로 예상되는 것은 사용자보다 연재물 이었으므로 아래와 같이 Key값을 변경하여 메모리 사용량을 크게 줄였습니다.// U_id : S_id 조합을 사용하면 Key가 엄청 많아진다. // 그래서 사용자당 Key를 100개로 제한하도록 한다. Count = 100 Key = '사용자ID' + ('연재물ID' % Count) 그런데 이렇게 Key 구조를 변경하였더니, 간단한 업데이트 동작임에도 불구하고 정상적으로 수행되지 않는 경우가 빈번하게 발생하였습니다. 이유는 낙관적 동시성(Optimistic concurrency) 모델의 특징 때문이었는데, Couchbase는 명시적인 잠금 이외에도 “Check and Set(CAS)”이라는 기능을 제공하고 있었습니다.공식 문서의 예제를 참고하여 아래와 같이 로직을 수정한 뒤로는 다행히도 동시성 문제가 아직까지 발생하지 않고 있습니다.boolean updateUsingCas(key, value) {  for (tryCount = 0; tryCount < MAX>    orgValue, cas = getValueAndCas(key)           // Update the original value.     // newValue = ... if setValueWithCas(key, newValue, cas)      return SUCCESS sleep(0.1) // 부하를 줄이기 위해  }  return FAIL } 맺으며동작하는 서비스에 새로운 기능을 추가한다는 것은 어려운 일입니다. 특히 새로운 데이터 스토리지를 필요로 하는 일이라면 더더욱 어렵다고 생각합니다. 그리고 그럴 때일수록 설계에 많은 시간을 들여야 한다는 것을 느꼈습니다. 설계 초기에는 RDBMS의 샤딩까지 고려하였지만, 요구 사항을 구체화할수록 단순 Key-Value로도 같은 문제를 해결할 수 있음을 깨달았기 때문입니다.또한, 서비스 개발에 있어서 어려운 문제를 마주했을 때 기술적으로만 접근할 것이 아니라 고객이 정말 원하는 것이 무엇인지를 고민하여 기획적으로 해결하는 능력도 중요하다는 것을 실감하였습니다.마지막으로 Couchbase는 현재로서도 꽤 좋고 앞으로도 많은 발전이 기대되는 NoSQL입니다. 도입을 고민하시던 분들께 조금이라도 도움이 되었기를 바랍니다.참고자료[1] MongoDB - Concurrency[2] Couchbase - Views Operations[3] Couchbase - File write#리디북스 #개발 #개발자 #서버개발 #서비스개발 #고객중심 #기능개발 #Couchbase #인사이트 #개발후기
조회수 1852

제니퍼 개발 이야기(UI/UX)_ 제니퍼 UI/UX의 특징

사용자가 목표로 하는 경험이나 서비스가 빠르게 구현되는 환경에서 B2B 제품의 UI는 대부분의 제품이 어렵고 복잡하여 전문가가 아니면 배우기 힘든 단점이 있었다. 제니퍼의 UX는 중요하고 자주 사용하는 기능의 사용성을 높이는데 중요도를 높이 둔다. 그렇다고 자주 사용하지 않는 기능의 UX를 중요시하지 않는다는 것이 아니다. 많은 사용자(비전문가 포함)가 사용하는 기능의 접근성을 높이고, 쉽게 사용할 수 있도록 하는 것이다. 반면, 전문가가 분석을 위해서 사용하는 복잡한 기능은 정확하게 기능을 사용할 수 있도록 유도하고, 데이터를 가장 잘 표시하는데 집중한다. 제니퍼 5는 제작 시기부터 다른 경쟁사가 하지 않은 도전을 시작하였다. 타사 제품들이 기능적인 부분에 포커스를 맞추고 개발하였다면, 제니퍼는 사용자 경험적으로 더 뛰어나게 만들기 위해 기존의 제니퍼가 가지고 있던 모든 요소를 하나하나 다시 고민하고 새롭게 재 창조하였다. 그 결과 심미적이면서도 직관적으로 사용자들이 겪는 불편함과 어려움을 최소화하였다. 많이 사용하고 중요한 기능일수록 쉬운 UX/UI현재 기업의 웹 서비스는 기업의 수익을 높이는 중요한 요소로 자리잡았다. 개발자나 웹 관리자뿐만 아니라, C 레벨 혹은 마케터까지 자신이 관련된 웹 서비스 방문자가 얼마나 되며 서비스 이용은 순조로운지 등에 관심 갖게 됐다. 그러나 이전의 APM은 IT관점으로 설계되어 현업이 제품을 이용해 애플리케이션을 모니터링 하는 것이 거의 불가능했다. 그래서 제니퍼 5는 기획 단계부터 현업까지 이해 가능한 UX/UI를 만드는데 공들였고, 사용자가 사용하기 쉬운 UX/UI를 제공하려고 애썼다. 개발 후에도 피드백을 받고 개선하는 작업을 게을리 하지 않고 있다. 간결하고 직관적인 인터페이스 제공대시보드는 관제실이나 전용 화면에서 공간을 최대한 활용할 수 있도록 만들었고, 분석의 경우 쉬운 조작만으로도 사용자가 보고자 하는 데이터를 직관적으로 보여주는데 중점을 두었다. 또한 대시보드에서 어떤 이벤트가 발생하면 해당 이벤트를 쉽게 볼 뿐만 아니라 그와 연관된 데이터의 분석도 바로 할 수 있도록 하여 사용자의 Interaction(사용자가 클릭 등의 행위를 하는 것)을 최소화하였다. 사용자는 이벤트를 선택하면 문제가 발행한 지점으로 바로 도달하는 느낌을 받도록 한 것이다. HTML 5 기반의 UI제니퍼 5는 HTML 5 스팩을 기반으로 UI를 개발했다. 제니퍼 5는 HTML 5 스팩이 나온 초기부터 개발을 시작해서 정보나 제공되는 기능 등의 부족으로 많은 어려움을 겪었지만, 수많은 연구를 통해 현재는 JUI(JENNIFER User Interface)라는 오픈소스 프로젝트를 진행할 수 있는 수준까지 이르렀다. 앞으로 HTML 5 스팩은 더욱더 발전할 것으로 예상되고 이에 맞추어 3D를 포함한 다양한 Frontend 기술을 접목해 더욱 발전시킬 예정이다. 제니퍼 네비게이션, 최단기간에 목적지까지 도달하는 구조사용자 경험을 긍정적으로 만들기 위해 신경 썼던 부분 중 하나가 네비게이션 기능이었다. 제니퍼 5의 네비게이션은 사용자 인지 네비게이션으로, 이벤트가 발생하거나, 사용자가 데이터를 분석하고자 할 때 접근하기 가장 쉬운 형태로 만들었다. 이를 위해 특정 기능이 다음으로 넘어가는 과정을 자연스럽게 구현하려고 노력했다. 제니퍼는 사용자가 주로 사용하는 기능을 집중해서 보여주는 방법으로 선택과 집중해서 제품의 UX를 개발했다. 반면 외산은 평면적으로 기능을 늘어놓아 이용자에게 적지 않은 학습을 요구한다. 제니퍼는 이용 목적이 분명한 사용자가 최단기간에 목적지에 도달할 수 있게 해준다. 이용자가 대시보드를 모니터링 할 것인지, 분석을 할 것인지, 아니면 통계를 할 것인지에 대한 목적이 정해지면 해당 메뉴를 클릭하는 방식으로 목적지까지 쉽게 도달할 수 있다.컴포넌트화를 통한 UI 통일성 및 유지보수 편의성 도모 디자인과 개발의 일관성을 위해 자주 사용하는 요소는 모두 컴포넌트화시켰다. 이에 한 요소가 JUI이고 이로 인해 새로운 화면이 추가되더라도 디자인의 일관성이 유지되었고, 화면상의 문제가 발생할 경우에도 컴포넌트 단위로 버그를 수정하여 반영함으로써 유지보수도 쉬워졌다.제니퍼는 이와 달리 데이터 관점에서 UX를 적용하기 보단, UX/UI에 제니퍼의 데이터를 맞추는 전략을 썼다. UX에 딱 맞는 옷을 찾기 위해 UI라이브러리나 차트도 새로 만들었다. 개발 생산성을 높이기 위해 제니퍼는 최대한 작은 단위로 디자인 구성요소들을 나눴다. 작은 단위로 쪼갠 후 재사용이 가능해야 개발의 일관성 및 확장성을 보장할 수 있기 때문이다. 쉽게 재사용할 수 있는 것을 컨셉으로 기술 트렌드인 HTML5를 스펙을 맞춰 공유를 목적으로 구성요소를 개발했다. 예를 들면 화면에 들어가 있는 버튼을 일일이 나눠 개발했고, 이를 재사용하기 쉽게 만들었다. 이를 통해 페이지마다 버튼이 다르게 보이는 문제를 해결했다. 하나의 버튼을 고치면 나머지 버튼도 바뀌도록 해 UI의 일관성을 유지했다.
조회수 1206

린더를 만들고 있는 이유 2.0

본문은 2017년 8월 작성한 린더를 만들고 있는 이유 1.0 의 후속편입니다.히든트랙이 해결하고자 한 문제히든트랙팀은 '린더'라는 일정을 받아보는 경험을 만들어가고 있습니다. 2018년 4월 기준 약 16만명의 사용자가 린더를 통해 일정을 받아보고 있으며, 린더가 존재하기 전 사람들을 일일히 자신들이 필요로 하거나 궁금한 일정들을 검색하여 확인해야만 했습니다. 우리가 문제를 해결한 방식은 매우 간단합니다. 매번 필요할 때마다 검색해봐야 했던 일정을 우리가 대신 기록하여 그것을 받아볼수 있도록 제공 하는것, 다시 말해 다수가 공통적으로 안고 있던 귀찮음을 소수의 노력으로 해결하고자였으며 이와 같은 문제 해결 방식은 명함 수기 입력 앱 - 리멤버 또는 전단지 모음 앱 - 배달의 민족이 접근한 방식과 유사합니다.첫 번째 선택, 캘린더 기반 일정 구독 ( https://linder.kr/ )일정을 받아보는 경험은 모바일앱, 챗봇, AI 스피커 등 다양한 방식으로 구현될 수 있습니다. 그중에서도 히든트랙팀이 선택한 첫 번째 방식은 이미 다수가 활용중인 캘린더 앱의 구독 기능을 활용한 것입니다. 스마트폰 기본앱인 캘린더를 하나의 정보 전달 채널로 활용함으로써 거부감 없이, 낮은 진입장벽으로 출시 반년 만에 15만명이 넘는 사용자를 확보할수 있었습니다.캘린더 기반 일정 구독의 한계하지만 캘린더를 기반으로 한 일정 구독에는 명확한 한계가 몇 가지 있었습니다. 1) 구독 캘린더의 특성상 리마인더 기능이 매우 제한적이었으며  2) 각 플랫폼 별 다른 동기화 시간으로 인해 실시간 업데이트가 불가했습니다. 3) 또한 기존 캘린더에 입력되어있던 개인 일정과 받아보는 일정이 혼재되어 분류가 어려웠으며 4) 일정을 삭제하거나 메모를 입력할 수 없었습니다.캘린더의 한계를 극복할 수 있는 자체 앱 제작 ( http://bit.ly/2EB41TW )이에 히든트랙팀은 지난 2017년 말 진행한 다수의 유저 인터뷰를 바탕으로 2018년 1월부터 약 3개월 간 일정을 받아보는 경험에 최적화된 모바일 앱을 개발하였습니다. 모바일의 핵심은 필요한 일정을 정확한 시점에, 검색 없이도 쉽게 받아 볼 수 있는데 초점을 두고 있습니다.린더 : 받아보는 캘린더 - Google Play 앱play.google.com 일정을 받아보는 경험에 대한 사용자와 이해 관계자히든트랙팀이 캘린더 기반의 일정 구독자와 모바일앱 사용자 모두에게 공통적으로 제공하고자 하는 것은 사용자가 자신에게 필요한 일정을 보다 쉽고 확실하게 소비할 수 있도록 돕는 것입니다. 사람들에게 필요한 일정은 아이돌 스케줄부터 화장품 세일, 학사일정에서부터 마트 휴무일까지 다양한 분야에 존재합니다. 일정을 받아보는 경험을 만들어가는 과정에서 우리가 일반 사용자 외에도 고려해야 할 나머지 두 종류의 이해 관계자는 일정을 공급하는 공급 파트너와 유통을 돕는 유통 파트너가 있습니다.망하기 딱 좋은 일정 데이터 생산 비즈니스일정을 받아보는 경험을 만들어가는 과정은 여느 타 서비스에 비해 매우 소모적입니다. 일정 데이터는 리뷰(왓챠)나 댓글(크리마), 연락처(리멤버) 등 과는 다르게 데이터의 휘발성이 매우 강하며 변동성 또한 매우 크기 때문에 다수의 기업들이 기피하는 데이터 형태라고 볼 수 있습니다. 일례로 2016년부터 2017년 중순까지 운영되었던 SKT의 Someday(썸데이)는 내부 조직장 교체와 비효율적인 ROI로 서비스가 종료된 바 있습니다.같은 실수를 저지르지 않기 위한 일정 데이터 서비스 전략 로드맵히든트랙팀은 2017년 1월부터 다수의 일정 관련 서비스 개발을 진행해왔으며 이 과정에서 습득한 노하우를 바탕으로 일정 데이터 생산 및 공급망을 구축할 수 있는 3단계 계획을 세우게 되었습니다.STEP.1 린더 파트너스 - 데이터 공급 파트너 확보캘린더 기반 일정 마케팅 솔루션 '린더 파트너스'는 해외 eCal, CalendarX, Eventable 등 다수의 캘린더 마케팅 업체를 벤치마킹하여 국내 인터넷 환경에 맞추어 최적화시킨 아시아 유일의 캘린더 마케팅 솔루션 입니다. 2018년 3월 기준 롯데자이언츠, 두산베어스, 수원삼성FC, 아디다스 코리아 등 20여 개의 데이터 공급 파트너를 확보한 린더 파트너스를 기반으로 히든트랙팀은 공식적인 데이터 공급 파트너를 확보함과 동시에 데이터 생산을 위한 초기 자본을 조달할 수 있게 되었습니다. 파트너스 영업은 현재 영업팀을 주축으로 이루어지고 있으며 2018년 말까지 현 20여 개의 파트너를 50여 개 수준으로 늘리는 것을 목표로 하고 있습니다.STEP.2 린더 모바일앱 - 일반 사용자 확보린더 파트너스를 통해 확보한 자금과 일정 생산력을 바탕으로 모바일앱 데이터의 정확도와 품질을 향상하고 사용자 중심의 서비스를 구축합니다. 기업 친화적인 린더 파트너스와는 다르게 린더 모바일앱은 오로지 일반 사용자를 위한 서비스로서 사용자 친화적인 인터페이스와 일정 콘텐츠 소비 경험을 핵심으로 합니다. 다수의 일반 사용자를 확보함으로써 제보 기능(크라우드소싱)을 활용하여 데이터의 정확도와 유저별 선호 캘린더 데이터를 파악할 수 있게 됩니다.  2018년 4월 안드로이드/iOS 앱 출시가 예정되어 있으며 2018년 연말까지 5만 이상의 MAU 확보를 목표로 하고 있습니다.STEP.3 린더 데이터헙 - 데이터 유통 파트너 확보글의 서두에서 언급한 바와 같이 일정을 받아보는 경험은 단순히 캘린더나 모바일앱 외에도 다양한 방식으로 제공될 수 있습니다. 확보한 데이터 공급 파트너와 일반 사용자 제보를 바탕으로 일정 데이터량과 품질을 향상하고, 더 나아가서는 보유한 유저 Pool을 바탕으로 사용자들의 선호도를 사전에 파악할 수 있게 됩니다. 이러한 다양한 종류의 데이터를 기반으로 현재 스피커 및 기타 AI 서비스를 제공 중인 네이버, 카카오, 삼성, SKT, KT 등의 유통 파트너를 대상으로 영업을 진행, 협력을 통해 다양한 방식으로 사용자들에게 일정 정보를 전달할 수 있게 됩니다.히든트랙의 3가지 비즈니스 모델위 언급한 3단계의 전략 로드맵을 통해 히든트랙은 3가지 수익창출 기회를 확보할 수 있습니다. 1) 캘린더 마케팅 솔루션 - 린더 파트너스의 Enterprise SaaS 형태 공급 및 데이터 관리 용역을 통한 수익2) 린더 앱 내 확보한 사용자 선호도를 바탕으로 일정 기반의 마케팅 광고주들에게 제공하여 창출하는 수익 3) 그리고 유통 파트너들에게 일정 데이터를 제공하는 대가로 받는 데이터 판매 및 용역에 대한 수익 이 바로 그 3가지 입니다.'린더' 하다 = 일정을 받아보다다각적인 비즈니스 모델과 단계가 존재하지만 결과적으로 이를 통해 확보한 매출의 재투자와 회사의 방향성은 하나로 일원화 될 수 있습니다. 그것은 바로 사람들의 소중한 일정을 놓치지 않도록 도와주는것. 자동차 네비게이션과 같이 서비스가 삶에 완벽히 녹아들어 그것이 부재하던 시절의 삶을 상상할 수 없게 되는 것이야 말로 가장 높은 수준의 서비스 구현이라 할 수 있습니다. 과거에 지도에만 의존하여 길을 찾던 시절 소수의 사람들이 네비게이션의 가능성을 보고 그것을 만들어왔던 것처럼, 사람들이 린더를 통해 그들의 소중한 일정을 놓치지 않도록 도와주는 것이 우리의 최종 목표입니다.#히든트랙 #챗봇 #기술기업 #개발자 #개발팀 #인사이트 #경험공유
조회수 1226

"서울 어디를 가든 패스트파이브가 보였으면 좋겠어요"

독특한 팀, 개성 넘치는 사람들로 가득한 패스트파이브. 지금까지 다양한 팀에 속한 분들을 소개해드렸는데요, 오늘 Humans of FASTFIVE에서 만나볼 분은 이름도 생소한 프로덕트 본부, 그중에서도 서비스운영팀을 맡고 계신 홍유현 님입니다. 패스트파이브를 더 예쁘고 편안한 곳으로 만들기 위해 ‘이것저것’ 하는 유현 님의 이야기를 들어보시죠. Q. 유현 님 안녕하세요, 간단한 자기 소개를 부탁드립니다.안녕하세요, 패스트파이브 프로덕트 본부의 서비스운영팀장 홍유현입니다. 저를 한마디로 소개해보라고 하셨는데, 패스트파이브의 로다주라고 소개하고 싶네요. (*위 인터뷰 내용은 편집부의 의견과 다름을 밝힙니다.) 영화 <어벤져스>에서 엔지니어, 혹은 수리공 역할을 하잖아요. 그 느낌이 비슷하다고 생각합니다. Q. 프로덕트 본부와 서비스운영팀에서 하는 일은 어떤 것들인가요?프로덕트 본부는 패스트파이브가 제공하는 공간과 서비스, 커뮤니티에 대해 고민하고 구체적인 서비스를 만들어가는 곳이에요. 굉장히 다양한 일을 하는 팀입니다. 사실 저희 팀이 처음 만들어질 때 이름 후보가 여러 개 있었거든요. 그중 하나가 ‘이것저것 팀’이었어요. 직관적이긴 하죠. 원래는 한 팀 안에 디자인, 개발 파트 등이 분화되지 않은 채로 다 들어있었거든요. 지금처럼 나누어진 지 얼마되지 않았죠. 그래서 ‘이것저것 팀’이라는 이름이 더 어울렸을 수도 있겠네요. 저희 팀의 목적을 말씀드리면 저희가 하는 일이 쉽게 이해될 것 같아요. 저희의 궁극적인 목적은 팀이 없어지는 거예요. 멤버가 원하는 것을 캐치해서 실현시키는 게 서비스운영팀의 역할이기 때문에 언젠가는 멤버들이 더 바랄 게 없어지는 상태, 그래서 팀이 필요 없어지는 상태가 되기를 바라죠. Q. 설명을 들을수록 궁금해지네요. 더 구체적인 설명이 필요할 것 같습니다. 유현 님의 하루 일과를 소개해주세요. 어제 뭐 하셨나요?오전에는 14호점 커피 머신을 세팅했어요. 얼마 전에 오픈한 강남3호점이요. 커피머신의 원두나 커피의 양 등이 저희가 제공하는 종이컵에 맞춰서 세팅되어 있었거든요. 그런데 요즘 Go Green 캠페인을 하면서 텀블러 사용이 많이 늘었잖아요? 보통 텀블러는 종이컵보다 많은 양이 들어가서 조절이 필요하더라고요. 오전에는 그 세팅을 했습니다.자동으로 커피 양을 맞춰주는, 강남3호점의 멋진 커피머신!오후에는 강남/역삼 지부의 지점들을 돌면서 현장 체크를 했어요. 최근 신규 지점이 많이 오픈하고 있는데, 그렇다고 기존 지점에 소홀하면 안 되잖아요. 어떤 부분을 발전시켜야 할지 직접 보면서 체크합니다. 저는 그 과정을 ‘못생김을 없앤다’고 불러요. 더 예쁘고 편한 것으로 교체하죠. 예를 들어 어제는 강남 지점에서 보안업체와 미팅을 했어요. 건물과 보안업체, 패스트파이브 사이에서 의견을 조율해서 불편한 부분을 편하게 만들었죠. 오늘은 15호점인 을지로1호점에 들어갈 물품 견적을 내고 발주해야 하고, 각 지점 커뮤니티 매니저분들에게 온 연락들을 처리해야 돼요. (늘 통화 중이시더라고요.) 통화도 하고, 메신저나 문자로도 계속 연락을 받죠. 어떤 날은 오전에만 열 통 가까이의 문의 전화를 받기도 합니다. Q. 서비스운영팀에서는 어떤 가치를 가장 중시하나요?조금 주관적이기는 해요. 일단 어떤 물품을 구매할 때 패스트파이브의 공간과 어울리는지를 가장 먼저 고려합니다. 라운지, 바, OA존과 어울리는지 생각하죠. 물론 실용성도 빼놓을 수 없습니다. 멤버들이 이 물건과 공간을 더 편하고 유용하게 사용할 수 있도록 고민해야 하죠. 이런 것들을 고려하다 보니 어떤 물품 하나를 찾고, 알아보고 구매하는 데 거의 일주일 가량이 걸릴 때도 있습니다. 신규 지점이 거의 매달 오픈하고 있어서 요즘에는 물품 구매와 관련한 업무가 많은 편이에요. 비용을 절감해야 하는 동시에 비용을 사용하고 있으니 어렵네요. Q. 지금까지 맡았던 일 중 가장 어려웠던 일은 뭔가요?패스트파이브의 퀄리티에 맞는 제품을 찾는 일이 어려워요. 부끄럽지 않은 물품을 구매해서 채워 넣어야 하는데, 패스트파이브가 운영하는 공간의 수준이 점점 올라가다보니 제 기준도 높아지더라고요. 한국 시장에서는 아예 찾을 수 없는 경우도 많고요. 패스트파이브는 국내에서 처음으로 공유오피스를 시작했기 때문에 아주 작은 것 하나를 결정할 때도 시행착오를 거치게 되는데요, 그 과정이 쉽지는 않지만 꼭 필요한 일이라고 생각합니다. 패스트파이브의 역할은 멤버들이 일의 본질에 집중할 수 있도록 돕는 것입니다. 서비스운영팀은 그 일을 멤버와 가장 가까운 곳에서 하고 있는 셈이죠. 저는 서비스운영팀이 매일매일 패스트파이브의 가치를 실현하는 중이라고 믿습니다. 멤버들이 본인의 일을 제외한 다른 것에는 신경쓸 필요가 없도록 만드는 게 제 목표고요.   Q. 패스트파이브가 어떤 브랜드가 되었으면 하시나요?강남, 홍대, 잠실, 을지로… 서울 어디를 가든 패스트파이브가 보였으면 좋겠어요. 멤버들이 어디에 있어도 패스트파이브를 찾을 수 있고, 패스트파이브 간판을 보고 잠시 들러서 업무를 보고 나올 수 있는 그런 곳이 되었으면 합니다. 어디에나 사무실이 있는 셈이니 정말 편리하지 않을까요? 그리고 이제는 오피스뿐만 아니라 카페와 주거 서비스까지 제공할 예정이니 허황된 꿈은 아니라고 생각합니다. 조만간 패스트파이브라는 브랜드를 중심으로 라이프스타일이 구성되는 날이 왔으면 좋겠네요. 일상 대화에서 스타벅스가 ‘카페’라는 말을 대체하기도 하잖아요. 그것처럼 패스트파이브가 ‘오피스’, ‘사무실’이라는 말을 대체하는 모습을 보고 싶고요.  개인적인 목표를 말씀드리자면, 패스트파이브의 모든 멤버들이 입주하는 순간부터 행복한 경험을 할 수 있었으면 좋겠습니다. 제가 그렇게 만들어드리고 싶고요. Q. 서비스운영팀에서 새로운 팀원을 뽑는다면 어떤 분과 함께 일하고 싶으신가요?지금은 15호점까지 운영 중이지만 곧 30호점, 100호점까지 지점이 늘어나면 분명히 훨씬 더 많은 팀원이 필요하겠죠. 우선 남을 위하고 배려할 줄 아는 마음을 가진 분이면 좋겠습니다. 다른 사람의 입장에서 생각할 줄 알아야 패스트파이브 멤버들이 원하는 점을 잡아낼 수 있을 테니까요. 또 업무 능력 면에서는, 저희가 ‘이것저것 팀’이잖아요. 많은 경험을 해보신 분이 좋을 것 같습니다. 집에서나 학교에서, 혹은 여행을 가서 할 수 있는 작은 경험들이 이 팀에서는 큰 도움이 될 수 있거든요. 프라모델 조립이나, 학교 행사 기획 혹은 모르는 지역에서 길을 찾았던 경험 등이요. "하지만 난 일이 좋다"보통 다능은 무능이라고 하지만 서비스운영팀에서는 다능이 능력입니다. 여러 업무를 수행할 수 있는 멀티플레이어가 필요한 곳이거든요. 저희 팀에서는 새로운 팀원분이 가진 여러 능력을 충분히 발휘할 수 있도록 도와드리고 지원할 겁니다. 그러니 ‘나는 특출난 능력이 없는 것 같아’라고 생각하지 않으셨으면 좋겠습니다. 많이 도와드릴 테니 지원해주세요! Q. 마지막으로 하고 싶으신 말 자유롭게 부탁 드립니다.   훌륭한 팀원분을 영입하고 싶은 마음이 커서, 회사 홍보를 좀 할게요. 제가 패스트파이브에 들어오고 싶었던 이유 중 하나는 이곳의 문화였어요. 첫 면접날 굉장히 신기하다고 생각했어요. 대표님이 반바지 입고 모자를 쓰고 계셨거든요. 이런 자유로운 분위기가 좋았죠. 그 분위기 안에서 제가 원하는 일을 할 수 있었고요. 멤버들에게 해주고 싶은 일이 생기면 자유롭게 실행할 수 있는 분위기라고 할까요? 더 많은 분들과 패스트파이브의 문화를 만들어나가고 함께 일하고 싶습니다. 다양한 일을 하고 있지만 결국 전부 패스트파이브의 멤버들을 위한 것이라는 유현 님과의 인터뷰, 재미있게 읽으셨나요? 앞으로도 멤버들의 든든한 멀티플레이어가 되어주실 것 같네요! 그럼 저희는 다음 인터뷰로 돌아오겠습니다. 읽어주셔서 감사합니다 :)- 패스트파이브 마케팅팀 드림
조회수 728

P2P금융에서 고도의 엔지니어링이 필수적인 이유

지난 8월30일, 매일경제신문이 주최하고 과학기술정보통신부와 금융위원회, 금융감독원이 후원한 매경핀테크어워드2018에서 렌딧이 최우수상을 수상했다. 렌딧이 굳이 이런 경연대회에 참여를 한 이유는 ‘P2P금융산업에서 기술력과 고도의 엔지니어링 파워가 얼마나 중요한 지’를 널리 알리고 싶기 때문이었다.매경핀테크어워드 수상 소식을 들은 후, 엔지니어링팀 렌딧맨들과최근 렌딧은 개발자 채용에 그 어느때보다도 열심이다. 많은 개발자들과 만나 P2P금융산업의 미래와 우리 회사가 하는 일에 대해 설명하고 좋은 개발자를 영입하기 위해 노력하고 있다. 그런데 생각보다 훨씬 더 개발자들에게 P2P금융기업이 어떤 일을 하고 있고, 왜 개발자가 도전할 만한 분야인지 알려져 있지 않다는 사실을 알게 되었다. 이번 글에서는 렌딧이 하는 일을 바탕으로 P2P금융회사에서 왜 고도의 소프트웨어 엔지니어링이 필수적으로 필요하고, 개발자 여러분이 어떤 일에 도전해 볼 수 있는지에 대해 설명해 보려고 한다. 우선 대출과 투자 등 모든 서비스가 기존 금융회사와 달리 온라인 상에서 이루어진다. 특히 렌딧이 집중하고 있는 개인신용 P2P금융의 경우, 대출 심사와 집행, 투자 모집과 운용 등 서비스 전 과정을 100% 온라인, 비대면 서비스로 구축하고 있는 디지털 금융 플랫폼이다.대출 서비스에서는 머신러닝 기반의 대출자 심사평가모델 개발이 핵심적이다. 렌딧이 자체 개발한 렌딧 개인신용평가시스템(Lendit Credit Scoring System)을 예로 들어 보겠다. 신용평가사에서 제공하는 250여가지의 금융 데이터를 순식간에 분석해 모든 대출 신청자마다 개인화 된 적정금리를 산출해 내는 시스템이다. P2P금융기업인 렌딧이 개발한 심사평가모델을 기존 금융권의 심사평가모델과 비교할 때 가장 큰 차이점은, 머신러닝 기법을 사용해 각종 금융 데이터의 최근 12개월 간 트렌드를 분석한다는 점. 이를 통해 보다 정교하게 개인의 신용을 평가해 낸다. 여기에 추가적으로 신용평가사에서 제공하는 사기정보공유(Fraud Bureau)데이터, 직장 신용정보, 상환 정보 등을 종합적으로 반영하고 있다. 최근에는 대출자가 제출하는 신분증 확인 과정에 머신러닝을 적용해 자동화해 나가기 시작했다. 투자 서비스에서는 실시간으로 분산투자 포트폴리오를 추천해 주는 알고리듬이 돌고 있다. 투자자가 투자할 금액을 입력하면 눈깜짝할 사이에 현재 투자 가능한 채권을 조합해 분산투자 포트폴리오를 추천해 주는 시스템이다. 포트폴리오에 조합된 모든 채권에 투자금을 일정한 비율로 고르게 나누어 분산투자할 수 있도록 추천해 주는 것이 특징이다. 렌딧이 개발한 분산투자 시스템은 투자자 1인이 수백~수천개의 채권에 분산하는 것과 동시에, 채권 1개도 평균 1,303명, 최대 3,814명(기준 2018년 6월30일 현재)이 나누어 리스크를 분산하도록 개발되어 있다. 이렇게 분산투자를 시스템적으로 활성화 시키고 있는 덕분에, 현재까지 렌딧의 모든 투자자가 하고 있는 분산투자의 총 누적 건수는 거의 800만 건에 육박하는 수준이다. 점점 더 많은 데이터가 축적되고 있기 때문에, 이러한 데이터를 바탕으로 고객에게 제공할 수 있는 서비스 아이디어도 하루 하루 쌓여 가고 있는 중이다.P2P금융산업이 가장 발전한 시장인 미국의 경우, 최대 규모인 렌딩클럽 한 회사가 미국 개인신용대출 시장 전체의 약 1.5%이상을 차지할만큼 금융 시장을 혁신해 나가고 있다. 렌딧 역시 지난 3년간 빅데이터 분석에 기반한 정교한 신용평가를 통해, 대출 고객의 이자를 총 100억원이 넘게 절약해 드리는 성과를 만들어 냈다. 그간 기존 금융회사들이 만들어 내지 못한 중금리 대출 시장을 스타트업인 렌딧이 활짝 열어낸 것이다.렌딧에서 우리 렌딧맨들과 함께 한국의 금융을 혁신하는 금융 플랫폼을 만들어 가실 엔지니어 여러분을 기다립니다. 관심있는 분은 주저없이 sjkim@lendit.co.kr 로 연락 주세요. 많은 엔지니어 여러분과 만나뵙고 싶습니다. 
조회수 2376

MOIN 안드로이드 개발자를 소개합니다

영화 같은 일들이 매일같이 벌어지는 요즘 모두들 안녕하신가요?해외송금 스타트업 모인에게 최근 새로운 변화가 생겼습니다.안드로이드 개발자가 합류했습니다.어떤 분인지 지금부터 소개 해드리겠습니다 ^^안드로이드 개발을 해주실 효찬님!- Professional Experience -2015.01~2016.10 kt R&D 연구개발센터 전임연구원2013.07~2015.12 kt R&D 연구개발센터 연구원2013.03~2013.06 kt R&D 연구개발센터 인턴- Education -2006.03~2013.08 고려대학교 컴퓨터통신공학부 학사2001.09~2005.05 Jakarta International School▶ 모인에서 어떤 일을 담당하고 계신가요?총체적인 안드로이드 개발과 웹 서버를 보조하는 일을 맡고 있습니다.▶ 개발자가 되겠다고 한 계기가 궁금합니다. 개발자로서 이력에 대해 간략히 설명해주시겠어요? 특정한 계기가 있어서 개발자가 되겠다고 한 건 아니었어요. 고등학교 시절, 컴퓨터 게임 하면서 막연히 나도 게임을 만들어 보고 싶다고 생각했고 그래서 관심은 가지고 있었죠. 친구들 이름 넣어서 RPG를 만들어보기도 했는데, 생각해보면 스토리 만들기가 재밌었던 거 같아요. 그러면서 자연스럽게 어떻게 하면 컴퓨터 개발할 수 있나 생각도 해보게 됐고, 책도 뒤적여보게 됐습니다. 이런 생활이 고2때까지 이어졌어요. 그런데 마땅히 공부할 수 있는 방법이 없어서 대학가서 해야겠다 생각했습니다. 대학 와서 본격적으로 컴퓨터공학을 공부하면서 재미를 느끼게 됐어요.▶ 그 중에서도 안드로이드 개발을 선택하게 된 이유는 뭐였을까요?예전에 KT에 있을 때, 안드로이드 개발 프로젝트를 맡으면서부터입니다. 원래 이 분야에 대해 전혀 몰랐는데 회사에서 3일간 안드로이드 개발 교육을 받고 해보라는 지시를 받게 된거죠. 막상 해보니 재밌었어요. 특히 이 시기가 2014년 초였는데, 당시에는 안드로이드가 워낙 인기 있는 분야여서 더욱 할만하겠다는 생각을 하게 됐습니다. 효찬님이 선보인 안드로이드 앱 (왼부터)가계부투게더, 메모캐스트, 돈테크 ▶ 본격적으로 모인에 들어오게 된 이야기를 들어보고 싶습니다. 어떻게 모인을 알게 되셨나요?이전 회사에서 늘 입버릇처럼 ‘스타트업을 하고 싶다’는 말을 하고 다녔습니다. 생각해보면 제가 굉장히 밉상이었을텐데 주변 회사분들이 응원을 많이 해주셨어요. 정말 좋으신 분들입니다. (하하) 지인 추천으로 원티드를 알게 됐어요. 저는 초기 단계에 있는 스타트업에 가고 싶었는데 쉽게 찾기는 힘들더라고요. 이후 설립한지 1년도 안 된 ‘모인’을 찾게 됐습니다. 회사에 대해 이것저것 찾아보고 한 번 만나서 이야기해보면 좋겠다는 생각이 들어 대표님을 만났어요. 대표님과 만나 이야기를 나누어 보니 같이 일하고 싶었습니다.  ▶ ‘스타트업을 하고 싶다’는 말을 입버릇처럼 하셨다고 했는데, 특별한 계기가 있었나요?대학 때, 그래픽 프로그래밍 관련 Term Project를 수행했던 적이 있었어요. 이 때 친구들과 밤을 새면서도 웃고떠들며 프로젝트를 해낸 게 제겐 정말 좋은 경험이었습니다. 친한 친구들과 같이 일을 하면 힘든 업무도 웃으면서 즐겁게 할 수 있다는 생각이 들었어요. 앞으로도 좋은 사람들과 같이 즐겁게 일할 수 있으면 좋겠다는 생각을 가지게 되었죠. 스타트업에서 근무하면 일과 동시에 좋은 조직문화를 만들어나갈 수 있을 거라고 생각했어요.  ▶ 개발자로서 자신 있는 영역이 무엇인가요?두루 다룰 줄 안다는 게 제 장점일 수 있겠네요. 그래서 스스로 찾아가면서 어떤 서비스든 개발할 수 있다는 자신이 있습니다. 하지만 역시 한 분야에 대한 전문성은 좀 부족하지 않나 생각해요. 안드로이드에 더더욱 집중해보려고 노력한 이유이기도 합니다. 앞으로도 저만의 차별점을 발굴하는데 계속 노력을 기울일 생각입니다. 효찬님이 가장 애착간다는 원피스 '상디'▶ 개발 외 관심 있는 영역이 무엇인가요?개발 외적으로는 조직 문화에 관심이 많습니다. 제가 개인적으로 일본 만화 ‘원피스’를 좋아해요. 루피 해적단을 보면 개개인이 발전하면서 동시에 팀이 강해지는 모습을 볼 수 있거든요. 어떠한 모험도 할 수 있을 정도로 강해지죠. 루피 해적단 같은 조직을 꿈꿉니다. 어떻게 보면 제가 꿈꾸는 조직 문화가 담겨있다고도 할 수 있죠.특히, 배트맨을 보면 악당이 배트맨 지인을 인질로 잡으면 배트맨은 지인을 구하러 가죠. 하지만 원피스에서는 악당이 루피 친구들을 인질로 잡으면 루피는 친구를 구하러 가지 않아요. 다만, 친구가 함정에서 알아서 잘 나올거라 믿습니다. 그리고 악당을 쓰려트려야 하는 자신의 역할을 수행하는 데 충실해요. 동료를 믿기 때문에 가능한 자세라고 생각해요. 제 나름대로 ‘믿음의 리더십’이라고 혼자 정의해봤어요. (웃음) 대신 내 능력은 스스로가 키워나가야 하죠. 이렇게 각자 자신의 일에 최선을 다하는 사람들과 함께 큰 꿈을 이루는 게 지금 제게 마지막으로 남아 있는 순수한 이상입니다.▶ 더 키워나가고 싶은 역량이 있나요?역량이라기 보다는 제가 만든 작품을 Developing 해나가고 싶어요. 발전가능성이 없는 서비스는 더 이상하고 싶지 않습니다. 내가 만든 앱을 상용화 시키고, 고객들이 반응하는 걸 직접 보고 싶어요. 더불어 서비스 개선에 필요한 역량은 지속적으로 키워나가려고 합니다.장효찬 개발자에게 '함께 일하고 싶은 사람'이란?#온정 #진솔 #파이팅 ▶ 출근한지 일주일도 안됐지만 (웃음) 모인에 대한 첫인상은 어땠어요?정말 아직 1주일도 안됐는데…. (웃음) 대기업에 있다 와서 그런지 소위 ‘젊음의 열정’이라고 하죠? 다들 파이팅 넘치는 모습이 좋았습니다. 그러면서 동시에 나 잘났다고 으스대지도 않고, 특히 대표님 같은 경우는 능력도 있으신데, 겸손하기까지 해서 반했어요. 무언가를 물어보면 설명도 친절하면서 꼼꼼하게 해주시구요. 팀워크가 좋을 거 같다는 긍정적인 예감이 들었어요. 사람 뽑는 데 신중하시다는 대표님을 믿으며, 앞으로도 잘 부탁드립니다.  ▶ 앞으로 어떤 개발자가 되고 싶으신가요? 모인에게도 한마디 해주세요.개발 PM(Project Manager)에 관심이 많습니다. 사실 앱 구현보다 뼈대를 구축하는 일이 더 중요하다고 생각해요. 저는 이 부분이 개발에서 30% 혹은 그 이상을 오롯이 혼자 차지하고 있다고 생각해요. 그러기 위해서는 리소스나 구현한 코드를 어떻게 관리할까, 어떤 부분을 어떻게 더 추가를 해서 연동시킬 수 있을까 등을 서비스 앱 전체를 보고 관리할 줄 알아야 하죠. 이 역할이 국내에서는 중요하게 다뤄지는 거 같지 않아 안타깝습니다. 대부분 보이는 것에만 관심을 가지고 제품이 어떤 제질로 만들어졌는지는 큰 관심을 가지지 않는 추세거든요. 저는 이러한 부분을 중요시 여기는 개발자가 되고 싶습니다. “저를 버리시면(?) 아니됩니다 (웃음)”- 장효찬이 꼽은 인생 명언 -“Do what you love. Everything else is secondary”by. Steve Jobs#모인 #MOIN #개발자 #개발팀 #안드로이드개발자 #안드로이드 #팀원 #팀원소개 #팀원인터뷰 #인터뷰 #기업문화 #사내문화 #조직문화
조회수 706

조건문을 긍정적으로!

Overview“나 혼자 프로젝트를 하니 주석은 안 달아도 무방해요” 이렇게 말하는 개발자는 그 코드를 가장 많이 보는 것도 자신이라는 사실을 잊고 있을지도 모릅니다. 구린 코드를 보고 욕했는데 3개월 전 자신이 작성한 코드란 걸 알면 그제서야 얼굴이 붉어지기 일쑤죠. 작은 습관이지만 약간의 변화만 준다면 분명 즐겁고 생산적인 개발을 할 수 있을 겁니다. 얼굴 붉어질 일도 없고요. 오늘은 그 노하우를 전해드립니다. 혼돈을 피하는 여섯 가지 코드 작성법조건문은 긍정적으로 쓰자조건문의 성능은 생각하지 말자조건 검증을 깔끔하게 하자주석은 적절하게, 적당하게 하자상수를 활용하자복잡한 코드는 풀어서 쓰자과거의 나 자신아, 넌 나에게 똥을 줬어1.조건문은 긍정적으로 쓰자”쟤가 그 아이가 아니지 않지 않나?!” 프로그램 코드를 마지막으로 실행하는 건 컴퓨터지만 코드를 작성하고 관리하는 건 결국 사람입니다. 수많은 조건문이 존재하는 프로그램에서 조건이 부정적이라면 한 번 더 생각해야 합니다. 반대로 조건문을 긍정적으로 작성하면 보다 편리하게 개발을 진행할 수 있습니다. 가능하다면 긍정적인 마인드로 조건문을 적어봅시다.<?php // 예제는 PHP로 작성 되었습니다. $title = $_POST['title']; // 공지사항 제목 if (empty($title)) {     echo '제목을 입력해주세요';    return; } // 위의 경우보다 한번 더 생각해야한다. if (!isset($title)) {     echo '제목을 입력해주세요';    return; } cf)비슷한 사례 for 증감식을 i– 처럼 적는 경우 꼭 필요한 경우가 아니라면 삼가는 것이 좋다. for로 작성 가능한 반복을 while로 구현하는 경우 for는 끝이 명확하지만 while은 언제나 불안하다. 2.조건문의 성능을 생각하지 말자간혹 조건문에 성능을 고민해 줄여보려는 개발자가 있습니다. 10개의 and 조건을 2개로 줄인다면 얼마나 이득일까요? 하지만 이것은 티도 나지 않는 적은 양입니다.1) 조건문을 압축하지 마세요. 시간이 지나면 자신의 코드가 마치 보물지도처럼 보일 수도 있습니다. 조건문을 최적화하려고 하기보다는 보기 좋고 읽기 편하게 변경합시다. 3.조건 검증을 깔끔하게 하자만약 게시물에 글을 쓰는 프로그램을 제작한다면 요청된 값들이 정상인지 확인해야 합니다. ‘게시물 제목이 있고, 글 내용이 있고, 글 분류가 정상이고, 뭐뭐 하면 등록!’이라고 작성하면 논리적인 접근으로 보이지만 코드의 상태는 그렇지 않습니다.<?php $title = $_POST['title']; // 공지사항 제목 $content = $_POST['content']; // 공지사항 내용 $category = $_POST['category']; // 공지사항 분류 if (!empty($title)) {     if (!empty($content)) {         if (!empty($category)) {             // 게시글을 등록한다.!         } else {             echo '카테고리를 선택해주세요';         }     } else {         echo '내용을 입력해주세요';     } } else {     echo '제목을 입력해주세요'; } if문 블럭이 중첩되어 가로 스크롤 압박에 시달릴 것이기 때문입니다. 또한 나중에 수정하려면 많이 고생해야 합니다. 조건 검증을 하는 코드라면 아닌 경우를 체크하는 것이 더 좋습니다. 아래와 같은 형태로 작성하는 게 깔끔하고, 유지 보수에도 도움이 됩니다. 게시물 제목이 없으면 오류 출력글 내용이 없으면 오류 출력글 분류가 정상이 아니면 오류 출력그 외 등등…<?php // 예제는 PHP로 작성 되었습니다. $title = $_POST['title']; // 공지사항 제목 $content = $_POST['content']; // 공지사항 내용 $category = $_POST['category']; // 공지사항 분류 if (empty($title)) {     echo '제목을 입력해주세요';     return;  } if (empty($content)) {     echo '내용을 입력해주세요';     return;  } if (empty($category)) {     echo '카테고리를 입력해주세요';     return;  } // 게시글을 등록한다.! 4.주석은 적절하게, 적당하게 하자주석이 많아야 좋을까요, 아니면 적어야 좋을까요? 이 논제는 여전히 개발자 사이에서 뜨거운 감자입니다. 다양한 의견이 있지만 저는 ‘적당한게 좋다’고 생각합니다. 주석이 없어서 고생한 적도 있지만, 주석이 너무 많거나 쓸모없었던 적도 겪어봤기 때문입니다. 가끔 “코드 한 줄마다 주석을 달아”라는 미친 선임도 있었고 “주석이 필요 없게 깔끔하게 짜”라고 말하는 기괴한 선임도 있었습니다. 사고의 최종 결과물인 프로그램 코드가 아무런 설명 없이 다른 사람 혹은 미래의 자신을 이해시키는 건 불가능한 일이라고 생각합니다. 다양한 테크닉과 아름다운(?) 코딩으로 주석을 줄여나갈 수는 있겠지만 꼭 필요한 곳엔 적어야 한다고 생각합니다. 4-1) 주석이 꼭 필요하다고 생각할 때 깊은 사고의 결과를 코드로 작성하였고, 다음에 왜 그렇게 작성했는지 헷갈릴 것 같을 때함정 카드가 발동되어 헤맬 것 같은 코드일 때코드가 길어져 기능의 단위별로 나눠서 보는 게 좋을 때기술된 함수나 클래스가 이름과 다르게 동작하는 코드일 때한참 디버깅 후에 허무함을 안겨준 코드일 때함수 클래스 파일에 대한 주석일 때변수가 특이성을 가지고 있거나, 타입별로 세팅되는 값일 때플러그인이나 라이브러리 사용법을 공유할 때 4-2) 주석을 줄여 나가야 한다고 생각할 때 조건문의 내용을 한글로 다시 기술하고 있을 때프로그램과 관계 없는 내용일 때변수명으로 설명이 가능한 내용을 기술하고 있을 때4-3) 주석이 잘못 되었다고 생각할 때 나만 이해할 수 있는 단어나 문장으로 기술된 주석일 때주어가 없는 주석일 때5.상수를 활용하자코드값에 따라 분기를 작성 중이라면 상수를 활용하는 게 좋습니다. ‘F’보다는 FACEBOOK_SERVICE 가 더 직관적이기 때문입니다.<?php // 예제는 PHP로 작성 되었습니다. if ($userAccountType == 'F') {     // 페이스북 유저 처리 로직 } /** 유저 구분 값 페이스북 */ define('ACCOUNT_TYPE_FACEBOOK', 'F'); // 코드는 좀 더 길어보이지만 별다른 주석 없이도 어떤 코드인지 알 수 있다. if ($userAccountType == ACCOUNT_TYPE_FACEBOOK) {     // 페이스북 유저 처리 로직 } 상수는 프로그램마다 다양한 형태로 지원되기 때문에 선언 후 참조해서 쓴다면 주석을 줄이는 데에 많은 도움이 될 것입니다.6.복잡한 코드는 풀어서 쓰자여러 가지 사고의 결정이 다시금 엮여서 또 다른 결과를 만들어야 하는 복잡한 코드입니까? 우선 서술형 문장으로 먼저 정리하십시오. 그 다음 오류가 없다면 이어서 작성하는 것이 좋습니다. 2)// 기획전이 시작 되면 세팅한 값으로 할인을 하고 // 기획전이 끝나면 원래의 할인율로 돌아오게 하는 프로그램 이다. 1. 대상 기획전을 찾는다.     * 기획전 시작일이 오늘인가? 종료일이 오늘인가? 2. 트랜잭션을 연다. 3. 대상 기획전 건수 만큼 루프를 돌며     1. 조건 체크         case 1. 시작일이 오늘이면             1. 상품 상태를 기획전 데이터로 업데이트         case 2. 종료일이 오늘인면             1. 상품 상태를 시작일 이전 히스토리 데이터로 변경     2. 상품 히스토리를 남긴다. 4. 커밋한다. 저는 사고의 결과를 주석 형태로 작성하고, 순번을 달아서 진행을 정리합니다. 다음으로 정리된 내용을 검증하고, 주석을 중간 크기로 작성해 쪼갭니다. 그 밑에 코드를 작성하면 두 마리 토끼를 잡을 수 있습니다. 중간 크기의 주석은 프로그램의 진행 단위를 나눠서 보기 편하고, 단계별로 검증할 때에도 유용합니다.<?php /***************************************************** * 1. 대상 기획전을 찾는다. *     - 기획전 시작일이 오늘인가? 종료일이 오늘인가? **************************************************** */ // 세부 로직은 생략함 $list = getPlainedPromotionList(); /*****************************************************  * 2. 트랜잭션을 연다. **************************************************** */ beginTransaction(); /*****************************************************  * 3. 대상 기획전 건수 만큼 루프를 돌며 *****************************************************/ foreach ($list as $obj) { /*****************************************************  *        case 1. 시작일이 오늘이면  *            1. 상품 상태를 기획전 데이터로 업데이트 *****************************************************/     if ($obj['startDate'] == $today) {         updateProductDistRate($obj['productNo'], $obj['distRate']);    } /*****************************************************  *        case 2. 종료일이 오늘인면  *            1. 상품 상태를 시작일 이전 히스토리 데이터로 변경  *****************************************************/     if ($obj['endDate'] == $today) {        recoveryProductFromHistory($obj['productNo']);    } /*****************************************************  *    2. 상품 히스토리를 남긴다. *****************************************************/     addProductHistory($obj['productNo']); } /*****************************************************  * 4. 커밋한다. *****************************************************/ commit(); Conclusion영화 <인터스텔라(Interstellar, 2014)>의 주인공 쿠퍼(매튜 맥커너히)가 책장 너머 다른 차원에서 과거의 자신에게 신호를 보냈던 명장면이 생각납니다. “ STAY” 그의 메시지는 분명 후회의 몸부림이었을 겁니다. 마찬가지로 당신이 조건문을 부정적으로 만들고 있다면 잠시 키보드에서 손을 떼는 게 좋습니다. 다른 차원의 자신이 어딘가에서 메시지를 보내고 있을지도 모르니까요. “STOP….” 참고 1) 1초에 수백억 번 이상 연산이 가능한 컴퓨터에선 10회와 2회의 차이가 거의 없다. 2) 동료에게 정리한 문장을 이해시킬 수 있다면 정리가 잘 되었을 확률이 높다. 글천보성 팀장 | R&D 개발2팀chunbs@brandi.co.kr브랜디, 오직 예쁜 옷만#브랜디 #개발문화 #개발팀 #업무환경 #인사이트 #경험공유

기업문화 엿볼 때, 더팀스

로그인

/