스토리 홈

인터뷰

피드

뉴스

조회수 2403

데이블 주니어 개발자 직무 인터뷰

오후 두 시의 회의실. 개발자들의 스터디하는 소리로 뜨겁다. 국내 최고의 추천 기술을 보유했다는 데이블. 10년 이상의 경력을 가진 노련한 시니어 개발자들 사이에서, 스쳐 지나가는 단어 하나하나 놓치지 않으려 귀 기울이고 있는 주니어 개발자들을 만났다.안녕하세요? 간략한 소개와 두 분의 업무에 관해 설명해주세요.형주: 안녕하세요? 저는 데이블 개발팀 최형주입니다.저는 백앤드 개발팀의 신입 개발자로서 데이블의 인프라 관리, 백앤드 개발 그리고 가끔 데이터 분석을 하고 있습니다. 주로 사용하는 서버는 클라우드 플랫폼인 AWS(Amazon Web Service)과 Nodejs 이고, MySQL, Redshift, Python을 사용하여 데이터 처리와 분석을 하고 있어요.성현: 안녕하세요. 저는 데이블 개발팀 이성현입니다.제 메인 업무는 데이블 위젯의 스타일링과 관련 문제 해결입니다. 고객사 페이지를 분석해서 위젯 디자인을 만들고, 추천 결과가 안 나오는 경우에 문제를 수정하는 작업입니다. 특별한 기능이 필요한 위젯이 있으면 스크립트 작업도 하고요. 작업 도구는 회사 내부 시스템이 있어서 그 안에서 직접 작업하고, CSS로 작성합니다.위 업무가 메인이지만 다른 영역과 겹칠 때도 잦아서 회사에서 사용하는 여러 시스템을 만질 수 있어야 합니다. 도구는Html+CSS+js 외에 Node, gulp, react, angular angularJS, PHP, 젠킨스, AWS, MYSQL, git를 사용하고 있습니다.두 분 다 신입 개발자이신 만큼 회사를 선택하는 데 있어 신중했을 것 같아요.데이블을 선택한 이유는 무엇인가요?형주:  저는 대학원에서 빅데이터 처리관련 연구를 주로 했었어요. 졸업할 때쯤 제 전공과 관련된 회사에 지원했었고 많은 면접을 보았습니다. 여러 회사에서 면접을 봤지만 데이블에서 봤던 면접 경험이 만족스러웠고 특히 개발자들의 실력과 내공이 느껴져 신입으로서 많은 것을 배우고 싶어서 입사하게 되었습니다. 복지 또한 여느 알려진 회사들에 비해 부족하지 않아서 굉장히 만족하고 있습니다.성현: 처음 데이블에 호감을 느끼게 된 건 기술 중심 스타트업이라는 점이었습니다. 도전하는 자세, 유연한 사고, 성장 가능성, 복지 등 여러 가지 기준들이 있겠지만, 내가 재미를 느낄 수 있는가, 개발자로서의 성장 이 두 가지로 압축되었어요. 저 같은 경우에는 블로그를 보면서 회사 분위기를 대략 파악했던 것 같네요. 자유로운 분위기도 잘 느껴지고, 서로를 배려하면서 열심히 일하는 것을 간접적으로 경험할 수 있었어요. 면접 보러 갔을 때, 블로그에서 보던 사람들이 블로그 글과 비슷한 느낌으로 편하게 얘기하는 걸 보면서 마음을 굳히게 됐어요.데이블의 분위기는 어떤가요?형주: 분위기는 실제로 굉장히 수평적입니다. 서로 존댓말을 사용해서 존중받는 기분이 들어요.성현: 저는 데이블 오기 전에 잠시 다른 회사에 있었는데, 거기서는 과한 예절이나 눈치를 보는 분위기가 있었어요. 데이블은 수평적인 분위기이다 보니 스트레스 받지 않고 일에 집중할 수 있어 좋아요.형주: 저 같은 경우, 잠에 굉장히 민감한 편인데 출퇴근이 탄력적이어서 지각에 대한 스트레스가 없어서 좋아요. 그래서 저는 보통 9시 넘어서 일어나서 10시쯤 출근하고 7시쯤 퇴근하는 편입니다. 그리고 식대도 지원해주고 있어요~성현: 매일 4시쯤 회사가 지원하는 간식 타임이 있어요. 오랜 시간 앉아서 일하다 보면 집중력 떨어질 때 쯤 다 같이 모여 대화를 나누면서 간식을 같이 먹습니다. 만약 생일이 있으면 간식 타임과 더불어 생일 파티를 해요.형주: 간식과 음료수가 항상 냉장고에 갖춰져 있어서 먹을 것을 좋아하는 사람에게 최고인 것 같아요. 저는 살이 잘 안 찌는 체질인데 입사 후 2킬로가 쪘어요.성현: 거의 슬랙과 트렐로 위주로 업무를 하는데 간식 타임에는 여러 사람과 대화를 할 수 있어 좋습니다. 서로 대화도 같이하고, 같이 활동할 수 있는 시간을 마련하기 위해 ‘플레이 데이’ 도 2개월에 한 번씩 열고 있어요! 회사-집, 집-회사를 반복하다가 다 같이 뭔가를 하니 신선했어요. 업무 외적으로 같이 활동하면서 사람들과 친밀감을 느낄 수 있어서 좋았어요.데이블을 선택했던 이유 중 개발자로서 성장 가능성도 있었는데 이것은 어떻게 채워지고 있나요?성현: Dabler, Be The Expert 프로그램(이하 BTE 프로그램)이 있고 업무 관련 스터디도 활발히 진행하고 있어요.자세히 설명해주세요. 성현: BTE 프로그램의 경우 장기목표를 정하고 반기별로 관련 학습 계획을 세워요. 그 안에서 책도 사고 강의도 신청하고 하는 거지요. 스스로 목표를 잡고 자유롭게 계획을 세울 수 있어서 좋아요. 본인이 정말 원하는 것을 배울 수 있고, 필요한 자금은 회사가 지원하는 거죠. 단, 업무에 관련된 성장 계획이어야 한다는 가이드라인이 있어요.이 외에도 백엔드 개발자들과 함께 AWS 사용법을 주제로 스터디도 해요! 보통 프론트엔드를 담당하지만, 백엔드 영역도 경험할 수 있어요. 본인 스스로 영역을 넓히기 위해 공부하고 능력이 된다면 활동 범위가 굉장히 넓어져요. 회사 차원에서도 그런 시도를 장려해요. 빨리 성장해야겠다는 욕심이 있어요.형주: 전 회사에서 일주일에 2번 모여서 스터디도 하고 있고 MOOC 강의를 수강하거나 책을 사고 싶을 때 눈치 볼 필요 없이 신청하면 돼요. 그리고 반기별로 자기 개발을 잘한 직원에게 인센티브를 줘요.※BTE 프로그램이란?그럼 두 분은 BTE 프로그램을 통해 어떤 것들을 배우고 계시는가요?형주: 저는 Coursera에서 Recommender System 수업을 듣고 있어요. 아무래도 우리 회사의 핵심기술이 추천 기술이다 보니까 이쪽 분야를 깊게 공부해야겠다는 생각이 들었습니다.성현: 저는 웹을 능숙하게 다루고 싶어서 상반기에는 인프라, 자바스크립트, 웹 표준, node 등 기본을 다시 챙기고 하반기에는 웹 최신 기술을 공부하려고 해요.지금은 자바스크립트 관련 책 3권과 강의 2개를 신청해서 주로 퇴근 후 또는 주말에 듣고 있어요. 업무와 관련된 것을 공부하고 나서 코드를 작성하면 대충 넘어갔던 부분들이 보여요. 그 부분을 놓치지 않고 수정하고 개선하다 보면 예전보다 나은 결과물이 나오고 뭔가 아는 게 늘었구나! 하는 보람을 느낍니다.데이블에서 개발자로 일하며 느끼는 점형주: 저의 경우에는 신입 개발자 관점에서 경험 많은 개발자분의 피드백을 통해 노하우를 전수하는 점이 좋았어요. 그러면서 기존에 놓치고 있던 부분이나 실무와 이론 사이의 괴리감을 좁히는 경험이었습니다. 저도 학부, 대학원 시절 많은 코딩을 했지만 제가 작성한 코드가 잘 작성된 코드인지 잘 읽히는 코드인지는 스스로 공부하기 힘들었는데 이러한 피드백을 통해 성장함을 느꼈습니다.어려웠던 점은 우리 회사는 애드테크 회사이다 보니 광고 용어를 굉장히 많이 사용하는데 광고에 관해 얘기할 때 처음에는 광고 용어를 몰라 답답했었는데, 스터디를 만들어서 어려운 점을 조금은 해소할 수 있었어요.성현: 자기만 할 수 있으면 얼마든지 여러 프로젝트에 참여할 수 있는 문화가 좋아요. 예를 들면 저는 위젯 담당이지만, 위젯 업무 틈틈이 데이블 시스템 페이지 수정을 할 수도 있고 내부 DB를 이용해서 사업팀에게 도움이 되는 통계 페이지를 만들기도 해요. 얼마 전에는 커뮤니티에 데이블 추천 기능을 직접 넣는 프로젝트를 했습니다. 보통 추천 연동은 고객사가 하고 저는 위젯만 만들고 있었거든요. 이번에 고객사 입장에서 서버 쪽을 만져본 거죠.미래의 데이블은 어떤 모습일까요?형주, 성현: 세계 No. 1 콘텐츠 디스커버리 플랫폼! 경영진이 자기 개발 지원이나 복지에 신경을 많이 쓰고 있어서 계속 나아질 것 같아요.데이블의 개발자가 되기 위해 어떤 것들이 필요할까요?형주: 제가 생각하기에 시니어 개발자분들이 가장 중요하게 여기는 부분은 CS 분야의 기본기였던 것 같습니다. 이 기본기를 통해 자주 사용하는 툴이나 오픈 소스가 내부적으로 어떻게 구성되어 있고 동작하는지에 대한 공부를 하면 도움이 될 것 같습니다.성현: 저는 주도적인 자세요! 스스로 일하고 배우는 자세가 필요합니다. 다른 개발자와 소통하면서도 자기 일의 진행 관리나 조율은 스스로 해야 해요. 다음 일을 직접 찾아야 할 때도 있고요. 또 전부를 물어볼 수는 없으니 어느 정도 혼자 찾아 공부하는 습관도 필요해요. 그리고 자기가 지원하는 포지션에서 사용하는 핵심 기술 하나는 능숙하게 사용할 수 있어야 해요. #데이블 #팀원 #개발자 #개발팀 #개발 #팀원소개 #인터뷰 #기업문화
조회수 590

