스토리 홈

인터뷰

피드

뉴스

조회수 871

로봇 택시가 산업 지형을 바꾼다

로봇 택시가 산업 지형을 바꾼다"자율 주행 전기차의 등장으로 유가가 배럴당 25달러까지 떨어지고, 새로운 세계 질서가 도래할 것이다."'에너지 혁명 2030' 의 저자로 2015년 한국을 방문한 적 있는 토니 세바 스탠포드대 교수(RethinkX의 공동 설립자)가 최근 미국 CNBC와 인터뷰에서 "기름 수요가 2020년~2021년 사이 1백만 배럴로 꼭지를 찍은 뒤 10년 내(2030년경)로 70만 배럴까지 줄어들면서 유가가 하락세를 면치 못할 것”이라며 이같이 예견했다.점차 많은 사람들이 공유경제의 축으로 자율 주행 전기차를 사용하게 되면서 ▽오일 회사는 생존이 어렵게 되고 ▽심해, 세일가스업체와 정유 파이프라인 회사들도 문을 닫게 될 것이라는 게 그의 예측이다.차량도 소유의 대상에서 서비스의 대상, 이른바 TAAS (transport as a service) 로 바뀐다. 차량을 더 이상 구입하지 않고, 편리하게 앱으로 로봇 택시를 호출해 이용하면 그만이다. 자율 주행 전기차의 가격도 싸지면서, 전기차 이용이 소유에 비해 10배 정도 저렴해질 것이라는 것.  경제학자인 그의 섬뜩한 전망은 계속된다. 급속한 기술의 진보로 인해 값비싼 정유회사나, 적응력이 떨어지는 카 메이커(의 주식)가 매력이 없어지며, 차량과 관련된 직업 중에서 차 딜러도 2024년까지 사라질 것이라는 예상이다.뿐만 아니라, 주차공간의 80% 이상이 쓸모없게 되고, (자동차)보험의 비용도 급격하게 떨어지기 때문에 보험회사도 설 땅이 좁아진다는 것.이 같은 그의 전망이 혼자만의 견해는 아니지만,  다른 사람들은 이런 변화에 훨씬 많은 시간이 걸리고, 그렇게 극적이지도 않을 거라고 내다본다.반대로 그는 차량 관련 지출이 줄면서 가계 소비가 늘어나 경제성장을 촉진할 것이라고 예상했다. 아울러 차세대 차의 개발과 관련된 차 운영체제, 컴퓨터 플랫폼, 배터리, 지도 소프트웨어 회사들을 눈여겨 보라고 조언했다.세바 교수의  유가 하락 전망이  결코 급진적인 것은 아니다.  유가는 WTI(서부 텍사스중질유)기준으로 2016년 2월에  배럴당 20달러대 중반까지 급락한 바 있다.  6월 14일 현재는  40달러대 중반에 머물러 있다.다만, 차량이 소유의 대상에서 이용 서비스의 대상으로 바뀐다든지, 차 딜러가 사라진다든지 하는 등의 혁신적이거나 과격한 전망이 실현될 지는 두고 볼 일이다.참조 : 다음은 토니 세바 교수가 참여한 화제의 보고서 ‘Rethinking transportation 2020-2030’ 원문 링크https://static1.squarespace.com/static/585c3439be65942f022bbf9b/t/591a2e4be6f2e1c13df930c5/1494888038959/RethinkX+Report_051517.pdf
조회수 1735

네이버 신디케이션 — Rails

블로그에 새 글이 올라올 때, naver에 사이트 등록을 한다. 네이버 신디케이션 API를 이용하면 자동으로 등록된다.Wordpress에는 네이버 신디케이션 plugin이 존재한다. Rails gem을 찾아보니 애석하게도 없었다. 직접 만들면서 알게 되었다. 딱히 gem을 만들 만한 일도 아니더라.네이버 신디케이션을 이용하려면 우선 네이버 웹마스터 도구를 이용해야 한다. 해당 url이 자기 것이라는 인증과정만 거치면 바로 사용할 수 있다.작동방법은 대강 이렇다.네이버 신디케이션 API를 이용해서, 새로운 글이 생성되었음을 알린다. (혹은 글이 지워졌음을)네이버 크롤링 봇, Yeti가 와서 크롤링 해간다.API를 이용할 때 미리 약속된 format으로 만들어야 되는데, ATOM feed와 구조가 거의 같다. 다만 네이버가 정한 룰 때문에 (꼭 이름/저자/업데이트날짜 이런 순서를 지켜야 한다.)Rails에서 제공하는 atom_feed helper를 그대로 이용할 수 없다. 그러나 format만 살짝 바꾸면 되기 때문에 atom_feed helper를 이용해서, feed를 만드는 방법을 알려주는 Railscast가 늘 그렇듯 엄청 도움이 된다.(요즘 새로운 episode가 안올라오고 있는데… 힘내시라는 의미에서 예전에 유료결제 해드렸다)atom_feed helper의 코드를 그대로 가져와서 formating만 바꾼 naver_atom_feed helper를 만들었다. 별다른 건 없고, feed option 초기화 부분과 제일 마지막에 나와야 되는 link 부분을 주석처리한게 전부다.module NaverSyndicationHelper def naver_atom_feed(options = {}, █) ... feed_opts = {} //feed_opts = {"xml:lang" => options[:language] || "en-US", "xmlns" => 'http://www.w3.org/2005/Atom'} ... xml.feed(feed_opts) do xml.id... // xml.link... // xml.link... yield ActionView::Helpers::AtomFeedHelper::AtomFeedBuilder.new(xml, self, options) end end end새로만든 naver_atom_feed helper를 이용해서, feed부분만 완성한 code이다.naver_atom_feed({xmlns: "http://webmastertool.naver.com", id: 'http://ikeaapart.com'}) do |feed| feed.title "이케아아파트" feed.author do |autor| autor.name("이케아아파트") end feed.updated Link.maximum(:updated_at) feed.link(:rel => 'site', :href => (request.protocol + request.host_with_port), :title => '이케아아파트')이제 entry쪽을 만들어야 되는데, 네이버가 지정한 순서에 맞아야지만 신디케이션 서버에 전달할 수 있다. 정말 이상한 형식이다. 아무튼 그래서 Rails에서 제공하는 entry method를 사용하지 못한다. 이번엔 AtomFeedBuilder class에 naver_entry method를 만들었다.#config/initializers/feed_entry_extentions.rbmodule ActionView module Helpers module AtomFeedHelper class AtomFeedBuilder def naver_entry(record, options = {}) @xml.entry do @xml.id... # if options[:published]... # @xml.published(...) # end # if options[:updated]... # @xml.updated(...) # end # @xml.link(..) ...이번에도 순서 때문에 주석처리 한 것 밖에 없다. naver_entry method를 이용해서 완성된 코드가 아래 코드이다.# views/links/show.atom.buildernaver_atom_feed({xmlns: "http://webmastertool.naver.com", id: 'http://ikeaapart.com'}) do |feed| feed.title "이케아아파트" feed.author do |autor| autor.name("이케아아파트") end feed.updated Link.maximum(:updated_at) feed.link(:rel => 'site', ...) feed.naver_entry(@link, {id: link_url(@link)}) do |entry| entry.title(@link.title) entry.author do |author| author.name("이케아아파트") end entry.updated(@link.updated_at.xmlschema) entry.published(@link.created_at.xmlschema) entry.link(:rel => 'via', :href => (request.protocol + request.host_with_port)) entry.content(@link.contents) end end이제 새 글이 만들어 질 때, 이 atom 파일 주소를 네이버 신디케이션 API로 보내주면 된다. 참고로 Rails에서는 어떤 view파일을 사용할지 알아서 해주니, controller에 따로 ‘response_to’ 를 이용해서 format을 나눠줄 필요는 없고, 이름만 잘 맞춰주면 된다. (위 파일명은 show.atom.builder 이다)네이버 신디케이션 API에 핑을 보내는 code이다. 네이버가 지정해 놓은 header를 설정해 줘야 되고, 신디케이션 인증 토큰을 받아서 header에 넣어줘야 된다. 신디케이션 토큰은 네이버 웹마스터 페이지에서 볼 수 있다.require 'net/http' ... header = {"User-Agent"=>"request", "Host"=>"apis.naver.com", "Progma"=>"no-cache", "Content-type"=>"application/x-www-form-urlencoded", "Accept"=>"*/*", "Authorization"=>"Bearer " + ENV["NAVER_SYNDICATION_TOKEN"]} uri = URI.parse('https://apis.naver.com/crawl/nsyndi/v2') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true args = {ping_url: link_url(link_id, format: "atom")} uri.query = URI.encode_www_form(args)request = Net::HTTP::Post.new(uri.request_uri, header) http.request(request)네이버 신디케이션 페이지에서 핑이 제대로 도달하는지 바로 확인해 볼 수 있다.#티엘엑스 #TLX #BA #BusinessAnalyst #비즈니스애널리스트 #꿀팁 #인사이트 #조언
조회수 1127

면접실의 브랜딩: 신입사원들을 매료시키는 브랜딩

