스토리 홈

인터뷰

피드

뉴스

조회수 911

글을 쓰다가 시트콤에 출연(=꼽사리)해보았다.

그러니까 사건의 발단은 이렇습니다. 아시는 분들은 아시겠지만서도 예전에 '넵'에 대한 쓸데없는 분석을 했던 글이 하나 있었습니다.https://brunch.co.kr/@roysday/103이 글이었죠. 호가든 두 캔을 마시고 쓴 글이예요. 저는 가끔 카카오채널에서 웃긴 짤들을 저장하며 혼자 키득거리는 사람 중 한 명입니다. 그 중 트위터 드립은 가히 천재적이라 할 수 있죠. 이건, 그 중 하나였던 '넵병' 에 대한 짤을 바탕으로 이래저래 제 경험과 합쳐서 풀어내본 '별 영양가 없는' 글 중 하나였습니다. 아니 그런데 이게 자고 일어나니까 막 조회수가 한 때 제가 투자했던 가상화폐 마냥 떡상을 하기 시작하더니 이내 태양계를 뚫고 점이 되어 사라져 버리더라구요.....사실 직무관련된 글을 주로 쓰던 제 매거진에 툭 튀어나온 농담따먹기 콘텐츠였는데...갑자기 이것이 다른 2~4위 글을 합친 것보다 선방을 치면서 뭔가 제 캐릭터가 이상해지기 시작했습니다. 왠진 모르겠지만 덕분에 악플이란 것도 달려보고 신기한 경험을 많이 하게 되었지요. 이 글을 작년 10월5일에 썼으니... 벌써 10개월이 지났네요. 근데 거진 1년이 다 되가는 시점에서 신박한 메일을 받게 되었습니다. 내용인즉슨 이런 것이었죠. 오읭?원래는 소재만 제공하는 걸로 끝내려고 했는데 작가님이 그러시더라구요.'대표님, 강의도 하고 했으니 한 번 나와서 직접 블라블라 해주시는 건 어떠세요?' (물론 이렇게 얘기하진 않았습니다. 짧게 줄인 ver.)전화를 끊고 곰곰히 생각해봤습니다. 혹시 내 얼굴이 까였을 때 신상이 탈탈 털려서 사회적으로 매장당할 일을 한 적이 있었던가... 음. 악플정도는 달리겠지만 뭐 검찰에 불려가거나 할 정도는 아니겠군 싶어서 '네' 라고 했죠. 그래서 잠깐 직접 출연을 해보기로 했습니다. 분량은 약 3~5분남짓의 까메오출연 정도이고..다큐형식으로 전문가의 인터뷰영상 내지는 강의영상 정도로 삽입되는 인서트씬이었어요. 근데 사람이 사실 엑스트라 출연해서 뒷골목에서 지나가던 행인1만 해도 걸음이 발목 접질리고 바로 걷는 사람마냥 어색해지는데...카메라가 코 앞에 있으니 이건 뭐 동공대지진...참고로 이건 KBS1에서 곧 방영될 오피스시트콤 '회사가기 싫어' 의 1화에 등장할 내용이랍니다. 요즘 유튜브에 웹드라마도 온통 오피스오피스오피스..하고 있어서 아마 지상파도 그 트렌드를 따라가려고 했던 모양입니당. 딴 건 잘 모르겠고 일단 소주연님이 나온다는 소식에 큰걸음으로 달려가 싸인을 받고 발등에 향유라도 부어드리려고 했으나....(참고로 전 '하찮아도괜찮아'의 정주행 팬입니다..)안계심. (다른 곳 촬영)소주연느님..뵙고 싶.......아쉬움을 뒤로해야 했지만, 사실 배우분들이 계셨다면 전 아무말도 하지 못했을 거예요. 카메라 렌즈를 보느 순간 온몸의 근육이 굳고 왠지 공중에 5cm정도 떠서 걷는 듯하게 발에 감각도 사라지는 했죠. 고대 인디언들은 카메라에 사진이 찍히면 자신의 영혼을 뺏겨 죽어서 안식을 취할 수 없다고 생각했대요. 그 분들의 마음을 잠시나마 이해할 수 있었습니다. 다행스럽게도 작가님께서 엄청 유쾌발랄하셨고 엄청 편하게 다독여주셨어요. 분명....처음 봤는데 한 고등동창인줄 알았습니다. 친화력 무엇. 대본을 스륵스륵 체크해보았어요. 아니 내가 썼던 글인데도 내가 뭐라 썼는지 하나도 모르겠더라구요. 술마시고 써서 그런가.... 그래서 제가 쓴 글을 다시 외워야 하는 이상한 상황을 맞이하게 되었습니다.작가님은 뒤에서 스케치북 넘기면서 챕터별로 설명해야 할 것들을 디렉션 주시기로 하셨어요. 문제는 제 시선은 카메라에 있어야 한다는 거였죠. 한 0.05초 정도 슬쩍 보고 다시 카메라 보면 되겠지!! 라고 생각했는데 카메라로 보니까 다 보이더라구요. 눈알 굴리는거.... 모니터하면서 다시 보니까 스펀지 슬로우모션 음악 나와야 할 것 같은 느낌이었습니다.위치 잡고. 조명 맞추고. 저 위에 한다스! 라고 적힌 건 드라마 속 가상의 회사이름이에요. 카메라 감독님도 엄청 편하게 잘 해주셨어요. 사실 모두가 편한 데에는 이유가 있긴 했죠. 편집이라는 막강한 힘이 있기도 했고, 서울대학교 심리학교수님인 곽금주 교수님이 인터뷰하실 때 뭐 배우처럼 막 유창하게 하진 않으시잖아요? 그런 느낌 정도면 충분하다고 하시더라구요. 그래서 편집팀의 능력을 믿기로 했습니다.이곳이 드라마 배경이 될 회사 사무실 세트장이예요. 실제 사무실이 아니라, 모두 세트입니당. 다들 협찬받은 상품들이고, 가상으로 배치한 도구들이죠. 진심 디테일에 소름돋았어요. 특히 서류위에 올려진 스테이플러.. 테이크아웃 커피잔 하나, 프렌치카페 하나...씩 책상 구석탱이에 박혀있는 것 까지 진짜 실감나게 만드셨더라구요. 깜놀했음..약 두 시간 정도의 촬영이 끝났어요. 실제 출연은 3분남짓이지만, 각도에 따라 다르게 여러번 찍어야 해서 시간이 오래걸렸어요. 물론 NG를 오지게 냈기 때문이기도 하구요.모니터링하면서 보니까 이마에 기름이 줄줄 흐르고 있더라구요... 혹시 TV에서 보신다면 아...저 기름이 그 기름이구나..생각해주시면 될 듯 합니다. 9월12일 오후11시 KBS1에서 1회에 방영된다고 하네요.사실 글을 쓴다는 표현은 적절치 않은 것 같아요. 포맷이야 글이긴 하지만 무슨 예술성이나 작품성을 가지고 짓는 글이 아니기 때문에 그냥 저는 제 글들을 '콘텐츠' 라고 부르고 싶어요. (그렇다고 콘텐츠가 뭔가 퀄리티가 떨어지는 것을 지칭하는 것은 아니겠지만 예술작품과는 구분을 지어야 할 것 같더라구요.) 콘텐츠의 힘은 변형과 확장에 있는 것 같아요. 처음엔 넵글이 무슨 의미가 있길래 사람들이 그리 카톡에서 돌려보나...싶었는데. 사람들은 제 글을 가지고 이래저래 놀더라구요. 비슷한 것들을 재창조하기도 하고 변형하기도 하고, 영상으로 만들기도 하고 이모티콘으로 제작하기도 하고 급기야 방송콘텐츠가 되기도 하구요.요즘 글 쓰면서 좀 감이 떨어진 건 아닌가...라는 고민이 있었어요. 자꾸 조회수에만 집착하고 있는건가? 아니면 이 글을 통해서 자꾸 의뢰받으려고 밑밥깔고 있는 건 아닌가? 하는 고민도 들었죠. 그러던 와중에 이 작은 사건은 콘텐츠에 대한 생각을 정리해주었어요. 쓰는 사람이 재밌어서 써야하고, 많은 사람들이 가지고 놀 수 있어야 하고, 누군가를 위로할 수 있어야 하고, 거기엔 진정성(=술김)이 있어야 한다는 것.이것들을 잘 기억하고 있다면언젠간, 저 글을 뛰어넘는 또 어떤 글을 쓸 수 있겠죵. 올해 가기전에 그럴 수 있으면 좋겠어요 :) 작은 소망이예요. 매우 즐겁고 유쾌한 촬영을 할 수 있게 만들어주신 KBS예능국 작가님과 카메라감독님과 스탭분들께 감사드려요 :) 재미있는 시간이었습니당!티저영상 나왔네요...뚜룬..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ전 도저히 끝까지 못보겠어서...여러분들이 대신 봐주세요.https://tv.naver.com/v/3941378<iframe width="700.000000" height="394.000000" src="//serviceapi.rmcnmv.naver.com/flash/outKeyPlayer.nhn?vid=D8991D5290E49D95B9AA6832EB3BD619D546&outKey=V1282f0420b21c7b1d11184e49b65315d787cb06ea4501893bcb384e49b65315d787c&controlBarMovable=true&jsCallable=true&skinName=tvcast_white" frameborder="0" allowfullscreen="">
조회수 1741

타운어스 신규플랫폼을 오픈하며

안녕하세요. 타운컴퍼니 R&D 파트의 백대현입니다.타운컴퍼니는 단체들를 위한 공동구매 플랫폼인 타운어스를 운영하는 스타트업입니다. 기술블로그를 시작하며 최근 오픈한 타운어스 2.0에 대한 소개, 타운컴퍼니 기술조직인 R&D 파트에 대한 소개를 드리려 합니다.타운어스는 대학생들이 학교 내에서 자주 진행하는 공동구매가 굉장히 복잡하고 만족하기 어렵다는 문제를 해결하기 위해 시작되었습니다. 수작업으로 진행하던 공동구매를 플랫폼화 시켜 편하게 공동구매를 진행할 수 있게 만들고, 전국단위로 공동구매를 진행하여 최저가로 구매할 수 있도록 하였습니다.2014년 9월 오픈베타서비스인 캠퍼스샵을 시작하였고 이어서 2015년 6월 정식서비스 타운어스를 런칭하여 2년 넘게 폭발적으로 성장해왔습니다.사실 그 동안 타운어스 사이트에 대한 아쉬움이 많았습니다. 사이트가 초기에 린(Lean)하게 만들어진 이후에 몇차례 업데이트를 거쳐 타운어스 비즈니스를 받쳐주고 있었지만 내부 개발팀의 부재, 인력부족으로 유지보수가 잘 되지 않고 있었습니다. 그 와중에 몇 차례의 비즈니스 전략 변경(Pivot)을 거치면서 기술과 비즈니스의 괴리가 점점 벌어지게 되었습니다.타운어스 신규플랫폼타운컴퍼니에서는 여러 고민을 거쳐 한층 업그레이드 된, 이제 대학생 뿐만 아니라 모든 단체를 위한 공동구매 커머스 플랫폼으로 거듭나고자 타운어스 2.0 프로젝트를 시작하며 기획팀, 디자인팀, 개발팀으로 이루어진 R&D 파트를 출범하고 기술조직을 구성하였습니다.새로 출범한 타운컴퍼니 R&D 파트에서는 물려받은 기존 코드베이스를 유지하며 플랫폼을 개선할 것인지, 부채를 청산하고 새로운 코드베이스를 쌓을 것인지 많은 고민을 했습니다. 결론적으로 새로운 코드베이스로 프로젝트를 진행하기로 하였는데 대표적인 이유는 아래와 같았습니다.타운어스 2.0에서 변경되어야할 기획이 상당히 많아 재설계가 필요함비즈니스적 전략 변경을 서비스에 반영하기 위해 변경해야할 기획이 상당히 많고 그 동안 기술에 반영되지 않은 비즈니스 요구사항이 많아 여려 요구사항이 복합적으로 고려되어야함서비스 아키텍처가 연속성이 없음초기에 MVP로 시작된 코드베이스가 연속적인 기술조직이 발전시키지 못하고 외주 개발과 인력 변경을 거치다 보니 일관적이지 않고 누수가 많음버그 빚더미인력부족으로 인해 그 동안 유지보수가 되지 않아 해결해야할 버그가 복합적으로 존재함 (해결되지 않은 리포팅된 이슈 450여개 OMG)위 외의 여러 이유로 타운컴퍼니 R&D 파트에서는 기술부채 파산을 선택하고, 새로운 코드베이스에서 프로젝트를 시작하기로 하였습니다.신규플랫폼 간략 소개결론적으로 타운어스 신규플랫폼은 전체적인 일정과 인력을 고려하여 우선 부분적으로 오픈하게 되었습니다. 가장 많은 사용자들이 사용하는 단체의류공동구매에 대한 서비스를 먼저 개발하게 되었고 그 외 카테고리의 공동구매는 기존플랫폼에서 서비스하고 있습니다.이렇게 시작한 타운어스 신규플랫폼의 현재 오픈한 변경 사항은 크게 아래와 같습니다.전체적인 UX/UI 업데이트공동구매를 더 편하게 시작하고 진행하고 마무리할 수 있도록 개선“공동구매방”을 친숙하게 사용할 수 있도록 유도하였습니다.단체의류 커스터마이징 기능 강화커스터마이징 의류 종류 확장 : 과잠, 코치자켓, 티셔츠 (점진적으로 확대할 예정)커스터마이징 예상가격 계산 기능편하게 단체의류 디자인을 미리 해볼 수 있는 서비스를 제공합니다.최근 오픈을 시작으로 타운컴퍼니 R&D 파트에서는 지속적으로 서비스를 발전시켜 세상 모든 단체활동을 위한 공동구매, 타운어스에 걸맞는 공동구매 커머스 플랫폼으로 만들어갈 예정입니다.기술 스택과 조직 문화타운컴퍼니 R&D 파트의 기술에 대해서는 꾸준히 소개를 드리려 합니다. 때문에 오늘은 조직 문화와 기술 스택에 대해서 간단하게 소개를 드리겠습니다.프로젝트 진행협업툴로 JIRA, Confluence, Slack을 사용하고 있습니다.프로젝트는 Agile Kanban 방식으로 테스트 주도 개발, 코드 리뷰, 페어프로그래밍을 통해 진행하고 있습니다.서비스에 대한 충분한 고민 이후에 개발을 진행하려 노력합니다.기술 스택Back-End는 Django 1.11 (DRF) 기반으로 개발하며, AWS, MySQL, Vagrant, Docker 같은 기술을 사용하고 있습니다.Front-End는 Angular 5.1을 사용해서 개발하고 있으며 Less, RxJS, Webpack 등의 기술을 사용하고 있습니다.UX/UI에 Sketch와 Zeplin을 주로 사용하고 있습니다.CI(Continuous Integration)로 Travis-CI, 배포 관리로 Fabric과 AWS CLI, 버그 리포팅으로 Sentry.io, 플랫폼 모니터링으로 ELK(ElasticSearch, Logstash, Kibana)를 사용하고 있습니다.지향하는 조직 문화 및 지원자유롭고 주도적인 조직 환경시간에 쫓겨 비루한 코드를 생산하지 않도록유연한 리모트 근무지시가 아니라 스스로 할 일을 찾는 자율 속에서 책임을 다하는 문화자유롭게 의견을 제시할 수 있는 편한 분위기건강한 비판과 토론을 장려하는 커뮤니케이션 문화이상을 추구하되 비즈니스에 기반한이상적인 기획, 디자인, 개발을 지향하지만 비즈니스 영역에 기반한 의사결정회사 모든 조직들이 더 부가가치가 높은 업무에 집중할 수 있는 환경 조성을 위해 노력TOY TIME매주 금요일 4시부터 7시까지 3시간 자유로운 주제로 프로젝트 진행세미나, 컨퍼런스 참가 적극 장려 및 도서 지원저희는 아직 성장하고 있는 만큼 개선할 점도 많고 배워야하는 부분도 많이 있습니다. 그 만큼 기술블로그를 통해 저희가 고민하고 겪었던 기술을 공유하고 소통하며 서로 성장할 수 있는 기회가 되었으면 합니다.잘 부탁드립니다.#타운컴퍼니 #서비스소개 #기업문화 #사내복지 #조직문화 #원격근무 #디지털노마드 #재택근무
조회수 1526