우리는 왜 오늘도 발버둥치나?

인간은 태어나서 언젠가는 죽는다.한치의 예외도 없다.인생은 세상에 나와서 다시 돌아가는 그 '과정'이다.처음과 끝을 선택할 수 없다면, 우리가 결정할 수 있는 것은 '어떻게 사느냐'이다.어떻게 사느냐에 앞서서, '왜 사느냐'에 대한 철학적 고찰이 우선일 수 있겠지만, 이건 진심 꽤 어려운 문제이다.어느 과학자들의 이론대로라면 우리가 물려받은 유전자를 영속시키기 위한 매개체 정도의 역할이 우리가 살아가는 이유일지도 모른다. 받아들이거나 말거나...우주의 큰 뜻은 차치하더라도,정작 우리에게 중요한 것은 어떻게 살아가느냐의 문제이다.어떻게 살아가는게 잘 사는 것일까?왜 우리는 하루하루를 이렇게 발버둥치며 살아가는 것일까?인간의 문명이 만들어놓은 각종 제도를 포함한 정치, 경제, 문화, 과학, 교육, 군사 시스템은 결국 인간이 잘 살아가게 하려는 목적으로 만들어진 것이며, 자본주의 사회에서의 모든 상품들은 인간이 더 잘 살아가기위해 필요한 것들을 기획한 것들에 지나지 않는다.미국 작가 티모시 페리스가 쓴 "4시간"이라는 책에 나와 있는 잘 알려진 이야기를 다시 한번 꺼내보자.멕시코의 어느 해안가의 어부는 하루 서너 시간만 일하면서 오늘 먹을 고기만 잡고, 남은 시간은 빈둥거리며 놀고, 애들과 아내와 노닥거리며 산다. 소소한 행복에 만족하며 느리게 살아간다. 반면 미국 MBA 출신은 멕시코 어부의 삶을 보면서, 더 나은 미래를 위해 오늘을 희생한다. 낙시로 잡을 수 있는 어획량을 늘리기 위해 고기잡이 어선을 여러 척 크게 만들고 공장을 짓고 생선을 가공하여 수출해서 큰 돈을 벌기 위해 하루 24시간이 모자라게 바쁘게 산다. 그런데 이 사업가의 장래 희망이 뭐냐하면 떼돈을 번 다음 은퇴하여 바닷가에 집을 짓고 가족들과 친구들과 한가로운 여생을 즐기는 것이다. 결국 이 사람이 꿈꾸는 은퇴 후의 행복한 삶의 모습은 가난한 멕시코 어부의 현재의 행복한 삶과 정확히 일치한다는 이야기이다.행복은 멀리 있지 않으며, 욕심을 버리고 작은 것에 감사하고 살아가는 지혜를 주는 우화이다. 일면 공감이 가는 이야기이다.혹시 우리가 발버둥 치는 이유가 결국 이미 우리 주변에서 찾을 수 있는 작은 행복에 다다르기 위한 힘든 여정이라는 교훈일 수도 있다. 그것이 정말 다 일까?다시 한번 스스로에게 물어보자,어떻게 사는 것이 잘 사는 것일까?멕시코 어부의 소소한 행복의 삶과 미국 MBA 출신의 고군분투의 삶에 혹시 공통적으로 추구하는 가치가 존재할까?사실 철학적인 사색을 하기 위해 이런 질문을 던지는 것이 아니다. 많은 기업들이 새로운 서비스와 상품을 기획하고, 젊은 스타트업 회사들이 열정과 인내심을 가지고 고민하는 근본적인 문제의 해답이 여기에 있기 때문이다.사람들은 어떻게 살고 싶어 할까?어떻게 하루하루를, 일분일초를 살아가는 사람들이 행복해할까에 대한 본질적인 질문들에 대한 답과 다양한 솔루션들이 '유니콘' 기업들을 만들어가고 있다는 것을 잊어서는 안된다.지금으로부터 10년 전 이태리의 유명한 디자이너이자 건축가인 미켈레 데 루키 (Michele De Lucchi)의 스튜디오를 방문한 적이 있었다. 그 유명한 아르테미데 (Artemide)의 톨로메오(Tolomeo) 조명을 곁에 두고서 덥수룩한 수염을 한 나이 지긋한 모습으로 스튜디오를 방문한 디자이너들에게 이런 질문을 던졌다. "여러분들은 무엇을 위해서 디자인하나요?" 당시 스마트폰이 나오기 전이어서, 우리들 손에는 최신 피쳐폰들이 들려져 있었는데, 휴대폰을 가리키며 다시 한번 물었다. "그 제품들은 결국 무엇을 위한 것일까요?"여러분은 무엇을 위해 디자인하나요?현문우답이 오고가는 가운데, 미켈레 데 루키는 우리에게 자신의 생각을 얘기했고, 나는 그 이후 10년의 시간이 흐르는 동안 내가 기획하고 생각하는 모든 일의 핵심에 그 단어를 되새김질 하고 있다. "Freedom", 자유!Freedom모든 과학 기술과 문명의 진보는 인간을 자유롭게 하기 위한 것들이다.자유: 최고의 가치인간의 단순 노동을 대체하고 위험으로부터 자유롭게 하는 자동화 생산로봇, 인간의 미숙한 제어력을 뛰어넘어 교통사고로부터 안전을 보장하는 자율주행기술, 언제 어디서나 세상의 누구와도 소통하고 교류할 수 있게 하는 소셜네트워크서비스, 세상에서 일어나는 모든 사건과 현장을 생생한 동영상으로 실시간으로 확인할 수 있게 해주는 동영상 서비스, 궁금한 모든 것을 몇 글자의 타이핑만으로도 검색하고 알 수 있게 해주는 검색 서비스 등등, 이런 모든 서비스와 상품은 결국 인간을 인간이 가진 한계와 제약으로부터 자유롭게 해주는 것들이다.할 수 없던 것을 하게 해주고,알 수 없던 것을 알게 해주고,보지 못했던 것을 보게 해주고,기억하지 못했던 것들을 기억하게 해주는 것...인간의 한계로부터 자유롭게 해주는 것들,그것이 사람들을 사로잡는 것들이다.인간의 자유를 기획하라!밥 딜런은 "아침에 잠에서 깨어 자신이 하고 싶어하는 일을 할 수 있는 사람이 성공한 사람이다." 라는 말을 했다.자신이 하고 싶은 일을 자유롭게 할 수 있는 삶... 진정 부러운 삶이다. 자신이 좋아하는 일을 통해 재화를 획득하는 소수의 행운아들, 또는 극단적인 부를 움켜쥔 소수의 계층들만이 가능했던 일이 이제는 새로운 기술, 새로운 플랫폼, 새로운 서비스로 정말 대중화될 수 있을까?누구나 누리게 될 수 있을까?이미 우리는 과거에는 엄두도 내지 못했던 많은 일들을 누구나 누리고 있다. 의학의 혜택으로 평균 수명 40세의 인간이 질병과 죽음으로부터 비약적으로 자유롭게 되었고, 치안과 법이라는 제도를 통해 각종 부당한 위협과 불안과 걱정으로부터 자유로운 세상이 되어가고 있다. 이제는 귀족 계층이 아니어도 (인공지능)비서를 무료로 제공받을 수 있는 시대를 마주하고 있으며, 12시간 비행의 고충을 견뎌내지 않아도 나이아가라 폭포의 대장관을 경험 할 수 있는 세상이 되고 있다.더 나아가, 회사가 아니어도 자유롭고 생산적으로 일을 할 수 있는 환경과 인프라가 갖춰지고 있고, 상사의 눈치를 보지 않고도 자유롭게 휴가를 내고 저녁에 취미 생활을 즐길 수 있으며, 누구나 자기의 생각을 대중들에게 자유롭게 호소할 수 있고, 사회의 잘 못된 부분을 자유롭게 고발하고 토론할 수 있는 세상은 어쩌면 과학기술보다 먼저 가능했던 것일 수도 있다. 하지만, 지금 이 땅에서 희망하는 것들이다.우리가 오늘 하루도 이리도 발버둥 치는 이유는 바로 그것 때문일 것이다. 자유!직장에서나 가정에서나 국회에서나... 모두, 진심으로...
조회수 1383