신입사원이 뾱 하고 등장했습니다. 모두에게 새로운 사람이 온다는 것은 흥미진진한 일이죠. 신입사원이 들어온다는데 "와씨....이제 회사 못다니겠다." 라고 책상을 치며 울분을 토하는 사람은 없을 겁니다. 대부분은 즐겁고 설레는 마음이 대부분입니다. 물론 전임자가 아주 거친 생각을 지닌 인물이었다면 남겨진 사람들의 불안한 눈빛과 그걸 지켜보는 너가 있긴 하겠죠. 전쟁같은 서류가 남아있을 테니까요. 하지만 그건 책상에 앉은 후에 일이고, 일단 우리가 생각해야 할 것은 그가 책상에 앉기 전까지 어떤 감정과 이미지를 안고 문을 여느냐하는 부분입니다. '아니, 회사가 신입들 감정까지 고려해야해??'라는 생각이 드시나요? 당연히 고려해야죠. 우선 신입도 우리 회사고객입니다.  반드시 우리 물건만으로 의식주를 영위해야 한다는 강제조항은 없잖아요. 맥도날드 직원도 버거킹을 먹을 자유가 있고. 애플직원도 서피스북을 쓸 수 있 듯, 입사 후에도 개인의 선택의 자유는 보장되며 이는 여전히 고객으로써의 역할도 함께 공존한다는 것을 의미합니다. 당사의 서비스와 물품을 사용하러 오는 것이 아니니 말입니다. 음 맛있져또한 사람의 행동은 프레임에 의해 움직입니다. 입사세레모니나 웰컴킷 등에서 키치함과 멋짐, 고유함을 살리려는 이유 또한 물품이나 경험을 통한 회사의 이미지를 프레임화 시키기 위해서잖아요. '우리 회산 이런 회사야.' 라는 것을 그렇게 보여주려고 하는 것은 브랜드 안에 그를 속하도록 하는 동기부여 내지는 구애행위와도 같습니다. 자유의지는 월급이나 직급체계에 구속되지 않습니다. 그가 온전히 집단내에 들어오기 위해선 자신의 발걸음이 중요하죠. 그래서 계약상의 소속과 심리상의 소속은 분리되어 생각해야 합니다.계약상의 소속과 심리상의 소속은 분리되어 생각해야 합니다. 급여, 복지, 사무실환경, 연차 등등은 계약상의 소속을 유지하기 위함입니다. 반면 면접안내를 하는 사원의 표정, 면접내용, 면접 분위기, 사내문화, 문자발송, 안내표지판, 공기의 무게(?), 화장실의 상태, 웰컴킷, 환영세레모니 등등은 심리상의 소속을 좌우합니다. 브랜딩이 늘 그렇듯, 구축과 유지에는 체계와 절차가 필요하지만 망하는 건 디테일에서 비롯되죠.합격자는 1명이지만, 돌아가는 지원자는 수십, 수백명이라는 걸 생각해보면 그들이 다시 고객이 되었을 때 우리회사에 어떤 이미지를 지니게 될 지는 분명 고려해봐야 할 부분 같습니다. (물론 합격자 1명의 경험도 포함해서 말입니다.)오늘은 면접장에서부터 입사, 입사 후 신입사원의 첫 숙지사항들에 대해서 살발한 디테일로 알아보도록 하겠습니다.신입채용 공지1. 잡코리아에 떨렁 '마케팅 직무 / 경력2년 이상 / 연봉 협의 후 결정' 한 문장만 올려놓는 것은 좀 아닌 것 같습니다. 2. 성실한 인재, 열정, 꿈을 지닌 인재.... 라는 인재상 말고 진짜 직무에 필요한 요소를 적어주세요. 하다 못해 앉아서 하는 업무가 많다, 아니면 활동적이고 사교성을 필요로 한다. 금융계 관련 커뮤니케이션에 경험이 충분한 분, 리스팅 관련 장문의 글이 작성가능한 사람 등. 서로 어떤 능력이 필요한 지를 말하고 들어야 온전한 만남이 이루어지지 않겠습니까.스토리가 중요하담서..3. 문의메일엔 답을 주세요.4. 서류합격 예정일은 꼭 지키는 것이 좋습니다. 신뢰의 문제이기도 하고, 그도 아닌 건 빨리 아니라고 생각하고 다른 일을 찾아가야 하니까요. 5. 불합격통지를 모두 보내는 것은 내부 업무로딩에 따라 어려운 일일수도 있습니다. 그럴 땐 '합격자에 한해서 개별통보가 진행됩니다.' 라는 안내문구 하나라도 제발 써놓는 것이 좋습니다. 6. 지원종료일이 24일인데 20일에 인재가 확정되었다면 얼른 마감공고를 내주세요. 20일 이후부터 지원한 사람들은 벙....쪄버릴 수 있습니다.서류합격 통보1. 합격통보야 기분좋은 일이니 '합투더격' 이라고 보내든 '합!격!' , '올?합격' 이라고 보내든 상관없으니 맘대로 보내도 좋지만, 보내는 사람 연락처는 다시 한 번 확인해주세요. 문자 보내는 순서도 좀..2. 중요한 건 합격 이후 일정통보입니다. 면접일정을 잡을 때는 닥치고 이 때 오렴..이 아니라 복수로 면접일정을 제공해주는 것이 좋습니다. 통보문자는 아래와 같이 보내봅시다.박창선님의 지원에 감사드리며, 다시 한 번합격을 축하드립니다. 이 후 면접일정에 대하여공지드리도록 하겠습니다.*면접일정-2018년 1월14일 15:00-16:00(약60분진행예정)-2018년 1월15일 15:00-16:00(약60분진행예정)양 일 중 편하신 일정을 알려주시면 감사하겠습니다.*면접장소서울특별시 강남구 서초동 000-0 혜성빌딩 3F *면접절차면접장소에 오셔서 15시 면접자라고 얘기해주시면 프론트에서대기실로 안내예정입니다. 기타 별도로 준비하실 사항은 없습니다.복장은 편한 복장도 무관합니다. 1차 면접은 실무진면접으로 이루어지며 지원하신 직무에 대한이해와 팀워크, 커뮤니케이션에 대한 아젠다입니다. *면접비용50,000원 / 현장지급 또는 계좌이체로 진행됩니다.면접 후 프론트에서 해당내용에 대한 안내가 있을 예정입니다.*기타문의면접에 대한 상세문의는 00-000-0000 담당자 누구씨에게해주시면 됩니다.4. 그리고 반드시 면접 전일 면접일정 재확인 문자와 함께 약도를 포함한 지도링크를 함께 보냅니다. 신입에게 뭐 이런 것까지 챙기나....라는 생각은 금물!!... 아직 우리 사원이 아닙니다. 심지어 우리 사원이어도 이런 생각은 안될 말이죠. 엄밀히 말하면 외부인에 대한 서비스이자, 우리 회사를 처음 경험하는 고객에게 제공하는 사용자경험입니다.5. 노쇼인원에겐 단호하게 불합격통보를 보내줍니다. 갠적으로 노쇼도 버릇인 것 같습니다. 이래저래 간보다가 그냥 쌩까고 안가는 인원들이 있는데, 불호령을 내려주도록 합시다.면접절차1. 편안한 복장은 좋지만 슬리퍼와 후즐근한 목티는 좀 아닌 듯 합니다. 한 회사의 대표가 인사는 커녕 눈도 안마주치고 슬리퍼 직직 끌면서 심지어 늦게 들어오는 건 일단..상식적으로 좀 아니지요.2. 기본적으로 면접은 피곤한 일이긴 합니다. 계속 새로운 사람과 끊임없이 비슷한 대화를 해야하는 것은 어려운 일이죠. 하지만, 기본적으로 자소서나 이력사항 정도는 읽어보고 와야 하는 게 예의입니다. 3. 면접질문은 정해진 것은 없지만 기본적으로 추궁이 아닙니다. 의금부에 끌려와 문책당하는 느낌의 질문, 그러니까 '왜 대학교때 공부 안하고 알바를 했어요? 그 땐 학자금을 받을 수도 있었을텐데요.' 와 같은 질문은 삼가도록 합시다. 우린 같이 일할 사람을 뽑는거지 신상털자는 게 아니니까요. 물론 대학교 때 일한 경험을 살려서 좋은 레퍼런스를 말하고 싶었다면 적힌 것만 물어보도록 합시다."대학교 시절 많은 알바를 했다고 하셨는데, 자세히 얘기해주실 수 있나요?" 라고 말입니다.4. 내가 할 말 다하고 너에게 질문할 시간을 주겠다...는 식의 면접은 사실상 너무 구시대적이고 권위적인 겁니다. 면접이란 것은 얼굴을 맞대고 서로 접한다라는 뜻이지, 널 평가하는 시간이 아닙니다. 서로에 대해 알아가기 위해선 면접자도 자유로운 질문이 보장되어야 합니다. 물론 대부분의 면접자는 돈을 받는 입장이니 강력하게 쫄아있을 겁니다. 자유롭게 질문하기 힘들겠죠. 면접을 진행하는 쪽에서 열린 질문들을 잘 던지는 것도 좋은 인재를 찾을 수 있는 방법 중 하나입니다.5. 일단 만나면 인사와 악수를 합시다. 눈 치켜뜨고 안경테를 잡는 행위는 흑백영화에서 많이 본 느낌입니다.6. 압박면접 등등이 있는데, 그런 경우라면 사전에 미리 얘기를 좀 해줍시다. 멋모르고 들어왔다가 멘탈이 탈탈 털렸는데, 불합격까지 주면 그건 압박면접이 아니라 그냥 진상입니다.  7. 면접이 끝나면 수고하셨습니다란 인사와 조심히 돌아가셔라, 결과는 개별통보로 언제까지 해드리겠다....는 정도의 얘기는 해줍니다. 사실 면접의 경험을 좌우하는 건 이런 사소한 것들에서 비롯됩니다. 8. 물 좀 가져다 줍시다.9. 다수 면접일 경우엔 질문을 공평하게 돌립니다. 그리고 사람 눈보고 얘기합시다.10. 참여자들의 문제해결형 면접이라면 발표자 한 사람에게 질문을 집중하는 것이 아니라, 각 인원들이 맡은 역할과 느낀 점들에 대해 동시에 물어봐야 합니다. 면접장에서의 문제해결과 현장에서의 업무처리는 그 결 자체가 다릅니다. 면접장은 경쟁을 전제로 하지만, 현장에선 협력과 깔끔하고 순탄한 흐름이 우선입니다. 면접장에서의 문제해결을 단편적으로 놓고 판단할 것이 아니라, 각 인원의 스타일과 감정이 현장에선 어떻게 드러날 지 유추하는 것이 목적입니다.11. 가끔 면접 자체를 파티 또는 이벤트로 구성해서 사내문화를 개성넘치게 보여주는 사례도 있어요. 뭐랄까..."와 역시 이 회사답다!" 라는 멘트를 절로 나오게 만드는 이벤트들이랄까요. 대기업은 정체성자체가 포괄적인지라 그런 고유한 색을 딱 보여주기 어렵지만 업무특성이 분명하거나 색깔이 아주 뚜렷한 브랜드, 스타트업 등에선 종종 보이는 모습입니다. 사실 이러한 이벤트는 행사라기 보단 일종의 세레모니같은 거라서 꼭 완벽하거나 대단할 필요도 없습니다. 서로 편하게 즐기고 솔직한 모습들로 마주하는 시간이니까요. 대표적인 사례로 피키캐스트를 들어볼까요. 일전에 페이스북에서 회자되었던 신입사원 몰카에서도 피키다운 키치함을 격렬하게 보여주었고 이번에 나온 회사소개 영상에서도 한결같은 문화를 어필하고 있습니다. 콘텐츠 회사인 만큼 개개인이 지니고 있는 색과 회사의 분위기를 하나의 이벤트로 경험케 하는 것이죠. 면접이나 회사소개도 하나의 콘텐츠가 되는 느낌이랄까요. 아마 신입사원들은 입사 첫 날부터 '아...내가 콘텐츠 회사에 들어왔구나!!' 라는 생각을 갖게 될 거예요.피키캐스트의 신입사원 환영이벤트https://www.youtube.com/watch?v=_GreS5OlEEQ<iframe width="700.000000" height="394.000000" src="//www.youtube.com/embed/_GreS5OlEEQ" frameborder="0" allowfullscreen="">웰컴투피키 Brand Film / 제공 : 피키캐스트https://www.facebook.com/pikipictures15/videos/1191357974291625/최종합격통보1. 최종입사통보는 입사일정협의와 함께 보냅니다. 2. 제출서류가 필요하다면, 어떤 서류를 언제까지 어디로 제출하면 되는 지를 구체적으로 공지해줍니다.3. 당일날 출근 시간과 장소, 소속팀 위치, 담당자연락처를 함께 보냅니다. 문을 열고 두리번 거리고 있으면 나도 너도 뻘쭘하니까요.자리에 앉았다.1. 일단 입사를 했고, 자리가 배정되었습니다. 자리는 전날 깔끔하게 치워주고 배선 정리해주고 랜선 뽑아주는 것이 좋은 것 같습니다... 처음 입사하면 그놈의 랜선 정리하느라고 오전을 다 보내더군요.. 그리고 입사통보할 때 개인컴퓨터의 지급여부와 아니라면 랜선 연결을 위한 어댑터(요즘엔 맥 등 C타입 USB포트가 제법 있어서 말입니다.)의 지참(또는 제공)등에 대한 정보도 함께 주면 좋을 듯 합니다.2. 툴킷을 짜잔. 필수는 아닙니다만, 요 근래 회사의 브랜딩을 위해 웰컴킷을 제작하여 제공하는 회사가 제법 있습니다. 얼마 전 회자되었던 티몬의 웰컴킷을 비롯하여, 펜타브리드나, 디지털다임 등 다양한 회사에서 독특하고 개성있는 웰컴킷을 제작하여 제공합니다. 정해진 틀은 없지만, 주로 사원증, 명함, OJT매뉴얼, 단체티, 사무용품(포스트잇, 펜, 메모장, 플래너, 캘린더, 도큐멘트 정리함) 등으로 구성하여 패키징하는 것이 보통입니다.티몬의 툴킷을 예로 들어볼께요. 아래 링크에서 자세한 내용을 확인해 보세요!https://brunch.co.kr/@creative/75 3. 멀뚱하게 있는...신입과 아무도 챙겨주지 않는 사람들의 모습을 엄청나게 자주 보았어요. 물론 뻘쭘하게 있는 사원도 문제지만, 뻘쭘하게 쳐다보고만 있는 사무실의 분위기도 좀 이상하긴 하죠. 보통 신입이 들어오면 소속팀이나 사수급, 또는 관리자급에서 직접 챙겨주도록 합시다. 일단 사무실 라운딩하면서 설명해주고각 인원들에게 인사시켜주고컴터에 공유네트워크 잡고, 랜선확인,프린터잡고직무설명해주고OJT일정이나 개별미팅일정 공지해주고점심먹고컴퓨터 셋팅 끝나면 결과보고서, 금년기획안, 프로세스진행리스트 공유해주면서 전체 업무파악하라고 하고 보고체계랑 업무시주의사항, 근로계약서 작성, 연봉/연차 등 계약내용 재확인 후 날인 이 정도 순서가 챡챡 지켜지면 좋은 수준의 입사프로세스이다....라고 박수를 챡챡 칠 수 있겠습니다.사실 모든 것이 너무 딱딱 맞아떨어지는 것도 좀 인간미없고 무섭긴 하지만, 그렇다고 모든 게 엉망인 게 좋다는 얘긴 아닙니다. 사람을 몇 시간이고 기다리게 하거나, 아무 공지도 안내도 없이 불친절한 과정을 경험하게 하는 등... 사실 이런 부분들은 사전에 미리 예방할 수 있는 수준입니다.  브랜드는 내부의 문화가 실체화되는 것이라고 했습니다. 내부의 문화는 대표와 직원과 환경이 함께 만들어가는 것이죠. 새로운 문화의 색을 더 할 귀한 인연을 새로 맞이하는 과정입니다. 새로운 문화의 색을 더 할 귀한 인연을 새로 맞이하는 과정입니다.완벽하진 않지만 따뜻함이 느껴지는 노력과 개성이 보이는 우리 회사만의 고유한 입구를 만들어놓는다면, 새로 들어오는 사람도 고개를 끄덕이며 우리의 색을 더욱 선명하게 만들어줄 거예요.
조회수 3802

KBS 분야별 업무소개 - 방송기술