레진 기술 블로그 - SVG를 이용해 간단한 웹 게임 만들어보기

근래 소규모로 게임 프로그래밍 스터디를 시작했습니다. 서비스 UI를 개발하는 프론트엔드개발자에게 있어 게임 프로그래밍은 언제나 커튼 뒤에 비친 풍경처럼 흐릿하고 형체를 쉽게 알 수 없는 신비한 존재입니다. 이번에 미약하게나마 커튼을 걷어 창문 너머 펼쳐진 풍경을 감상해 보자는 게 이번 스터디의 개인적인 목표입니다.왜 SVG를 선택했나게임을 만드는 데 어떤 기술을 사용할지 고민했습니다. 일반적인 DOM은 쉽게 객체를 조작할 수 있지만, 문서의 엘리먼트를 추상화한 것에 불과하므로 다양한 도형을 만들거나 좌표계에 사상(寫像, Mapping)1하기 쉽지 않습니다.캔버스는 그래픽 처리에 환상적인 성능을 보여주고 원, 다각형 등 다양한 도형을 그리기 쉽지만 일일이 객체화해야 하고 이를 관리하기 쉽지 않습니다. 여기에 필자가 캔버스를 좀 처럼 써 본 경험이 없어서 무턱대고 사용하기에도 부담을 느꼈습니다.하지만 SVG는 이 두 장점을 모두 갖고 있습니다. 확장 가능한 벡터 그래픽(Scalable Vector Graphics)이라는 이름을 통해서 알 수 있듯이 그래픽 요소를 그리는데 적합한 포멧이며 DOM처럼 추상화된 객체도 지원합니다.어떤 게임을 만들었나필자가 만든 게임은 크롬에 내장된 Running T-Rex와 비슷한 것으로 JUMPING CAR라고 이름을 붙였습니다. 플레이해보고 싶은 분은 uyeong.github.io/jumping-car를 방문하시기 바랍니다.규칙은 단순합니다. 게임을 시작하면 자동차가 달려나가고 이윽고 장애물을 만나게 됩니다. 장애물을 뛰어넘으면 점수가 1씩 증가하지만 부딪히면 게임이 종료됩니다.이 글에서는 게임을 만드는 과정을 소개하기보다 SVG를 이용하면서 알게 된 몇 가지 주요한 내용을 다룹니다.Pattern을 사용한 요소는 느리다이미지를 반복해서 출력할 때 HTML에서는 CSS의 background-url 속성으로 간단히 해결할 수 있습니다. 하지만 SVG에서는 Pattern 요소를 이용해야 합니다.아래 그림처럼 pattern#pat-land 요소를 만들고 이를 rect.parallax에서 사용하여 그림을 반복 출력되도록 합니다. 그리고 rect.parallax를 조금씩 Transform 하여 앞으로 이동하도록 구현합니다.코드는 다음과 같습니다(예제: svg-parallax-test/parallax1).<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="..."> <defs> <pattern id="pat-land" x="0" y="0" width="..." height="100%" patternUnits="userSpaceOnUse"> <image x="0" y="0" xlink:href="../images/land.png" width="..." height="100%"></image> </pattern> </defs> <g> <rect class="parallax" x="0" y="0" width="..." height="100%" fill="url(#pat-land)" transform="translate(0,0)"></rect> </g> </svg> 표면상으론 전혀 문제가 없는 코드지만 크롬 브라우저에서 이 코드를 실행하면 프레임이 50 이하로 떨어지는 경우도 발생합니다. 이 정도면 육안으로도 화면의 움직임이 매끄럽지 않게 느껴지는 수치입니다.따라서 성능에 영향을 주는 pattern을 제거하고 image 요소로 대체합니다. image 요소는 자동으로 반복할 수 없으므로 두 개의 요소를 이어 붙여 사용합니다(예제: svg-parallax-test/parallax2).<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="..."> <g> <image x="0" y="0" xlink:href="../images/land.png" width="..." height="100%"></image> <image x="..." y="0" xlink:href="../images/land.png" width="..." height="100%"></image> </g> </svg> 실행 결과 프레임이 안정적이고 육안으로도 이질감을 느낄 수 없습니다. 이처럼 Pattern을 이용한 SVG 요소를 애니메이션 처리할 때에는 주의가 필요합니다.일부 안드로이드 기종에서의 성능 문제pattern을 제거하고 image로 대체하면서 Parallax 처리 시 발생한 문제를 해결할 수 있습니다. 하지만 image로 대체하더라도 일부 안드로이드 기종에서는 여전히 성능 문제가 발생합니다.아래 영상처럼 image 요소를 Transform 할 경우 프레임이 급격하게 떨어집니다. 이는 크롬 개발자 도구에서도 쉽게 발견하기 힘든데 CPU 성능을 10배 줄여 테스트해도 수치상으로는 크게 차이 나지 않기 때문입니다.<style>.video-container { position: relative; padding-bottom: 56.25%; padding-top: 30px; height: 0; overflow: hidden; } .video-container iframe, .video-container object, .video-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style><iframe width="560" height="315" src="https://www.youtube.com/embed/F_-zXf1jb8I?rel=0" frameborder="0" allowfullscreen="">이 처리를 DOM으로 바꿔보면 어떻게 될까. 놀랍게도 큰 차이를 보여줍니다(예제: svg-parallax-test/parallax3).<iframe width="560" height="315" src="https://www.youtube.com/embed/VXQ1aT79D2s?rel=0" frameborder="0" allowfullscreen="">SVG에 대한 최적화 상황은 브라우저마다 조금씩 다릅니다. DOM은 과거부터 최적화 노력이 많이 이뤄졌지만, SVG는 pattern 요소나 다음 절에서 이야기할 리페인팅 문제 등 성능 문제를 일으키는 부분이 아직 남아있습니다.따라서 충돌 계산처럼 특별히 좌표계 연산이 필요 없는 배경은 DOM으로 옮기고 자동차, 장애물만 SVG로 구현했습니다(예제: svg-parallax-test/parallax4).SVG는 항상 페인트를 발생시킨다SVG는 이상하게도 svg 요소의 크기를 고정하더라도 자식 요소를 변경하면 페인팅이 발생합니다. 아래는 svg 요소의 자식 요소인 rect의 좌표를 수정하는 예제 코드입니다.<svg"http://www.w3.org/2000/svg" width="500px" height="500px" viewBox="0 0 500 500"> width="500" height="500" x="0" y="0"> </svg> [removed] setTimeout(() => { rect.setAttribute('x', '100'); }, 3000); [removed] svg는 viewBox로 설정한 사이즈 만큼 내부에 그림을 그립니다. 즉, 내부의 어떠한 그래픽적 변화가 문서에 변화를 일으킬 가능성이 없습니다. 그래서 개인적으로 쉽게 이해가 되지 않는 렌더링 흐름입니다.그러면 SVG 요소의 크기나 좌표를 바꾸지 않고 색상 또는 투명도를 변경하면 어떨까요. 이번에는 rect 요소의 좌표가 아니라 색상을 바꿔봅니다.<svg"http://www.w3.org/2000/svg" width="500px" height="500px" viewBox="0 0 500 500"> width="500" height="500" x="0" y="0"> </svg> setTimeout(() => { rect.setAttribute('fill', '#ebebeb'); }, 3000); 그래도 페인트가 발생합니다. 하지만 앞서 진행한 테스트의 페인팅 시간은 수십 마이크로세컨드로 크게 의미가 없어 보입니다. 그래서 현재 서비스 중인 레진코믹스의 메인페이지에 SVG를 넣고 테스트했습니다.페인팅에 0.51ms가 소요됐습니다. 작다고 느낄 수 있지만 페이지 전반적으로 영향을 줄 수 있으며, 애니메이션 처리 중인 SVG라면 성능적 문제를 발생시킬 수 있는 부분입니다.그래서 svg 요소에 null transforms 핵을 선언해 문서 상위 레벨까지 페인팅이 전파되지 않도록 합니다.<svg"http://www.w3.org/2000/svg" width="500px" height="500px" viewBox="0 0 500 500" style="transform:translate3d(0,0,0)"> width="500" height="500" x="0" y="0"> </svg> 또는 아예 svg 내부의 요소를 개별로 분리하는 방법도 있습니다(참고: Doubling SVG FPS Rates at Khan Academy).<svg> fill="red" transform="translate(2px, 3px)"> fill="blue" transform="scale(2)"> </svg> style="transform:translate(2px, 3px)"> <svg> fill="red"> </svg> style="transform:scale(2)"> <svg> fill="blue"> </svg> 끝으로여기까지 SVG를 이용해 게임을 개발하면서 만나게 된 이슈와 해결 방법을 간단히 정리했습니다.필자는 간단한 게임은 SVG로 만들 수 있고 괜찮은 성능을 보장할 것이라고 기대했습니다. 하지만 현실은 달랐습니다. 이 글에서 다룬 문제 외에도 사파리와 크롬 브라우저의 성능 차이, 자동차를 움직일 때 버벅이는 현상 등 다양한 문제를 해결해야 했습니다. 객체의 개수도 적고 애니메이션도 복잡하지 않은 단순한 게임이었는데 말이죠.다음 게임은 캔버스로 시작하고자 합니다.공간(空間)의 한 점에 대(對)하여, 다른 공간(空間) 또는 동일(同一)한 공간(空間)의 한 점(點)을 어떤 일정(一定)한 법칙(法則)에 의(依)하여 대응(對應)시키는 일 ↩
조회수 1345

현대오일뱅크 선배들의 이야기 - "누구보다 자신을 믿고 힘내라!" 경영지원본부 홍보팀 전도영

입사를 준비하고 있는 후배들에게 해주고 싶은 말은?누구보다 자신을 믿고 힘내라는 말을 하고 싶습니다. 채용전형 기간 동안 ‘내가 과연 할 수 있을까’라고 생각할 수 있습니다. 주변에서 합격소식이 들려올 때마다 불안감도 커질 것입니다. 저도 그랬고요. 하지만 저는 이것이 사회라는, 그리고 현대오일뱅크라는 또 하나의 문을 열기 위한 과정이라고 생각합니다. 현대오일뱅크 입사를 준비하시는 여러분은 분명 멋진 분들입니다. 할 수 있다는 자신감을 가지고 매 전형에 차근차근 임하십시오. 분명히 현대오일뱅크의 문도 활짝 열릴 것입니다. 어깨 펴시고 힘내세요! 기다리고 있겠습니다.우리회사에 입사하기 위해 어떤 준비를 하셨나요?회사 홈페이지를 적극적으로 활용했습니다. 홈페이지는 현대오일뱅크에 대한 정보를 가장 신속하고 정확하게 볼 수 있는 곳입니다. 애뉴얼 리포트, 회사소개영상 등을 참고하면 현대오일뱅크에 대해 많은 정보를 얻을 수 있습니다. 더불어 사보도 웹진으로 게재되니 읽어보시길 바랍니다. 저도 웹진을 보면서 현대오일뱅크 내 각 부서에 대한 정보를 얻었던 기억이 있습니다. 회사에서 발간하는 책자인 만큼 조직문화나 분위기도 느낄 수 있을 겁니다. 잘 정리한 자기 PR 자료와 회사 정보를 가지고 면접에 임하신다면 좋은 결과를 얻을 수 있을 것입니다.#현대 #현대그룹 #현대오일뱅크 #경영지원본부 #홍보팀 #선배들의이야기 #현대오일뱅크공채 #현대오일뱅크채용
조회수 1306

좀비 멘토, 창업 놀음 경계하는 군자들의 세상