AWS Rekognition + PHP를 이용한 이미지 분석 예제 (1/2)

OverviewAWS Rekognition은 딥 러닝 기반의 이미지, 동영상 분석 서비스입니다. Rekognition API를 사용하면 서비스에서 객체, 사람, 텍스트, 장면 및 동작을 식별하고 부적절한 콘텐츠를 탐지할 수 있습니다. Rekognition은 딥 러닝 기술을 기반으로 하고 있기 때문에 지금 이 순간에도 새로운 데이터를 통해 끊임없이 학습하고 있고, AWS에서도 새로운 레이블과 얼굴 인식 기능을 추가하고 관리합니다. 이번에는 AWS S3 Bucket에 업로드한 이미지로 이미지 분석 결과를 볼 수 있는 예제 사이트를 통해, Rekognition과 친해지는 시간을 갖도록 하겠습니다. 저는 예제 사이트를 개발하기 위해 PHP 프레임워크인 CodeIgniter 3, MAMP, Bootstrap을 사용했습니다.1. AWS Rekognition SDK 설치하기1-1) AWS Rekognition 사이트에 접속해 Download SDKs 를 클릭합니다.1-2) AWS 에서 제공하는 다양한 언어의 SDK를 확인할 수 있습니다. 저는 PHP를 사용할 것이므로 PHP 의 Install을 클릭하겠습니다.1-3) AWS SDK 를 설치할 수 있는 방법은 여러가지가 있습니다. 이 중에서 저는 Composer를 이용해 설치했습니다.curl -sS https://getcomposer.org/installer | php php -d memory_limit=-1 composer.phar require aws/aws-sdk-php 1-4) 짠! 짧은 명령어 2줄로 SDK 설치가 완료되었습니다 :)2. AWS S3 Bucket 에 업로드된 이미지를 분석하기2-1) 여기에 임의로 만든 예제 사이트가 있습니다. [이미지 선택] 과 [S3에 이미지 업로드하기] 를 통해 이미지 파일을 등록하면, 백단(Back-end) 에서는 해당 파일을 특정 S3 Bucket 에 업로드 한 후 Rekognition 에게 이미지 분석을 요청하도록 짜여있습니다. 관련 코드는 아래와 같습니다.{     "Image": {         "S3Object": {             "Bucket": "bucket",             "Name": "input.jpg"         }     },     "MaxLabels": 10,     "MinConfidence": 80 } 위의 코드 블록은 AWS Rekognition 개발자 안내서에 나와있는 예제 포맷이고, 아래의 코드는 예제 포맷을 PHP 에서 요청할 수 있는 방식으로 코딩한 것입니다.detectLabels 메소드 를 이용해 분석할 이미지가 저장되어 있는 S3 Bucket 과 이미지의 Name 을 전달해줍니다. 1) MaxLabels : 응답 받을 최대 Label 수 2) MinConfidence : Label 에 대한 최소 신뢰성 여기서 Label 이란 ‘이미지에서 발견되는 객체, 장면 또는 개념’ 이라고 생각하면 됩니다. 예를 들어 해변에 있는 사람들을 촬영한 사진에는 ‘사람’, ‘물’, ‘모래’ (객체) 및 ‘해변’ (장면) 그리고 ‘야외’ (개념) 등이 Label 이 될 수 있습니다. 자, 우주 사진을 한 번 분석해볼까요? array(3) {     ["Labels"]=>     array(8) {       [0]=>       array(2) {         ["Name"]=>         string(9) "Astronomy"         ["Confidence"]=>         float(96.8987350464)       }       [1]=>       array(2) {         ["Name"]=>         string(5) "Earth"         ["Confidence"]=>         float(96.8987350464)       }       [2]=>       array(2) {         ["Name"]=>         string(5) "Globe"         ["Confidence"]=>         float(96.8987350464)       }       [3]=>       array(2) {         ["Name"]=>         string(11) "Outer Space"         ["Confidence"]=>         float(96.8987350464)       } ...     } Rekognition이 업로드한 우주 사진을 분석하여 정확히 연관된 Label들만 반환한 것을 확인할 수 있습니다. 이 Label을 가지고 이미지 태그를 간단하게 구현했습니다.참 쉽죠 ?Conclusion이번 시간에는 AWS Rekognition 을 이용하여 기본적인 이미지 분석을 해보는 시간을 가져봤습니다. 다음 시간에는 ‘얼굴 감지 및 분석’ 기능을 응용하여 Collection 을 생성해보고, 얼굴 검색을 해보는 시간을 갖겠습니다. 참고놀라운 무료 이미지 · Pixabay핀터레스트 스타일 레이아웃 만들기 (masonry) - 생활코딩이미지에서 레이블 감지 - Amazon Rekognition글김우경 대리 | R&D 개발1팀[email protected]#브랜디 #개발문화 #개발팀 #업무환경 #인사이트 #경험공유
조회수 196

화가 날 땐 참지 말고 태워버리세요.