KBS에 입사하면 수습기간을 통하여 방송기술 분야에 관련된 제반 업무를 익히게 됩니다. 방송기술직의 주요업무는 기술관리, 방송기술연구, 방송제작기술(TV제작기술, 중계기술, 라디오기술, 보도기술), 송출 및 송신기술 분야 등 크게 4가지 업무로 분류할 수 있는데 신입사원들은 수습기간 동안 이 업무에 대한 전반적인 오리엔테이션을 받게 됩니다기술관리 부문은 기술본부 조직의 핵심부서로서 기술기획·장비관리· 기술관리·기술협력 등 기술정책 수립 및 기술관련 업무를 총괄하고 있으며, 시설부문은 방송제작·송출·송신 시스템 구축을 위한 설계 및 시공 업무에 주력하고 있습니다. 방송망운용 부문은 방송품질을 최상의 상태로 유지관리 하기 위한 방송망 지원부서이며, 방송기기정비 부문은 방송장비에 대한 정비 및 검사 업무에 주력하고 있는 등 분야별로 전 문가들이 조직되어 있습니다.기술연구 부문에 있어 KBS는 국내방송사 중 유일하게 기술연구소를 보유하고 있으며, 방송방식, 기기, 영상부문 등 뉴미디어 및 디지털방송 시대에 필요한 제반 연구사업에 매진하고 있습니다. - 방송 서비스 기술 대화형 방송, 디지털 라디오 서비스- 디지털 콘텐츠 기술 IT기반 제작, 콘텐츠 저작권 보호- 방송 네트워크 기술 디지털 TV, 디지털 오디오 방송(DAB)- 기반 기술 입체TV, 오디오/비디오 신호처리, 실감 오디오/비디오 방송제작기술 부문은 TV제작기술, 중계기술, 라디오기술, 보도기술 분야로 구분할 수 있는데, 제작기술 스텝은 각 분야별 고유의 제작기법 과 상황에 따른 대처능력을 능숙하게 발휘할 수 있도록 프로그램의 내용을 명확히 파악하여각자 맡은 역할의 사전 준비를 철저히 해 두어 야합니다. 특히 TV 제작기술부문은 주로 연주소의 부조정실(녹화 및 생방송을 진행하는 곳)에서 근무하는데 이 곳에는 기술감독을 비롯한 영상, 음향, 녹화, 편집, 조명담당기술자 등이 하나의 기술스태프를 이루어 프로그램제작 업무에 종사하고 있으며, 신입사원에게 부여되는 최초의 업무는 대체로 음향과 조명기술 업무부터 시작하는 경우가 많습니다. 음향기술 담당은 오디오 MIXER와 마이크맨으로 나눌 수 있는데 오디오 MIXER가 되기 위해서는 일정기간 마이크맨 경력을 거쳐야 합니다. 특히 전문 오디오 MIXER가 되기 위해서는 다양한 장르의 음악적 재능 과 이해가 필요하며, 실전 경험을 통한 노하우가 중요하므로 입사후 오 랜 기간동안 꾸준한 노력이 요구되는 분야라고 할 수 있습니다. 평상시 장르별로 좋은 음악을 많이 듣고, 악기의 종류와 음질의 특성에 대해서도 관심을 갖고 준비해두면 입사 후 훌륭한 오디오MIXER가 될 수 있는 지름길이라고 생각합니다. 조명기술 담당은 훌륭한 영상미를 연출하기 위해서 미적감각과 예술적 감각을 동시에 겸비하고 있으면 업무수행에 유리합니다. 조명업무는 조명감독의 지휘를 받고 프로그램별 조명계획에 따라 스튜디오의 조명기구를 배치하여 녹화진행에 맞추어 조명의 밝기를 조정하는 업무를 수행합니다. 조명기술이 프로그램 장르별로 TV화면에 어떻게 연출되고 있는지에 대해서 관심있게 모니터 함으로써 빛과 색에 대한 이해를 높일 수 있 고, 또한 조명장비에 대한 발전 추세 및 동향에 대해서도 장비전시회 및 관련 서적을 통하여 관심있게 파악해 둠으로써 개인의 조명기술 능력을 향상시킬수 있습니다. 송출, 송신부서에 배치되면 KBS의 주조정실 또는 TV, R 송중계소 등 에서 현업근무를 하게 됩니다. 주조정실은 보도 및 제작부서에서 제작 된 프로그램이(VCR녹화 또는 생방송) 송·중계소로 전달되기 위해 연주소에서 마지막으로 송출되는 곳으로 방송사의 핵심시설이라고 할 수 있습니다. 방송국에서 송출된 신호는 전국에 설치된 송·중계소로 보내지고 이곳에 설치된 종단송신기를 최종적으로 거치면 해당 채널로 시청취자에게 전달됩니다. 송·중계소에서는 모든 방송 입·출력 신호를 최상의 상태로 유지하여, 최적의 방송품질을 관리 운용하는 업무를 수행하고 있습니다. 방송의 최종단이므로 방송사고에 대한 부담감을 갖고 있으나 시청취자에게 양질의 전파를 제공한다는 사명감으로 근무하고 있습니다. 송신기를 주로 다루므로 전자공학, 통신공학을 전공하면 업무수행에 많은 도움이 됩니다.#한국방송공사 #KBS #KBS공채 #직무정보 #직무소개
조회수 1218

[도떼기 비하인드 스토리] 1화 : 지극히 개인적인, 마켓

여러분은 중고 거래에 대해 어떻게 생각하시나요?혹시 '평화로운 그 곳'에서 물건을 사고 팔아본 경험이 있으신가요?꼭 익명의 인터넷 사이트 상이 아니라도 크고 작게, 누구나 한번쯤 해봤을 중고 거래.기억을 더듬어 보세요.오래 전 '아나바다'라는 슬로건이 성행하던 시절이 있었는데요. 단순히 아끼고 나누는 것 외에 같은 반 친구들, 한 동네 이웃들과 입지 않는 옷이나 사용하지 않는 물건 등을 바꿔 쓰고 다시 쓰는 알뜰살뜰하고도 가슴 따땃해지는 운동이었죠. 어디 그 뿐인가요? 매해 연말 '사랑나눔 바자회'라는 벼룩시장은 꿀같은 득템은 물론 수익금 일부가 사회 소외된 곳에 기부되어, 세상을 온화히 데우는 데에 동참할 수 있었던 좋은 장이었답니다.나에게서 의미를 잃은 것은 다른 이를 만나 가치를 되찾으며같은 방법으로 나 또한 누군가로부터 무의미해져 버린 것에서 새로운 가치를 찾는 것.도떼기마켓은 그 가치를 일깨우는 연장선 상에 있는 서비스입니다. 도떼기마켓은 보다 쉽고 편하며 안전한 중고 거래를 지향합니다. 당신 또한 우리를 통해 긍정과 호의의 중고 거래를 조우하길 소망합니다. 사람들로 하여금 새로운 라이프 스타일을 경험할 수 있도록 펼쳐진 너른 장이 되길 도떼기마켓은 기꺼이 자처합니다.지금부터 도떼기마켓의 탄생 비하인드 스토리들을 꺼내 들려 드리려고 합니다.이로써 당신의 생각 한켠에 자리한 중고 거래에 대한 인식이 이전보다 조금은 나아지길 기대해봅니다.' 중 고 '이거 지-인짜 좋은데... 뭐라 표현할 방법이 없거든요!1화 지극히 개인적인, 마켓 : '플리마켓'을 하다. '도떼기마켓'이 되다.도떼기마켓을 이야기하기 위해서는 플리마켓을 빼 놓을 수 없습니다.도떼기 플리마켓이 곧 도떼기마켓의 시작을 다지는 초석이었으니까요.# 도떼기마켓, 소박한 시작처음부터 계획을 갖고 시작된 서비스는 아니었습니다. 거창한 꿈이나 원대한 포부가 태초부터 존재했던 건 아니었죠.다만 옷장 속엔 입지 않는 옷이, 쓰지 않는 모자가, 메지 않는 가방이 있었습니다.흔히들 그렇듯, 인터넷 커뮤니티를 통해서 중고 거래를 추진했습니다. 사진을 찍고 가격을 고민합니다. 이래저래 토를 다는 상대방에 분노가 치밉니다. 택배비를 빼주네 마네 실갱이가 시작됩니다. 직거래 장소를 절충하는 과정에서 진이 빠집니다. 만나는 날과 시간을 정하는 것에서 혼이 나갑니다. 겨우 성사된 거래, 고대하던 택배 상자 안에 벽돌이 들어있습니다. 같잖은 물리적인 이유들로 용사의 정신력이 쇠퇴합니다.(-30)이럴바엔 차라리 직접 시장을 열어보면 어떨까하는 생각을 하게 됐죠. 곧장 마음 맞는 친구들을 불러 모아 작은 이벤트를 기획했습니다. 포스터도 만들어 붙이고, SNS와 자주 가는 인터넷 카페에 놀러오라는 글도 올리구요.# 제 1회 도떼기 플리마켓 in 이태원 경리단길2012년 10월 13일 토요일마음 맞는 친구들과 그 친구의 친구가 모여 11개의 노점을 펼쳤습니다. 이렇게 이태원 경리단길 골목에 '제 1회 도떼기 플리마켓'이 열리게 됐답니다.플리마켓을 열 장소를 물색하고 친구들을 불러 모으고 오고가는 손님들을 응대하며 내가 내놓은 물건에 담긴 사연을 누군가에게 들려주는 일. 새로운 상황을 경험하고 새로운 사람들과 이야기하는 것, 그 자체만으로도 충분히 즐거웠습니다. 필요없는 물건을 해치우겠다는 이글이글 불타는 완판의 욕망은 완전히 사라졌죠.단순한 재화의 거래가 전부인 시장통이 아니었어요.이건 페스티벌! yay!# 도떼기 플리마켓, 문화가 되다.플리마켓에 대한 반응은 예상보다 뜨거웠습니다.친구들과 그 친구의 친구, 또 그 친구의 친구 그리고 SNS와 커뮤니티에서 보고 놀러온 사람들까지... 많은 이들이 도떼기 플리마켓에 대한 관심과 지지를 보내주었습니다. 기대하지 못했던 열렬한 성원에 힘입어 한달 채 지나지 않은 같은 해 11월 3일, 같은 장소에서 제 2회 도떼기 플리마켓을 열게 됩니다. 물론 이번에도 거창한 의미는 없었습니다. 그저 즐겁게 모여, 유쾌한 교류와 소통을 꿰었습니다.몇 번의 플리마켓을 거치며 알게 된 중요한 사실. 도떼기 플리마켓에 방문하는 사람들은 단순히 옷만을 구입하러 오는 게 아니라는 거죠. 플리마켓 속 멈추지 않는 음악, 오가며 맛 볼 수 있는 달큰한 요깃거리, 좁은 골목을 오가는 이들 사이에 스치는 묘한 동지애, 텔레파시 같은 뭐 그런 거. 그런 짜릿함에 매료돼 플리마켓을 찾아오는 이들이 많다는 걸 알게 되었죠. 보다 더 즐겁고 유쾌한 플리마켓으로 거듭나기 위해 DJ 공연, 먹거리, 체험거리 등을 더해 갔습니다.이렇게 도떼기 플리마켓은 한 순간도 지루할 새 없는 옹골찬 축제로 거듭나게 됩니다.도떼기 플리마켓이 풍요로워지는 만큼, 이전엔 없던 새로운 목표를 하나 갖게 되었습니다.'플리마켓을 문화로 만들자!'다양한 트렌드와 스타일이 존재하고, 이를 기반으로 한 서로의 생각을 나누는 그 자체로의 문화. 플리마켓이 '당연'해진다면 중고 거래에 대한 세상의 시선도 변화할거라 믿고있고 이 생각은 지금도 변함없거든요.사사롭게 시작된 도떼기 플리마켓은 그렇게 도떼기마켓으로의 또 다른 걸음을 내딛기 시작하였습니다.다음 주, 도떼기마켓 비하인드 스토리 두 번째가 계속됩니다!#유니온풀 #도떼기마켓 #경험공유 #인사이트 #성장 #기업가치
조회수 1316

레진 기술 블로그 - 모두를 위한 설계. 레진 웹 접근성 가이드라인.