페이스북을 보다 보면, 좀비 멘토나 창업 놀음에 관련된 글만 나오면 제목만 보고 단숨에 공유하는 사람들이 많다. 이 글을 통해 그것이 왜 문제이며, 인류의 발전에 어떤 악영향을 미치는 지를 설명할 계획이다. 물론, 이 글은 인기가 없을 것이다. 이유는 간단하다. SNS가 갖고 있는 나르시시즘에 대한 내용인데, 내 글을 공유하는 사람들은 '이 글에 동의합니다'라는 단 한 가지 이유로 공유한다. 그러나, 좀비 멘토, 창업 놀음에 관련된 글을 공유하는 사람들은 두 가지 이유로 글을 공유한다.첫 째. '이 글에 동의합니다.' 사실 이런 경우의 경우 공유수 100을 넘기도 힘들다.둘째. '이런 사람들이 정말 많으니 조심하세요. 하지만 나는 아닙니다. 공유함으로써 내 진정성을 검증합니다'둘째와 같은 이유가 소셜 네트워크에서 아주 강한 파급효과를 갖게 되고, 페이스북에는 이와 관련된 글들이 범람해 보이는 것 같은 착시현상을 느끼게 된다. 공유하는 사람들의 패턴도 매우 정형화되어있다. 물론 댓글 또한 정형화되어있다. [공유] 스타트업도 결국 이런 사람들이.. 조심해요!댓글 : 좋은 정보 감사합니다.. 정말 사짜들이 넘치는 세상이에요. 본질에만 충실합시다.[공유] 아니! 이런 게 있었나? 동굴 속에서 밤새 개발만 하느라 몰랐는데 ㅎㅎ댓글 : ㅇ 대표 몸좀 사리면서 하라구! [공유] 정말 많이 반성하게 됩니다. 혹시 나도 이런 사람이 아니었을까요? 댓글 : 아닙니다! 당신은 진짜예요! 본질에 아주 가까운 사람이랍니다!특히 스타트업에서 본질이라는 말을 매우 남발하는데, 안타깝게도 요즘 세상은 본질이라 불리는 진리에 근접한 개념들이 해체되고 있는 세상이다. 뉴턴의 고전역학은 양자역학을 만났다. 사물이 부딪치면 충돌한다는 개념은 양자물리학으로 보면 어떤 사물도 실제로 만나지 않는다. 세상의 진리는 해체되고, 우리가 진리 또는 본질이라 여겼던 것이 무너지면서 인생과 아집의 덧없음이 느껴지는 세상에 살고 있는데, 아직도 우리는 고전적인 선악구도, 좋은 것과 나쁜 것. 옳은 것과 틀린 것을 찾는데 혈안이 되어있는 듯하다.진리의 해체. 정답이 없는 데 정답을 가르치고, 정답과 어긋나면 회초리를 맞는 세상.우리나라는 특히 공식과 절대적인 진리를 좋아한다. 누군가 강의를 한다고 하면 지식과 정보를 받아 적는데 집중한다. 스타트업 실패 공식 100! 이런 것들이 아주 큰 인기를 끈다. 성공한 스타트업은 이유가 다양하지만, 실패한 스타트업은 이유가 정해져 있다고 한다. 스타트업 대표는 대외적으로 나대면 안 되고 본질에만 집중해야 되고, 고객을 만나면 고객은 정답이기 때문에 그들의 말을 꼼꼼히 받아 적고 그대로 만들어줘서 돈을 받아내야만 한다. 그 돈을 받으면 ARPU를 측정해서 CLV를 어쩌고 저쩌고...그런데, 여기서 아주 중요한 명제적인 오류가 있다. 성공한 스타트업이 이유가 없다고 정의한 순간, 성공한 스타트업이 실패하는 스타트업의 99%의 요소를 갖고 있다고 해도 이상하지 않게 된다. 성공한 스타트업의 패턴이 있고, 실패한 스타트업의 패턴이 있어야만 그것을 진리로 가공해서 절대적인 교육요소로 활용할 수 있게 된다. 실패한 스타트업의 요소는 단순히 레퍼런스로서 학습할 필요는 있지만, 성공한 스타트업의 요소들과 100% 충돌하지 않는 이상 그것 또한 진리가 아니다. 결국, 정답이라는 것은 없는 셈이다. 그런데, 우리 주변을 보면 자신이 세워놓은 이 진리에 어긋나는 사람들의 진정성을 하대하고 회초리를 때리는 경우가 많다.누군가 글에 이렇게 쓰여있었다. '내가 가짜가 아님을 계속해서 증명해야 한다'이 무슨 터무니없는 소리인가? 누구에게, 어디에 증명을 해야 한다는 말인가? 나의 진정성과 나의 부족함은 온전히 내 안의 피상적인 경험 속에서 피어나고 발전하는 일련의 과정인데, 대체 누구를 위해 살아가고 그 삶을 검증받아야 한다는 것인가? 부모님이 퇴근하면 내가 공부를 열심히 했다는 것을 증명하고 싶다는 유아기적인 욕구가 살아나는 건가?점점, 사람들이 말하는 '본질'은 입을 다물고 아무것도 하지 않은 채 동굴 속에서 고객과 서비스 개발하는 것이라고 정의되는 것 같다. 넥슨의 김정주와 엔씨소프트의 김택진 창업주 등이 그들이 말하는 최고의 기업가라 볼 수 있겠다. 나는 창업을 3년을 넘게 하면서 그들로부터 뭔가 배운 적이 없기 때문이다. 책도 안 쓰고 강연도 안 나온다. 이 얼마나 본질에만 충실한 기업가들인가? 그들이 말하는 본질을 생각하면, 초등학교나 중학교 시절로 돌아가는 것 같다. 나는 어렸을 때부터 나서는 성격이었다. 반장선거도 항상 나갔고, 수업시간에 친구들 웃겨주는 즐거움으로 살았다. 그런데, 내성적인 아이들은 내 행동을 이해하지 못하고 나를 싫어하는 경우가 많았다. 외향적인 사람들은 내성적인 사람들을 싫어하고 미워하는 경우가 없는데, 내성적인 사람들은 외향적인 사람들을 나댄다고 싫어한다. 그때도 아이들은 똑같은 말을 했다. '너 숙제나 잘하고 반장선거를 나가던지. 너 알림장도 안 가지고 다니잖아!' 내가 알림장을 안 갖고 다니던 갖고 다니던 너랑은 노상관이라고 말하고 싶었다. 꼬우면 지가 반장 하던가.좀비 멘토라는 허상좀비 멘토도 이와 비슷하다. 내가 경험한 바에 따르면 2000년대 초반에 활동한 기업가들 사이에 무언가 파벌과 자격지심이 존재하는 듯했다. 그리고, 좀비 멘토는 창업자들이 만들어낸 개념이라기보다는 멘토들끼리 만들어놓은 개념 같다는 느낌이 매우 강하게 들었다. 평소 왕래하던 분인데, 사람들이 그분을 두고 좀비 멘토라고 부르는 경우도 들어봤다. 나는 이해가 가지 않았다. 멘토라는 것은 어차피 자신만의 경험을 잣대로 자신을 찾아온 사람들에게 조언을 해주는 존재고, 그것을 받아들이고 말고의 차이는 찾아간 사람의 책임이다. 그 가르침이 옳지 않다고 해서 좀비라고 부르면, 진리에 근접한 성인군자만이 멘토를 할 수 있나?가끔 경험 있으신 분들을 만날 때가 있는데, 그럴 때마다 그분들이 자꾸 '나는 좀비 멘토가 아니에요'라고 말하는 것도 피로가 쌓인다. 왜 세상으로부터 우리는 검증받아야 하는 존재인가? 경험의 다양성, 성격의 다양성을 우리가 강제로 받아들이는 것도 아니고, 내가 주체가 되어 선택하는 세상 속에 살고 있는데 왜 내 눈에 아니꼬우면 미워하고 시기하고 비판하는 걸까?물론, 내가 사람들의 말을 곧이 곧대로 듣고 믿고 따르는 성격이 아니라서 그럴 수도 있다. 사람들은 나를 보고 '말 정말 안 듣는 성격'이라고 한다. 인정한다. 실제로 사람들의 말을 잘 듣지 않고 흥미가 없으면 표정관리도 안되기 때문에 누구나 한눈에 알 수 있다. 하지만 그들이 말하는 것들은 내 머릿속에서 의식적으로든 무의식적으로든 매우 강한 영향을 미쳐왔고 앞으로도 그럴 것이다. 그 모든 선택의 주체에는 내가 있기 때문에 내가 누구를 만나서 무슨 이야기를 들었든 아무 상관없다. 지금의 잣대가 1년 뒤의 잣대와 동일하다는 보장이 없기 때문이다. 작년에 사람들이 내게 해줬던 많은 조언들이 올해의 사업에 얼마나 큰 도움이 되고 있는지 모른다. 그들은 같은 성격의 조언들이 아니라 저마다 다른 말들을 했다. 편식하지 않고 골고루 잘 들어뒀다. 내가 듣고 싶은 말만 들을 생각도 없고 듣기 싫은 말은 안들을 생각도 없었기 때문에 가능했던 것일지도 모른다. 내 기본선택은 '안 듣는다' 였기 때문에, 그에 대한 이익을 지금 보고 있는 것 같다. 그때 도와줬던 분들께는 지금 와서야 감사드리는 마음을 갖고 있다.짧은 인생 살면서도 이렇게 삶에 정답이 없다는 것을 느꼈는데,좀비 멘토 욕하는 분들은 얼마나 진리와 정답에 근접한가?그들의 진정성이 그저 '돈'과 '탐욕'에만 있다고 장담할 수 있나?인류가 전쟁을 멈춘 이유가 무엇이라고 생각하는가? 사람들은 핵이나 전쟁에 대한 공포라고 말하지만, 내 생각은 조금 다르다. 인류가 전쟁을 멈춘 이유는 절대적인 진리의 해체 과정을 겪고 있기 때문에 단순한 선악구도 명제를 통한 폭력성의 발현이 불가능하기 때문이다. 이제 우리는 '공산당은 빨갱이고 제거해야 한다'라는 단순한 명제에 도달할 수 없는 세상에 살고 있다. 이데올로기가 진리가 아니라는 것은 이제 중학생들도 안다. '우리나라'와 '다른 나라'의 경계, 인종의 경계, 언어의 경계 모든 것을 존중하고 받아들이고 있다. 나와 다른 남을 배척하는 세상이 종말을 향해가고 있기 때문에 전쟁이 일어나지 않는 것이다.하지만, 우리의 원시적인 심리적 근간에는 이런 선악구도를 만들고 끊임없이 투쟁하고자 하는 공격성이 담겨있다. 이 공격성은 SNS를 통해 여지없이 발휘되고 있다. 남을 까내리며 자신을 검증하고자 한다. 좀비 멘토에 대한 글을 쓴 사람은 '자신이 좀비 멘토가 아니라는 것', '자신은 뛰어난 멘토라는 것'을 말하는 것과 같다. 진리에 통달한 성인군자임을 계속해서 검증받는 것. 그것이 그들이 말하는'본질'에 조금 더 가깝게 느껴진다. '좀비 멘토', '창업 놀이', '사업 놀이' 모두 남을 까내리고 자신을 검증하고 올라서고 싶은 욕구 또는 남을 까내리고 가르침을 통해 내가 원하는 방향으로 시대를 끌어가고 싶어 하는 본능이 담겨있는 프로파간다라고 보인다. 단어 자체가 그러한 에너지를 담고 있다. 이런 나쁜 말은 쓰지 말아야겠다. 사람들이 착각하는 게, 이런 말들을 쓰는 것이 시대정신이고 용기 있는 행동이라 착각하는데 부정적이고 선악구도의 자극적인 이야기를 쓰고 공유하는 것은 결코 용기 있는 행동이 아니다. SNS에서 그러한 콘텐츠는 충분한 인기를 얻고 강하게 소비된다. 부정적인 이야기가 잘 먹히는 세상이다. 하지만, 우리 인류는 이미 이런 것을 필터링할 수 있는 능력을 배양해왔다. 이렇게 우리가 배양해온 지성의 힘을 본능보다 우위에 두고 진지하게 고민해볼 때다.인류는 이미 단순한 선악구도를 만들어 자신이 선임을 끝없이 인정받고 싶어 하는 원시적 욕구를 넘어설 수 있는 단계에 도달해있다. 인간사회에 정답이 없듯, 사업에도 정답이 없는 것 같다. 정답과 진리를 100% 안다고 생각하는 사람이 있다면 그냥 본인이 창업을 해서 큰돈을 벌어서 우리나라나 부자로 만들어줬으면 좋겠다.마지막으로, 내가 가장 존경하는 지두 크리슈나무르티의 말을 인용하며 글을 마친다.너 스스로를 인디언, 무슬림, 기독교인, 유럽인 등이라 무르는 순간 너는 폭력성을 갖게 된다. 이미, 너 스스로를 인류 그 자체와 분리시켜 생각하고 있기 때문이다. 네가 너 스스로를 믿음 또는 국가, 전통에 의해 인류와 분리하기 시작할 때 폭력성은 고개를 든다. 폭력을 이해하기 시작하는 순간, 너는 어떤 국가에도, 종교에도, 정치적인 이데올로기에도 속하지 않게 될 것이다.오직 인류 그 자체만을 위해 고민하기 시작할 때, 폭력은 완전히 이해되고 사라질 수 있다.ㅡ 지두 크리슈나무르티 
조회수 1108

앱 데이터 분석 시 사용자 세그먼트의 필요성

사용자 세그먼트(USER SEGMENTATION)란? 모바일 분석 툴을 사용하면 앱 사용자에 대한 많은 정보를 얻을 수 있습니다. 하지만 방대한 데이터는 오히려 의사결정에 혼란을 일으킬 수 있어 비즈니스에 의미가 있는 데이터를 선별해서 보는 것이 중요합니다.‘사용자 세그먼트’란 데이터의 필터 기능으로, 1차 데이터를 하위 기준으로 분류해서 보는 것을 의미합니다. 예를 들어, 앱 서비스 사용자들을 성별, 연령, 국가, 플랫폼 별로 나누어서 보는 것도 세그먼트에 해당합니다. 이 기능을 이용하면 ‘우리 사용자는 누구인가?’ 에서 더 나아가, 앱 서비스의 충성고객, 구매고객, 이탈고객 각각의 특성을 파악하고 이에 맞는 비즈니스 전략을 만들 수 있습니다.아래 내용을 통해 앱분석 시 사용자 세그먼트의 방법과 필요성을 알아보겠습니다.사용자 세그먼트 적용하기사용자 세그먼트가 무엇인지 실제 데이터 분석 툴의 예시를 보며 자세히 알아보도록 하겠습니다. 모바일 분석 서비스 와이즈트래커(WISETRACKER)는 기본 세그먼트와 사용자 정의 세그먼트 기능을 제공하고 있습니다.기본 세그먼트기본세그먼트 기능을 통해 플랫폼, 성별, 연령대에 따라 데이터를 분류할 수 있습니다. 비즈니스에 따라 사용자 구분 시 중요한 지표가 있다면, 그것을 기본세그먼트 항목으로 추가하는 것도 가능합니다. 광고채널, 회원여부, 회원등급 등이 이에 해당합니다.[ 와이즈트래커 세그먼트 설정화면 – 필요한 세그먼트를 더블 클릭하거나, 오른쪽 상단의 ‘Drag Here’ 로 세그먼트 항목을 Drop하면 세그먼트가 적용됩니다. 여러가지 세그먼트를 동시에 적용할 수 있습니다 ]아래 데이터는 기본 세그먼트 중 연령대(20대, 30대, 40대) 세그먼트를 이용해 [신규방문 vs 재방문] 리포트 데이터를 하위 분석한 결과입니다.이를 통해 단순히 신규방문/재방문의 수치/비율 뿐 아니라, 각 방문 유형별 연령대 구성을 파악할 수 있습니다. 이 데이터를 통해 처음방문자의 경우, 20대와 30대의 수치가 비슷하게 나타나지만 반복방문자의 경우 30대의 비율이 20대보다 훨씬 높게 나타나, 앱 서비스가 20대보다 30대에게 지속적으로 어필되고 있다는 것을 확인할 수 있습니다.사용자 정의 세그먼트사용자 정의 세그먼트를 통해 기본적으로 제공되는 세그먼트를 조합해 비즈니스에 필요한 맞춤 세그먼트를 설정할 수 있습니다. 예를 들어, 앱 서비스의 주요 고객이 iOS를 사용하는 20~30대 여성이라면 아래와 같이 해당 속성값을 가지는 사용자 정의 세그먼트 ‘iOS_2030_여성’을 생성합니다.위에서 생성한 세그먼트를 위의 [신규방문 vs 재방문] 리포트에 적용하면 아래와 같은 데이터가 나타납니다.이처럼 사용자 정의 세그먼트를 이용하면 앱 사용자를 비즈니스에서 정의한 타겟 고객군과 잠재 고객군으로 분류하여 유의미한 사용자 그룹의 숫자를 파악할 수 있습니다.사용자 세그먼트의 필요성데이터 분석은 분석 자체가 목적이 아니라, 비즈니스의 성장과 목표 달성에 도움이 될 때 의미가 있습니다. 그럼 사용자 세그먼트는 비즈니스의 성장에 어떤 도움을 줄 수 있을까요?1. 의사결정에 필요한 데이터를 선별해 추출할 수 있다. 신규 고객을 위한 이벤트 기획 시, 신규 고객들의 성별, 나이, 플랫폼 등을 세그먼트 기능을 통해 파악할 수 있습니다. 만약, 아래 테이블처럼 신규 고객의 대다수가 20,30대 여성이라면, 이들의 흥미를 끌만한 이벤트를 기획해 이벤트 참여율을 높일 수 있습니다.[ 와이즈트래커 내 처음방문자 방문수 데이터에 연령_성별 사용자정의 세그먼트를 적용한 화면 ]2. 어떤 유저가 우리 비즈니스에 가장 유의미한지 파악할 수 있다. 앱 서비스의 핵심적인 유저는 앱을 주기적으로 방문하고, 구매 빈도/금액이 높은 사용자입니다. 이들의 특성을 세그먼트를 통해 파악하고, 이러한 데이터를 기반으로 해당 사용자들의 충성도와 구매율을 높이기 위한 프로모션을 진행할 수 있습니다.[ 와이즈트래커 내 1회 구매자 방문수 데이터에 여성들의 연령_플랫폼 사용자정의 세그먼트를 적용한 화면 ]3. 오디언스 타겟팅(AUDIENCE TARGETING)에 이용할 수 있다.세그먼트 기능을 통해 파악한 특정 사용자 그룹의 특성을 바탕으로 오디언스 타겟팅을 진행할 수 있습니다. 앱에서 한번도 상품을 구매하지 않은 비구매자 그룹의 특징을 파악했다면, 이를 기반으로 해당 그룹의 ADID/IDFA를 추출해 구매를 유도하는 푸시메시지 또는 광고를 노출할 수 있습니다.[ 와이즈트래커 오디언스 타겟팅 설정화면. 비구매자 그룹의 주요 특징이 회원인 40대 국내 남성이라면 이들의 ADID/IDFA를 추출해 구매를 유도하는 푸시메시지/광고 프로모션을 진행할 수 있다.]비즈니스 성장의 지름길 고객에 대한 이해도가 높을수록 비즈니스는 빠르게 성장합니다. 이 때문에 모바일 비즈니스에서 사용자 세그먼트를 통해 비즈니스 고객군 별 특성을 정확하게 파악하는 것은 선택이 아닌 필수입니다. 모바일 데이터 분석을 이제 시작했다면, 사용자 세그먼트 기능을 통해 데이터에 깊이를 더하고 비즈니스 성장에 핵심적인 데이터를 확인해보세요! * WISETRACKER는 모바일 광고 성과 측정부터 In-app 이용자/컨텐츠 분석, 푸시메시지 최적화까지 지원하는 모바일 통합 분석/타겟팅 솔루션입니다. 와이즈트래커 솔루션의 무료체험을 원하실 경우 여기를 클릭해주세요.* WISETRACKER가 제공하는 무료 데이터 분석 컨설팅를 원하신다면 여기를 클릭해주세요.#와이즈트래커 #앱마케팅 #마케터 #성과분석 #데이터분석 
조회수 1177