당신은 화가 날 때어떻게 하시나요?1. 화를 낸다. 2. 참는다. 1번을 선택한 당신은?그럼요. 화가 나면 바로바로 화를 내야죠. 어떻게 화를 참나요? 그렇게 화를 내야 상대방도 내가 화가 났다는 사실을 알고 조심하지 않겠어요? 그런데 화를 내고 나면, 당시에는 후련하지만 조금 지나고 나서 후회가 되기도 해요. 조금만 참았으면 괜찮았을까 싶어서요. 한번 화가 나면 조절이 안 될 때가 있거든요. 저도 그러고 싶어서 그러는 게 아닌데, 사람들이 저를 화만 내는 사람인 줄 아는 것 같아서 더 화가 나요. 화가 난다. 화가 난다                                                 2번을 선택한 당신은?어떻게 화가 난다고 내 감정을 다 표현할 수가 있겠어요. 화가 나긴 하지만, 꾹 참고 넘어가는 거죠. 나만 잠깐 참고 넘어가면 모두가 다 편안해지는 걸요. 그런데 그렇게 참다 보니 내 속에 화가 가득 차 버렸나 봐요. 가슴이 막 답답해서 숨이 가빠올 때가 있어요. 이러다 정말 내가 정말 화병으로 죽을지도 모른다는 생각이 들지만, 내가 화를 내면 나를 떠날까 봐 두려워요. 이젠 화를 내는 방법조차 잊어버렸어요. 어떻게 화를 내야 하는 건가요. 화를 참자. 화를 참자                                                           그래요. 당신 말이 다 맞아요. 이 글을 읽고 있는 바로 당신. 화가 날 땐 화를 내기도 하고, 내고 나서 괜히 화냈나 후회하기도 하는, 화가 나지만 모두의 평화를 위해 참기도 하는 바로 당신 말이에요. 그런 당신을 위해 태어났습니다.화를 낼 수도 없고, 안 낼 수도 없다면대신 분노해드리겠습니다.주인님. 화라는 것은 눈에 보이지 않아서 얼마나 쌓였는지도 모르기 때문에, 누군가에게 던져서 상처를 주거나 내 몸에 쌓아서 결국 내 몸에 병이 나게 하죠. 그래서 생각했습니다. 눈에 보이지 않는 화를보이게 만들면 어떨까?화를 보이게 만들고 그것을 태워서 나의 화가 사라질 수 있다면? 그렇게 나를 힘들게 하는 감정들을 녹여서 없앨 수 있다면, 사람들이(그리고 나도) 좀 편안해질 수 있지 않을까?  그렇게 태어난 스트레스 컴퍼니의 첫 번째 상품인 분노 캔들은 "분노는 마음에 담아두는 것이 아닙니다"라는 콘셉트로 제작되었습니다. 눈 부분이 심지로 되어있어, 쌍심지를 켜고 대신 화를 내준답니다. 분노캔들과 분노캔들 DIY 키트처음에는 화가 날 때 씹어먹거나 천천히 녹여 먹을 수 있는 사탕이나 초콜릿을 생각했습니다. 그래서 초콜릿을 만들어보겠다고 방산시장을 들락거렸지만, 먹는 걸 만드는 것은 꽤 까다롭더군요. 폭망하여 상심하고 있을 때 친구가 캔들은 어떠냐며 추천해주더군요. 그래 바로 이거야. 신난다. 분노를 태우자! 그때부터 시중에 있는 모든 양초 재료들을 리서치했습니다. 소이 왁스와 파라핀, 만지락, 밀랍 왁스를 가지고 부어서도 만들고 붙여서도 만들고 말아서도 만들어본 후에야 밀랍 시트를 말아서 만드는 형태로 만들어야겠다고 결정하게 됐지요.다채로운 분노캔들의 변천사                                     그 모습을 본 친구들이 그렇게 일일이 손으로 만들어서 어떻게 돈을 벌겠냐며 공장에서 대량 생산할 수 있는 형태로 만들어야 한다고 말렸지만, 저는 그냥 그렇게 손으로 말아서 만드는 게 좋았습니다. 그래서 회사를 만든 지 4년이 지난 지금도 주문이 들어오면 손으로 만들고 있습니다. 하하 만드는 사람이 행복해야 쓰는 사람도 행복할 수 있다고 믿었기 때문입니다. 그리고 그래야만 그 사업이 지속될 수 있다고 지금도 여전히 믿고 있습니다. 그랬기에 밀랍 시트를 자르고 나무 심지를 자르고 또 심지에 시트를 덧입히고 그 재료들을 정성껏 말아서 만드는 분노 캔들을 탄생시키고야 만 것입니다. 분노캔들 첫 번째 버전. 누가 만들었는지 참 귀엽네요.                           끝인 줄 알았죠?그런데 처음부터 분노 캔들이 쌍심지였던 것은 아니었습니다. 그리고 지금처럼 나무 심지도 아니었어요. 그런데 면 심지보다 나무 심지가 더 불꽃이 크고 타닥타닥 소리가 나니까 타는 소리로도 힐링이 될 수 있겠다는 생각이 들더라고요. 코, 눈, 볼 심지의 위치 테스트                                     분노캔들의 사이즈 테스트                                     그리고 처음부터 지금의 사이즈도 아니었어요. 과연 어떤 사이즈가 적당할 것인가 한참을 고민하다가 분노 캔들을 켜고 마음을 다스릴 수 있는 가장 적당한 시간이 30분 정도라고 느꼈고, 그 시간 동안 화난 얼굴을 다 녹여버릴 수 있는 사이즈로 결정하게 되었습니다. 그렇지만 분노 캔들은 얼굴이 다 녹은 후에도 대략 2시간 정도 액체상태로 끝까지 탑니다. 그렇게 제작한 분노 캔들은 인체에 유해성이 없다는 인증절차를 거쳐서 KC 마크도 받았습니다. 분노캔들의 첫번째 버전. 분노캔들을 켜고 마음을 식힐 수 있도록 메뉴얼이 같이 들어있습니다. 분노캔들 두 번째 버전. 책을 빼고 크기를 더 키웠습니다. 더 귀여워졌네요!           혼자서 꼬물꼬물 만들면서 그런 생각을 했습니다. 지금은 내가 혼자 만들고 있지만, 분노 캔들이 많이 팔리면 동네의 손재주 좋은 아줌마들, 할머니들과 함께 만들고 그들에게 일자리를 주는 사회적 기업으로 발전시키고 싶다는 야무진 꿈을 꿨었지만, 아직까지 그렇게 많이 팔리지는 않아서 혼자서 만들고 있습니다. 그렇지만 언젠가는 제 꿈을 현실화시킬 수 있는 날이 오겠지요? 그때까지 지치지 않고 차근차근히 만들어나가겠습니다.  분노 단계에 따라서 색상을 선택할 수 있어요.분노캔들은 스트레스컴퍼니샵에서 구매 가능합니다.*이 글은 2016년 다음 스토리 펀딩에 연재했던 글을 수정하여 올린 글입니다. ⓒ스트레스컴퍼니 - 무단 전재-재배포 금지 #스트레스컴퍼니 #심리스타트업 #스트레스관리 #서비스소개
조회수 1343

일본 스타트업 적응기#7   「동료」

언제부터였을까'가족같은 분위기의 회사' 는절대 피해야할 구인광고가 되었다.'분위기  가족같은 회사'는 곧'분위기가  족같은 회사'라는 웃지 못할 유머가 있듯이 말이다.그렇지만 본 적 있는가? TED에서 봤던 인상적인 강의 중에 하나"빌 그로스(Bill Gross): 스타트업 성공의 가장 중요한 요소"를 보면(링크확인)<기업을 성공으로 이끄는 주요한 5가지 요소>아이디어, 팀, 비즈니스 모델, 자금, 타이밍 중 첫 번째를 Timing, 두 번째를 Team로 꼽고 있다.Timing과 관련해서는 개인이 회사에 합류를 결정하는 시점이면 몰라도, 이미 전개되고 있는 비즈니스에 함께하는 입장에서는 영향을 끼치기가 쉽지 않다. 어쩌면 이것은 리더의 안목과 운의 작용에 의해 만들어나가는 것인지도 모르니 말이다.하지만 Team - 사내 문화, 분위기, 동료관계와 관련해서는 특히나 스타트업이라면 개개인의 영향력이 클 수밖에 없다. 따라서 내가 속한 조직을 성공으로 이끌고자할 때 각자에 자리에서 맡은 일을 잘하는 것도 중요하지만, 이에 바탕이되는 행복한 동료 관계에도 늘 관심을 기울여야한다고 생각한다.한국에서는 많은 사람들이 '가족같은 회사가 되는 것'을 경계해서 일까언제부턴가 돈이 많거나, 아이디어가 남다르거나, 비즈니스 모델이 훌륭한 기업은 성공할 것이라 믿으면서, 상대적으로 Team - 사내 문화, 분위기, 동료관계 등의 중요성은 점점 소홀하게 생각하고 있는지도 모른다.근래에 한국 비즈니스 전개로 인해 출장이 잦았다. 다소 숨 가쁘게 진행된 일정에 기진맥진하여 돌아오면 동료이 있다. 그리고 그들을 보면 마음이 편안해진다.'그래 내가 열심히 해서 우리 동료들 다 같이 한국 가서 맛있는 음식 한번 먹어야지!' 라는 마음으로 일을 하고 있다.동료가 이런 말을 한 적이 있다.'난 지금 우리가 하는 서비스가 예상 못한 상황을 만나 쫄딱 망하더라도, 지금 함께하는 동료들과 같이라면 언젠간 꼭 목표를 성취하는 날이 올 거라 믿는다'4월 FULLER 동료들과 다같이 하나미(벚꽃놀이)에서이런 동료애를 바탕으로 한다면 뭘 해도 할 수 있지 않을까?Fuller 의 대표 서비스 App Ape가 오랜 준비기간을 걸쳐 드디어 한국에 진출하였습니다!신뢰성 있는 모바일 앱 데이터를 기반으로 한 다양한 인사이트와 정보를 전해드리겠습니다.- 페이스북 페이지 : https://www.facebook.com/appape.korea/ - App Ape Lab : http://lab.appa.pe/ko/index.html많은 관심을 부탁드립니다!#Fuller #일본 #스타트업 #해외취업 #스타트업합류 #일상 #인사이트 #팀원 #동료
조회수 1424

잘 가요 친구들