레진엔터테인먼트는 글로벌(한국, 일본, 미국) 서비스를 운영하고 있기에 다양한 사람들의 재능과 욕구에 관심이 있습니다. 우리는 웹 접근성에 관심을 기울여 조금 특별한 욕구를 가진 사람들의 문제를 해결하려고 합니다. 소수의 특별한 욕구는 모두의 욕구와 연결되어 있다고 생각하기 때문입니다.조금 특별한 욕구를 가진 사람WHO는 세계 인구의 15%에 해당하는 사람들이 장애가 있는 것으로 파악하고 있습니다. 그리고 보건복지부 장애인 실태조사에 따르면 후천적 장애 발생률은 90% 수준입니다. 이런 통계에 따르면 한 개인이 일생을 살면서 장애인이 되거나 일시적으로 장애를 체험하게 될 확률은 무려 13.5%나 됩니다.저는 적록 색약입니다. 약한 수준의 장애로 분류할 수 있죠. 채도가 낮은 상태의 적색과 녹색을 쉽게 구별하지 못합니다. 충전 중 적색이었다가 완충이 되면 초록색으로 변하는 LED가 박혀있는 전자제품은 전부 망했으면 개선하면 좋겠어요. 전 세계 남성의 8%가 색약이고, 여성은 0.5%가 색약입니다. 대부분 적록 색약이고 마크 저커버그도 적록 색약입니다. 만화가 이현세 선생님도 적록 색약이고요. 한편 색약인 사람은 빛의 밝고 어두움을 구별하는 능력이 뛰어난 것으로 밝혀져 있어 저격과 관측에 탁월한 능력을 발휘합니다. 숨어있는 저격수 빨리 찾기 게임을 해 보세요. 위장 사진 1, 위장 사진 2, 위장 사진 3. 색약인 사람이 이길 것입니다.전맹 시각장애인은 마우스 포인터와 초점을 볼 수 없으므로 키보드만을 사용해서 웹을 탐색합니다. 키보드와 음성 낭독에 의존하지만, 키보드 기능을 정말 잘 다루죠. 그래서 키보드 접근성 문제를 해결하면 시각장애인뿐만 아니라 키보드를 능숙하게 사용하는 사람들의 사용성이 높아집니다. 소수의 특별한 요구사항을 해결하는 것이 모두를 위한 설계와 연결되어 있습니다.결국, 누구에게나 특별히 다른 측면이 있고 그것을 고려할 때 "모두를 즐겁게 하라!"라는 우리의 좌우명에 한 걸음 더 가까워질 수 있다고 믿습니다.도저히 풀 수 없을 것 같은 숙제웹 접근성을 소개할 때 많이 듣는 질문이 있습니다.장애인이 우리 서비스를 이용해요?매출에 도움이 돼요?시간과 비용이 많이 필요하지 않아요?이 질문에 대한 제 대답은 다음과 같습니다.이용한다면 기쁠 것 같아요.큰 도움은 안 될 거예요.조금은 그렇죠. 하지만 반환이 있어요.레진코믹스와 같이 이미지 기반의 콘텐츠를 서비스하는데 웹 접근성을 준수하려고 노력한다는 것은 무모한 도전에 가깝습니다. 왜냐하면, 현재로서는 전맹 시각장애인 고려가 없고 논의조차 쉽지 않기 때문입니다.하지만 달에 갈 수 없다고 해서 일찌감치 체념할 필요는 없겠지요. 쉬운 문제부터 하나씩 풀어 나아가길 기대합니다. 로켓에 올라탔으니까 금방 갈 수 있지 않을까요?W3C 표준을 우리 언어로W3C에서는 WCAG 2.1이라는 웹 콘텐츠 접근성 지침을 제시하고 있고요. 국내 표준 KWCAG 2.1 또한 있습니다. 국내 표준은 W3C 표준에서 중요도가 높은 항목을 우리 언어로 정리한 것이기 때문에 결국 어떤 지침을 선택해서 따르더라도 괜찮습니다.하지만 표준 문서는 너무 장황하고 전문 용어가 많아 다양한 분야 전문성을 가진 직원들과 함께 보기에는 한계가 있다고 생각했습니다. W3C 표준을 근간으로 하되 비전문가도 15분 정도면 읽고 이해할 수 있을 만큼 정리된 문서가 필요했고 레진 웹 접근성 가이드라인 사내 표준을 제안하고 공개하게 됐습니다.의미를 전달하고 있는 이미지에 대체 텍스트를 제공한다.전경 콘텐츠와 배경은 4.5:1 이상의 명도 대비를 유지한다.화면을 400%까지 확대할 수 있다.키보드만으로 조작할 수 있다.사용할 수 있는 충분한 시간을 제공한다.발작을 유발하는 콘텐츠를 제공하지 않는다.반복되는 콘텐츠 블록을 건너뛸 수 있다.모든 문서의 제목은 고유하고 식별할 수 있다.링크와 버튼 텍스트는 콘텐츠의 목적을 알 수 있다.섹션에는 의미있는 마크업과 헤딩이 있다.문서의 휴먼 랭귀지 속성을 제공한다.문맥 변경은 예측할 수 있다.폼 콘트롤 요소에 설명을 제공한다.실수를 예방하고 정정하는 것을 돕는다.HTML 문법을 준수한다.WCAG 2.1 지침의 1.1.1 항목 예를 들어 볼게요.All non-text content that is presented to the user has a text alternative that serves the equivalent purpose, except for the situations listed below. 사용자에게 제공되는 모든 텍스트 아닌 콘텐츠는 아래 나열된 상황을 제외하고 같은 목적을 수행하는 대체 텍스트를 제공한다.원문 표현보다 아래와 같이 다듬은 표현이 좋다고 보는 것이죠.의미를 전달하고 있는 이미지에 대체 텍스트를 제공한다.물론 사내 지침은 너무 단순하게 표현했기 때문에 지침마다 ‘부연 설명, 관련 예시, 기대 효과, 관련 표준, 평가 도구’ 텍스트와 링크를 간략하게 제공하고 있습니다. 사실상 W3C 표준에 대한 링크 페이지라고 생각해도 괜찮습니다. 사실이 그런걸요.맺음말레진 웹 접근성 가이드라인은 사내 유관 부서 담당자분들께 공유하고 동의를 얻어 사내 지침으로 결정하고 공개할 수 있게 됐습니다. 긍정적으로 검토해 주신 사우님들 감사합니다.레진 웹 접근성 가이드라인은 W3C 표준을 요약한 버전에 불과하므로 누구라도 복제(Fork), 개선 요청(Pull Requests), 문제 제기(Issues)할 수 있습니다."Design for all, amuse everyone!"
조회수 87

타인의 스트레스

#3안녕하세요. STRESS IN SEOUL입니다. 이곳에 들어오려면 암호가 필요합니다. 요즘 당신을 힘들게 하는 스트레스를 1분 동안 깊게 생각해주세요. 우리는 거기서부터 시작할 겁니다. 그럼 문을 열고 들어오세요.“나를 괴롭히는 스트레스라... 너무 많은데? “  두근거리는 마음으로 문을 노크했다.똑똑“네, 들어오세요.”작지만 나긋한 여자의 목소리가 들렸다.조심스럽게 문을 열어보니 어두침침했던 복도와는 달리 환한 빛이 쏟아져 들어왔다. 끼이익 소리와 함께 열린 문 안에서는 새파란 청귤 냄새가 났다. 작년에 제주에 갔을 때 귤 농장 옆에 딸려있는 작은 커피숍에 들어갔었는데, 주인아주머니가 손수 담근 것이라며 내어주셨던 청귤차를 떠오르게 하는 상큼한 시트러스 향이었다. 그제야 아침에 일어나서 아무것도 먹지 않았다는 사실이 떠올랐다. 마른침을 꿀꺽 삼키며 입을 열었다. “저기요...”“안녕하세요. STRESS IN SEOUL입니다. “친구가 3시 30분에 예약을 했다고 하더라고요.”“네. 박소연 님으로 예약하셨죠?” “네. 제 친구인데, 좀 늦는다고 해서 저만 먼저 왔어요.”    “네. 기다리고 있었어요. 소파에 편안히 앉으셔서 긴장을 풀고 준비가 되면 앞에 놓인 카드를 열어보세요. 그런데 이상하게도 여자의 목소리는 들리는데, 어디 있는 건지 보이지가 않았고, 내 앞에는 푹신해 보이는 소파와 작은 탁자 하나가 덩그러니 놓여있었다. 한참을 두리번거리면서 오느라 꽤 긴장했던 탓인지 다리에 피로가 몰려와서 일단 소파에 앉았다. 소파는 생각했던 것보다 더 푹신했다. 탁자 위에는 작은 모래시계와 봉투가 하나 놓여있었는데, 아마도 이걸 열어보라는 얘기 같았다. ‘아니 말로 설명해주면 될걸 뭘 또 읽어보래...’ 입으로는 구시렁대면서도 손으로는 봉투를 집어 들고 이미 열어보고 있었다. 불평이 가득해도 시키는 것은 또 곧 잘 해내는 성격이 여기서도 어김없이 발휘되고 있었다. 내 별명이 괜히 투덜이 스머프인 것이 아니다. 봉투 안에는 포스트잇 한 묶음과 함께 쪽지가 한 장 들어있었다.  모래시계를 뒤집고 요즘 당신을 힘들게 하는 스트레스를 1분 동안 깊게 생각한 뒤, 눈앞에 놓여있는 포스트잇에 당신의 스트레스를 적어주세요. 한 장에 한 개씩 적어서, 벽에 붙여주세요. 벽을 가득 채워도 괜찮습니다. - 제한 시간 9분 -포스트잇에는 “What is your stress?”라고 적혀있었고, 모래시계 위에는 ‘3 minute’이라고 적혀있었다. 제한 시간이 10분도 아니고 5분도 아니고 9분이라는 건, 모래시계를 세 번 뒤집으면 나올 수 있는 시간이어서인가? 그럼 차라리 9분짜리 모래시계를 샀으면 한 번만 뒤집으면 됐잖아. 왜? 9분짜리 모래시계는 찾기가 어려운가? 9분이 어때서 3분짜리도 있는데 9분짜리쯤은 있을 법도 한 거 아니야? 별 쓸데없는 걸 다 계산했네 하며 피식 웃음이 났지만, 하라는 것은 안 하고 별 쓸데없는 것에 에너지를 쏟고 있는 건 사실 나였다. 그날도 그랬다. 쓸데없이 호기심이 많은 것이 가장 큰 문제였다. 세심한 관찰력이 숨어있던 호기심에 발동을 걸어버리면 혼자서 납득이 될 때까지 꼬리에 꼬리를 무는 생각이 펼쳐지는 것을 도저히 막을 수가 없었다. 그렇게 핵심을 놓쳐버리는 것이 한두 번이 아니었다. 면접날도 그랬다. 그래. 가만 생각해보니 내가 중요한 날이라고 생각했던 날에는 어김없이 머릿속에서 이런 짓을 벌였다. 면접장 앞에 앉아서 순서를 기다리며 외웠던 내용들을 머릿속으로 되뇌며 덜덜 떨고 있는데, 기둥 옆에 하늘색 체크무늬가 있는 손수건이 떨어져 있는 것을 발견한 것이다. 손수건은 다리미로 4번쯤 접혀있는 것으로 보니 누군가 곱게 다려서 가방에 넣은 것 같은데 무슨 이유에서인지 모르게 바닥에 툭 떨어져 있었다. 요즘 누가 손수건을 갖고 다니지? 여자? 남자? 잔 체크무늬가 반복되는 걸 보면 남자일 가능성도 높다. 손수건을 접힌 모양을 보니 손에 들고 있다가 떨어뜨린 것 같은 느낌도 든다. 누군가에게 전해주려고 들고 있다가 놓친 걸까? 누구? 여자? 어쩌면 그 사람은 감기가 걸렸을지도 모른다. 아니면 땀이 많은 사람일 수도 있겠지.. 그러나 어떤 사람이 주인이었든 간에 그것은 나의 면접의 통과 여부와는 아무런 관련이 없는 일이었다. 면접관이 내게 어떤 질문을 할지 예상문제를 달달 외우고 있어도 모자랄 천금 같은 시간에 나는 왜 그런 쓸데없는 생각을 계속했던 것일까. 그래. 그것은 회피였다. 나는 그저 그 순간을 벗어나서 다른 세상에 가고 싶었던 것이다. 타조가 위험한 상황에서 머리만 묻고 그 상황을 모면하려는 것처럼. 딱 그 불안한 타조가 바로 나였다. 머릿속이 복잡했다. 근데 이 여자는 어디에 있는 걸까? 왜 나와보지 않는 걸까? 궁금한 것들이 투성이었지만, 이미 내 손은 포스트잇을 만지작거리고 있었다. 모래시계를 뒤집고 포스트잇을 한 장 뜯어서 그간 나를 괴롭혀왔던 스트레스들을 떠올려봤다. 생각할수록 어찌나 많은지 내 스트레스만으로도 벽 한쪽을 다 채울 수 있을 것만 같았다. 그래 일단 하나만 써보자. 그동안 내 마음속을 헤집고 있었던 스트레스 하나를 포스트잇에 빠르게 휘갈겨 쓰고는 고개를 들어 벽을 보니 중학교 때나 봤던 것 같던 순서도가 그려져 있었다. 시작 스트레스를 받았는가? YES지금 나를 힘들게 하는 스트레스들을 다 적어보자YES 순서도를 눈으로 따라가 보니 초등학교 앞 떡볶이집 벽에 빼곡하게 붙어있던 포스트잇들처럼 이미 다른 사람들의 스트레스들이 붙어있었다.아... 내가 처음이 아니었구나... 갑자기 스트레스를 적으라니 속내를 들키는 것 같아서 두려웠는데, 생면부지 타인들이 적어놓은 스트레스들을 보니 왠지 모르게 마음이 놓였다. 모래시계를 한 번 더 뒤집고 천천히 남들의 스트레스들을 감상해보기로 했다.소설 STRESS IN SEOUL의 3번째 글입니다. 이 소설은 곧 현실이 됩니다.스트레스컴퍼니는 당신과 나의 스트레스를 해소하기 위해 태어났습니다. 당신이 스트레스에 굴복하지 않고, 즐겁게 극복할 수 있도록 세상에 없던 상품을 만들고 매달 마음을 나누는 모임을 진행합니다. 함께 성장하는 감정 멤버 1기를 모집합니다. 링크를 참조하세요. www.stresscompany.net https://www.facebook.com/stresscompany/ⓒ스트레스컴퍼니 - 무단 전재-재배포 금지
조회수 1172