테이블을 내 마음대로! 컬럼 추가와 삭제, 테이블 분리

Overview이전까지는 단일 테이블에서 INDEX를 적용하는 효과적인 방법들을 살펴봤습니다. 아직 못 본 개발자를 위해 친절히 링크도 준비했습니다. 이 글을 보기 전에 아래의 글들을 먼저 보는 것이 좋습니다.단일 TABLE을 SELECT하자!: 올바른 SELECT문 작성하기순서대로 척척, ORDER BY: ORDER BY 조건 처리 알아보기원하는 대로 뭉치는 GROUP BY: GROUP BY 조건 처리 알아보기이번 글에서는 테이블에서 컬럼을 추가 또는 삭제하고, 테이블을 분리하는 방법까지 알아보겠습니다.Let’s do it먼저 아래의 컬럼을 추가해봅시다.ALTER TABLE test.TB_MBR_BAS ADD COLUMN AREA_NM    VARCHAR(10)    COMMENT '지역 명'; 그리고 테스트 자료를 넣습니다.UPDATE test.TB_MBR_BAS SET     AREA_NM =         CASE FLOOR(RAND()*15)             WHEN 0    THEN '서울특별시'             WHEN 1    THEN '부산광역시'             WHEN 2    THEN '인천광역시'             WHEN 3    THEN '대전광역시'             WHEN 4    THEN '대구광역시'             WHEN 5    THEN '광주광역시'             WHEN 6    THEN '울산광역시'             WHEN 7    THEN '경기도'             WHEN 8    THEN '강원도'             WHEN 9    THEN '충청남도'             WHEN 10    THEN '충청북도'             WHEN 11    THEN '전라남도'             WHEN 12    THEN '전라북도'             WHEN 13    THEN '경상남도'             WHEN 14    THEN '경상북도'             WHEN 15    THEN '제주도'         END WHERE AREA_NM IS NULL ; 자료를 확인하면 아래와 같이 나옵니다.SELECT     * FROM test.TB_MBR_BAS ; AREA_NM 컬럼을 추가해 지역이 나오도록 했습니다. AREA_NM을 보면 중복되는 지역명이 있습니다. 이럴 때 보통 AREA_NM을 별도의 테이블을 만들어 ID OR 코드를 부여해 처리합니다. 위의 UPDATE 문을 참조하여 ID를 만들면 아래와 같이 만들 수 있습니다.0    : ‘서울특별시’1    : ‘부산광역시’2    : ‘인천광역시’3    : ‘대전광역시’4    : ‘대구광역시’5    : ‘광주광역시’6    : ‘울산광역시’7    : ‘경기도’8    : ‘강원도’9    : ‘충청남도’10    : ‘충청북도’11    : ‘전라남도’12    : ‘전라북도’13    : ‘경상남도’14    : ‘경상북도’15    : ‘제주도’먼저 AREA_NM과 ID를 다룰 테이블을 만들겠습니다.CREATE TABLE test.TB_AREA_BAS  (     AREA_ID        TINYINT UNSIGNED NOT NULL    COMMENT '지역 아이디 '     ,AREA_NM     VARCHAR(10)             NOT NULL    COMMENT '지역 명'     ,PRIMARY KEY (AREA_ID)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='TB 지역 기본' ; 테이블을 만들었으면 자료를 넣어줍니다. INSERT INTO test.TB_AREA_BAS  (     AREA_ID      ,AREA_NM  ) VALUES (0,'서울특별시')  ,(1,'부산광역시')  ,(2,'인천광역시')  ,(3,'대전광역시')  ,(4,'대구광역시')  ,(5,'광주광역시')  ,(6,'울산광역시')  ,(7,'경기도')  ,(8,'강원도')  ,(9,'충청남도')  ,(10,'충청북도')  ,(11,'전라남도')  ,(12,'전라북도')  ,(13,'경상남도')  ,(14,'경상북도')  ,(15,'제주도')  ; 자료를 확인하면 아래와 같이 나옵니다.SELECT     * FROM test.TB_AREA_BAS ; 테이블을 만들었다면 test.TB_MBR_BAS 테이블에 AREA_ID 를 추가하여 자료를 넣은 후 AREA_NM 컬럼을 삭제하면 됩니다.이제 AREA_ID를 추가합니다.ALTER TABLE test.TB_MBR_BAS ADD COLUMN AREA_ID TINYINT UNSIGNED NOT NULL COMMENT '지역 아이디'; AREA_NM을 참조하여 AREA_ID를 넣습니다.UPDATE test.TB_MBR_BAS SET     AREA_ID =         CASE AREA_NM             WHEN '서울특별시'    THEN 0             WHEN '부산광역시'    THEN 1             WHEN '인천광역시'    THEN 2             WHEN '대전광역시'    THEN 3             WHEN '대구광역시'    THEN 4             WHEN '광주광역시'    THEN 5             WHEN '울산광역시'    THEN 6             WHEN '경기도'    THEN 7             WHEN '강원도'    THEN 8             WHEN '충청남도'    THEN 9             WHEN '충청북도'    THEN 10             WHEN '전라남도'    THEN 11             WHEN '전라북도'    THEN 12             WHEN '경상남도'    THEN 13             WHEN '경상북도'    THEN 14             WHEN '제주도'    THEN 15         END ; 자료를 확인하면 아래와 같이 나오는데요.SELECT     * FROM test.TB_MBR_BAS ; 최종적으로 AREA_NM 컬럼을 삭제합시다.ALTER TABLE test.TB_MBR_BAS DROP COLUMN AREA_NM; 삭제했다면 자료를 확인해봅시다.SELECT     * FROM test.TB_MBR_BAS ; 이제 두 개의 테이블을 연결해서 조회해보겠습니다. JOIN을 사용하면 되고, Quey 문은 아래와 같습니다.SELECT     T101.MBR_ID      ,T101.MBR_INDFY_NO      ,T101.MBR_NM      ,T101.AGE      ,T101.AREA_ID      ,T102.AREA_NM FROM test.TB_MBR_BAS T101      INNER JOIN test.TB_AREA_BAS T102          ON T102.AREA_ID = T101.AREA_ID  ; 정리하며위에서 보여드린 예시는 두 가지 다른 점이 있습니다. 첫째는 TABLE 뒤에 T101, T101 과 같은 얼라이스를 준 것, 둘째는 INNER JOIN 문장이 들어간 것입니다.만약 테이블이 2개 이상이라면 사용할 테이블 컬럼을 써야 하는데 테이블명을 그대로 쓴다면 너무 길어집니다. 그래서 얼라이스로 테이블을 간단하게 표시하는 것이죠.INNER JOIN은 JOIN 중 가장 기본이 되는 문장입니다. 플랜을 보면 T101 즉 test.TB_MBR_BAS를 차례대로 전부 읽는데, 그때마다 T102인 test.TB_AREA_BAS 를 AREA_ID 를 기준으로 값을 읽습니다. T101에 해당하는 내용과 T102에 해당하는 내용을 보여주는 것이죠. 저는 Database를 쓰는 이유가 바로 JOIN 때문이라고 생각하는데요. 여러분의 생각은 어떤가요. 조금 헷갈린다면 다음에는 JOIN에 대해서 알아보도록 하겠습니다. (자연스러운 결말..!)글한석종 부장 | R&D 데이터팀[email protected]브랜디, 오직 예쁜 옷만#브랜디 #개발문화 #개발팀 #업무환경 #인사이트 #경험공유
조회수 5773

개발자가 되고픈 어린 친구들에게...

정말 즐겁고, 재미있어서 시작한 소프트웨어 개발. 하지만,  그렇게 재미있게 시작한 소프트웨어 개발과 관련된 활동이 일이 되는 순간. 가장 ‘지루하고 재미없는 일’이 될 수 있다는 것에 대해서 아는가?대부분의 소프트웨어 개발업(?)이라는 것이 정말 재미없고 지루할 수 있다는 것에 대해서 아는가?필자도 처음 컴퓨터를 국민학교(요즘 초등학교) 6학년 때부터 만지작거리면서 품었던 오래된 꿈은 ‘소프트웨어 개발’을 하면서도 생계를 유지할 수 있기를 바랐다. 이렇게 재미있는 세계에만 빠져서 살게 해 달라고 간절히 기도하면서, 프로의 세계에 들어왔다.물론, 재미있고 즐거운 일도 많았다. 밤을 새워가며 목표로 한 애플리케이션을 디자인하고 설계하고 구현하고 테스트하는 즐거운 삶이 이어졌다. 규모가 커지고, 프로젝트 리딩을 해보고, 정말 내가 만들고 싶은 소프트웨어를 만들기 위해서 사업이라는 것도 해봤다.사업을 홀라당 날려먹고, 막장이라고 불리는 SI현장에도 들어가 봤다. 역시, 대한민국의 SI현장은 녹녹한 곳이 아니었다. 그나마, 플랫폼을 만들고, 기술지원을 하는 팀에 들어갔음에도 불구하고, SI는 상상 이상의 모습들을 경험하게 했다.그때의 경험을 간접적으로 느껴보기 위해서는 다음의 3권의 책을 추천한다. 여유가 난다면 한 번쯤 읽어 보기 바란다. SI현장이나 기업의 소프트웨어가 망가지는 모습은 두 번째 책에 너덜하게 많이 묘사돼있다.소프트웨어 아키텍트가 알아야 할 97가지소프트웨어 누가 이렇게 개떡같이 만드는 거야?위대한 게임의 탄생재미있는 책이고, 재미있는 소프트웨어 개발 세상에 대해서 이야기를 하는 내용을 언급하고 있는 내용이다.‘소프트웨어 아키텍트가 알아야 할 97가지’는 40여 명의 경험이 풍부한 소프트웨어 아키텍트들이 소프트웨어를 개발하면서 느끼게 한 소프트웨어 아키텍처에 대한 자신의 생각과 충고에 대한 글들을 모아두었다. 재미있는 소프트웨어 개발과 자신의 기술적인 요소를 어떻게 적극적으로 활용하는 방법, 능력 있는 팀을 만드는 방법까지 능수능란하게 중요한 원칙들에 대해서 위트 있는 소재로 언급한 내용들이 서술되어 있다. 이 책은 소프트웨어 아키텍트에 도달한 달인들이 자신들의 생각과 경험을 통해서, 소프트웨어 개발의 밝은 측면을 보여준 것이라면.두 번째 ‘소프트웨어 누가 이렇게 개떡같이 만드는 거야?’라는 책은, 엄청난 비용과 시간을 투자하여 만든 보안시스템이 보안담당자에게 걸려온 전화 한 통에 의해서 무력화되는 어이없는 상황에 대해서 여과 없이 보여준다.세 번째 ‘위대한 게임의 탄생’이라는 책은, ‘유저를 행복하게 해줄 수 있는 게임은 불행한 개발자에게서 나오지 않는다’라는 말처럼, 1편과 2편의 매우 재미있고, 흥미로운 게임 개발의 세계에 대해서 보여주고 있다.1편은 주로 해외 게임들, 2편은 국내 게임 개발과 관련된 내용들로 재미있게 구성되어 있는데. 개인적으로 2편이 더 재미있고 흥미로웠다. 소프트웨어라는 것이 소프트웨어 개발자들 이외의 세계와 연결되어진 통로와 실제 생활들을 적나라하게 보여주는 아주 극과 극을 달리는 중요한 세 개의 서적이 되겠다. 전문가의 입장, 황당한 현실, 그리고. 멋진 개발의 모습.. 이 3권이면 소프트웨어 개발의 전체를 간단하게나마 소개할 수 있다고 본다.하지만, 실제, 현실의 소프트웨어 개발은 참으로 아주 지루하고 재미없고, 기계적인 반복 작업의 연속이다.재미있는 흥미요소들을 모두 제외하고, 무미건조한 프로세스로만 살펴보자. 그렇다면, 이런 재미없고, 반복적인 실제 소프트웨어 개발을 하는 방법과 절차만 남게 된다.소프트웨어 개발과정을  도식화하면 위의 그림과 같다. ‘정해진 명세’에 따라서, ‘지시된 설계’를 만들고, ‘구현’하고 ‘테스트’를 하는 과정을 무한 반복하는 것이 소프트웨어 개발을 포장 없이 표현한 것이다. 실제, 소프트웨어 개발의 환경은 이렇게 ‘무의미한 작업’의 계속된 반복 인지도 모른다.( 정말 재미요소를 빼면 그렇다. )필자도 ‘기업용 애플리케이션’을  만드는 데 있어서 이런 단순 반복적인 공정을 통하여 만들어진 산출물이 가장 효과적이라는 것에 대해서 부인하지 않는다. 대부분의 기업용 애플리케이션은 다양성과 창의성은 필요 없고, 구체적이고 확실한 결과물만을 원하는 경우가 많다.실제 그 도메인과 업무의 매력이 충분하게 느껴지지 않는다면, 소프트웨어 개발은 정말 지루하고 재미없는 일이 된다. 학생들이 소프트웨어 개발에 대해서 착각하는 여러 가지 이유 중의 하나가, 소프트웨어 개발은 정말 ‘창의적인’것을 요구하는 것이 많을 것 같다고 착각하는 것이다. ( 대부분의 국내 소프트웨어 개발은 ‘창의적인’것은 그다지 필요 없다. )물론, 사용자에 대한 고려, UX, 서비스의 풍부함을 연구하고 이를 구현하여 서비스를 자유롭게 발전시키는 식의 개발이 가능한 곳도 있으며, 이러한 환경에서 프로그래밍을 구사하고, 그것을 표현하는 일을 하는 사람들도 없는 것은 아니다. 하지만, 과연 그러한 일을 하는 사람이 얼마나 될 것인가? 특히, 대한민국에서?!!!새롭게 시작하는 후배들이여, 구로 디지털단지에서 오전에 출근하는 개발자들과 오후에 퇴근하는 개발자들을 전철역에 서서 바라보아라. 얼마나 척박한 개발자의 삶을 살고 있는지 생각해보라는 것이다.언제부턴가, 소프트웨어 개발자들의 전통적인 개발자 커뮤니티는 쇠퇴하기 시작했다. 과거에는 소프트웨어 개발자 커뮤니티를 보지 않고,  바라다보지 않고 있으면, 개발일을 못하던 시대가 있었다. 물론, 아직도 그러한 개발자 사회가 있기는 하다. 자바 개발자 커뮤니티는 여전히 튼실한 사용자 커뮤니티를 유지하고 있으나, 그밖에 커뮤니티들은 대부분 과거의 영광들을 모두 잊어버렸다.더 심각한 것은 ‘현재의 개발자들은 기술을 공유하고, 자신의 생각을 토론할 수 있을 만큼의 여유가 사라졌다는 점’이다. 지금, 구로디지털단지역에서 내리고 오르는 개발자들이 출퇴근 시간에 스마트폰을 가지고도 개발자 커뮤니티에 글을 올리거나 접속할 마음의 여유가 사라졌다는 것이 가장 슬픈지도 모르겠다. 물론, 이러한 개발자 커뮤니티에 의존하지 않더라도, 쉽게 정보를 찾을 수 있는 시대가 된 것도 또 하나의 원인인지 모르겠다. 하지만, 현재에도 매우 활성화된 개발자 커뮤니티들이 존재하고 있고, 왕성하게 활동한다. 그러한 왕성한 활동을 보이는 조직의 공통점이 몇 가지 있다.그것은 ‘신입/초보’에 대한 배려를 잊지 않고 있는 곳이다. 물론, 이러한 개념을 확대하면, 초보 사원들에 대한 ‘배려’를 잊지 않는 소프트웨어 개발자 기업이 최고의 기업이라 할 수 있겠다.잉여 개발과 독립 개발을 꿈꾸는 사람들이 스타트업을 시작하는 시대가 됐다.정말 개발일을 즐기고 싶다면, 차라리. 직업적인 프로그래머가 되지 않는 것이 방법이기도 하다. 아예, 독립 개발과 잉여 개발을 취미로 시작하면서, 자신의 독자적인 설루션을 찾거나 만드는 방법도 최고의 방법이다.굳이, 소프트웨어 개발을 회사에 입사해서 직업적인 관점에서 접근하는 것만이 최선의 시대가 되지 않았나 한다. 요 근래 뛰어난 개발자들을 보면, 전공을 소프트웨어 관련으로 공부하지 않고서도 전문가의 경지에 이른 사람들이 더 많아졌다.아이러니하게도 융합의 시대에 타 도매 임의 전문적인 지식을 가지고 소프트웨어 기술을 효과적으로 활용할 줄 아는 인재가 최고의 인재로 대우받는 시대가 된 것 아닌가 하다. ( 실제 필자의 주변에도 의사, 수의사 등 다른 전공을 했지만, 최고의 소프트웨어 엔지니어가 된 사람들이 부지기수이다. )이제, 각자 창업을 하거나, 개별적으로 자기가 하고 싶은 일이나 설루션, 서비스를 각자 알아서 개발하더라도, 이를 충분하게 홍보하고, 주변에서 활용할 수 있게 하는 다양한 서비스들이 매우 많이 생겨났다. 그래서, 소프트웨어 개발을 굳이 회사에 입사해서 할 필요가 없어진 것도 사실이다. 하지만, 소프트웨어 개발자가 되는 것과 창업을 하는 것은 완전 다른 영역이다.요리사가 요리만을 잘한다고 전문 레스토랑을 오픈하고 손님을 맞이할 수 있을까? 절대 그렇지 않다. 요리와 전문 레스토랑 경영은 사실상 다른 영역이고, 실제 산업계에 들어가 보더라도, 전문 경영인의 세계와 전문 요리의 세계는 완전하게 구분되어있다.물론, 드라마나 영화에서처럼 둘 다 잘하는 천재들이 실제 세계에도 가끔 존재하기는 하나, 말 그대로 그것은 소수의 타고난 천재들만 가능하다. ( 뭐, 실제 보면.. 정말 대단한 사람들을 볼 수 있다. )대부분의 요리사들처럼, 개발자들도 경영에는 빵점이거나 소질이 없는 경우가 많다. 창업의 세계는 완전하게 별개의 영역이므로, 나중에 다시 한번 소프트웨어 개발과 창업에 대해서 언급할 때에 따로 이야기를 하도록 해보자.소프트웨어 개발만 하고 싶어요. 학교 공부는 좀 적게 할 방법이 없나요?소프트웨어 개발을 하는 사람이, 글을 잘 쓰거나, 그림을 잘 보거나 이해하는 것들의 주변적인 지식이 필요 없을까? 아니다. 소프트웨어 개발을 제대로 멋지게 하려면 그러한 인문적인 지식이 오히려 남들과 다를 정도로 탁월하고 상식 또한 시야가 매우 넓어야 한다.필자가 아는 뛰어난 소프트웨어 개발자들 대부분이 특정 분야에서는 매니악을 넘어선 오타쿠 수준이고, 독서능력과 수학적인 능력, 거기에 어학적인 능력까지 탁월한 소프트웨어 개발자들이 더 멋지게 성장하는 모습을 많이 보아왔다. 오히려, 10대 때에 미치도록 다른 분야에서 탁월한 성과나 효과적인 지식들을 습득한 사람들이 더 뛰어난 개발자가 되는 것을 많이 보게 된 것이다. 그것은, 자신의 재능과 지식을 소프트웨어 개발이라는 매우 기능적인 것으로 통합한 것이기 때문이다. 소프트웨어 기술은 이렇게 ‘지식’과 ‘정보’를 자유롭게 다루는 기술이다. 그래서, ‘지식’과 ‘정보’가 없이는 아무리 뛰어난 소프트웨어 기술도 못 없는 망치일 뿐이다.하드웨어 개발도 결국, 소프트웨어 파워가 중요하다.SSD의 핵심은 낸드 플래시 메모리이다. 그리고, 그 낸드 플래시 메모리의 저장방법은 조금은 복잡하지만 쉽게 설명하면, 플로팅 게이트라 불리는 메모리 셀 구조에 있어서 전압을 가해서 전압이 낮으면 1, 전압이 높으면 0으로 할당하여 저장하는 방법이다. 전압을 상승하고 내려서 0, 1을 쓰는 방법을 사용해서 데이터를 저장한다. 그리고, 그 사이에 ‘절연막’을 통과하는데, 이 ‘절연막’이 손상되어지면 더 이상 쓰기 기능이 작동하지 않으므로, SSD의 수명이 종료되는 방법이다. ( 아주 자세한 내용을 정말 ~~ 간단하게 줄인 것이다. )현재는, 이 0, 1의 전압을 좀 더 세분화하여 3단계로 구분하는 방법까지 개발되었고, 이렇게  세분화하다 보니, 쓰기를  한 번 더 하는 방법을 통하여 유지하는 방법까지 개발되어서 2013년도 이후에는 좀 더 용량은 커지지만, 속도는 조금 떨어지는 방식의 SSD도 출시되었다.이러한, SSD의 핵심 또한 소프트웨어라고 볼 수 있다. 똑같은 하드웨어의 구조를 어떻게 소프트웨어로 구사하느냐가 그 절대적인 용량이나 속도를 비약적으로 증대시킬 수 있다.정말로 소프트웨어 공학적인 요소와 품질요소를 중요시 여기는 고품질의 영역이 필요한 항공기나 원전과 같은 곳의 중요한 컨트롤 소프트웨어들의 역할은 한두 줄로 설명할 수 있는 내용의 것들이 아니다. 말 그대로, 소프트웨어가 거의 전부나 다름없다.자동차도 이제는 거대한 소프트웨어 덩어리에 속한다. 소프트웨어 파워는 정말 대단하다.소프트웨어 개발자를 꿈꾸는 부모님들에게 한마디 하자면...필자도 대학교 2학년 큰아들 녀석을 둔 아이의 아빠입니다. 개인적으로는 소프트웨어 개발자가 되었으면 바람도 있고, 그 녀석의 어머니도 마찬가지 바람이었습니다. 정말, 소프트웨어 개발자의 미래가 충분하게 희망적이기 때문이죠.하지만, 큰아들 녀석은 '문예창작학과'로 진학했습니다. 프로그래머인 아빠에게는 큰 영향을 받지 않았나 봅니다. 하지만, 이렇게 글을 쓰는 아빠의 모습이 일부 영향을 주지 않았나 합니다.아이가 커가면서 프로그래머가 되라고 강요는 하지 않았습니다. 다만, 초등학교 시절에 정보처리 기능사 시험을 볼 정도로 개인적으로 가르치기는 했습니다. 처음에 정보처리 기능사 시험을 패스할 정도로 열의를 보이는 모습을 보여서 어린 녀석이 행렬을 풀어내는 것이 너무 좋았지만, 그 녀석이 나이를 먹고 나서 다시 물어보니.아빠랑 대화하고 같이 무언가를 하는 것 때문에 하는  척했다고 하더군요. 아빠의 과도한 욕심 맞습니다. 그래서, 요즘은 자기가 좋아하는 일을 하면서 살았으면 좋겠다는 생각을 하고 있습니다. 멋진 작가가 되기를 바랍니다.부모 된 입장으로써 아이가 ‘행복’하기를 바란다는 것은, 타인에게 존중과 인정을 받는 삶을 만들어주는 것이라고 생각합니다. 물론, 돈도 어느 정도 필요한 일이겠지만요. 부모 된 입장으로써 아이에게 조언을 해주는 것은 포기하면  안 됩니다. 최소한, 아이가 행복하게 어떤 일을 선택할 수 있게 하는 것 까지는 해줘야 할 것이라고 생각합니다.분명, 대한민국 IT의 불합리한 글과 미래에 대한 수많은 이야기들이 주변에 많이 이야기되고 있는 것은 알고 있습니다. 하지만, 이미 전 세계적으로 소프트웨어 개발자는 최고의 직업이며, 앞으로도 더욱더 중요한 역할을 담당할 것으로 믿어 의심치 않고 있습니다.이미, IT기술은 모든 비즈니스의 중심적인 역할을 담당하고 있고, 빅데이터라는 새로운 개념은 비즈니스의 기회까지도 IT를 통해서 만들어 나간다고 할 정도로, 소프트웨어의 세계는 매우 미래지향적인 직업입니다.다만, 대한민국의 대부분의 소프트웨어 개발자들의 2/3 정도는 일반적이고 ‘따분하고’, ‘지루한’, 기업용 소프트웨어를 개발하는 직업에 종사하고 있습니다. 하지만, 이런 일은 계속 줄어들 것이며, 향후 정말 자동화되거나 패키지 시장으로 진입하는 시대가 올 것입니다. 냉정하게 꿈꾸는 자가 이야기하자면, ‘SI 서비스업’은 결코, 우리가 이야기하는 IT나 소프트웨어 개발자들을 표현할 수 있는 세계가 아닙니다. 말 그대로 ‘인력 중심의 서비스업’ 일 뿐이죠.과거의 전산화 소프트웨어들이 단지 효율성을 높이기 위한 도구였다면, 현재의 소프트웨어들은 인간의 삶과 질을 향상하기 위한 소프트웨어들로 발전하고 있다는 것을 말하고 싶다는 점입니다.제대로 된 소프트웨어 개발자가 되려면 무엇을 공부해야 하는가?최소한 제 주변에 있는 고급 개발자들이 동의하는 첫 번째는 바로 ‘소프트웨어 이론’이 정립되어진 사람입니다. 자료구조라고 이야기하는 소프트웨어와 관련된 기초이론이 튼튼해야 한다는 것이 그 첫 번째 일 것입니다. 아무리 빠르게 변하는 소프트웨어의 세계이지만, 기본적인 기초이론은 아마도, 변하지 않을 것입니다.둘째는 오픈소스와 같은 개발 커뮤니티에서 공동으로 꿈을 꾸는 그 무언가를 한번 만들어 보는 것입니다. 이는, 적극적으로 무언가를 위해서 자신의 시간을 투자하고 ‘잉여’를 제대로 활용할 줄 아는 사람으로 변화하게 합니다. 적극적인 자신의 모습이 변화되는 모습을 느끼게  될 것입니다.마지막 세 번째는 폭넓은 상식과 인문학적인 개념입니다. 이제, 소프트웨어는 사람과 사람을 이해하지 못하면, 제대로 그 무언가, 어떤 서비스를 제대로 구현하지 못하는 시대가 되었습니다. 이제는, 세상의 새로운 가치를 창출하거나, 사람들이 즐거워할 그 무언가를 위해서 자신의 ‘잉여’를 풀 줄 아는 사람이 최고의 인재로 대우받는 세상입니다.특히, 마지막 세 번째는 이제 막 중/고등학교를 다니거나, 소프트웨어 개발에 눈을 뜬 어린 개발자들에게 꼭 하고 싶은 말이기도 합니다. 이제, 소프트웨어 개발은 ‘인문학’적인 소양이 없으면, 더욱 성장할 수 없는 시대가 되었고, 필자가 예전에 꿈꾸었던 소프트웨어 개발을 꿈꾸던 시대와는 조금은 다른 세상이 된 것입니다.필자가 소프트웨어 개발을 꿈꾸던 시대에는 인문학적인 소양이 없어도, 오로지 컴퓨터 소프트웨어 언어만 익숙하면, 소프트웨어 개발이 가능한 정말 낭만적인 시대였습니다. 왜냐하면, 당시의 소프트웨어 개발의 대부분은 지루하고 재미없는 기업용 소프트웨어의 개발이 대부분이던 시대였으니까요.하지만, 현재는 그렇지 않습니다. 개발은 쉬워지고, 더 다양한 디바이스와 커넥티드 되는 센서 기술들도 우리 주변의 사물들과 소통하는 시대가 되었습니다. 물건과 정보, 가치들을 제대로 이해해야만 소프트웨어를 정말 잘 만들 수 있는 시대가 된 것입니다.그래서, 현재의 어린 개발자분들은 좀 더, 인문학적인 소양도 같이 끌어올려야만, 제대로 된 소프트웨어 개발이 가능할 것입니다. 물론, 여기서 이야기하는 '인문학적'인 내용이란 인간, 사회, 제도, 법, 윤리 등을 이야기하는 것입니다. 모두, 학교에서 기본적인 것들을 가르치고 있죠.그리고, 회사와 동아리의 차이점에 대해서 알아야 합니다.소프트웨어 개발자들의 세계는 생각보다 오픈되어 있을 것 같지만, 실제 사회에 들어와 보면, 그렇지 않다는 것을 처음 느끼는 순간 매우 큰 좌절에 빠지기도 한다. 안타깝지만. 회사 동료들 사이에서는 적절한 거리를 유지하는 것을 배워야 하는 것을 알아야 한다.학교 때의 동아리의 선배처럼 인정으로 이끌어주는 환상은 말 그대로 환상일 뿐이다. 회사라는 조직에서는 ‘이윤추구’라는  절체절명의 명제를 실현해야 하기 때문에, 다른 사람의 아이디어나 성과를 집어삼키는 경우는 너무도 많다, 아니. 거의 대부분이라고 해야 맞을 것이다.물론, 그런 식의 아귀다툼과 같은 회사는 잘 발전도 못하고, 비전도 없는 회사가 되기 때문에 만일 그러한 회사에 승선(?)한다고 하면, 빨리... 그 배를 버리는 것이 아주 현명할 것이다. 대부분의 국내의 기업에서는 내가 가진 스킬과 리소스를 오픈하지 않고 꽁꽁 숨겨두는 스킬을 발휘해야 하는 회사에 가야 할 것인지도 모른다. 그리고, 개발자 직업이 가지고 있는 고충에 대해서도 심도 있게 고민해야 합니다.이제는 평생직장이 아니라, 평생 직업만이 존재하는 세상이 되었다는 것, 정말로, 사람들이 바라는 자유로우면서도 돈을 많이 주는 자리는 존재하지 않는다는 것이다.개발자! 소프트웨어 개발자!나이 40을 넘겨보니, 소프트웨어 개발 이외에도 정말 많은 것을 공부하고, 알게 되었을 때에 더 깊고 재미있는 세계를 알게 한 것이 소프트웨어 개발의 세계였다는 생각을 해본다. 보통 소프트웨어 개발에 눈을 뜬 젊고도 어린 개발자들은 특정 전문적인 분야나 스킬에 집중해서 그 부분만을 미친 듯이 파고드는 경향이 간혹 있다. 물론, 필자도 그런 경향이었다.정말 즐겁게 이 소프트웨어 개발일을 하고 싶다면, 폭넓은 시야와 지식을 갖추는 것이 최선이며 최고의 길이라는 것을 깨닫기까지는 20년이라는 세월이 훌쩍 지났는지도 모르겠다. 그리고, 아무리 한 분야만 집중하는 개발자라고 하더라도 몇 가지 경험을 꼭 해봤으면 좋겠다.하나. 전문화된 영역이 아니라 전체 영역으로 소프트웨어 개발을 살펴볼 수 있는 틀이 갖추어진 정형화된 기업( 보통, 큰 기업에서 이런 현상을 대부분 가진다. )보다는 아직, 그 틀이 많이 갖추어지지 않은 기업에서 자신의 역량으로 그 틈을 메워보려 하는 것.둘. 신입 때에 100만 원의 급여를 따라다니다 보면, 냉정하게 10년 20년 후에 1천만 원 이상의 손해를 보는 것이 신입 때의 잘못된 선택이다. 언제나, 자신을 대우해주고, 자신을 존중해주는 기업을 찾으라는 것이다.셋. 소프트웨어 개발자는 게으르다. 그래서, 언제나 자동화를 하려 한다. 하지만, 이러한 자동화라는 측면은 사람의 능력을 확장시키는 자동화라고 생각한다. 계속적으로 발전 가능성이 있는 자동화이지, 사람을  기계화시키는 자동화라는 개념이 아니라는 것이다.넷. 행복을 찾으라는 것이다. 아무리, 소프트웨어 개발이 좋다고 하더라도, 가족. 사람만 하겠느냐는 것이다. 우리가 아무리 ‘돈’을 받고 무언가를 만들어주는 ‘공돌이’의 역할만을 한다고 하더라도. 나의 행복과 타인의 행복, 그리고. 내가 만든 소프트웨어를 통해서 사람들이 행복을 얻을 수 있게 하는 것이.. 소프트웨어 개발자로서의 최고의 행복이 아닐까? 개인적으로 ‘게임’ 업체에 있는 친구에게 가끔 하는 이야기가 그것이다. ‘마약’ 장수가 되지 말고, ‘즐거움’을 줄 수 있는 게임을 만들라고 이야기한다. 필자도, 과거에 작은 실수로 ‘온라인 포커 게임’과 같은 소프트웨어를 만들라고 지시한 적이 있다. 다, 무식함(!) 때문이다.소프트웨어 개발자는 ‘즐거움’은 만들어도, ‘마약 장수’가 되면  안 된다.세상이 자본주의가 극단적으로 변해가고, ‘돈’을 선택할  수밖에 없는 삶을 살아가야 한다고 하지만, 내가 만드는 소프트웨어가 그런 억압의 수단이거나 ‘불법’적인 수단이 되는 것은 피해야 하지 않을까?아무 생각 없이 온라인 도박 사이트를 만들고, 마약과도 같은 불법적인 소프트웨어를 만드는 소프트웨어 개발자들이 후배들 중에는 생겨나지 않기를 바란다. 물론, 우리가 만들고 있는 소프트웨어는 자본주의를 가속화한다는 것은 이미 어쩔 수 없는 일이라고 하지만, 소프트웨어 개발자들은 잊어서는 안된다. 우리는 언제나 사람을 생각하고, 사람을 지향하는 소프트웨어를 만들고 있음을.그리고, 내가 행복한 만큼, 다른 사람도 행복할 수 있는 소프트웨어를 만드는 것만이 진정한 소프트웨어 개발자가 되는 한걸음 한걸음 아닐까?마지막으로, 꿈꾸는 자가 ‘인재를 구 할 때에 사용하는 말’로 끝맺음을 하겠다.‘소프트웨어 개발에 있어 '창의력'을 만들기 위해서는, 적절한 '잉여'가 필요하다고 생각합니다. 그리고, 적절한 보상과 비전이 같이 있어야죠. 프로젝트에 헌신한다는 것은 매우 어려운 일이니까요. 대부분의 소프트웨어 개발은 계획대로 되는 것이 아니라는 것을 잘 알 수 있습니다. 소프트웨어 개발자의 최고의 인재상은 잉여를 부여하면, 무언가를 도전할 수 있는 생각을 가진 사람입니다. 소프트웨어 개발은 그런 잉여를 바탕으로 완성되는 것이라고 생각하니까요.이 글을 읽는 당신께서 소프트웨어 기술도 있고, 성격까지 좋은 사람이라면 정말 좋겠습니다. 만일 그러신 분이 소프트웨어 개발자로 성장하신다면 그에 대한 충분한 보상을 다짐할 수 있는 조직이나 단체, 회사는 손쉽게 찾으실 것입니다. 정말입니다.그리고, 소프트웨어 개발회사가 꿈꾸는 인재는 그렇습니다. 가끔은 푸른 하늘을 보러 농땡이 치러가자고 팀장을 꼬드기는 그런 재미있는 동료들이 있는 그런 곳이면 좋겠습니다. 아무리, 소프트웨어 개발이 좋다고 하더라도. 푸른 하늘만 할까요? 그런 마음의 여유가 넘치는 소프트웨어 개발자가 되시고, 그런 회사와 조직을 만드십시오.소프트웨어 개발을 통해서 맹목적인 목표나 아주 거창한 세계 정복 계획은 세우지 않고 있지만, 재미있고. 인간사회에 도움이 되는 그런 서비스를 개발하고 싶어서 모인 집단(?)을 찾으십시오. 그런 사람들과 무언가 끄적거리며 도전해보실 그런 뜨끈한 마음을 가진 개발자를 이 늘었으면 좋겠습니다.충분한 능력에 어울리는 대우를 받는 시대, 그것이 소프트웨어 개발자의 미래입니다. 약속합니다. 뭐, 가끔은 팀워크가 좀 불성실해도, 내가 맡은 일은 책임질 수 있는 자신감이 있는, 비딱한 개발자도 좋습니다. 능력 없는 것보다는 성격이 약간 불완전한 것도 그 사람의 개성이니까요. 우리 모두 그런 소프트웨어 개발자가 되어서 실무에서 일하면서 만나면 웃음 한번 지을 수 있는 사람들이 되었으면 합니다.
조회수 3171

Apache Spark에서 컬럼 기반 저장 포맷 Parquet(파케이) 제대로 활용하기 - VCNC Engineering Blog

VCNC에서는 데이터 분석을 위해 다양한 로그를 수집, 처리하는데 대부분은 JSON 형식의 로그 파일을 그대로 압축하여 저장해두고 Apache Spark으로 처리하고 있었습니다. 이렇게 Raw data를 바로 처리하는 방식은 ETL을 통해 데이터를 전처리하여 두는 방식과 비교하면 데이터 관리비용에서 큰 장점이 있지만, 매번 불필요하게 많은 양의 데이터를 읽어들여 처리해야 하는 아쉬움도 있었습니다.이러한 아쉬움을 해결하기 위해 여러 논의 중 데이터 저장 포맷을 Parquet로 바꿔보면 여러가지 장점이 있겠다는 의견이 나왔고, 마침 Spark에서 Parquet를 잘 지원하기 때문에 저장 포맷 변경 작업을 하게 되었습니다. 결론부터 말하자면 74%의 저장 용량 이득, 10~30배의 처리 성능 이득을 얻었고 성공적인 작업이라고 평가하지만 그 과정은 간단하지만은 않았습니다. 그 과정과 이를 통해 깨달은 점을 이 글을 통해 공유해 봅니다.Parquet(파케이)에 대해Parquet(파케이)는 나무조각을 붙여넣은 마룻바닥이라는 뜻을 가지고 있습니다. 데이터를 나무조각처럼 차곡차곡 정리해서 저장한다는 의도로 지은 이름이 아닐까 생각합니다.Parquet을 구글에서 검색하면 이와 같은 마룻바닥 사진들이 많이 나옵니다.빅데이터 처리는 보통 많은 시간과 비용이 들어가므로 압축률을 높이거나, 데이터를 효율적으로 정리해서 처리하는 데이터의 크기를 1/2 혹은 1/3로 줄일 수 있다면 이는 매우 큰 이득입니다. 데이터를 이렇게 극적으로 줄일 수 있는 아이디어 중 하나가 컬럼 기반 포맷입니다. 컬럼 기반 포맷은 같은 종류의 데이터가 모여있으므로 압축률이 더 높고, 일부 컬럼만 읽어 들일 수 있어 처리량을 줄일 수 있습니다.https://www.slideshare.net/larsgeorge/parquet-data-io-philadelphia-2013Parquet(파케이)는 하둡 생태계의 어느 프로젝트에서나 사용할 수 있는 효율적인 컬럼 기반 스토리지를 표방하고 있습니다. Twitter의 “Julien Le Dem” 와 Impala 프로젝트 Lead였던 Cloudera의 “Nong Li”가 힘을 합쳐 개발한 프로젝트로 현재는 많은 프로젝트에서 Parquet를 지원하고 컬럼 기반 포맷의 업계 표준에 가깝습니다.Parquet를 적용해보니 Apache Spark에서는, 그리고 수많은 하둡 생태계의 프로젝트들에서는 Parquet를 잘 지원합니다.val data = spark.read.parquet("PATH") data.write.parquet("PATH") Spark에서는 이런 식으로 손쉽게 parquet 파일을 읽고, 쓸 수가 있습니다. 데이터를 분석하기 전에 원본이라고 할 수 있는 gzipped text json을 읽어서 Parquet 로 저장해두고 (gzipped json은 S3에서 glacier로 이동시켜버리고), 이후에는 Parquet에서 데이터를 읽어서 처리하는 것 만으로도 저장용량과 I/O 면에서 어느 정도의 이득을 얻을 수 있었습니다. 하지만 테스트 결과 저장용량에서의 이득이 gz 23 GB 에서 Parquet 18GB 로 1/3 정도의 저장용량을 기대했던 만큼의 개선이 이루어지지는 않았습니다.Parquet Deep Dive상황을 파악하기 위해 조금 더 조사를 해보기로 하였습니다. Parquet의 포맷 스팩은 Parquet 프로젝트에서 관리되고 있고, 이의 구체적인 구현체로 parquet-mr 이나 parquet-cpp 프로젝트 등에서 스펙을 구현하고 있습니다. 그리고 특별한 경우에는 Spark에서는 Spark 내부에 구현된 VectorizedParquetRecordReader 에서 Parquet 파일을 처리하기도 합니다.파일 포맷이 바뀌거나 기능이 추가되는 경우에는 쿼리엔진에서도 이를 잘 적용해주어야 합니다. 하지만 안타깝게도 Spark은 parquet-mr 1.10 버전이 나온 시점에도 1.8 버전의 오래된 버전의 parquet-mr 코드를 사용하고 있습니다. (아마 다음 릴리즈(2.4.0)에는 1.10 버전이 적용될 것으로 보이지만)Parquet 의 메인 개발자 중에는 Impala 프로젝트의 lead도 있기 때문에, Impala에는 비교적 빠르게 변경사항이 반영되는 것에 비하면 대조적입니다. 모든 프로젝트들이 실시간적으로 유기적으로 업데이트되는 것은 힘든 일이기 때문에 어느 정도는 받아들여야겠지만, 우리가 원하는 Parquet의 장점을 취하기 위해서는 여러 가지 옵션을 조정하거나 직접 수정을 해야 합니다.VCNC 데이터팀에서는 저장 용량과 I/O 성능을 최적화하기 위하여 Parquet의Dictionary encoding (String들을 압축할 때 dictionary를 만들어서 압축하는 방식, 길고 반복되는 String이 많다면 좋은 압축률을 기대할 수 있습니다)Column pruning (필요한 컬럼만을 읽어 들이는 기법)Predicate pushdown, row group skipping (predicate, 즉 필터를 데이터를 읽어 들인 후 적용하는 것이 아니라 저장소 레벨에서 적용하는 기법)과 같은 기능들을 사용하기를 원했고, 이를 위해 여러 조사를 진행하였습니다.저장용량 줄이기102GB의 JSON 포맷 로그를 text그대로 gzip으로 압축하면 23GB가 됩니다. dictionary encoding이 잘 적용되도록 적절한 옵션 설정을 통해 Parquet로 저장하면 6GB로, 기존 압축방식보다 저장 용량을 74%나 줄일 수 있었습니다.val ndjsonDF = spark.read.schema(_schema).json("s3a://ndjson-bucket/2018/04/05") ndjsonDF. sort("userId", "objectType", "action"). coalesce(20). write. options(Map( ("compression", "gzip"), ("parquet.enable.dictionary", "true"), ("parquet.block.size", s"${32 * 1024 * 1024}"), ("parquet.page.size", s"${2 * 1024 * 1024}"), ("parquet.dictionary.page.size", s"${8 * 1024 * 1024}"), )). parquet("s3a://parquet-bucket/2018/04/05") 비트윈의 로그 데이터는 ID가 노출되지 않도록 익명화하면서 8ptza2HqTs6ZSpvmcR7Jww 와 같이 길어지기에 이러한 항목들이 dictionary encoding을 통해 효과적으로 압축되리라 기대할 수 있었고, Parquet에서는 dictionary encoding이 기본이기에 압축률 개선에 상당히 기대하고 있었습니다.하지만 parquet-mr 의 구현에서는 dictionary의 크기가 어느 정도 커지면 그 순간부터 dictionary encoding을 쓰지 않고 plain encoding으로 fallback하게 되어 있었습니다. 비트윈에서 나온 로그들은 수많은 동시접속 사용자들의 ID 갯수가 많기 때문에 dictionary의 크기가 상당히 커지는 상태였고, 결국 dictionary encoding을 사용하지 못해 압축 효율이 좋지 못한 상태였습니다.이를 해결하기 위해, parquet.block.size를 default 값인 128MB에서 32MB로 줄이고 parquet.dictionary.page.size를 default 값 1MB에서 8MB 로 늘려서 ID가 dictionary encoding으로만 잘 저장될 수 있도록 만들었습니다.처리속도 올리기저장용량이 줄어든 것으로도 네트워크 I/O가 줄어들기 때문에 처리 속도가 상당히 올라갑니다. 하지만 컬럼 기반 저장소의 장점을 온전하게 활용하기 위해서 column pruning, predicate pushdown들이 제대로 작동하는지 점검하고 싶었습니다.소스코드를 확인하고 몇 가지 테스트를 해 본 결과, Spark에서는 Parquet의 top level field에서의 column pruning은 지원하지만 nested field들에 대해서는 column pruning을 지원하지 않았습니다. 비트윈 로그에서는 nested field들을 많이 사용하고 있었기에 약간 아쉬웠으나 top level field에서의 column pruning 만으로도 어느 정도 만족스러웠고 로그의 구조도 그대로 사용할 예정입니다.Predicate pushdown도 실행시간에 크게 영향을 줄 거라 예상했습니다. 그런데 Spark 2.2.1기준으로 column pruning의 경우와 비슷하게, top level field에 대해서만 predicate pushdown이 작동하는 것을 확인할 수 있었습니다. 이는 성능에 큰 영향을 미치기에, predicate 로 자주 사용하는 column들을 top level 로 끌어올려 저장하는 작업을 하게 되었습니다. 여기에 추가로 parquet.string.min-max-statistics 옵션을 손보고 나서야 드디어 10~30배 정도의 성능 향상을 볼 수 있었습니다.매일 15분 정도 걸리던 "의심스러운 로그인 사용자" 탐지 쿼리가 30여초만에 끝나고, cs처리를 위해 한 사람의 로그만 볼 때 5분 정도 걸리던 쿼리가 30여초만에 처리되게 되었습니다.못다 한 이야기parquet.string.min-max-statistics 옵션과 row group skipping에 관해.Parquet 같은 포맷 입장에서 string 혹은 binary 필드의 순서를 판단하기는 어렵습니다. 예를 들어 글자 á 와 e 가 있을 때 어느 쪽이 더 작다고 할까요? 사전 편찬자라면 á가 더 작다고 볼 것이고, byte 표현을 보면 á는 162이고 e는 101이라 e가 더 작습니다. Parquet 같은 저장 포맷 입장에서는 binary 필드가 있다는 사실만 알고 있고, 그 필드에 무엇이 저장될지, 예를 들어 á와 e가 저장되는지, 이미지의 blob가 저장되는지는 알 수 없습니다. 그러니 순서를 어떻게 정해야 할지는 더더구나 알 수 없습니다.그래서 Parquet 내부적으로 컬럼의 min-max 값을 저장해 둘 때, 1.x 버전에서는 임의로 byte sequence를 UNSINGED 숫자로 해석해 그 컬럼의 min-max 값을 정해 저장했습니다. 이후에 이를 개선하기 위해 Ryan Blue가 PARQUET-686에서 parquet-format에 SORT_ORDER를 저장할 수 있도록 했습니다.여기에서 문제는 이전 버전과의 호환성입니다. SORT_ORDER가 없던 시절의 Parquet 파일을 읽으려 할 때, min-max 값을 사용해 row group skipping이 일어나면 query 엔진에서 올바르지 않은 결과가 나올 수 있으니, binary 필드의 min-max 값을 parquet-mr 에서 아예 반환하지 않게 되어있습니다.하지만 이는 우리가 원하는 동작이 아닙니다. 여기에 parquet.string.min-max-statistics option을 true로 설정하면, 이전처럼 binary필드의 min-max값을 리턴하게 되고 rowgroup skipping이 작동하여 쿼리 성능을 크게 올릴 수 있습니다.마치며Spark과 Parquet 모두 많은 사람이 사랑하는 훌륭한 오픈소스 프로젝트입니다. 또한 별다른 설정이나 튜닝 없이 기본 설정만으로도 잘 돌아가는 편이기 때문에 더더욱 많은 사람이 애용하는 프로젝트이기도 합니다.하지만 오픈소스는 완전하지 않습니다. 좋은 엔지니어링 팀이라면 단지 남들이 많이 쓰는 오픈소스 프로젝트들을 조합해서 사용하는 것에서 그치지 않고 핵심 원리와 내부 구조를 연구해가며 올바르게 활용해야 한다고 생각합니다. 기술의 올바른 활용을 위해 비트윈 데이터팀은 오늘도 노력하고 있습니다.
조회수 2009

랜딩 페이지, 제대로 운영하기

방치된 랜딩페이지랜딩 페이지가 회사에서 어떤 역할을 맡고 계신가요? 아쉽게도 우리는 국내외를 막론하고 그저 “없으면 이상하니 겨우 만들어 둔” 랜딩 페이지를 많이 발견할 수 있습니다. 특히 고객당 매출이 꽤 큰 서비스라면 영업 성과를 위해 랜딩페이지에 최우선적으로 투자해야 함에도 엉뚱한 곳에 영업 비용을 들이면서 그 중요성을 과소평가하는 모습을 많이 보게 됩니다.이 글은 회사에서 랜딩페이지를 어떻게 바라보아야 하는지, 어떻게 큰 투자 비용을 들이지 않고 랜딩 페이지를 개선해나갈 수 있는지를 전반적으로 정리해보고자 합니다.고객을 처음 끌어오는 “비용”과 발생하는 “매출”랜딩페이지의 구체적인 위치 선정을 위해 분명히 짚고 넘어가야 할 두 가지 수치가 있습니다. 한 명의 고객을 유치하는데 드는 “비용”과 이 고객이 발생시키는 “매출”입니다. 충분히 현대적인 기업이라면 여기에 재방문율와 이후 매출/유지비를 계산하여 고객 생애 가치까지 연계해 생각하겠지만, 일단 그런 개념이 전혀 없다면 우선적으로 생각해볼 수 있는 가장 간단한 수치가 이 고객 유치 비용(Customer acquisition cost, 이하 CAC)와 고객별 평균 매출(Average revenue per user, 이하 ARPU)입니다. 이는 기업이라는 형태를 유지하고 있다면 어느 곳이나 정의할 수 있는 개념이며, 또한 분명히 알고 있을 수록 의사 결정에 핵심적인 도움을 줄 수 있습니다.고객 생애가치에 대해서는 조성문의 실리콘밸리 이야기에서 아주 좋은 글을 보실 수 있으므로, 이 쪽을 읽어보시는 것을 추천드립니다.랜딩 페이지도 영업할 줄 압니다!중요한 점은 랜딩페이지 운영을 하는 것이 “그저 만들어 두는 것” 이상으로 현대적인 기업의 CAC와 ARPU에 깊게 관여할 수 있으며, 특히 ARPU가 높은 사업일 수록 이 중요도가 높아진다는 것입니다. 랜딩 페이지는 방치해두고, 10만원 이상의 CAC를 그저 외부 영업으로 소진하고 계시진 않으신가요? 당신이 담당하고 있는 랜딩페이지의 CAC는 얼마인가요? 이 질문에 대답할 마음이 생겼다면, 랜딩 페이지를 바라보는 관점이 올바르게 잡힌 것입니다.우리가 랜딩 페이지 개선에 있어 어떤 것을 고민해야 하는가?비즈니스마다 액수나 구성의 차이가 있겠지만, 매출규모를 포함한 사업 다이나믹을 전반적으로 고려하여 적정 CAC를 산정할 수 있는데, 이는 랜딩페이지 평가의 중심 축이 됩니다.랜딩 페이지의 성과 측정은 크게 두가지 값을 중심으로 계산합니다.1. 랜딩페이지까지 도달하는데 쓰는 비용2. 랜딩페이지의 전환율가령, 키워드 광고로 (1) 클릭당 3,000원의 비용을 소진하고, (2) 전환율이 5%라면 키워드 광고를 통한 CAC는 총 3,000 / 0.05 = 60,000원이 됩니다. 목표로 하는 기간별 영업 비용과 비교했을때, 이 값이 더 비싸다면 이 두 수치중 하나를 올리는 것으로 비용을 개선할 수 있습니다.영업에 있어서 통상적으로, 영업방법을 우선 개선하고나서 영업인원을 늘려야 하는 것이 순서입니다. 마찬가지로 랜딩페이지 역시 둘 중 우선하여 개선해야 하는 것은 전환율입니다.잠깐! 유입이 없다면 일단 만드세요.테스트를 하기엔 너무 적게 들어오나요? 그렇다면 애초에 놓치고 있는 사용자가 많다는 이야기입니다. 랜딩 페이지가 어디에서 어떻게 노출이 되고 있나요? 대부분의 “방치된” 랜딩페이지들은 기껏해야 스타트업 관계자들과 같은 타겟이 아닌 고객들이 구경오는 양이 더 많을 것입니다.기본적인 유입 전략이 없다면 네이버 키워드 광고나 오버추어와 같은 광고 플랫폼을 통해 기본적인 유입량은 확보해두어야 합니다. 이 유입의 효율을 늘리는 것은 1번의 일이므로 이번 글에선 다루지 않습니다만, 차후에 랜딩페이지를 통한 마케팅시 꼭 집고 넘어가야 하는 부분이니 잘 염두해두시기 바랍니다.랜딩 페이지 개발 주기유입도 늘렸고, 전환율도 파악이 되고, 기준 CAC도 계산된다면 이제 기본적인 방향설정은 끝났습니다. 저희는 이 상태에서, 랜딩페이지의 전환율을 늘리기 위해 아래와 같은 개발 주기를 거칩니다.1. 현재의 랜딩 페이지 분석2. 기존 내/외부 랜딩페이지 스터디 참조3. 가설을 설정4. 가설에 맞춘 랜딩페이지안 제작5. 기존 안과 A/B 테스팅6. 인사이트 정리 및 반영7. 1번으로 돌아가기1. 현재의 랜딩 페이지 분석먼저 현재 랜딩 페이지를 누가/어떻게 들어오는지, 들어와서 어떤 과정을 거치는지에 대한 총체적인 분석이 필요합니다. 저희는 이 과정을 위해 두가지 서비스를 활용합니다.Mixpanel과 Google Analytics: 사용자 브라우저, 해상도, 키워드 유입 경로, 깔때기 분석Crazyegg: Heatmap, Scrollmap 분석이 통계들을 통해 (1) 어느 단계에서 이탈이 많은지 (2) 어떤 브라우저와 해상도를 지원해야 할지 (3) 어떤 키워드를 통해 들어온 사용자가 전환율이 높은지 (4) 무엇을 누르고 어떤 컨텐츠를 스킵하는지를 주로 봅니다. 그리고 비즈니스에 따라 주요해서 볼 수 있는 부분이 더 많이 있을 것입니다.2. 기존 내/외부 랜딩페이지 스터디 참조현재 서비스의 랜딩페이지 개선사항을 명확히 파악하고 있지 않다면 이를 먼저 파악하는 것이 중요합니다. 이전 개발 담당자나 주요 의사 결정자가 따로 있다면 사전 인터뷰를 통해 현재까지의 과정을 모두 수집하세요. 그 이후엔 외부 자료를 통해 랜딩 페이지에 대한 공개 자료를 스터디하여 어떤 개선책을 적용할 수 있는지를 배워둘 필요가 있습니다.한가지 외부 자료를 추천드리자면 랜딩페이지 제작 서비스를 제공하는 Unbounce에서 운영하는 블로그에 배울만한 자료들이 많이 있으므로 이 쪽의 스터디를 보시는 것을 추천드립니다.3. 가설 설정1번과 2번 과정을 거치면서 현재 랜딩페이지의 전환율을 방해하는 요소가 무엇인지, 그리고 이를 어떻게 해결해나갈 수 있을지에 대한 구체적인 그림이 그려질 것입니다. 이에 따라 개선안에 대한 가설을 정리합니다. 모든 가설마다 1번안에서 문제점을 도출하고, 2번안에서 해결책을 도움받아 논리를 잘 뒷받침하는 것이 중요합니다.4. 가설에 맞춘 랜딩페이지안 제작이 단계에서 가장 중요한 점은 가설당 하나의 테스트를 만들어야 하며, 여러 가설을 하나의 테스트에 뭉쳐놓으면 안된다는 것입니다. 가설은 성공할 수도, 실패할 수도 있는데 해보시는 분들은 아시겠지만 의외로 실패가 많은 것이 랜딩페이지 개선입니다. 여러 가설이 하나의 개선안에 뭉쳐있다면 어떤 요소의 개선때문에 성공/실패하였는지 알기가 어렵습니다. 가설이 3개가 있으면 3개의 개선안을 기존안으로부터 분리하여 따로따로 만듭니다.또한 가설에 있어 언제나 마지막의 전환율 변화만을 가정한다면 실험 결과를 유의미하게 뽑는데 어려움이 있을 수 있습니다. 작은 변화라도 장기적으로는 결국 전환율의 변화를 가져올 것이지만, 실험 결과를 빠르게 내기 위해선 전환을 위한 중간과정들을 세세하게 정의하고, 그 과정에서의 깔대기 개선을 목표로 삼아야 합니다.5. 기존 안과 A/B 테스팅만들어진 가설을 토대로 기존안과 A/B 테스팅을 진행합니다. 자체적인 A/B 테스팅을 준비하려면 해야 할 것이 꽤 복잡하지만, 약간의 정확도를 희생해도 된다면 Optimizely을 이용하여 준비하는 것을 추천드립니다. Optimizely를 이용하면,1. GUI 상에서 간편하게 A/B 테스팅을 준비할 수 있으며2. 통계적으로 비교적 정확한 통계 결과를 실시간으로 뽑아주며,3. Mixpanel, Crazyegg와 연동 설정을 지원하므로 가설에 대한 보다 깊은 리뷰가 가능합니다.6. 인사이트 정리 및 반영유입이 어느정도 발생한다면, 기존안에 비해 전환율의 차이가 통계적으로 분석되어 나올 것입니다. 주로 체크하는 지점은 아래와 같습니다.1. 해당 해결책이 효과적으로 작동하였는지2. 개선안에서 의도치 않은 사용 행태가 있는지3. 구체적으로 어떤 컨텐츠 변화가 차이를 불러왔는지이와 같이 정리를 한 후, 유효했던 결과들을 합치고 문제점을 보완하여 최종적으로 개선을 완료합니다. 이렇게 최종적으로 상승한 전환율이 가져온 CAC의 개선을 확인하면 이번 개선이 가져온 이익이 얼마인지 추정이 가능합니다.마치며랜딩페이지는 충분히 회사의 마케팅에 구체적인 성과를 낼 수 있는 중요한 장치임을 인지해야 합니다. 그저 만들어두고 방치하기보다 유입 비용과 전환율을 측정 후 기존 CAC와의 비교를 통해 개선시켜나갈 수 있습니다. A/B Testing, Heatmap, 깔때기 분석은 SaaS를 적극적으로 활용하여 스타트업도 어렵지 않게 할 수 있습니다.랜딩 페이지가 큰 효과를 내줄 수 없을 때도 있는데, 랜딩페이지로의 유입을 통한 서비스 접근 비율에 한계가 있는 서비스들이 그 예이며 오히려 이런 서비스들은 랜딩페이지를 개선하는 것보다 다른 마케팅 채널에 투자를 하는 것이 낫습니다. 하지만 그 이전에 CAC 관점에서 랜딩 페이지의 가능성을 타진해보는 것은, 적어도 랜딩페이지를 올려놓은 입장이라면 한번 쯤은 꼭 시도해보시는 것을 추천드립니다.다음에는 키워드 광고나 기타 유입량을 개선할 때 쓸 수 있는 전략에 대해 소개해보도록 하겠습니다.#스포카 #디자인 #디자이너 #기획 #기획자 #랜딩페이지 #꿀팁 #인사이트
조회수 2335

Angular Lazy Loading 모듈 사용하기

Angular는 비동기식 라우팅이 가능합니다. 나중에 사용할 기능들을 NgModule로 분리하여 사용자의 요청이 들어왔을 때 모듈을 불러와 기능을 사용할 수 있고, 이러한 기술을 지연 로딩이라 합니다.프로젝트가 진행되고 기능이 추가될수록 어플리케이션 번들 크기가 커지고, 결국엔 초기 로딩 시간도 길어지게 됩니다. 지연 로딩을 사용하면 초기 로딩 시간을 줄일 수 있습니다. 컴파일 단계에서 나중에 사용할 모듈들을 메인 모듈에서 분리하여 번들을 생성합니다. 그리고 사용자가 기능을 요청할 때 비동기로 스크립트를 불러와 실행합니다. 지연 로딩에 대한 소개와 사용법은 Angular 공식 문서의 Routing & Navigation — Milestom 6: Asynchronous routing 을 참고하시길 바랍니다하지만 지연 로딩을 사용할 때 유의해야할 점이 몇 가지 있습니다.지연 로딩 모듈과 인젝터(Injector)지연 로딩이 완료되었을 때 Angular는 지연 로딩된 모듈을 루트 인젝터(Root Injector)의 자식이 되는 자식 인젝터를 이용하여 초기화하고, 서비스들을 자식 인젝터에 추가합니다. 즉, 인젝터가 분리되기에 지연 로딩된 모듈의 클래스들은 자식 인젝터로의 서비스 주입이 가능하지만 루트 인젝터로 만들어진 클래스들은 불가능합니다.이는 Angular의 독특한 의존성 주입 시스템 때문입니다. Angular의 인젝터는 처음 애플리케이션이 시작되었을 때, 컴포넌트나 다른 서비스에 주입되기 전에 포함된 모든 모듈들의 서비스 제공자들을 블러와 루트 인젝터를 생성합니다. 애플리케이션이 시작되고 나면 인젝터는 서비스들을 생성하고 주입을 시작하고, 새로운 서비스들을 제공자로 추가가 불가능합니다.그러므로 지연 로딩된 서비스들은 이미 생성이 완료된 루트 인젝터로 추가가 불가능합니다. 따라서 Angular는 지연 로딩된 모듈에 대해서 새로운 자식 인젝터를 만들는 전략을 취하게 된 것입니다.자식 인젝터가 새로 만들어지기 때문에 공통된 모듈을 사용할 때 주의하여야 합니다. 예를 들어 다음과 같이 SharedModule 에 CounterService 를 서비스로 추가하고 루트 모듈인 AppModule 과 지연 로딩 모듈인 LazyModule 에 각각 SharedModule 을 import 하였습니다.import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { SharedModule } from './shared/shared.module'; import { AppShellComponent } from './app-shell.component'; const APP_ROUTES = [ { path: 'lazy', loadChildren: 'app/lazy/lazy.module#LazyModule' } ]; @NgModule({ imports: [ BrowserModule, SharedModule, RouterModule.forRoot(APP_ROUTES) ], declarations: [ AppShellComponent ], bootstrap: [AppShellComponent] }) export class AppModule { }import { Injectable } from '@angular/core'; @Injectable() export class CounterService { count = 0; increase(): void { this.count++; } decrease(): void { this.count--; } }import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { SharedModule } from '../shared/shared.module'; import { SomeLazyComponent } from './some-lazy.component'; const LAZY_ROUTES = [ { path: '', component: SomeLazyComponent } ]; @NgModule({ imports: [ SharedModule, RouterModule.forChild(LAZY_ROUTES) ] }) export class LazyModule { }import { NgModule } from '@angular/core'; @NgModule({ providers: [ CounterService ] }) export class SharedModule { }그리고 루트 모듈의 컴포넌트와 지연 로딩 모듈의 컴포넌트에서 각각 CounterService 를 사용하여 숫자 값을 바꿔봅니다.서로 다른 인젝터에 CounterService 인스턴스가 만들어졌기 때문에 두 컴포넌트에 표시되는 숫자값은 다릅니다. 앞에서 말했듯이 지연 로딩 모듈은 루트 인젝터가 아닌 자식 인젝터를 이용하여 초기화하기 때문입니다.만약, 지연 로딩 모듈에서 제공되는 서비스를 다른 모듈에서 사용하려면 루트 모듈에 포함시켜 줘야 합니다. 다음과 같이 루트 모듈에게만 노출시킬 서비스 제공자들을 따로 빼내어 줄 수 있습니다.import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { AccountLoginPageComponent } from './login-page.component'; const ACCOUNT_ROUTES: Routes = [ { path: 'login', component: AccountLoginPageComponent } ]; @NgModule({ imports: [ ... RouterModule.forChild(ACCOUNT_ROUTES) ], decalartions: [ AccountLoginPageComponent ] }) export class AccountLazyModule { }import { ModuleWithProviders, NgModule } from '@angular/core'; import { AccountAuthService } from './auth.service'; @NgModule({ imports: [...] }) export class AccountModule { static forRoot(): ModuleWithProviders { return { ngModule: AccountModule, providers: [ AccountAuthService ] }; } }AccountModule.forRoot() 를 루트 모듈에 import하면 다른 모듈에서도 AccountAuthService 를 사용할 수 있게 됩니다. 물론 이 경우 AccountModule를 지연로딩 모듈로 만들면 루트 모듈에 포함되기 때문에 번들을 나누는 의미가 없어질 수 있으니 AccountLazyModule 을 따로 두어 코드를 분리하였습니다.#타운컴퍼니 #개발 #개발자 #인사이트 #꿀팁
조회수 1611

3월에 다녀온 여름나라 코타키나발루 3박5일 이야기 (1)

패션블로그 웹뜰입니다2008년 법인 설립한 이후 끊임없는 도전과 체계적인 관리로열심히 성장하는 기업이 되어 어느새 10주년을 맞이하게 되었습니다. 먼저 웹뜰의 성장에 도움을 주신 고객님들과 이웃님들께 감사 인사를 드립니다. 10주년 기념으로 그동안 여러모로 고생하고 함께한 직원들을 위해서 웹뜰의 이태경 대표님께서 통크게 해외 워크샵을 준비해주셨답니다. 워후~ 모두 함께소리질러~~그래서  어디로 다녀왔냐구요?눼눼~ 무려 세계 3대 선셋을 볼수 있는 천혜의 지상낙원 코타키나발루로 다녀왔습니다. 그렇게 기다리던 3월 중순! 워크샵 날이 왔습니다. 코타키나발루로 직항하는 비행기는 거의 오후만 있더라구요 그래서 오전 근무 마치고 로비에 모여 있는 웹뜰 직원들 손마다 큰 캐리어를 하나씩 들고 있네요 ㅎㅎ3월 중순이였는데요 하필 이날이 꽃샘추위가 있던 날이였어서 출근한 직원들이 모두 두꺼운 외투를 입고 왔었답니다. 잠시 뒤 공항으로 가기위해 대여한 버스가 도착하고 버스를타고 이동준비를 합니다. 사실 지하철 타고 갈까 했었는데 대표님께서 직원들을 위한 배려로 리무진버스를 대여하여 직원 모두가 편하게 이동할 수 있었답니다.  웹뜰 직원들 모두 공항으로 출발!리무진버스가 참 편하고 좋더라구요 어제 해외간다고 설레여서 잠을 좀 설쳤더니 공항까지 가는 동안 버스안에서 꿀잠을 잤답니다. 버스에서 한숨 자고 나니 어느새 인천공항 도착! 해외 워크샵을 가는 게 좀 더 실감이 나네요 여행사 미팅하고 수화물 모두 맡기고 항공권 발권까지 완료 괜히 공항가면 요렇게 여권이랑 항공권 사진 꼭 찍게 되는 그 맘 알쥬? 코타키나발루는 공항이 작아서 인지 저가항공만 있더라구요 저희는 이스타 ZE501편을 타고 갔답니다.  검색대를 잘 통과하고 나오자마자 만난 인천공항 핵인싸 공항로봇 에어스타 세계최초의 자율주행&음성인식 인공지능로봇이라는데!!나도 에어스타랑 말해 보고 싶었지만.. 넘나 인기쟁이라 기회가 없었네요 에어스타! 다음기회에 또 만나자구~~ 일단 공항오면 역시 면세점 투어겠죠?하지만 전 인터넷 면세점에서 다 구매를 해 둔터라 오프라인 면세점은  휙휙 둘러보고 밥 먹으러 갑니다. 아까 위에 언급했듯이 저희가 이용한 비행기는 이스타 ZE501편이였는데 이스타는 기내식이 없어요 밥을 먹고 비행기를 타던지 아니면 미리 따로 주문을 하셔야 한답니다. 그리하여 웹뜰직원들은 대표님께서 저녁식사 값까지 다 지급해주셨답니다. 저희는 맛있는 식당 찾아서 먹기만 하면 되용 ㅎㅎㅎㅎ면세점 투어 마치고, 식사도 마치고 인터넷면세점 인도장을 지나 이제 비행기 탈 시간입니다. 밖으로 저희가 탈 이스타항공의 ZE501이 보이고 그 뒤로는 해가 뉘엿뉘엿 넘어가네요 비행기를 타고 각자의 자리에 앉아서 이제 출발!출발한 시간은 오후 7시! 창밖을 보니 해가 거의 넘어가고 하늘위에서 바라본 풍경 너무 멋있더라구요 근데 날개 옆자리여서 야경은 보지 못햇어요 하하하인천에서 코타키나발루까지 걸리는 시간은 약 5시간 정도로 저희는 7시 비행기를 타고 출발했고 도착하니 현지시간으로 11시 30분정도 였습니다.(시차는 1시간으로 우리나라보다 1시간 느린시간으로 보시면 됩니다.)코타키나발루 공항 도착 후 입국심사질문는 따로 없으며 여권 보여주고 지문찍고 사진 찍고 나올때 반입금지품목이 있는지 수화물 검사 다시 한번합니다. 말레이시아는 이슬람 국가이기 때문에 주류 반입이 좀 까다롭구요닭, 소 돼지로 만든 축산물 가공품 소지가 금지라고 합니다. 여행가시는 분들 참고하시면 좋을 듯입국심사 마치고 나와서 말레이시아 화폐인 링깃으로 환전 및 유심칩 구매 후 가이드와 만나 설명 듣고 차타고 숙소로 이동하였습니다. 저희 웹뜰 워크샵은 숙소를 5성급 더마젤란수트라하버로 잡았습니다.  뷰는 씨뷰에 골드카드 혜택까지! 정말 통크게 워크샵을 쏘신 대표님 다시 한번 감사합니다.  리조트에 도착해서 로비에서 우와~엄청 좋다 연발하며 사진한장 찰칵!체크인을 마치고 각자 방키를 받아서 방으로 올라갔습니다. 올라가면서 복도에서 본 뷰 입니다. 모든 방은 씨뷰로 예약했다고 들었습니다만 일단 밤이여서 바다는 보이지 않네요 하지만 수영장과 야자수 만으로도 아침이 기대되는 뷰였답니다. 방은 2인1실로 사용하였구요 5성급 답게 깨끗하고 쾌적하였습니다. 더운나라 이지만 에어컨도 빵빵 나오고 시원하고 쾌적한 느낌!TV는 도착하고 입실해서 딱 한번 틀어봤었네요  한국채널도 한개 있었습니다. KBS였던 듯..사진엔 없지만 도착해서 배고플 직원들을 위해 웹뜰 이태경 대표님께서 각방에 치킨한마리와 맥주 두캔씩 넣어주셨답니다. 코타키나발루에 도착해서 먹는 치맥은 정말 사진도 못찍고 허겁지겁 먹을 정도로 환상적이였습니다 :D 첫날 밤이 지나고 둘째 날 아침! 조식을 먹기위해 일어나서 커텐을 걷자 눈앞에 펼쳐진 광경입니다. 정말 너무너무 예쁘다 환상적이다 이런 표현말고 또 없나요?진심으로 너무 좋더라구요 뷰가 어쩜이래? 날씨가 어쩜 요래?  눈뜨자마자 뷰를 보고 기분이 좋아 흥얼흥얼 거리면서 조식을 먹으러 내려 옵니다. 조식은 1층에 있는 뷔페식 식당에서 먹을 수 있구요 식당 앞에서 골드카드 소지여부 확인을 위해 방 번호와 이름을 알려주면 됩니다. 일단 저희는 자리를 뷰가 잘보이는 야외테이블로 잡고 어떤걸 먹을까 확인해 봅니다. 조식은 간단하게 시리얼, 빵, 과일, 딤섬, 요거트 등등이있구요 소시지나 약간 고기종류도 있었던 것 같아요 (3일간 좋아하는 음식만 먹어서 기억이 잘.. ㅋㅋ)이외에 에그후라이나 치즈오믈렛등도 조리해주시는 분이 계십니다. 사진에 담지 못해 아쉽네요 아까 잡아놓은 테이블로 돌아와서 사진도 한컷 찍어봅니다. 어떤가요 정말 지상낙원이 따로 없죠? 보기만해도 힐링이 되는 느낌수영장과 야자수가 보이는 자리에서먹는 조식이라니 꿈인가요?한국에서도 아침 잘 안 챙겨먹는데 여기서는 이 뷰 때문에 매일 아침 챙겨먹었다는 사실 ㅎㅎ하지만 야외에서는 새를 조심해야해요 특히 아침엔 새가 엄청 많은데 잠시만 자리 비워도 저 음식은 저의 음식이 아니라 새의 먹이가 되고 말아요 (실제로 제 앞 테이블이 접시 놓고 또 가지러 가다가 새의 밥으로 접시음식을 날렸다는 사실 ㅠ ㅎㅎ)간단하게 조식을 먹고 잠시 쉰 후에 다음 일정을 위해 선착장으로 이동다음 웹뜰 직원들의 일정은 마누칸섬에서의 호핑투어 입니다. 사실 떠나오기전에 제일 궁금한게 3월 코타키나발루 날씨였는데 날씨도 우리를 돕는지 어찌나 맑고 좋던지요! 3월은 보통 건기가 시작되기때문에 보통 쾌청하고 좋은 날이긴 하지만 그래도 동남아에서는 언제 비가 올지 모른다고 들었던거 같은데 저희는 3박5일내내 비한방울 안 만났답니다. :) 선착장으로 가면서 바다를 보니 물고기들이 어마어마하게 많더라구요 선착장이데도 맑고 투명해서 물고기며 성게며 다 보여서 신기방기 마누칸섬은 웹뜰 직원들이 묵고 있는 마젤란수트라하버에서 배를타고 10분정도 나가면 되는 곳이구요 선착장이 마젤란수트라하버에 바로 있어 웹뜰직원들은 멀리 이동하지 않고 바로 모여서 섬투어로 출발 할 수 있었답니다. 저희가 가는 마누칸섬 투어는 마젤란수트라의 골드카드의 혜택 중 하나여서 꼭 골드카드를 소지해야만 배를 탈수 있답니다. 마누칸 섬으로 갔다 오는 왕복 배, 섬에서의 식사 등이 포함되어 있답니다. 선착장에서 가이드님과 마누칸섬으로 갈 배를 기다리면서 사진도 한컷 찍어봅니다. 날씨가 좋아서 어디서 찍어서 사진 예술~마누칸 섬으로 가는 배안에서 맥주 시원하게 한캔 ㅋㅋㅋ 섬에 있는 식당에서는 따로 판매하고 있어 마실 수 없으므로 마누칸 섬으로 가는 동안 배안에서라도 즐겨봅니다. 마누칸 섬은 아까 말한대로 웹뜰 직원들이 묵고 있는 숙소와 멀지 않은 곳에 있어서 금새 도착했네요 세상에 여러부운~ 저 에메랄드 빛 바다 좀 보세요 꺄아 바다만 봐도 시원하고 신나고 좋네요 이 모든 걸 워크샵으로 즐길 수 있는 웹뜰직원이라 행복합니다.  섬에서 현지 가이드직원을 만나서 식당으로 이동해서 자리를 안내해줍니다. 이 자리는 골드카드를 내고 잡은 웹뜰직원전용자리나 마찬가지~!이곳에 짐놓고 패러세일링이나 호핑투어등 하면 되구요 가지고 온 짐은 직원이 봐준다고 전혀 노프라블롬이라면서 걱정말라고 하더라구요 놀다가 점심시간에 맞춰서 모든 직원들이 모이면 식사를 준비해준다고 합니다.  앉아서 조금 쉬고 있으니 현지 가이드가 패러세일링 바나나보트 씨워킹 등등의 여러가지 섬에서 할수 있는 익스트림 스포츠가 있으니 어떤걸 할꺼냐고 묻습니다. 아 물론 섬에서 하는 모든 익스트림스포츠는 비용은 따로 있답니다. ㅋㅋㅋ하지만! 우리 웹뜰 대표님께서 모든 비용을 지불 해주실테니 각자 하고 싶은 걸 하나씩 해보라고 하셨답니다. 이런 혜택 거절하지 않고 냉큼! 해봐야죠? 웹뜰 직원은 씨워킹과 패러세일링 두 패로 나뉘었네요  저는 패러세일링을 다녀왔으니 패러세일링 사진 소개시켜 드릴께요 패러세일링과 씨워킹은 보드 섬에서 조금 떨어진 바다로 나가야 합니다. 패러세일링 신청한 웹뜰 직원 반반 나누어서 배를 타고 나왔습니다.  패러세일링은 펼쳐진 낙하산을 달고 보트로 끌게하여 고도가 높아지면 낙하시키며 물에 빠트리는 (?)레포츠 입니다. 일단 패러세일링을 하기위해서는 짝을 2인1조로 맞춰야하구요 몸무게 밸런스도 맞춰서 짝을 해야합니다. 너무 무거우면 한쪽으로 쏠릴 가능성 다분하답니다. ㅋㅋ그리고 남자들끼리 타면 너무 무거워서 잘 뜨지도 않는다고 해요 타기전에 패러세일링을 하는 현지인 분이 물어봅니다. 퐁당퐁당 오케이?  우리는 물에 빠지는게 잼날거 같아서  매니매니 퐁당퐁당하고 답을 했엇죠 보트가 달리면서 줄을 멀리멀리 보내면 더 멀리 더 높이 날아가요 생각보다 높이 있지만 생각보다 그리 무섭진 않더라구요 좀 멀리 갔다 싶으면 줄을 느슨하게 해서 퐁당퐁당 합니다. ㅋㅋㅋ보트가 움직이는 방향때문인지 저는 오른쪽에 있어서 물에 많이 빠지지 않았지만 왼쪽에 있던 제 패러세일링 짝궁은물에 계속 빠지더라는 ㅋㅋㅋ 그래도 물도 차갑지 않고 시원하니 넘 기분 좋았어요  액션캠을 가지고 가서 위에서도 영상 찍으면서 패러세일링을 했어요 패러세일링 동영상 하나 올리면서 이번 포스팅은 마무리 할께요~  웹뜰의 코타키나발루 10주년 워크샵 이야기는 아직 남아있습니다. 섬에서의 점심식사부터는 다음 후기에서 소개할께요 기대해주세요#코타키나발루 #워크샵 #해외워크샵 #웹뜰 #웹뜰워크샵 #마젤란수트라하버 #마누칸섬 #패러세일링 #인천공항 #이스타항공  

기업문화 엿볼 때, 더팀스

로그인

/