그동안 고생 많았어요.마지막 식사를 하고 승표님, 날씽님과 헤어짐의 인사를 나눴다. 하지만 뭔가 아쉬움이 남아 이제 곧 계정이 정리될 슬랙으로 한번 더 고생했다는 개인 메시지를 남겼다. 오늘은 함께 일했던 그들을 떠나보내는 날이다.스타트업이라는 기차에 타고 여행을 하다 보면 정해진 역 없이 사람들이 타고 내린다. 어떤 역에서는 사람들이 왕창 타기도 하고, 또 어떤 역에서는 예고도 없이 내리기도 한다. 북적북적한 기차를 같이 타고 가다 빈자리를 보면 그 사실을 알고 있었음에도 쓸쓸한 마음이 든다. 역시 든 자리는 몰라도 난 자리는 안다.승표님은 5개월, 날씽님은 2개월을 함께 일했다. 그들이 회사에 처음 들어와서 했던 자기소개를 기억해 본다.대출  좀 받아줘야 8퍼센트 들어올 수 있지 말입니다당시에는 미국 명문대에 다니고 있는 이 친구가 왜 8퍼센트에서 일하고 싶어 하는지 솔직히 잘 이해가 안 되었다. 일반적으로 스타트업 인턴이라고 하면 '제가 스타트업에 관심이 많습니다. 스타트업을 경험해 보고 싶습니다' 가 일반적이다. 그런데 미국의 스타트업에서도 일해 보고 한국에서 창업 경험도 있는 친구가 8퍼센트에서 무엇을 얻어 가려 하는지 의문이었다.          실제로는 조금만 더 잘생겼다병특을 마치고 놀고 있는 날씽님은 세바님이 8퍼센트에 추천해 주셨다. (보다 정확하게 이야기하면 풋살장에서 축구하고 있는 날씽몬을 세바 트레이너가 잡아왔다.) 원래 8퍼센트에서는 짧은 기간만 일하는 개발 인턴을 채용하지 않는다. 손발을 맞춰 가는데 드는 노력에 비해 얻을 수 있는 것이 많지 않다는 생각 때문이다. 하지만 이미 3년의 경력을 갖추고 보증인(세바)도 있는 개발자가 인턴을 하고 싶다고 하니 마다할 이유가 없었다. 오히려 병특을 막 끝내고 복학 전에 놀고 싶을 텐데 왜 굳이 일을 하려 할까 하는 생각이 들었다.두 분은 인턴이라는 이름으로 일했다. 두 분이 원한 것은 취직도 아니고 돈도 아니었다. (그 기간 동안 돈을 벌려고 했으면 훨씬 더 좋은 기회가 많았으리라 생각한다) 그들이 원한 것은 경험이었다.승표님은 '성장하는 한국의 스타트업'을 경험해보고자 했다. 승표님이 들어오신 시점을 기준으로 회사에 대한 객관적인 성장 잣대인 누적 대출액이 2배 이상 늘었으니 성장했다고 할 수 있겠다. 그동안 회사는 아무것도 모르는 천둥벌거숭이에서 조금은 먼 미래를 볼 수 있게 되었으니 그것도 성장이라고 부를 수도 있겠다. 이런 과정에서 승표님이 스스로 만족할 수 있는 경험을 가져갔는지는 잘 모르겠다.날씽님은 8퍼센트에서 '함께 개발하기'를 경험해보고자 했다. 전 직장에서 오랜 시간 동안 혼자 일을 하셔서 팀으로서 효율적으로 그리고 즐겁게 일하는 것은 어떤 것일까? 를 궁금해하셨다. 다행히 회사에서 소울메이트도 만났고, 나는 많은 신경을 써주진 못했지만 금방 팀과 어울려서 도움을 주고받는 모습을 볼 수 있었다. 황금 같은 2달의 시간이 충분한 가치가 있었는지는 역시 날씽님만 아는 일이다.승표님은 진중한 사람이다. (우리는 재미없는 사람이라고 부른다.) 항상 논리적인 대화를 통해 이성적인 결과를 만들어 가고자 했다. 디자인을 전공한 최진님과 자주 제품을 두고 티격태격했지만 내가 보기에는 좋은 조합이었다. 이 스마트한 친구는 분야를 한정하지 않고 일을 했고 회사의 여러 곳을 개선시켜 두었다. 특히 데이터에 기반한 기획과 마케팅을 할 수 있게 기틀을 잡아준 것은 앞으로 회사에 많은 도움이 될 거다. 이 글을 빌어 감사드린다.  날씽님 또한 회사에 필요한 여러 가지 일들을 '알아서' 해 주셨다. 역시 좋은 인재는 꼭 일을 던지지 않아도 알아서 찾아서 한다. 회사의 개발 환경도 야금야금 개선시키고 코드도 (내가 모르는 사이에) 여기저기 리팩터링을 해두었다. 그리고 고객팀 분들께 필요한 도구들도 개발해 주셨다. 역시 이 글을 빌어 감사드린다.날씽님이 떠날 때 고객 팀분들이 겨울방학 때 꼭 돌아와서 일해달라고 부탁했다. 그리고 날씽님은 “겨울방학 때 돌아올게요.”라고 답하셨다. (내가 볼드는 왠만해서는 잘 쓰지 않는다)떠나는 분들께 감사한 마음을 담아 작성한 롤링페이퍼두 분은 이제 학교로 돌아가셔서 다시 공부를 시작하실 거다. 회사에서 보여준 그들의 능력과 태도라면 학교에서도 그리고 조만간 맞닥뜨릴 사회에서도 충분한 인정을 받으시리라 생각한다. 이제 남은 우리가 해야할 일은 8퍼센트를 충분히 성장시켜서 그들이 사회에 나올 때 멋진 오퍼를 건네는 것이다. 다시 만날 그날을 기다리며.#8퍼센트 #에잇퍼센트 #작별 #팀문화 #조직문화 #기업문화 #팀워크 #인턴 #P2P금융
조회수 2529

2018년, 새 사무실로 이사했어요 : Watcha, Inc.

2018년, 새 사무실로 이사했어요2018년 여름,왓챠는 정든 신사동을 나와 강남역 근처로 이사했어요이전 사무실과 고작 15분 거리지만독립한 대학생처럼 설레고 어리둥절해요이렇게 더워질지 몰랐던 2018년 7월 초,폭염이 우리를 덮치기 전에 이사한 건 참 잘한일이에요이곳이 새 사무실이에요이쪽은 업무공간다들 열일 중이쪽은 라운지공간을 널찍하게 분리했어요여기는 그란데!새 사무실은 [톨 – 그란데 – 벤티] 3개의 방이 있어요그란데에서는 휴식과 식량을 해결할 수 있어요가끔 저 큰 TV로 영화를 즐길 수도 있다고 해요카페가 부럽지 않은 뷰강남에서 창밖의 초록색을 보며 일할 수 있다는 건 행운이죠할 거 없나 – 1이삿짐이 속속들이 들어오고 있어요할 거 없나 – 2더 예뻐진 브라운은 이곳까지 잘 따라왔어요너는 깨끗해질 것이다왓 왓 이즈 잇..!이게 ‘모션데스크’ 라는 건데,앉으나 서나(?!) 일할 수 있게 해주는 신박한 책상이에요오…아이 러브 잇사이좋게 새 냉장고를 채워 넣는 그레이와 그린그냥 제가 할게요답답했나봐요엄청난 칼각을 세우고 있는 그레이 (25, 행정병 출신)잔뜩 채워 넣어진 음료수들우리들의 배에 털어 넣어질 예정이에요아 어떡하지…고민 중인 비제이의 모습점심 메뉴 고민 중이었던 걸 들킨 비제이사무실이 너무 넓어서새로운 운송수단이 생겼어요화장실도 빨리 갈 수 있어요이제는 전체회의도 널찍널찍하게 할 수 있어요어디서든 아이디어가 샘솟아요멀리서 찍으니 멋짐도 샘솟아요뭘 보고 있었을까요?이제 왓챠는 새 사무실에서더 큰 세상으로 뛰쳐 나갈 거예요기대해주세요 🙂
조회수 1582

이달의 반장님(6월) 선정 - '조 반장님' 감사드립니다

 안녕하세요. 다시 찾는 인테리어, 두번째입니다.  온라인 기반이라는 한계에도 불구하고 많은 고객님들이 저희를 찾고 만족해 하시는 가장 큰 이유 중 하나는 바로 오프라인 시공 현장에서 열심히 수고해주시는 '반장님'들 덕분이라고 생각합니다. 항상 수고해주시는 반장님들에게 조금이나 즐거움을 드릴 수 있는 방법을 꾸준히 고민해왔는데요. 드디어 한가지 작은 실천을 시작해보게 되었습니다. 이제부터 월마다 '이달의 반장님'을 선정하여  수고하시는 시공파트너분들에게는 소정의 금액과 감사의 표시로 상장을 드리기로 했습니다.  6월달에는 '조익현' 반장님이 이달의 반장님으로 선정이 되셨습니다. 마침 저희 사무실 근처에서 시공 일정이 있으셔서, 저희들이 갑자기 방문을 드려서 '이달의 반장님' 으로 선정되었다면서 상장을 드리고 왔는데요. 바쁘신 상황에서 갑작스러운 방문이라서 놀라셨을 수도 있으실텐데, 친절히 맞아주셨습니다.  조 반장님께는 연식이 오래된 아파트나 또는 험한(?) 시공지를 많이 부탁을 드렸었는데요.  이번에 방문드렸던 현장도 오래된 아파트 현장이었습니다...  그만큼 조 반장님을 신뢰를 할 수 있었고, 신뢰한 만큼 항상 최선의 시공으로 좋은 결과물이 나왔던 것 같습니다.  또 많은 도배 시공자들이 그리 반기지 않은 '1품 작업'도 자주 협조해주셨습니다.  어제 방문했던 현장에서도 '1품 작업'이다 보니 반장님 혼자서 바쁘게 시공을 해주시고 계시더라구요.  그래서 기회를 보다가 준비한 상장만 드리고 금방 복귀해야 했답니다.  크지 않은 선물임에도 반장님이 굉장히 만족해하셔서 저희도 기분이 같이 좋아지더라구요.   이렇게 감사의 마음을 표현하고 나니, 항상 머릿속에만 있었던 아이디어를 실행하는 것이 그렇게 어려운 일이 아니었던 것 같습니다.  '조 반장님' 외에 다른 시공 파트너 분들에게도 항상 감사한 마음 뿐인데요.  이렇게 좋은 기획을 더 일찍 시작하지 못해서, 죄송한 마음이 드네요.  항상 열심히 수고해주시는 모든 반장님들, 감사합니다!! 