안드로이드 클라이언트 Reflection 극복기

비트윈 팀은 비트윈 안드로이드 클라이언트(이하 안드로이드 클라이언트)를 가볍고 반응성 좋은 애플리케이션으로 만들기 위해 노력하고 있습니다. 이 글에서는 간결하고 유지보수하기 쉬운 코드를 작성하기 위해 Reflection을 사용했었고 그로 인해 성능 이슈가 발생했던 것을 소개합니다. 또한 그 과정에서 발생한 Reflection 성능저하를 해결하기 위해 시도했던 여러 방법을 공유하도록 하겠습니다.다양한 형태의 데이터¶Java를 이용해 서비스를 개발하는 경우 POJO로 서비스에 필요한 다양한 모델 클래스들을 만들어 사용하곤 합니다. 안드로이드 클라이언트 역시 모델을 클래스 정의해 사용하고 있습니다. 하지만 서비스 내에서 데이터는 정의된 클래스 이외에도 다양한 형태로 존재합니다. 안드로이드 클라이언트에서 하나의 데이터는 아래와 같은 형태로 존재합니다.JSON: 비트윈 서비스에서 HTTP API는 JSON 형태로 요청과 응답을 주고 받고 있습니다.Thrift: TCP를 이용한 채팅 API는 Thrift를 이용하여 프로토콜을 정의해 서버와 통신을 합니다.ContentValues: 안드로이드에서는 Database 에 데이터를 저장할 때, 해당 정보는 ContentValues 형태로 변환돼야 합니다.Cursor: Database에 저장된 정보는 Cursor 형태로 접근가능 합니다.POJO: 변수와 Getter/Setter로 구성된 클래스 입니다. 비지니스 로직에서 사용됩니다.코드 전반에서 다양한 형태의 데이터가 주는 혼란을 줄이기 위해 항상 POJO로 변환한 뒤 코드를 작성하기로 했습니다.다양한 데이터를 어떻게 상호 변환할 것 인가?¶JSON 같은 경우는 Parsing 후 Object로 변환해 주는 라이브러리(Gson, Jackson JSON)가 존재하지만 다른 형태(Thrift, Cursor..)들은 만족스러운 라이브러리가 존재하지 않았습니다. 그렇다고 모든 형태에 대해 변환하는 코드를 직접 작성하면 필요한 경우 아래와 같은 코드를 매번 작성해줘야 합니다. 이와 같이 작성하는 경우 Cursor에서 원하는 데이터를 일일이 가져와야 합니다.@Overridepublic void bindView(View view, Context context, Cursor cursor) { final ViewHolder holder = getViewHolder(view); final String author = cursor.getString("author"); final String content = cursor.getString("content"); final Long timeMills = cursor.getLong("time"); final ReadStatus readStatus = ReadStatus.fromValue(cursor.getString("readStatus")); final CAttachment attachment = JSONUtils.parseAttachment(cursor.getLong("createdTime")); holder.authorTextView.setText(author); holder.contentTextView.setText(content); holder.readStatusView.setReadStatus(readStatus); ...}하지만 각 형태의 필드명(Key)이 서로 같도록 맞춰주면 각각의 Getter와 Setter를 호출해 형태를 변환해주는 Utility Class를 제작할 수 있습니다.@Overridepublic void bindView(View view, Context context, Cursor cursor) { final ViewHolder holder = getViewHolder(view); Message message = ReflectionUtils.fromCursor(cursor, Message.class); holder.authorTextView.setText(message.getAuthor()); holder.contentTextView.setText(message.getContent()); holder.readStatusView.setReadStatus(message.getReadStatus()); ...}이런 식으로 코드를 작성하면 이해하기 쉽고, 모델이 변경되는 경우에도 유지보수가 비교적 편하다는 장점이 있습니다. 따라서 필요한 데이터를 POJO로 작성하고 다양한 형태의 데이터를 POJO로 변환하기로 했습니다. 서버로부터 받은 JSON 혹은 Thrift객체는 자동으로 POJO로 변환되고 POJO는 다시 ContentValues 형태로 DB에 저장됩니다. DB에 있는 데이터를 화면에 보여줄때는 Cursor로부터 데이터를 가져와서 POJO로 변환 후 적절한 가공을 하여 View에 보여주게 됩니다.POJO 형태로 여러 데이터 변환필요Reflection 사용과 성능저하¶처음에는 Reflection을 이용해 여러 데이터를 POJO로 만들거나 POJO를 다른 형태로 변환하도록 구현했습니다. 대상 Class의 newInstance/getMethod/invoke 함수를 이용해 객체 인스턴스를 생성하고 Getter/Setter를 호출하여 값을 세팅하거나 가져오도록 했습니다. 앞서 설명한 ReflectionUtils.fromCursor(cursor, Message.class)를 예를 들면 아래와 같습니다.public T fromCursor(Cursor cursor, Class clazz) { T instance = (T) clazz.newInstance(); for (int i=0; i final String columnName = cursor.getColumnName(i); final Class<?> type = clazz.getField(columnName).getType(); final Object value = getValueFromCursor(cursor, type); final Class<?>[] parameterType = { type }; final Object[] parameter = { value }; Method m = clazz.getMethod(toSetterName(columnName), parameterType); m.invoke(instance, value); } return instance;}Reflection을 이용하면 동적으로 Class의 정보(필드, 메서드)를 조회하고 호출할 수 있기 때문에 코드를 손쉽게 작성할 수 있습니다. 하지만 Reflection은 튜토리얼 문서에서 설명된 것처럼 성능저하 문제가 있습니다. 한두 번의 Relfection 호출로 인한 성능저하는 무시할 수 있다고 해도, 필드가 많거나 필드로 Collection을 가진 클래스의 경우에는 수십 번이 넘는 Reflection이 호출될 수 있습니다. 실제로 이 때문에 안드로이드 클라이언트에서 종종 반응성이 떨어지는 경우가 발생했습니다. 특히 CursorAdapter에서 Cursor를 POJO로 변환하는 코드 때문에 ListView에서의 스크롤이 버벅이기도 했습니다.Bytecode 생성¶Reflection 성능저하를 해결하려고 처음으로 선택한 방식은 Bytecode 생성입니다. Google Guice 등의 다양한 자바 프로젝트에서도 Bytecode를 생성하는 방식으로 성능 문제를 해결합니다. 다만 안드로이드의 Dalvik VM의 경우 일반적인 JVM의 Bytecode와는 스펙이 다릅니다. 이 때문에 기존의 자바 프로젝트에서 Bytecode 생성에 사용되는 CGLib 같은 라이브러리 대신 Dexmaker를 이용하여야 했습니다.CGLib¶CGLib는 Bytecode를 직접 생성하는 대신 FastClass, FastMethod 등 펀리한 클래스를 이용할 수 있습니다. FastClass나 FastMethod를 이용하면 내부적으로 알맞게 Bytecode를 만들거나 이미 생성된 Bytecode를 이용해 비교적 빠른 속도로 객체를 만들거나 함수를 호출 할 수 있습니다.public T create() { return (T) fastClazz.newInstance();} public Object get(Object target) { result = fastMethod.invoke(target, (Object[]) null);} public void set(Object target, Object value) { Object[] params = { value }; fastMethod.invoke(target, params);}Dexmaker¶하지만 Dexmaker는 Bytecode 생성 자체에 초점이 맞춰진 라이브러리라서 FastClass나 FastMethod 같은 편리한 클래스가 존재하지 않습니다. 결국, 다음과 같이 Bytecode 생성하는 코드를 직접 한땀 한땀 작성해야 합니다.public DexMethod generateClasses(Class<?> clazz, String clazzName){ dexMaker.declare(declaringType, ..., Modifier.PUBLIC, TypeId.OBJECT, ...); TypeId<?> targetClassTypeId = TypeId.get(clazz); MethodId invokeId = declaringType.getMethod(TypeId.OBJECT, "invoke", TypeId.OBJECT, TypeId.OBJECT); Code code = dexMaker.declare(invokeId, Modifier.PUBLIC); if (isGetter == true) { Local<Object> insertedInstance = code.getParameter(0, TypeId.OBJECT); Local instance = code.newLocal(targetClassTypeId); Local returnValue = code.newLocal(TypeId.get(method.getReturnType())); Local value = code.newLocal(TypeId.OBJECT); code.cast(instance, insertedInstance); MethodId executeId = ... code.invokeVirtual(executeId, returnValue, instance); code.cast(value, returnValue); code.returnValue(value); } else { ... } // constructor Code constructor = dexMaker.declare(declaringType.getConstructor(), Modifier.PUBLIC); Local<?> thisRef = constructor.getThis(declaringType); constructor.invokeDirect(TypeId.OBJECT.getConstructor(), null, thisRef); constructor.returnVoid();}Dexmaker를 이용한 방식을 구현하여 동작까지 확인했으나, 다음과 같은 이유로 실제 적용은 하지 못했습니다.Bytecode를 메모리에 저장하는 경우, 프로세스가 종료된 이후 실행 시 Bytecode를 다시 생성해 애플리케이션의 처음 실행성능이 떨어진다.Bytecode를 스토리지에 저장하는 경우, 원본 클래스가 변경됐는지를 매번 검사하거나 업데이트마다 해당 스토리지를 지워야 한다.더 좋은 방법이 생각났다.Annotation Processor¶최종적으로 저희가 선택한 방식은 컴파일 시점에 형태변환 코드를 자동으로 생성하는 것입니다. Reflection으로 접근하지 않아 속도도 빠르고, Java코드가 미리 작성돼 관리하기도 편하기 때문입니다. POJO 클래스에 알맞은 Annotation을 달아두고, APT를 이용해 Annotation이 달린 모델 클래스에 대해 형태변환 코드를 자동으로 생성했습니다.형태 변환이 필요한 클래스에 Annotation(@GenerateAccessor)을 표시합니다.@GenerateAccessorpublic class Message { private Integer id; private String content; public Integer getId() { return id; } ...}javac에서 APT 사용 옵션과 Processor를 지정합니다. 그러면 Annotation이 표시된 클래스에 대해 Processor의 작업이 수행됩니다. Processor에서 코드를 생성할 때에는 StringBuilder 등으로 실제 코드를 일일이 작성하는 것이 아니라 Velocity라는 template 라이브러리를 이용합니다. Processor는 아래와 같은 소스코드를 생성합니다.public class Message$$Accessor implements Accessor { public kr.co.vcnc.binding.performance.Message create() { return new kr.co.vcnc.binding.performance.Message(); } public Object get(Object target, String fieldName) throws IllegalArgumentException { kr.co.vcnc.binding.performance.Message source = (kr.co.vcnc.binding.performance.Message) target; switch(fieldName.hashCode()) { case 3355: { return source.getId(); } case -1724546052: { return source.getContent(); } ... default: throw new IllegalArgumentException(...); } } public void set(Object target, String fieldName, Object value) throws IllegalArgumentException { kr.co.vcnc.binding.performance.Message source = (kr.co.vcnc.binding.performance.Message) target; switch(fieldName.hashCode()) { case 3355: { source.setId( (java.lang.Integer) value); return; } case -1724546052: { source.setContent( (java.lang.String) value); return; } ... default: throw new IllegalArgumentException(...); } }}여기서 저희가 정의한 Accessor는 객체를 만들거나 특정 필드의 값을 가져오거나 세팅하는 인터페이스로, 객체의 형태를 변환할 때 이용됩니다. get,set 메서드는 필드 이름의 hashCode 값을 이용해 해당하는 getter,setter를 호출합니다. hashCode를 이용해 switch-case문을 사용한 이유는 Map을 이용하는 것보다 성능상 이득이 있기 때문입니다. 단순 메모리 접근이 Java에서 제공하는 HashMap과 같은 자료구조 사용보다 훨씬 빠릅니다. APT를 이용해 변환코드를 자동으로 생성하면 여러 장점이 있습니다.Reflection을 사용하지 않고 Method를 직접 수행해서 빠르다.Bytecode 생성과 달리 애플리케이션 처음 실행될 때 코드 생성이 필요 없고 만들어진 코드가 APK에 포함된다.Compile 시점에 코드가 생성돼서 Model 변화가 바로 반영된다.APT를 이용한 Code생성으로 Reflection 속도저하를 해결할 수 있습니다. 이 방식은 애플리케이션 반응성이 중요하고 상대적으로 Reflection 속도저하가 큰 안드로이드 라이브러리에서 최근 많이 사용하고 있습니다. (AndroidAnnotations, ButterKnife, Dagger)성능 비교¶다음은 Reflection, Dexmaker, Code Generating(APT)를 이용해 JSONObject를 Object로 변환하는 작업을 50번 수행한 결과입니다.성능 비교 결과이처럼 최신 OS 버전일수록 Reflection의 성능저하가 다른 방법에 비해 상대적으로 더 큽니다. 반대로 Dexmaker의 생성 속도는 빨라져 APT 방식과의 성능격차는 점점 작아집니다. 하지만 역시 APT를 통한 Code 생성이 모든 환경에서 가장 좋은 성능을 보입니다.마치며¶서비스 모델을 반복적으로 정의하지 않으면서 변환하는 방법을 알아봤습니다. 그 과정에서 Reflection 의 속도저하, Dexmaker 의 단점도 설명해 드렸고 결국 APT가 좋은 해결책이라고 판단했습니다. 저희는 이 글에서 설명해 드린 방식을 추상화해 Binding이라는 라이브러리를 만들어 사용하고 있습니다. Binding은 POJO를 다양한 JSON, Cursor, ContentValues등 다양한 형태로 변환해주는 라이브러리입니다. 뛰어난 확장성으로 다양한 형태의 데이터로 변경하는 플러그인을 만들어서 사용할 수 있습니다.Message message = Bindings.for(Message.class).bind().from(AndroidSources.cursor(cursor));Message message = Bindings.for(Message.class).bind().from(JSONSources.jsonString(jsonString));String jsonString = Bindings.for(Message.class).bind(message).to(JSONTargets.jsonString());위와 같이 Java상에 존재할 수 있는 다양한 타입의 객체에 대해 일종의 데이터 Binding 기능을 수행합니다. Binding 라이브러리도 기회가 되면 소개해드리겠습니다. 윗글에서 궁금하신 점이 있으시거나 잘못된 부분이 있으면 답글을 달아주시기 바랍니다. 감사합니다.저희는 언제나 타다 및 비트윈 서비스를 함께 만들며 기술적인 문제를 함께 풀어나갈 능력있는 개발자를 모시고 있습니다. 언제든 부담없이 [email protected]로 이메일을 주시기 바랍니다!
조회수 791

스타트업을 위한 AARRR(해적지표) 개념잡기

AARRR, 스타트업에 종사하거나 그로스 해킹에 관심 있으신 분이라면 한 번쯤은 들어본 용어일 것입니다.  그런데 이걸 뭐라 읽어야 할지, 정확히 무슨  용어인지 궁금해 하시는 분들이 계실 것 같아서 AARRR(해적지표)에 대해서 함께 살펴보는 시간을 마련 하였습니다.1. ‘AARRR’이란?이 용어는 미국의 스타트업 엑셀러레이터인 500 Startups의 설립자인 데이브 맥클루어(Dave McClure)가 개발한 분석 프레임워크입니다. 스타트업은 아이디어를 바탕으로 서비스(상품)를 만드는 데 능숙하지만, 서비스를 효과적으로 사람들에게 알리고 사용자를 꾸준히 확보하기 위한 개선방법에 대해서는 고민이 많습니다. AARRR은 시장 진입 단계에 맞는 특정 지표를 기준으로 우리 서비스의 상태를 가늠할 수 있는 효율적인 기준이 됩니다. 수많은 데이터 중 현 시점에서 가장 핵심적인 지표에 집중할 수 있게 함으로써, 분석할 리소스(인력이나 시간)가 충분하지 않은 스타트업에게 매력적인 프레임워크라고 할 수 있습니다.2. AARRR 단계별 핵심 지표Acquisition : 어떻게 우리 서비스를 접하고 있는가Activation : 사용자가 처음 서비스를 이용할 때 긍정적인 경험을 제공하는가Retention : 이후의 서비스 재사용률은 어떻게 되는가Referral : 사용자가 자발적 바이럴, 공유를 일으키고 있는가Revenue : 최종 목적(매출)으로 연결되고 있는가약어를 살펴보면 사용자가 서비스를 접하고 우리가 원하는 매출을 일으키기까지의 전체적인 과정을 크게 5단계로 분석한다고 볼 수 있는데요, 그럼 각 단계별로 실제 어떤 지표를 살펴봐야 하는지 보겠습니다. Acquisition → DAU, MAU, New UserAcquisition은 사용자를 획득하는 단계로, 서비스 안정화를 거친 후 시장 진입을 위해 공격적인 마케팅을 할 때 집중하는 지표입니다. 여러 채널을 통해 얼마나 많은 사용자가 유입되고 있는지, 신규 사용자는 얼마나 획득했는지 등을 파악합니다. 적은 비용으로 높은 볼륨을 일으키는 채널이 좋은 채널이라 할 수 있습니다.Activation → Bounce Rate, Avg.PV, Avg.Duration, Signup사용자가 서비스를 이용하기도 전에 이탈하는 비율은 얼마나 되는지, 서비스 이용을 시작했다면 이후의 engagement는 어떻게 되는지 등을 파악합니다. Bounce Rate(반송률)는 첫 페이지에서 서비스를 종료한 비율로, 부정적 사용자 경험을 나타내는 지표입니다.Retention → Retention Rate사업 초기 단계에서 가장 중요한 지표 중 하나가 바로 Retention입니다. Retention Rate은 서비스의 만족도를 가장 잘 대변하는 지표로, 서비스 만족도가 높다면 꾸준한 사용으로 높은 재사용률을 나타낼 것입니다. 반대로 재방문율이 낮으면 해당 서비스는 오랫동안 존속하기 힘듭니다. 이럴 경우 낮은 Retention을 끌어올리기 위한 푸시, 메일링, 리뉴얼 등의 다양한 노력이 필요합니다.Referral → Channel, SNS Share Rate최근 신규 앱을 받아 설치한 경험이 있으신가요? 설치하는 데 영향을 끼친 것은 무엇이었나요? 아마 지인의 추천을 통해 설치하는 경우가 다수일 것입니다. 이미 사용자 디바이스에 설치된 앱은 포화상태이기 때문에, 지인의 추천이 아니면 새로운 앱을 설치할 이유도, 목적도 쉽게 제시하지 못하는 상황입니다. 그렇기 때문에 서비스가 안정화되고 성장하는 단계에서 중요한 데이터가 바로 Referral입니다. 우리 서비스가 어디에 얼마나 공유되고 있으며, 그 채널로 인해 얼만큼의 사용자를 다시 확보하는지 등을 살펴봐야 합니다. 결국 Referral 단계는 Acquisition과 맞물려 선순환을 만들게 됩니다.Revenue → Conversion서비스가 존속하기 위해서는 분명한 수익모델이 있어야 합니다. 이를 판단하는 지표는 서비스마다 다르겠지만, 서비스를 이용하는 사용자의 Conversion Rate를 높이는 것이 목표인 것은 동일할 것입니다.*각 지표 별 자세한 분석 방법과 예시가 궁금하다면 아래 내용을 참조해주세요.모바일 데이터 분석의 시작: AARRR (해적지표)결론AARRR은 허무 지표(Vanity Metrics, 총 방문수 등)에 시간을 쏟기 보단 실행 지표(Actionable Metrics)에 집중함으로 개선의 방향을 잡고 최적화할 수 있도록 돕는 분석 프레임워크라고 볼 수 있습니다. AARRR과 같이 Actionable한 데이터를 제공하는 와이즈트래커를 통해 보다 많은 기업이 통찰력 있는 데이터 기반의 실행으로 높은 퍼포먼스를 내길 기대합니다.(Dave McClure의 AARRR 문서 보기 : http://www.slideshare.net/dmc500hats/startup-metrics-for-pirates-long-version) 
조회수 27415

꽤 멋진 사업계획서 쉽게 쓰는 법

실화에 기반한 이야기다.2013년의 어느 날, 기억은 잘 안 나지만 어떤 창업지원 사업에 참여하기 위해 사업계획서를 써야 할 일이 있었다. 그러나, 창업하겠다고 집을 나온 지 1년이 다되어 가던 그 시기에도 나는 사업계획서를 어떻게 쓰는 것인지 몰랐다. 아무리 검색해봐도 감도 안 잡혔고, 크몽에서 사업계획서 템플릿 같은 것을 사서 다운로드하였는데 너무 형식적 이어 보여서 마음에 안 들었다.결국, 나보다 사업을 먼저 시작해서 무려 고려대 산학협력센터에 입주했던 친구인 아우름플래닛의 김진우 대표를 찾아가서 사업계획서 쓰는 법을 물어봤다. 내 기억에는 무슨 태블릿 같은 거 들고 와서 빠르게 보여줬던 것 같은데 너무 빨리 지나가서 제대로 보지도 못했다. 결국 내 사업계획서는 개판이 났다. 처음 사업을 해보는 입장에서 사업계획서를 제대로 쓰기는 너무 어려워 보였다. 이제 몇 년이 지나서야 사업계획서를 어떻게 쓰는지 조금이나마 감이 왔을 정도다. 이제는 솔직히 창업자마다 개성이 있어서 사업계획서도 전혀 다른 방식으로 전개되어야 한다고 생각한다. 오히려, 나는 요즘 사람들이 천편일률적인 사업계획서를 무슨 이력서, 자소서 마냥 쏟아내는 것에 반대한다. 어떤 사람들은 커리어와 기술력에 설득력이 실릴 수도 있고, 어떤 사람들은 열정과 패기에 실릴 수도 있겠다. 당연히 나는 대학을 중퇴하고 창업을 했으니 후자였다. 근데, 그렇다고 해도 빠져서는 안 될, 매력적인 사업계획서라면 필수적으로 가지고 있어야 할 요소들은 분명히 존재한다. 무엇을 강조하느냐, 어떤 순서로 배치할 것이냐가 달라질 뿐이다.그래서 공개하려 한다. 꽤 괜찮은 사업계획서 쓰는 법! 우리 회사는 한화 S&C 드림플러스와 킹슬리 벤처스, 두 차례에 걸쳐 투자를 유치한 바 있다. 또, 투자 외에도 비글로벌, 독일 베를린 등에서 많은 사업 발표를 하며 느낀 것들을 모두 반영했다. 특히, 독일에서 만난 '피칭 닥터'라는 사람은 내가 본 사람 중에 사업 발표 설계를 가장 잘 하는 사람이었고 그 사람에게서도 많은 걸 배울 수 있었다.이 템플릿대로 아웃라인을 잡으면 꽤 멋진 사업계획서를 써볼 수 있다고 확신한다. 사업계획서 순서는 자신이 매력적이라고 생각하는 포인트대로 나열해서 스토리라인만 맞추면 된다. 중요한 것은 Core concept다. 사업의 Concept만 분명하면 투자자나 사업계획서를 열람하는 사람들마다 호불호는 있겠지만, 분명히 그 콘셉을 믿어줄 수 있는 사람이 생긴다. 하지만 Concept이 모호하면, 1억 명을 보여줘도 동조하는 사람을 찾기 힘들다. 그래서 콘셉이 중요하다. 대부분 사람들이 말도 안 되는 소리라고 할 지라도 뭐든 아주 '정확하고 단순하고 강력하게' 전달하는 것이 핵심이다. 그래야 1%의 팬이라도 생긴다.1. 문제정의 및 증거자료2. 해결책3. 제품 소개 사진/프로토타입 영상4. 이 제품이 있기 전과 후의 세상 비교5. 실제 시장에서의 사업성과 (서비스 전이면 잠재고객 반응)6. 시장 크기 및 증거자료7. 경쟁자 분석8. 제품(서비스) 포지션9. 수익화 전략(사업모델)10. 목표로 하는 성장/매출11. 성장/매출 목표를 위해 달성되어야 하는 중간 마일스톤들12. 이러한 마일스톤을 달성하기 위해 필요한 자금, 사용처13. 회사(팀) 소개 및 경쟁력14. 회사 비전그럼 이러한 개요를 어디서 짜 보면 좋을까?비캔버스의 '사업계획서' 템플릿을 이용하면 이런 콘셉을 매우 쉽고 빠르게 만들어 볼 수 있다.비캔버스에서 바로 만들어볼 수 있는 '사업계획서' 템플릿. 이미 만들어진 템플릿에 그냥 빈 공간 채우면서 아웃라인을 쭉 그리면 된다. 이거 한 번 작성해놓으면 사업계획서든 피치 덱이든 용도에 맞게 뚝딱뚝딱 만들 수 있다. 그리고, 사업 중 수정사항이 생기면 이 아웃라인을 수정해서 나머지 자료들에 반영하면 된다.이렇게 안 하면, 사업계획서가 서로 다른 버전이 너무 많이 나온다. 중요한 건 코어 콘셉트를 유지하고 보완해야 한다는 것이다. 그 뿌리를 관리하지 않으면 사업계획서가 뒤죽박죽 엉켜버린다. 어떤 건 '문제' 부분이 기똥차고 어떤 부분은 '시장성' 부분이 기똥차다던지, 그렇다고 두 개를 잇기에는 연결고리가 없는.. 그런 이상하고 짜증 나는 상황이 펼쳐진다.핵심은 뿌리다.식물 키우듯 뿌리를 잘 관리해야 한다. 허리가 튼튼해야 인간이 튼튼하듯, 사업계획서도 뿌리(콘셉)가 튼튼해야 유지 보수하고 용도에 맞게 새로 작성하기도 편하다.이렇게 사업계획서를 작성하는 게 꼭 투자를 받거나 피칭대회에 나가기 위한 것은 아니다. 창업자 스스로 사업을 간단하게 정의하기에 사업계획서는 아주 좋은 도구가 된다. 뿐만 아니라, 팀원들과 공유하면 회사의 공통의 목표와 방향대로 사업을 전개할 수 있어 기가 막히다.만약에 이 템플릿을 차곡차곡 모두 채웠음에도 불구하고, 머릿속에 사업이 정의가 되지 않거나 사업계획서를 어떻게 써야 할지 막막한 사람이 있다면 내 손에 장을 지지겠다. 하나하나 채워나가는 게 어려울 뿐이지 한 번 채워서 코어 콘셉트를 완성하고 나면 머릿속이 정리가 안 될 수가 없다. 그리고 이 템플릿에 있는 내용들 만으로도 사업계획서를 볼 사람들이 사업에 대한 많은 궁금증들을 해결할 수 있게 될 것이다. 이렇게 만든 캔버스를 지인들에게 공유해서 코멘트를 받아보는 것도 좋은 선택일 것 같다. 비캔버스에 '비회원'이 코멘트를 달 수 있게 공유하는 기능이 있으니 적극 활용하여 사업을 성공으로 이끌어보자!아~ 내가 처음 창업할 때 이런 게 있었으면 기가 막히게 쉽게 사업계획서를 작성했을 텐데!사업계획서 템플릿 미리보기 :https://beecanvas.com/s/f4b06b
조회수 2406

매력뿜뿜 초긍정주의, 박윤혜 총괄 디자이너

안녕하세요. 써티입니다.이제 사내인터뷰를 다시 시작합니다!작년 12월에 마지막 사내인터뷰를 올리고 나서, 써티컷의 수난(?)과 비욘드펀드의 탄생 등 정말 많은 일들이 있었어요. 그래서 제가 언론홍보 하느라 바쁘기도 하고 인터뷰 대상자 분들께서도 넘나리 바빴기 때문에 사내인터뷰를 못했었는데요. 이제 새식구들도 많이 들어왔고 새 사업도 시작했으니 새로운 맘으로 다시 시작해보려고 해요.첫 주인공은 박윤혜 디자이너입니다.1. 비욘드플랫폼에서 어떤 일을 맡고 계시나요?비욘드펀드 및 써티컷의 디자인 전반을 총괄하고 있습니다. 운영부분도 맡고 있는 웹디자이너라고 생각하시면 되는데요. 스토리보드를 바탕으로 홈페이지를 디자인하고 개발팀과 협업하는 일, 투자상세 페이지를 만들거나, 상품 관련 다양한 온라인 광고를 제작하는 일을 하고 있습니다. 원래는 혼자 디자인 작업을 다 했었는데 요즘 현아님(이제 곧 인터뷰 예정)이 오셔서 한결 편해졌어요.2. 비욘드플랫폼에 합류하기 전에는 어떤 일을 하셨나요?온라인 광고회사에서 앱 서비스를 만드는 일을 중심으로 웹/앱 서비스를 디자인 했습니다.3. 윤혜님 같은 디자이너를 그러면 ‘웹 디자이너’라고 하나요?디자이너도 종류가 많은데요. 인쇄나 출력쪽의 편집디자이너가 있고 웹 UI디자인, 운영 디자인을 하는 디자이너가 있고, 온라인 광고를 담당하는 프로모션 디자이너도 있고요. 온라인 화면 설계 쪽에 가까운 UX 디자이너도 있습니다. 지금 우리 회사에는 썹님(베일에 싸인 또 한명의 남자 디자이너)이 주로 UX 디자인을 하시고, 제가 웹/운영 디자인을 하고 현아님이 마케팅/프로모션 디자인을 한다고 생각하시면 됩니다.4. 비욘드플랫폼에는 어떻게 합류하게 되셨나요?디자이너를 뽑는다는 채용공고를 보고 맨 처음 찾아봤던게 블로그였어요. 블로그에서 좋은 인상을 많이 받았어요. 일관적인 브랜딩에 대한 중요성을 알고 있는 것 같아서 인상적이었어요. 회사 분위기도 좋아보였고, 무엇보다 스타트업인데도 불구하고 전문가들이 많은 것 같더라고요. 스타트업은 보통 대표를 포함해서 젊은 사람들의 비중이 높잖아요. 그런데 비욘드플랫폼은 대표님도 삼일회계법인 임원 출신의 실력있으신 분이시고 다른 팀장님들도 스펙이 빵빵하더라고요. 그 부분에서 믿음이 갔고 써티컷 사업도 굉장히 매력적이었어요. 지금 안타깝게도 출시를 못하고 있지만 출시만 되면 정말 유망한 비즈니스라고 생각해요. 아! 그리고 마케팅팀장인 한팀장님 인상이 좋았던 것도 한 몫했어요^^5. 비욘드플랫폼은 핀테크 회사잖아요. 전에도 금융에 관심이 많으셨나요?금융이라고 하기에는 뭔가 거창하고 재테크에는 관심 많았어요. 주식도 해봤고요. 지금 비욘드펀드 상품을 비롯해 P2P에도 투자하고 있고요. 주식은 손해를 봤지만…(많이는 아니고 코트 한벌 값 정도?) P2P로 재테크 열심히 해서 만회하려고요.6. 재테크에 관심있는 20대 여성으로서 P2P투자라는건 어때요?저는 긍정적으로 봐요. 보통 투자에 대해서 잘 모르는 사람들은 PB를 찾아가거나 재테크 카페에서 정보를 얻어야 하는데 굉장히 한정되어 있거든요. 시간과 노력도 많이 들고 쉽지 않잖아요. 그런데 P2P투자는 플랫폼 회사들이 상품을 면밀히 분석해서 홈페이지나 페이스북, 블로그 등에 자세히 올려주기 때문에 투자자 입장에서는 접근이 쉽죠. 투자 장벽도 낮고요. 그래서 앞으로도 P2P금융 시장은 더욱 성장할거라고 봐요.넘나 예쁜 캐릭터 (치킨이 포인트: 윤혜님의 주먹거리를 반영하여...)7. 그런데 이제 P2P 가이드라인이 시행되잖아요? 한 업체당 1년에 천만원 밖에 투자를 못하게 되는데요.너무 안타까워요. 위에 말했듯이 자산가나 전문투자자가 아닌 개인들이 가장 간편하게 투자를 할 수 있는게 P2P금융인데, 한 업체당 천만원 밖에 투자를 못한다고 하면 너무 적죠. 흥칫뿡입니다ㅋㅋㅋ8. 눈여겨보고 있는 P2P 상품군이 있다면?확실히 재미있는 상품이 끌려요. 얼마전에 다른 P2P플랫폼 회사에서 에비츄라는 캐릭터 관련 투자상품이 있었어요. 너무 하고 싶더라고요. 저는 에비츄 짱팬이라. 이런 관여도가 높은 상품이 확실히 눈에 띄는 것 같아요. 관심 있으면 투자 상품도 더 눈여겨서 분석하게 되고요. 요즘에는 이런 재밌는 상품들이 많이 나와서 보는 재미가 쏠쏠합니다.  9. 디자이너로서 비욘드펀드에서 해보고 싶은게 있나요?지금 비욘드펀드 홈페이지가 반응형으로 제작되어 있는데요, 모바일에서의 편리한 화면 구성을 좀더 고민할 필요가 있다고 생각해요. 그래서 리뉴얼 때 그 부분을 많이 반영하려고 합니다. 그리고 딱딱한 투자 상품들이 2,30대의 젊은 층들에게도 잘 어필될 수 있도록 다양한 디자인적인 시도도 하려고 노력합니다. 실제로 현아님과 비욘드펀드만의 멋진 페이지 구성을 위해서 논의 중이에요.10. 디자이너니까.. 급 회사 인테리어에 대해 물어보고 싶어졌어요(뜬금). 우리 사무실 인테리어 어때요?너무 좋아요. 만족스러워요. 일단 건물이 새건물이라 깨끗하잖아요. 한 층 다 쓰니까 저희 공간도 넓고요. 사무실이 너무 넓어서 약간 휑해 보이는 공간도 있는데 시간이 나면 인테리어를 해볼 생각입니다. 조명을 많이 달고, 포스터도 제작해서 붙이고 싶어요. 비욘드펀드의 효자상품들을 포스터로 만들어서 명예의 전당처럼 붙여놓으면 좋을 것 같아요.  11. 지금 회사가 새로운 복지제도를 만들고 있는 중인데 바라는 점이 있다면?재미있는 회식을 했으면 좋겠어요. 그리고 일주일에 한번은 한시간씩 일찍 퇴근하면 좋겠….. 너무 과한가?ㅋㅋㅋ 만약 그렇게 되면 조기퇴근하는 날 아침부터 행복할 것 같아요. 그리고 영화를 보거나 문화생활을 즐기는 문화데이가 있으면 좋겠어요.12. 기업문화 측면에서 비욘드펀드의 좋은점은?팀장-사원간에 격이 없어요. 다른 스타트업과 다르게 팀장님들의 나이대가 아주 젊은 편은 아닌데도 의견을 잘 들어주시고 착하세요. 그리고 복장 자유로운 것도 좋아요. 팀장님은 반삭도 하시고 수염도 기르시고…… 자유로운 분위기인 것 같아요.13.  올해 개인적인 목표가 있다면?살을 엄청 빼려고요. 그냥 빼는게 아니라 엄청! 10키로 빼는게 목표인데 가능할지는 모르겠지만…... 헬스를 시작해보려고 합니다. 화이팅!#비욘드플랫폼서비스 #비욘드펀드 #팀원 #팀원소개 #인터뷰 #팀원인터뷰 #사내문화 #조직문화 #기업문화
조회수 2500

JANDI 검색엔진 도입기

이번 포스트에서는 JANDI가 검색엔진을 도입하게 된 배경과 어떤 작업을 했는지 공유하려고 합니다검색엔진 도입 배경JANDI는 사용자가 입력한 메시지를 검색하고 사용자가 올린 파일의 파일명/파일 타입을 검색하는 메시지/파일 검색 기능을 제공하고 있습니다. 데이터 저장소로 MongoDB를 사용하고 있는데 검색되는 필드에 인덱스를 걸고 정규 표현식을 이용하여 DB Like 검색(“DB는 검색을 좋아한다”아니에요;;)을 하고 있습니다.초기에는 데이터가 아담했는데, 서비스가 커감에 따라 사용자 증가하면서 생성되는 데이터도 많아졌습니다. 올 초에 데이터가 많아지면서 검색이 DB에 부하를 주고, JANDI 서비스에도 영향을 주게 되었습니다. 그래서 JANDI 서비스용 MongoDB와 검색 전용 MongoDB를 분리했는데 이는 임시방편이었고 언젠가는 꼭 검색엔진을 도입하자며 마무리를 지었습니다.시간은 흘러 흘러 4월이 되었습니다. 당시 메시지 증가량을 봤을 때 올해 안에 검색엔진을 사용하지 않으면 서비스에 문제가 될 거라고 판단이 되어 도입을 진행하게 되었습니다.검색엔진 도입의 목표는 다음과 같았습니다.현재 DB Like 검색과 비슷한 검색 품질이어도 좋다. (일정때문에)검색엔진 도입을 통해 검색이 JANDI 서비스에 영향을 주지 않도록 한다.색인을 위해서 주기적으로 JANDI의 MongoDB 데이터를 가져 와야 했지만, 이 작업이 JANDI 서비스에 큰 부하를 주지 않을 거라고 생각했습니다.검색엔진 후보로는 Solr, ElasticSearch, CloudSearch, ElasticSearch Service 가 있었는데 Solr를 선택했습니다.왜냐하면제가 경험한 검색엔진이 Solr 였습니다. 더군다나 2010년 초에 접했던 Solr 비해 많이 발전한 것 같아 개발자로서의 열정과 도전 욕구가 샘솟았습니다. SolrCloud pdf, WhyNoWarAWS에서 제공하는 검색 서비스는 많은 부분을 관리해준다는 면에서 솔깃했지만, Custom Analyzer는 적용할 수 없어서 선택하지 않았습니다.ElasticSearch에 크게 흔들렸지만 경험이없다 보니 공부하면서 프로젝트를 진행한다는 부담감이 커서 다음을 기약했습니다.작업 내용1. MongoImporter, Sharding. MongoImporter 수정현재 JANDI는 MongoDB를 데이터 저장소로 사용하고 있습니다. MongoDB의 데이터를 색인하기 위해 데이터를 검색엔진으로 가져와야 하는데 Solr에서는 DataImportHandler 기능을 제공하고 있습니다. 기본 DataImportHandler로 RDB 데이터는 가져올 수 있지만 이 외 MongoDB나 Cassandra 같은 NoSQL의 데이터를 가져오기 위해서는 따로 구현이 필요합니다. 구글신에게 물어봐서 SolrMongoImporter 프로젝트를 찾았는데 문제가 있었습니다. mongo-java-driver 버전이 낮아서(2.11.1) 현재 JANDI에서 서비스 되고 있는 MongoDB(3.0.x)의 데이터를 가져올 수 없었습니다.url: Reference compatibility MongoDB Java2.11.1에서 3.2.2로 버전을 올리고 변경된 api를 적용하는 작업, 빌드 툴을 ant에서 maven으로 변경하는 작업을 하였습니다. 마음의 여유가 된다면 P/R을 할 계획입니다.여담으로 DataImportHandler 작업과 함께 검색 schema 정하는 작업을 했는데 sub-document 형식이 필요하게 되었습니다. Solr 5.3부터 nested object를 지원한다는 article을 보았는데, nested object 지원 얘기를 보니 Solr도 text search 뿐 아니라 log analysis 기능에 관심을 가지는건 아닐까 조심스레 생각해봤습니다. (역시나… 이미 banana, silk 같은 프로젝트가 있습니다. Large Scale Log Analytics with Solr 에 관련된 이야기를 합니다.). Sharding. 그리고 Document Routing대량의 데이터를 처리하기 위해 한 개 이상의 node로 구성된 데이터 베이스에 문서를 나누어 저장하는 것을 sharding이라고 합니다. SolrCloud는 shard 생성/삭제/분리할 수 있는 API가 있고, 문서를 어떻게 나눌지 정할 수 있습니다. 어떻게 나눌지는 shard 생성 시 router.name queryString에 개발한 router 이름을 적어주면 됩니다. 그렇지않으면 Solr에서 murmur Hash 기반으로 문서를 나누는 compositeId router를 사용합니다. JANDI의 검색 기능은 Team 단위로 이루어지기 때문에 TeamId를 기준으로 문서를 나누기로 하고, compositeId Router를 사용했습니다. 실제 서비스의 문서 데이터를 색인 돌려서 각 node에 저장되는 문서 개수나 메모리/디스크 사용량을 확인했는데 다행히도 큰 차이가 나지 않았습니다.하나의 문서는 TeamId와 MessageId를 조합한 “TeamId + ! + MessageId” 값을 특정 field에 저장하고 해당 필드를 uniqueKey 지정했습니다. 간단한 수정으로 문서 분배가 되는점이 좋았고, 더 좋았던건 검색시 _route_ 를 이용해서 실제 문서가 존재하는 node에서만 검색을 한다는 점이 었습니다. 4년 전 제가 마지막으로 Solr를 사용했을 때는 사용자가 직접 shards queryString에 검색할 node를 넣어주어야 했습니다..../select?q=\*:\*&shards=localhost:8983/solr/core1,localhost:8984/solr/core1SolrCloud RoutingSolrCloud Routing2Multilevel CompositeId2. analyzer, queryParser. analyzerSolr에 기본으로 있는 text_cjk analyzer를 사용하였습니다. <!-- normalize width before bigram, as e.g. half-width dakuten combine --> <!-- for any non-CJK --> text_cjk는 영어/숫자는 공백/특수기호 단위로 분리해주고 cjk는 bigram으로 분리해주는 analyzer 입니다. analyzer는 이슈 없이 완성될 거라 생각했지만 오산이었습니다. 텍스트가 들어오면 token을 만들어주는 StandardTokenizerFactory 에서 cjk와 영어/숫자가 붙어있을 때는 분리하지 못해 원하는 결과가 나오지 않았습니다. 또한 특수기호중에 ‘.’(dot), ‘_‘(underscore)가 있을 때에도 분리하지 못했습니다.nametextInputTopic검색개선_AB1021_AB제시CD.pdfStandardTokenizerFactoryTopic검색개선_AB1021_AB제시CD.pdfCJKWidthFilterFactoryTopic검색개선_AB1021_AB제시CD.pdfLowerCaseFilterFactorytopic검색개선_ab1021_ab제시cd.pdfCJKBigramFilterFactorytopic검색개선_ab1021_ab제시cd.pdf원하는 결과topic 검색개선 ab 1021 ab 제시 cd pdf그래서 색인/검색 전에 붙어있는 cjk와 영어/숫자사이에 공백을 넣어주고 ‘.’와 ‘_‘를 공백으로 치환해주는 작업을 하였습니다. 색인은 Transform에서 처리하고 검색은 다음에 알아볼 QParserPlugin에서 처리했습니다.nametextInputTopic검색개선_AB1021_AB제시CD.pdfTransform 단계Topic 검색개선 AB 1021 AB 제시 CD pdfStandardTokenizerFactoryTopic 검색개선 AB 1021 AB 제시 CD pdfCJKWidthFilterFactoryTopic 검색개선 AB 1021 AB 제시 CD pdfLowerCaseFilterFactorytopic 검색개선 ab 1021 ab 제시 cd pdfCJKBigramFilterFactorytopic 검색개선 ab 1021 ab 제시 cd pdf※ 추가 : 검색 결과를 보여줄때 어떤 키워드가 매칭되었는지 Highlight 해야했는데, 색인하기 전에 원본을 수정을 해서 Solr에서 제공하는 Highlight를 사용하지 못하게 됐습니다. 눈 앞의 문제만 바라보고 해결하기 급급했던 저를 다시금 반성하게 되었습니다.. queryParser앞에서도 언급하였지만, 색인뿐만 아니라 검색할 때도 검색어가 입력되면 검색하기 전에 붙어있는 cjk와 영어/숫자를 분리하고 ‘.’, ‘_‘를 공백으로 치환해주는 작업이 필요합니다. Solr에서 기본으로 사용하는 LuceneQueryParserPlugin 을 수정하였습니다.@Override public Query parse() throws SyntaxError { // 수정한 코드 String qstr = splitType(getString()); if (qstr == null || qstr.length() == 0) return null; String defaultField = getParam(CommonParams.DF); if (defaultField == null) { defaultField = getReq().getSchema().getDefaultSearchFieldName(); } lparser = new SolrQueryParser(this, defaultField); lparser.setDefaultOperator (QueryParsing.getQueryParserDefaultOperator(getReq().getSchema(), getParam(QueryParsing.OP))); return lparser.parse(qstr); } QParserPlugin3. DataImportHandler manageMongoImporter에서도 얘기했지만 Solr에서는 DB 데이터를 가져오는 DataImportHandler 기능을 제공 하고 있습니다. DataImportHandler Commands를 보면 총 5개의 명령을 제공하고 있는데, 그중 색인을 실행하는 명령은 full-import와 delta-import입니다. full-import 명령은 DB의 모든 데이터를 색인 하는 것을 말합니다. 색인 시작할 때의 시간을 conf/dataimport.properties에 저장하고 이때 저장한 시간은 delta-import 할때 사용됩니다. 전체 색인한다고 말합니다. delta-import 명령은 특정 시간 이후로 생성/삭제된 데이터를 색인 하는 것을 말합니다. 특정 시간이란 full-import 시작한 시간, delta-import가 최근 종료한 시간을 말합니다. full-import와는 다르게 delta-import가 종료된 시간을 conf/dataimport.properties에 저장합니다. 증분 색인 혹은 동적 색인이라고 하는데 여기서는 증분 색인이라고 얘기하겠습니다. 두 명령을 이용하여 JANDI의 메시지/파일을 색인 하기 위한 삽질 경험을 적었습니다.. 첫 번째 삽질full-import는 현재 active인 데이터를 가져올 수 있도록 query attribute에 mongo query를 작성하고, delta-import 는 특정 시간 이후에 생성된 데이터를 가져올 수 있도록 deltaQuery attribute에 mongo query를 작성합니다. 또한 deltaQuery로 가져온 id의 문서를 가져올 수 있도록 deltaImportQuery attribute에 mongo query를 작성하고, 특정 시간 이후에 삭제된 데이터를 가져올 수 있도록 deletedPkQuery 에도 mongo query를 작성합니다.<!-- data-config.xml --> <?xml version="1.0" encoding="UTF-8" ?> 정상적으로 동작은 했지만, 색인 속도가 실제 서비스에 적용하기 힘들 정도였습니다. 실행되는 mongo query를 확인했는데 다음과 같이 동작하였습니다.특정 시간 이후에 생성된 데이터를 색인하기 위해 약 (새로 생성된 문서개수 + 1) 번의 mongo query가 실행되었습니다. (batch size와 문서 갯수에 따라 늘어날 수도 있습니다.) 메신저 서비스 특성상 각각의 문서 크기는 작지만 증가량이 빠르므로 위 방식으로는 운영 할 수 없었습니다. 그래서 delta-import using full-import 를 참고해서 두 번째 삽질을 시작 하였습니다.. 두 번째 삽질full-imoprt 명령을 실행할 때 clean=false queryString을 추가하고 data-config.xml query attribute를 수정하는 방법으로 증분 색인 하도록 수정했습니다. 특정 시간 이후 생성된 문서를 가져오는 attribute인 deltaQuery와 deltaImportQuery 는 필요가 없어 지웠습니다.<!-- data-config.xml --> <?xml version="1.0" encoding="UTF-8" ?> <!-- if query="" then it imports everything --> 전체 색인은 /dataimport?command=full-import&clean=true 로 실행하고, 증분 색인은 /dataimport?command=full-import&clean=false(생성된 문서)와 …/dataimport?command=delta-import&commit=true(삭제된 문서)로 실행하도록 했습니다.정상적인 것 같았지만, 문제가 있었습니다.full-import, delta-import 명령을 실행하면 conf/dataimport.properties 파일에 전체 색인이 실행한 시작 시각 혹은 증분 색인이 최근 종료한 시간이 “last_index_time” key로 저장됩니다. 첫 번째 삽질에서 증분 색인시 delta-import 명령 한 번으로 생성된 문서와 삭제된 문서를 처리했지만, full-import와 delta-import 두개의 명령으로 증분 색인이 동작하면서 생성된 문서를 처리할 때도 last_index_time이 갱신되고 삭제된 문서를 처리할 때도 last_index_time이 갱신되었습니다.예를 들면증분색인 동작이 1분마다 삭제된 문서를 처리하고, 5분마다 생성된 문서를 처리 한다고 가정해보겠습니다. 3시 13분 14초에 delta-import가 완료되어 last_index_time에 저장되고, 다음 delta-import가 실행되기 전 3시 13분 50초에 full-import가 완료되어 last_index_time이 갱신되었다면, 3시 13분 14초부터 3시 13분 50초 사이에 삭제된 문서는 처리를 못 하는 경우가 발생합니다.Solr에서 dataimport.properties에 기록하는 부분을 수정하는 방법과 전체/증분 색인을 동작시키는 Solr 외부에서 특정 색인 시간을 관리하는 방법이 있었는데 Solr를 수정하는 건 생각보다 큰 작업이라 판단되어 외부에서 관리하는 방법으로 세 번째 삽질을 시작하였습니다.. 세 번째 삽질전체/증분 색인을 주기적으로 동작 시키는 곳에서 full-import&clean=false(생성된 문서) 처리할 때 필요한 마지막으로 색인 된 문서 id와 delta-import(삭제된 문서) 처리할 때 필요한 마지막으로 색인 된 시간을 관리하도록 개발하였습니다. 증분 색인 시 full-import&clean=false를 실행하기 전에 현재 색인 된 마지막 id 조회 후 해당 id보다 큰 데이터를 처리하도록 하였고, delta-import를 마지막으로 마친 시간을 따로 저장하다가 delta-import 실행 시 해당 시간을 전달하는 방법으로 수정하였습니다.<!-- data-config.xml --> <?xml version="1.0" encoding="UTF-8" ?> 마치며튜닝의 끝은 순정이라는 말이 있는데 IT 기술은 예외인 것 같습니다. 현재는 Solr의 기본 기능만으로 구성했지만, 고객에게 더 나은 서비스를 제공할 수 있는 시작점으로 생각하고, JANDI 서비스에 맞게 끊임없이 발전해나가겠습니다.감사합니다.참고Getting Started with SolrApache Solr 5.5.0 Reference Guide PDFApache Solr 6.1 - Analyzers, Tokenizers and FiltersRebalance API for SolrCloud issueYonik Blog#토스랩 #잔디 #JANDI #개발자 #개발팀 #개발후기 #인사이트

기업문화 엿볼 때, 더팀스

로그인

/