조회수 1640

[Tech Blog] PhantomJS를 Headless Chrome(Puppeteer)로 전환하며

버즈빌에서는 모바일 잠금화면에 내보내기 위한 광고 및 컨텐츠 이미지를 생성하기 위한 PhantomJS 렌더링 서버를 다수 운영하고 있습니다. 일반적으로 PhantomJS는 웹페이지 캡쳐에 많이 쓰이지만, 기본적으로 headless하게 웹페이지를 렌더링하고 캡쳐할 수 있다는 특성 때문에 동적인 이미지 생성에도 많이 활용됩니다. 버즈빌의 렌더링 서버는 200개 이상의 컨텐츠 프로바이더로부터 실시간으로 잠금화면 컨텐츠 이미지를 생성하고 있어 분당 수백 건의 이미지를 안정적으로 생성하는 것이 가능해야 합니다.  렌더링 서버의 스케일링 이슈를 해결하기 위해 버즈빌에서는 여러 대의 렌더링 서버를 둬서 횡적으로 확장을 함과 동시에, 개별 서버 내에서도 리소스 사용률을 높이기 위해 Ghost Town이라는 라이브러리를 작성해 PhantomJS 프로세스 풀을 구성하여 사용하고 있었습니다(Scaling PhantomJS With Ghost Town ) 한편, 시간이 지나면서 잠금화면에서 렌더링하는 이미지 템플릿의 종류가 다양해지고, emoji 및 여러 특수문자를 표현하기 위해 렌더링 서버에 여러 폰트(대표적으로 Noto Sans CJK)를 설치해야 하는 요구사항이 추가됐는데, PhantomJS에서 폰트 렌더링이 일관적이지 않은 문제가 발생했습니다. 동일한 템플릿이지만 폰트가 비일관적으로 렌더링되고 있는 모습 이 문제의 정확한 원인은 결국 찾지 못했지만 PhantomJS의 이슈였거나 시스템 상에 폰트가 시간이 지나면서 추가 설치됨에 따라 font cache가 서버마다 일관되지 않은 상태가 되었기 때문인 것으로 짐작하고 있습니다. 다른 워크로드와 마찬가지로 렌더링 서버도 최초에는 packer를 이용해 일관되게 이미지를 빌드하고 업데이트하려고 했지만, 자주 기능이 추가되거나 배포되는 서비스가 아니기에 서버를 오래 띄워놓고 수동으로 유지보수를 한 케이스들이 누적되어 더 이상 packer를 이용해 시스템이나 폰트를 최신 상태로 유지하는 것이 어려운 상태였습니다. 모든 눈꽃송이가 자세히 보면 조금씩 다르게 생겼다는 것에서 비롯된 snowflake, 즉 배포된 서버들이 시간이 지남에 따라 조금씩 다른 상태가 된 것입니다. 평소에는 문제가 없어 보이지만, 추가적인 확장성이 필요해 scale out을 하거나 새로운 템플릿을 개발해 배포를 하면 문제가 발생하는 상황이었습니다. 사실 더 큰 문제는 PhantomJS 프로젝트가 더 이상 관리되지 않는다는 점이었습니다. 2017년 Google Chrome 59버전부터 Headless Chrome이 내장되기 시작하였고, 곧바로 Node API인 puppeteer가 릴리즈 되어, 현시점에서 가장 많이 쓰이는 렌더링 엔진을 손쉽게 headless로 사용할 수 있는 환경이 되었습니다. 때문에 PhantomJS 관리자가 사실상의 중단을 선언하였고, 2018년에는 최초 개발자에 의해 프로젝트가 아카이브 되었습니다. 프로젝트가 업데이트되지 않는 것은 템플릿에 최신 CSS 스펙을 사용하지 못한다는 것을 의미하고, 버그 수정도 되지 않기에 어플리케이션의 유지보수가 굉장히 어려워짐을 의미합니다. 현재까지의 문제점을 정리하면 아래와 같습니다.  자주 배포되지 않는 서비스 특성으로 인한 서버들이 snowflake화 되는 현상(특히 폰트) PhantomJS의 개발 중단으로 인해 버그 픽스 및 최신 CSS 속성 사용이 어렵게 되고, 향후 유지보수나 새로운 템플릿 개발이 어려워짐  해결방안은 명확했습니다. 첫번째 문제를 해결하기 위해서는 어플리케이션과 폰트가 설치된 시스템을 통째로 컨테이너로 만들고, CI/CD 파이프라인을 통해 지속적으로 빌드하여 snowflake화 되지 않도록 하면 됩니다. 사실 최초에 packer를 이용해 AMI 이미지를 생성하도록 구성이 되어있었기에, 매 배포마다 AMI를 새로 생성하고 지속적으로 렌더링 서버를 배포하는 환경이기만 했으면 snowflake를 방지할 수 있었을 것입니다. 하지만 자주 기능이 추가되거나 배포되는 서비스가 아닌데다, AMI를 빌드하는 과정이 CI/CD에 통합돼 있지 않고 어플리케이션만 지속적으로 배포하는 환경이었기에 편의상 서버를 종료하지 않고 장기간 관리를 해 오게 되었고, packer로 새로운 AMI 이미지를 빌드하는 것이 어려워 졌습니다. 때문에 AMI 빌드를 통한 배포 대신, 이미 운영 중인 kubernetes 클러스터에 도커 컨테이너를 빌드해 immutable한 형상으로 배포하기로 결정하였습니다. 두번째 문제의 간단한 해결책은 PhantomJS를 puppeteer로 변경하는 것입니다. 이 부분은 생각보다 간단했습니다. 의도했는지는 알 수 없으나 puppeteer의 api는 PhantomJS와 꽤나 비슷합니다. drop-in replacement까진 아니지만, PhantomJS api 호출하는 부분만 살짝 바꿔주는 정도로 교체가 가능하였습니다. 물론 교체만 하였다고 해서 기존에 개발된 템플릿이 의도된 대로 출력되는 것을 보장하지는 않기에, 렌더링 서버가 렌더링하는 수많은 템플릿들을 PhantomJS와 puppeteer로 각각 출력하여 일일히 비교하는 작업이 필요했습니다. 어떤 템플릿이 어떤 인자를 필요로하며 의도된 출력 결과가 무엇인지에 대한 정의가 남아있지 않았기에 템플릿마다 샘플 케이스들을 생성하는 작업이 필요했습니다. 아직까지는 수동으로 결과를 비교해야하는 문제점이 있지만 적어도 직접 확인할 수 있는 것은 큰 도움이 되었습니다. 향후에는 자동화된 테스트 케이스를 구성하여 기능 개발이 좀 더 용이하도록 보완할 계획입니다. 결과는 만족스러웠습니다. 많은 경우 기존과 출력 결과가 달랐지만, 최신의 크롬 웹킷이 사용되면서 오히려 템플릿을 개발할 때 의도했던대로 CSS를 더 정확하게 렌더링하게 된 것이었습니다.  FROM node:10-slim RUN apt-get update && \ apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \ libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 \ libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 \ libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 \ fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont \ ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget unzip && \ wget https://github.com/Yelp/dumb-init/releases/download/v1.2.1/dumb-init_1.2.1_amd64.deb && \ dpkg -i dumb-init_*.deb && rm -f dumb-init_*.deb && \ apt-get clean && apt-get autoremove -y && rm -rf /var/lib/apt/lists/* RUN yarn global add [email protected] && yarn cache clean ENV NODE_PATH="/usr/local/share/.config/yarn/global/node_modules:${NODE_PATH}" RUN groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser # Set language to UTF8 ENV LANG="C.UTF-8" RUN wget -P ~/fonttmp \ https://noto-website-2.storage.googleapis.com/pkgs/NotoSans-unhinted.zip \ https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \ https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKkr-hinted.zip \ https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKtc-hinted.zip \ https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKsc-hinted.zip \ https://noto-website-2.storage.googleapis.com/pkgs/NotoColorEmoji-unhinted.zip \ && cd ~/fonttmp \ && unzip -o '*.zip' \ && mv *.*tf /usr/share/fonts \ && cd ~/ \ && rm -rf ~/fonttmp WORKDIR /app # Add user so we don't need --no-sandbox. RUN mkdir /screenshots && \ mkdir -p /home/pptruser/Downloads && \ mkdir -p /app/node_modules && \ chown -R pptruser:pptruser /home/pptruser && \ chown -R pptruser:pptruser /usr/local/share/.config/yarn/global/node_modules && \ chown -R pptruser:pptruser /screenshots && \ chown -R pptruser:pptruser /usr/share/fonts && \ chown -R pptruser:pptruser /app # Run everything after as non-privileged user. USER pptruser RUN fc-cache -f -v COPY --chown=pptruser:pptruser package*.json /app/ RUN npm install && \ npm cache clean --force COPY --chown=pptruser:pptruser . /app/ ENTRYPOINT ["dumb-init", "--"] CMD ["npm", "start"]  puppeteer를 사용하면서 약간의 권한 문제가 있어서 결과적으로 위와 같은 Dockerfile을 작성하게 되었는데, puppeteer 도커 이미지 작성에 관한 최신 정보는 여기서 확인할 수 있습니다. 컨테이너 오케스트레이션(K8s)을 사용하면 process 기반의 스케일링은 컨테이너를 여러대 띄워 로드밸런싱을 손쉽게 할 수 있지만, 개별 컨테이너의 throughput을 향상시키기 위해 기존에 Ghost town을 작성해 PhantomJS 프로세스 풀을 만든 것처럼 크롬 프로세스 풀을 구성하기로 하였습니다. 프로세스 풀 구성에는 generic-pool 라이브러리를 사용하였으며 아래처럼 구성하였습니다.  const puppeteer = require("puppeteer"); const genericPool = require("generic-pool"); const puppeteerArgs = ["--no-sandbox", "--disable-setuid-sandbox", "--disable-dev-shm-usage"]; const createPuppeteerPool = ({ max = 5, min = 2, maxUses = 50, initialUseCountRand = 5, testOnBorrow = true, validator = () => Promise.resolve(true), idleTimeoutMillis = 30000, ...otherConfig } = {}) => { const factory = { create: async () => { const browser = await puppeteer.launch({ headless: true, args: puppeteerArgs }); browser.useCount = parseInt(Math.random() * initialUseCountRand); return browser; }, destroy: (browser) => { browser.close(); }, validate: (browser) => { return validator(browser) .then(valid => Promise.resolve(valid && (maxUses <= 0 || browser.useCount < maxUses xss=removed xss=removed xss=removed> genericAcquire().then(browser => { browser.useCount += 1; return browser; }); pool.use = (fn) => { let resource; return pool.acquire() .then(r => { resource = r; return resource; }) .then(fn) .then((result) => { pool.release(resource); return result; }, (err) => { pool.release(resource); throw err; }); }; return pool; }; module.exports = createPuppeteerPool;  Caveats PhantomJS에서 puppeteer로 전환함에 있어서 몇가지 주의해야 할 점이 있었는데요. 첫째는 기존에 사용하던 템플릿의 html에 이미지 소스를 file:// url 프로토콜을 이용해 로드하는 경우가 있었는데, PhantomJS에서는 정상적으로 로드가 되지만 Headless Chrome에서는 보안 정책으로 인해 로컬 파일을 로드할 수 없었습니다(관련 이슈). 때문에 로컬 이미지가 필요한 템플릿은 Express 서버에서 static file serving을 하도록 하고 http:// 프로토콜로 변경하였습니다. 다음으로 발생한 문제는 PhantomJS을 이용한 기존 구현에서는 jade template을 compile한 후 page 객체의 setContent 메소드를 이용해 html을 로드하였는데, puppeteer에서는 page#setContent API 호출 시 외부 이미지가 로드될 때까지 기다리지 않는다는 점입니다. puppeteer 에 올라온 관련 이슈에서는 `=setContent`= 대신 아래와 같이 html content를 data URI로 표현하고 page#goto의 인자로 넘기면서 waitUntil 옵션을 주는 방식을 해결방법으로 권하고 있습니다.  await page.goto(`data:text/html,${html}`, { waitUntil: 'networkidle0' });  이 때 주의해야 할 점은 waitUntil의 옵션으로 networkidle0이나 networkidle2 등을 사용하면 외부 이미지가 충분히 로드될 때 까지 기다리는 것은 맞지만, 500ms 이내에 추가적인 네트워크 커넥션이 발생하지 않을 때까지 기다리는 옵션이기 때문에 외부 이미지가 로드되더라도 추가적으로 500ms를 기다리게 됩니다. 때문에 SPA 웹페이지를 캡쳐하는 경우가 아니라 정적인 html을 로드하는 경우라면 `load` 이벤트로 지정하면 됩니다. 이외에도 향후에 프로젝트의 유지관리나 운영 중인 서비스의 모니터링을 위해 Metrics API 엔드포인트를 만들어 prometheus에서 메트릭을 수집할 수 있도록 하고 grafana 대시보드를 구성하였습니다. 이 대시보드는 어떤 템플릿이 실제로 사용되고 있는지, 템플릿 렌더링에 시간이 얼마나 소요되는지 등을 모니터링할 수 있도록 구성하여 사용되지 않고 있는 템플릿을 판단하거나 서비스 지표를 모니터링 하는 데 이용하고 있습니다. grafana와 prometheus를 이용해 구현한 렌더링 서버 모니터링 대시보드. 마치며 최근에 들어서는 PhantomJS를 사용하던 많은 곳에서 puppeteer로의 전환을 해오고 있어 본 포스팅에서 다루고 있는 내용이 크게 새로운 내용은 아닐 수 있습니다. 하지만 버즈빌에서는 렌더링 서버가 과거에 이미 PhantomJS를 사용하는 것을 전제로 상당한 최적화가 진행되어 왔고, 꽤나 높은 동시 처리량이 요구되는 상황에서 puppeteer로 교체를 해버리기에는 여러 불확실한 요소들이 존재하는 상황이었습니다. 버즈빌의 핵심 비즈니스 중 하나인 잠금화면에 사용되는 이미지를 렌더링하는 서비스가 레거시(개발이 중단된 PhantomJS)에 의존하는 코드베이스 때문에 변경이 어려워지는 것은 향후 꽤나 큰 기술부채로 작용할 것이라 판단하였습니다. 이번 마이그레이션을 진행하면서는 이 부분을 염두에 두고 컨테이너를 사용해 CI/CD 파이프라인을 구축해 지속적으로 컨테이너 기반의 이미지를 생성하도록 변경하였고, 그 결과는 꽤나 만족스러웠습니다. 마이그레이션 이후 그간 밀려 있던 신규 템플릿 개발이나 신규 컨텐츠 프로바이더를 추가하는 과정이 수월해졌기 때문입니다. 빠르게 변화하는 비즈니스 요구사항에 대응하다보면 기술부채는 필연적으로 쌓일 수밖에 없습니다. 개발자에게는 당연히 눈에 보이는 모든 기술부채들을 청산하고 싶은 욕구가 있지만 늘 빚 갚는데 시간을 쓰고 있을 수만은 없는 노릇입니다. 리소스에는 한계가 있으니까요. 어떤 기술부채를 지금 당장 해결해야하는지 의사결정을 하는데 있어 고민이 된다면 일단 “측정”을 해보는 것을 권장합니다. 수치화된 지표가 있다면 당장 의사결정권자나 팀을 설득하는 데 사용할 수도 있지만, 서비스의 핵심 지표들을 하나 둘씩 모니터링 해나가다 보면 서비스에 대한 가시성이 높아지고 미래에 정말로 병목이 되는 지점을 찾아내기 쉬워질 것입니다. 참고 자료  https://docs.browserless.io/blog/2018/06/04/puppeteer-best-practices.html https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md Icons made by Freepik from Flaticon is licensed by Creative Commons BY 3.0    *버즈빌에서 개발자를 채용 중입니다. (전문연구요원 포함)작가소개 Liam Hwang, Software Engineer 버즈빌에서 DevOps를 담당하고 있습니다. Cloud Native 인프라를 구현하기 위해 여러 노력을 기울이고 있으며 새로운 기술들을 공부하는 것을 좋아합니다.
조회수 721

창업자의 일기장(2)-퇴사하는 날

회사를 나올 때,그래도 일은 잘 했었나 보다.대표님이 월급 줄테니까아무 일 하지 말고 출근만 하라고 잡으시더라.와서 게임을 하든,다른 회사에 지원을 하든,일단 본사로 출근했다가 퇴근하라고...마음이 조금 흔들렸다.물론 대표님이 그리 제안하는 이유를모르는 바는 아니지만,어차피 떠날 건데 괜히 제안받으면,서로에게 안 좋은 추억이 남을 듯해서단호하게 거절했다.지난 직장생활들이 주마등처럼 떠올랐다.처음 입사할 때,내가 첫 직원이었다는사실에 멘붕이었던...(그때, 날 부산까지 불러서 입사하게 끔 꼬신 친구 놈을 한 동안 원망했었지)첫 3달은 수습이라면서100만 원 안 되는 돈이 통장 찍힌 첫 달에짐 싸고 그만두려 했던 기억!(내가 이러려고 스펙 만든다고 애썼나 자괴감이...)매주 토요일마다 세미나라는 이름으로회사에서 영문 논문 번역하고,실험할 결과 비교하며,발표 자료 만들던 시간들!(군대 있을 때도 욕은 안 했는데...ㅡㅡ;; 이때는 진심 멘탈이 무너짐)직접 명세서를 작성하여특허를 출원하던 날들!(웬만하면 변리사에게 맡기는 게 더 효율적이라는 걸 깨달음)밤새 연구실에서 실험하면서"유레카"를 외친 날들!(아무도 알아주지 않아도,순수한 깨달음의 즐거움으로 버티고)큰 프로젝트를 기획하고계약까지 체결되었을 때,뭔가 이룬 뿌듯함!(2주 동안 여운이 남아서흥분된 나날들의 연속)파견 나가서업체 사장님과 자주 들렀던 주례의 횟집!(협력사와 인프라를 서서히 늘리던 시절)새벽에 퇴근하고,2시간 후에 출근해 비몽사몽인데이사님이 목욕탕 보내주셨던 일!(이사님이 실각했을 때, 직장생활은 줄을 잘서야 한다는 진실에 마주했었다는...;;;)회사에 자체 공장과 본사가 만들어지고,직원이 20명은 넘겼을 때,믿기지 않았던 감동(회사에 대한 애사심의 최전성기)하늘에서 내려온 경영진들과마찰로 밉보여서 멀리 쫓겨난 유배생활!(마음이 상했지만, 동료들 덕분에 버텼지)연전연승하던 사업 수주와매일이 바빠 휴일 반납이 일상이었고회사가 커갈수록,부서 간에 알력 다툼이 생겨 속이 상했다.(특히, 지연/학연/혈연의 무서움을 깨달음)첫 직장 퇴사하고,한 동안 쉬면서가족과 친구들과 시간을 나누며행복했던 한 때를 보냈다.(그리고 이내 두 번째 직장을 구한다) 새로 입사한 회사에서하고 싶었던 사업 아이템을추진!6개월 만에 15억 원 수주!(그러나 그때부터 연구소장과 사이가 틀어짐)매일 아침 회의와잦은 회식 강요,일일 업무보고에 지쳐서번 아웃!(윗사람에게 밉보이면, 늘 손해 보는 건 나!)그래도 날 격려하고, 진정시켜주신대표님과 동료들!(동료애로 회사생활 버텨냄)그러나결국 터질게 터짐.총대 매고 연구소장과 의견 충돌!대표님의 중재가 있었으나,연구소장과 대표님의 혈연관계임을알게 된 순간.... 퇴사 결심!(역시나 혈연은 가장 극복하기 힘든 장벽)지금 돌이켜보면,나도 젊은 혈기를 좀 더 죽여야 했는데,그리고경영진의 입장에서 생각해 보고,서로 합의할 수 있는 부분부터절충해 나가는 유연성이 있어야 했는데...고지식하고,혈기왕성하고,물러남이 없는 어리숙함에생각보다 이른 퇴사가 되었다.그럼에도퇴사하던 날!뭐가 그리 좋은지총총걸음으로집으로 룰루랄라~흥얼거렸지.예상하지 못했던시간들이 기다리고 있음을눈치채지 못하고 말이야!
조회수 3067

에이스프로젝트 신규입사자 OJT

두근두근 새 회사 첫 출근 날!깔끔한 사무실, 내 이름표가 붙은 책상, 잘 세팅되어 있는 컴퓨터, 여기까지는 좋았는데...."이번에 새로 입사한 땡땡땡이라고 합니다. 잘 부탁드립니다!"(짝짝짝!)서로 인사를 나눈 이후로 다들 스크럼이다, 아침 회의다, 업데이트다 바빠 보이고 혼자 멀뚱멀뚱 모니터만 보고 있다 보면 어느덧 점심시간.......신규입사자의 첫날 둘째 날이 보통 이렇게 지나가곤 합니다.(안돼..!)에이스프로젝트는 신규입사자의 빠른 안착과 꿔다 놓은 보릿자루화 방지를 위해 3일간 알차고 체계적인 OJT(On the Job Traning)를 진행합니다.프론트와 함께라면 외롭지 않아요!어떤 교육이 진행되는지 살펴볼까요?/ 웰컴 투어맨 먼저 지식관리자와 함께 웰컴 투어를 합니다.회의실이 많은 에이스프로젝트, 잠실도 가보고 목동도 가보고 다저스에도 가봅니다.화장실은 어디인지, 담배는 어디서 피우는지, 각 팀들은 어디에 있는지, 카페테리아는 어떻게 이용하는지 사무실을 함께 돌면서 안내를 받을 수 있어요.입사키트와 퀘스트/ 입사퀘스트 ; 환영한다 낯선 이여!세팅도 게임회사답게!입사 구비서류 제출부터 각종 프로그램을 설치하는 방법, 담당자 안내까지.퀘스트를 하나씩 하다 보면 어느덧 기본 세팅이 완료됩니다.퀘스트를 완료할 때마다 꿀보상이 주어집니다./ 입사키트 ; 입사자를 위한 작은 책어서 와, 에이스프로젝트는 처음이지?입사키트에는 에이스프로젝트의 팀 소개, 생활 가이드, 복리후생 등이 안내되어 있습니다.잊어버릴 때마다 다시 찾아서 볼 수 있어요!/ 커뮤니케이션 툴1일차의 핵심 프로그램!프론트 지식관리자와 함께하는 커뮤니케이션 툴 교육이 진행됩니다.구글 메일, 드라이브, 캘린더를 사용해 효과적으로 협업하는 방법,컨플루언스, 슬랙의 성격과 활용 팁을 듣고 실습도 합니다!/ 에이스프로젝트 조직문화2일차에는 인사담당자와 에이스프로젝트의 조직문화에 대해 이야기를 나누는 시간을 갖습니다.에이스프로젝트의 역할 중심 조직 문화, 중요하게 생각하는 권리와 의무를 차근차근 알려드립니다.현재 에이스프로젝트의 조직 구성과 각 역할을 맡은 구성원을 소개하고, 덤으로 그동안 에이스프로젝트가 어떻게 성장해 왔는지 히스토리도 알 수 있는 시간입니다./ 평가와 보상3일차에는 에이스프로젝트의 평가 제도, 인센티브 제도 관련 교육이 진행됩니다.에이스프로젝트가 어떤 것을 지향하고 어떤 것을 평가하는지, 성과는 어떻게 분배하는지 알 수 있습니다.신규입사자가 들어오면 서포터가 배정됩니다.서포터는 생활 면에서 신규입사자에게 도움을 주는 사람입니다."무슨 음식 좋아해요? 점심은 어떤 걸 먹을까요?""점심시간에 같이 게임해요!""도서 신청은 여기에서 할 수 있어요"같은 팀에서, 주로 자리가 가깝고 낯을 덜 가리는(?) 분이 배정되어 갓 알게 된 사람끼리의 서먹함을 해소하고 신규입사자의 회사생활을 도와줍니다.입사 5일차, 사무실과 주변 사람들이 익숙해질 무렵 CEO와 런치를 함께 합니다.사실 신규입사자와 CEO가 얼굴을 마주하고 대화할 일이 거의 없죠..?(2차 면접 때 가장 많은 대화를 나눈다고 한다..)이 런치 타임은 신규입사자와 CEO가 오손도손 이야기를 나누며 가까워질 수 있는 시간입니다.메뉴 선택권은 신규입사자에게 있어요! :D에이스프로젝트의 OJT는 신규입사자, 기존 팀원들 모두를 널리 이롭게 하고자 하는 프론트의 노력과'이런 것도 해주면 좋을 것 같아요!'라는 구성원들의 참여로 발전해왔습니다.아직도 지원이 망설여지시나요?함께 "성장하는 전문가"가 될 수 있도록 시작부터 도와드립니다.많이 지원해주세요!

기업문화 엿볼 때, 더팀스

로그인

/