2014년 12월 18일 목요일

기년회 준비를 위한 생각 정리

2년전 AC2라는 과정을 통해 애자일을 배우게 되었다. 그리고 AC2 라는 모임에 소속하게 되었는데 올해는 "기년회"라는 것에 참석하기로 하였다.

"기년회"에 대한 것은 "망년회 대신 기년회"라는 글을 참조하면 자세한 것을 알 수 있을 것이다. 간단히 말하면 올한해에 대한 회고인 셈이다.

이번 기년회에서는 사전 미션이 있다. 아래의 질문중 공유하고 싶은 3가지에 대하여 답을 준비해 가는 것이다.

  1. 올해 잘 산 물건?
  2. 올해 좋았던 책?
  3. 올해 좋았던 장소?
  4. 올해 인상 깊었던 사람은?
  5. 올해 고마웠던 분은?
  6. 올해 좋았던 영화는?
  7. 올해 꾸준히 했던 것들은?
  8. 올해 의외의 성공은? (내 예상보다 훨씬 더 잘된 일들)
  9. 올해 잘 쓴 10만원 이하의 소비는?
  10. 올해 좋았던 모임?
  11. 올해 큰 실수?
  12. 올해 눈물이 나왔던 순간?
  13. 올해 뿌듯했던 일은?
  14. 올해 새롭게 접한 것은? 
  15. 올해 나 답지 않았던 순간은? 
  16. 올해 기분 좋았던 경험은?
  17. 올해 당황스러웠지만 잘 대처했던 순간?
  18. 올해 왠지 모르겠지만 그냥 떠오르는 순간은?
  19. 올해 미뤄오다가 해치워서 속 시원한 일은?
  20. 올해 가슴에 남는 명언은?
  21. 올해 칭찬을 받았던 일은?
  22. 올해 내가 만든 것?
  23. 올해 수련한 것?
  24. 올해 나에게 도움된 습관?
어떤 질문에 대한 답을 공유하면 좋을지 고민도 할겸 답변도 마련해 둘겸 정리해 보려고 한다.

가장 먼저 답변을 정리해 볼 것은 "1. 올해 잘 산 물건?" 이다.

답변은 "맥북 프로" 이다. 취미이자 직업은 프로그래머로써 좋은 도구를 구매하게 된 것이다. 참고로 기존에 쓰던 것은 맥북 에어였다. 에어로도 적당했지만 좀 더 다양한 것을 해보려고 하니 작게 느껴져 업그레이드하게 되었다. 기존에 동네 공터에서 맨땅 축구를 했다면 맥북 프로는 그래도 잔디가 깔린 멋진 구장이 된것이다. 물론 월드컵 운동장 처럼 좋은 것은 아니다. 맥프레(맥북 프로 레티나)를 만나면서 몇가지 새로운 도전을 하게 되었다. APM 만드는 일에도 도전해보고 최근 유행하는 Cloud 환경 구축도 해보고하면서 기술적인 역량을 늘릴 수 있었다. 아쉽게도 성과를 내지 못했지만 많은 것을 학습 할 수 있었다. 그리고 좋았던 점은 다양한 무료 어플리케이션으로 생활 리듬을 만드는 일에 도움을 받았다. 도커를 이용해서 로컬 위키를 만들어 기술 정보를 기록하기도 하였고, 원더리스트로 할일 관리도 하였다. 물론 웹에서 무료로 사용할 수 있는 서비스들이 많으나 public 한것보다 private 한 것이 조금은 마음의 안정감을 주었기 때문에 앱을 많이 이용하였다. 남들이 볼 때 크게 차이가 없겠지만 맥북을 사용하는 것은 좋은 장남감을 항상 지니고 다닐 수 있기 때문에 언제나 놀거리가 있고 그것들이 한곳에 집중되어 있어 나로써는 즐거운 시간을 늘 가질 수 있었다.
여튼 맥북은 올해 나를 성장시켜준 도구 중의 하나인 셈이다.

두번째 답변은 "올해 큰 실수?" 에 대한 답변이다.

올해 가장 큰 실수는 지금도 수습중인 타인의 욕망을 쫓아 회사를 옮기려했던 점이다. 먼가 많이 배우고 멋지게 일할 수 있는 회사에서 일하고 싶었다. 사용자 트래픽이 많아 어플리케이션을 튜닝하고 복잡한 엔터프라이즈 어플리케이션을 만드는 일을 하고 싶었다. 여러 곳에 이력서를 넣고 면접 과정을 거쳤다. 준비 없이 가서 망신 당한 적도 있고, 이후 잘 준비해서 합격한 곳도 있다. 나의 레벨보다 더 많은 것을 요구하는 곳에 도전해서 멘붕이 된 적도 있다. 하지만 준비 과정에서 내가 타인의 욕망을 쫓고 있다는 것을 알았다. 면접을 준비하면서 많은 것을 학습할 때 비로서 이전에 나는 게을렀다는 것을 알았다. 일을 하면서 배울 수 있는 곳을 상상했는데 그게 아니라는 것을 알았다. 관심이 있다면 얼마든지 스스로 학습할 수 있다는 것이다. 스스로 환경을 만들고 스스로 트래픽을 발생시킨다면 얼마든지 경험할 수 있다는 것을 알게 되었다. 그리고 평범한 일에서도 많은 것을 생각해본다면 얼마든지 새롭게 해볼 수 있다는 것을 알게 되었다. 
그리고 새로운 회사에 들어가게 되면 또 적응해야하고 사람들과 친해져야하는데 또 시간과 에너지를 써야한다는 것이다. 먼가 낭비한다는 느낌이 많이 들었다. 게다가 내가 하고 싶은 일보다는 조직을 위해 일을 해야하는 경우가 많을 것이라는 것이다. 먼가 잘못생각했던 것이다. 지금은 내가 스스로 일을 만들어서 하고 있는데 이것이 주는 행복감을 완전히 무시했던 것이다.
여튼 그래서 제자리가 되었지만 수습중에 있다. 수습하고 있다. 수습이 되었으면 좋겠다.

세번째 "올해 수련한 것"
올해 수련하였지만 잘 못하고 있는것이 "기록"이다. 바빠지거나 힘들어하거나 게을러져서 기록하는데 소홀했다. 반백수 생활을 할때도 시작한지 15일만에 기록이 멈추어버렸다. 저널이나 일기처럼 꾸준히 쓰는 것을 못해 조각조각 여기저기 남기기도 해봤지만 이도 얼마가지 못했다. 그래서 이런저런 도구도 사용해 보았다. 위키, 메모, 블로그, 노트... 엉망진창이다. 그래도 최근들어 기록하는 작업에 조금씩 습관이 붙기 시작했다. 기록의 문제점은 무조건 잘 정리하려고 했다는 것이다. 프로그램을 작성하면 틈틈히 리팩토링을 해서 프로그램의 품질을 높이는데 글도 똑같이 하면 된다는 것을 깨닫게 되었다. 그 다음부터 마구잡이로 글을 쓰기 시작했다. 좋은 글을 쓰는게 아니라 기록을 남기는데 그래도 충실히 하려고 하니 기록의 양이 늘어나기 시작했다. 물론 처음 생각했던 것처럼 글을 수정하는 작업은 거의 없다. 나중에 관련 글들을 모아 정리할 수는 있겠지만 평상시 글은 그냥 엉망진창으로 남겨둔다. 머 어찌됐든 기록이 남기 때문이다. 현재 기록을 위해 남기는 것은 크게 변하지는 않았지만 메모, 위키, 페이지, 낙서, 블로그, 원더리스트 등등 다양하게 사용하고 있다. 최종적으로 공유하고자 할 때는 키노트에 정리하려고 한다. 좀 더 나아가면 슬라이드쉐어로 공유까지 생각하고 있다. 내년에는 좀 더 체계적이고 다른 이들과 함께하는 방식으로 하려고 한다. 일단 회사내에서 프로세스를 만들어 진행하려고 한다.

일단 이정도로만 정리해두자.

2014년 12월 17일 수요일

실시간 빅데이터 분석 아키텍처를 탐색하다.

얼마전부터 자꾸 실시간 빅데이터 분석에 대한 일련의 사건들이 계속 발생하였다.
빅데이터에 대해서는 별로 관심을 두려하지 않았는데 나에게 하이프 싸이클의 계몽단계(Slope of Enlightenment)로 다가왔나보다.

어찌됐든 내년에는 실시간 빅데이터 분석 시스템을 만드는 것이 목표중의 하나가 될 것 같다. 그래서 빅데이터 아키텍처에 대하여 살펴보기로 했다.
먼저 빅데이터를 다루는 개발자들이 작성한 글들을 쭈욱 살펴보니 알아두어야 할 용어가 몇가지 있었다.


  • CEP (Complex Event Processing)
  • ESP (Event Stream Processing)

빅데이터 시스템의 종류라고 하는데 EDA(Event Driven Architecture) 기반의 시스템으로 CEP 는 ESP 의 기능에 패턴 감지 기능이 추가된 것이라고 구분하기도 한다. CEP 와 ESP 를 알아보기전에 EDA 에 대하여 먼저 알아보기로 하였다.

EDA 란 분산된 시스템 간에 이벤트를 생성, 발행하고 발행된 이벤트를 필요로하는 수신자에게 전송, 필요에 따라 처리하는 시스템 아키텍처라고 한다.

잘 정리된 블로그 글이 있어서 처음에 개념을 잡는데 도움을 받았다.


EDA 에는 SEP(Simple Event Processing), ESP(Event Stream Processing), CEP(Complex Event Processing) 가 있으며 Event Generator, Event Channel, Event Processing Engine 로 구성되어 있다.
잘 몰랐던 점은 EDA 가 SOA 와 같이 언급된다는 것이었다. (최근에는 MSA - MicroService Architecture 와 SOA 를 많이 비교한다.) 관련된 자료에서는 Domain EDA 라고 표현하고 있다.


다시 빅데이터 아키텍처로 돌아오면 ESP 는 실시간 빅데이터 분석에 좀 더 특화된 것이고  CEP 는 패턴 감지 기능을 포함하여 ESP 보다 상위개념으로 생각할 수 있다.

최근에 살짝 살펴보고 관심을 두었던 Spring XD 도 CEP 엔진으로 구분하기도 한다. 이외에도 Esper, Drools 가 있고 ESP 에는 Storm, Spark 등이 유명한데 상세한 구분으로 정리한 글이 있으니 참고할 수 있었다. 


전반적인 CEP 에 대한 사항과 ESP 를 기준으로 상세하게 설명한 글이 있는데 이것만 살펴봐도 많은 도움이 되었다.


해당 슬라이드에서는 빅데이터 분석 시스템을 만들기 위한 절차도 소개하고 있는데 간단히 요약하면 다음과 같다.

이벤트 정의 -> EPL 정의 -> Output Adapter 개발 및 등록 -> Input Adapter 개발 및 등록

최근에 가장 많은 레퍼런스를 가지고 있는 실시간 빅데이터 분석 아키텍처는 Apache Kafka + Storm 이거나 Apache Kafka + Spark 가 있다고 한다. 개인적으로는 Apache Kafka + Spring XD 를 하고 싶어 비교자료를 찾아보니 다음과 같은 글이 있었다.


성능 비교가 있었으면 좋으련만 비교 자료는 찾지 못했다.

참... 하다보니 Java Logging Framework 까지 찾아보게 되었는데 이건 나중에 정리해 봐야겠다.

실제 개발이 진행되면 개발하는 과정을 상세히 정리해 보도록 해야겠다.

글을 올린후 storm 과 spark 를 비교 설명한 글이 새로 올라왔다.

http://www.itworld.co.kr/news/91022

추가적인 비교 자료

http://www.slideshare.net/ptgoetz/apache-storm-vs-spark-streaming

Spark 의 핵심에 대한 설명

http://www.slideshare.net/yongho/rdd-paper-review


2014년 12월 15일 월요일

지식 공유를 위한 나의 생각

애자일을 배우기 시작한지 2년남짓되었다.
이전의 N사에서의 애자일 경험은 신비롭기까지 했다. 기존의 SI 를 할때 언제 어떻게 연락이 올지 몰라 마음조렸던 것을 완전히 잊게 해주었던 것이 애자일이었다.
체계적으로 일에 대한 정의를 하고 일정을 정한다. 개발에 있어서는 TDD 를 이용하여 사전에 충분한 버그를 찾아 해결한다. CI 툴을 이용해 예상치 못한 소프트웨어의 품질을 측정한다. 빌드배포툴을 이용하여 손쉽게 상용서버에 반영한다. 이 모든 작업은 서로 공유하고 공개하여 누구나 다 작업을 이해하고 진행할 수 있다.
기존은 이와 정반대였다고 보면 된다. 일을 숨기고 수작업으로하고 시간에 쫓겨 동작하기만 하면 코딩이 멈추었다. 그런데 이런 내용은 "엔터프라이즈 SOA" 책을 들여다보다 나온 문구를 보고 "남들도 심지어 외국사람들도 똑같은 경험을 했구나"라고 생각했다.
그렇다면 나의 경험과 나의 변화가 결코 방향이 틀리지 않았다는 것이다. 실제로 나와 같이 생각하는 사람들이 많은 것이다. 반면에 나와 같이 제대로 지도를 못받거나 학습을 못한 경우도 있을 것이다. 나는 이미 시간이 지나 늦은 부분이 있지만 나의 후배들에게는 아직 기회가 있다. 그래서 후배를 양성하는 일에 매진하기로 했다.
아직 정리해야할 것이 많으나 방향은 명확해졌다. 이런 글을 남기는 이유도 더이상 나의 다짐이 흔들리지 않기 위해서이다.
흔들림의 첫번째 유혹은 현재 면접이 진행중인 대기업의 유혹이다. 돈도 많이 받을 수 있고 좋은 환경을 제공하고 적절한 명예욕도 챙겨준다. 하지만 곰곰히 생각해보면 돈을 받는만큼 나의 시간을 팔아야한다. 좋은 환경은 돈이 많아 만드는 것이나 경험상 내가 만들면 된다. 특히 개발환경은 많은 오픈소스의 발전으로 더이상 돈이 문제가 되어가지 않고 있다. 명예욕은 나의 마음의 문제다. 주변의 괜찮은 사람들은 좋은 회사를 다니기보다 좋은 일을 하고 있다. 그들과 많은 이야기를 하면서 생각을 바꿀 필요가 있다.
흔들림의 두번째 유혹은 자신의 노하우를 갖추어 몸값을 높이는 일이다. 내가 경험하고 공부해서 알고 있는 것들은 너무 쉽게 다른 사람에게 준다면 나의 가치가 떨어지는것 아니냐는 이야기를 듣고는 한다. 그런데 나의 목표는 나의 가치를 높이는 것이 아니라 조직의 가치를 높이는데 있기 때문에 결코 그렇게 생각해서는 안된다. 게다가 나의 노하우를 알려주려고 해도 대부분 흡수하지 못하거나 무시하는 경우가 많다. 실제로 나도 그런적이 있다. 잘 알지 못하기 때문에 그냥 무시하는 경우가 많다. 지금은 하나하나 놓치지 않기 위해 기록하고 나중에라도 꼭 알기위해 노력한다. 아마도 이런 점이 흡수하지 못하는 자와 차이점일 것이다. 여튼 이런 이유들로 노하우를 알리는 것에 대하여 아깝게 생각하지 않는다.
후배 양성에서 가장 좋은 점은 생각의 차이를 알 수 있다는 것이다. 내가 놓치고 있던 것을 후배가 질문하게 되기도 하고 설명하면서 내 몸에 체화된다는 점이 가장 좋은 점이다.
체계적인 방법과 스케쥴 관리를 한다면 아마도 1년 뒤에는 내가 알고 싶은 것들을 체화할 수 있을 것이라 생각한다. 아직은 시작단계에 있지만 2년동안 시행착오를 바탕으로 매우 치밀하게 움직일 것이다.
여튼 그냥 생각나는 것을 정리해 보았다.

2014년 12월 14일 일요일

린캔버스를 작성하자

블로그를 시작한지 1년도 안되었다.
야심차게 시작했던 모든 상황들은 실패의 연속이었고 게으름의 연속이었다.
그래서 모든 상황들을 바꾸고 차분히 기록을 남기기로 했다.
과정에서 많은 선택이 있었지만 어찌됐든 다시 기록을 남기고자 한다.

시작함에 있어서 구체적인 목표를 만들고자 한다.
사용하고자 하는 도구로 린캔버스를 선택했다.

우선 현재의 문제점을 정의했다.


  • 실제적인 개발 능력이 부족하다.
  • 아키텍처 설계 능력이 부족하다.
  • 어학 능력이 부족하다.
개발 능력이 부족하다. 알고리즘의 활용이나 프로그래밍은 꾸준히 연습하고 있기 때문에 어떤 면에서는 실무자들보다 나은것이 있다. 하지만 스프링이라든지 네티등의 프레임워크를 활용하고 개발하는 능력이 부족하다. 그래서 나는 스프링을 자유롭게 사용하고 네티를 자유롭게 활용하는 등 프레임워크 활용 및 개발 능력을 가지고 싶다. 
이에 따라 매달 한가지를 지정하고 이를 개발하도록 하고자 한다. 전체적인 목표는 가상의 커머스 사이트를 만드는 것이다. 웹, 모바일을 지원하고, 백엔드에서는 배송관련 처리, 정산관련 처리등의 작업이 발생하도록 한다. 이를 위해 필요한 기술들을 정의하고 매달 한가지씩 개발할 내용을 정의하고 개발한다. 물론 정확한 업무의 적용이 아니라 가상 업무의 적용이기 때문에 임의로 정의한 프로세스가 동작하도록 한다. 총 12개의 아키텍처 설계와 개발을 수행하여 동작하는 제품을 만들고 시연하도록 한다.

아키텍처 설계 능력이 부족하다. 머리속에 알고 있는 것과 구체화해서 표현할 수 있는 것이 확실히 다르다는 경험을 했기 때문에 단순한 설계 능력이 아니라 설득할 수 있는 능력을 키우는 것이 중요하다. 때문에 특별히 지정한 아키텍처를 설계하고 가상의 문제를 발생시켜서 이를 해결할 수 있는 아키텍처를 설계한다. 예를 들어 대표적으로 SNS 에서 다량의 친구들의 글들을 가져와서 표현할 수 있도록 하는 아키텍처의 설계이다. 트래픽을 어떻게 분산할지 설계해 보는 것이다. 그리고 다른 사람들에게 표현하여 장단점을 확인하는 것이다. 다른 사람이란 가까운 도반들에서 시작하여 아키텍처 그룹으로 발표해보는 일을 수행한다.

어학 능력이 부족하다. 읽기 위주의 치중했던 영어를 실용적인 회화 위주로 변경하도록 한다. 실제 회화 횟수를 늘리고 잘 알아들을 수 있는 영어 능력을 만드는 것이 목표이다. 냉정하게 현재의 실력을 인정하고 차근차근 준비하여 여행에 불편이 없도록 한다. 여행 영어가 쉬워지면 영어 세미나등을 참석하여 난이도를 높여보도록 한다. 우선 전화영어부터 시작하도록 하자.

지금은 서술형으로 풀어보았지만 이를 린캔버스로 만들어 두었다. 위의 글은 초심이 되겠지만 작성한 린캔버스는 지속적인 수정을 통해 구체화되고 수정될 것이다. 내년 말에는 어떻게 변경되었는지 상세하게 비교하여 글을 작성해보도록 하자.

린캔버스에는 표기하지 않았으나 기록에 대하여 소홀히 하고 있으니 이를 강화하는 것도 잊지말자.

2014년 8월 3일 일요일

Java JDBC API 정리하기

JDBC 에 대하여 정리해볼 필요가 있어서 정리하면서 기록을 남긴다.
JDBC 는 2개의 패키지로 구분된다.


  • java.sql
  • javax.sql


간단한 JDBC버전 정보

  • 1.8 - JDBC 4.2
  • 1.7 - JDBC 4.1
  • 1.6 - JDBC 4.0
  • 1.4 - JDBC 3.0
  • 1.2 - JDBC 2.0


Java.sql 를 살펴보도록 한다.

1. DriverManager 관련

  • DriverManager class - Driver 를 이용하여 Connection 을 만든다.
  • SQLPermission class
  • Driver interface
  • DriverPropertyInfo class - JDBC driver 의 속성 정보 제공
    각 벤더는 Driver 에 대한 구현을 수행하고 제공하여야 한다.  


2. SQL statement 관련

  • Statement interface
  • PreparedStatement interface
  • CallableStatement Interface
  • Connection interface 
  • Savepoint interface
    interface 만 제공하므로 각 벤더에서는 해당 Interface 를 기준으로 구현을 해야한다.

3. Result 관련
  • ResultSet interface
    각 벤더는 ResultSet 에 대한 구현을 수행하고 제공하여야 한다.

4. SQL type 매핑 관련

  • Array interface -- mapping for SQL ARRAY
  • Blob interface -- mapping for SQL BLOB
  • Clob interface -- mapping for SQL CLOB
  • Date class -- mapping for SQL DATE
  • NClob interface -- mapping for SQL NCLOB
  • Ref interface -- mapping for SQL REF
  • RowId interface -- mapping for SQL ROWID
  • Struct interface -- mapping for SQL STRUCT
  • SQLXML interface -- mapping for SQL XML
  • Time class -- mapping for SQL TIME
  • Timestamp class -- mapping for SQL TIMESTAMP
  • Types class -- provides constants for SQL types

5. 사용자 정의 타입 매핑 관련
  • SQLData interface -- specifies the mapping of a UDT to an instance of this class
  • SQLInput interface -- provides methods for reading UDT attributes from a stream
  • SQLOutput interface -- provides methods for writing UDT attributes back to a stream

6. Metadata

  • DatabaseMetaData interface -- provides information about the database
  • ResultSetMetaData interface -- provides information about the columns of a ResultSet object
  • ParameterMetaData interface -- provides information about the parameters to PreparedStatement commands
7. Exception
  • SQLException -- thrown by most methods when there is a problem accessing data and by some methods for other reasons
  • SQLWarning -- thrown to indicate a warning
  • DataTruncation -- thrown to indicate that data may have been truncated
  • BatchUpdateException -- thrown to indicate that not all commands in a batch update executed successfully

Javax.sql 을 살펴보자

1. DataSource interface 를 통해 Connection 을 생성하여 다음과 같은 이점이 있다.
  • Properties 를 이용하여 어플리케이션의 소스코드 수정없이 속성을 변경할 수 있다.
  • Connection Pooling, Statement Pooling, 분산 트랜잭션 등을 처리할 수 있다.

2. Connection pooling 과 Statement pooling
  • ConnectionPoolDataSource Interface
  • PooledConnection Interface
  • ConnectionEvent Class
  • ConnectionEventListener Interface
  • StatementEvent Class
  • StatementEventListener Interface

3. Distributed transactions
  • XADataSource
  • XAConnection

4. Rowsets - 이건 좀더 정리가 필요
  • Event Notification
    • RowSetListener
    • RewSetEvent
  • Metadata
    • RowSetMetaData
  • The Reader/Write Facility
    • RowSetInternal
    • RowSetReader
    • RowSetWriter

기본적인 JDBC 를 살펴보았으니 차후 Oracle JDBC Driver 를 살펴보면서 다시 정리해 봐야겠다.

2014년 3월 7일 금요일

vagrant 를 이용하여 개발환경 만들기

vagrant 를 이용하여 맥프로에 개발 환경을 만들었다. 그 과정을 간단하게 정리해 본다.

우선 vagrant 를 다운로드 받자.

http://www.vagrantup.com/downloads.html

그리고 virtualbox 를 다운로드 받아 설치한다.

https://www.virtualbox.org/wiki/Downloads

개발 환경을 만들기 위해서 생성할 Host 의 필요한 네트워크 조건은

  • 인터넷이 되어야 한다.
  • Host와 Guest간에 연결되어야한다.
  • 독립 네트워크만 구성하면 된다.
그런데 VirtualBox 의 네트워크에는 다음의 3가지 사항이 있었다.
  • Bridged Networking : 위의 2가지 조건을 만족하나 네트워크 환경을 만들고 IP 구성을 하여야 한다. 네트워크 환경을 만들수 없기 때문에 개발환경에는 부적합했다.
  • NAT(Network Address Translation) : Host 와 Guest 간에 연결이 불가하나 인터넷이 가능하다.
  • Host Only Networking : Host 와 Guest 간에 연결이 가능하다 인터넷이 불가능하다.


개발환경을 위해 필요한 네트워크 구성은 NAT 와 Host Only 를 동시에 사용하면 독립 네트워크도 구성하고 인터넷도 사용할 수 있게 만들수 있다.
vagrant 를 이용하여 구성해 보았다. 만들려는 서버는 우선 AppServer 로 가장 기본적인 Tomcat 와 mysql 이 설치된 개발서버였다.
편의를 위해 boxes 폴더를 만들고 appserver 폴더를 만들었다.

mkdir boxes
cd boxes
mkdir appserver
cd appserver

그리고 적당한 vagrant box 를 vagrantbox.es 에서 선정하였다. ubuntu 를 주로 사용하기에 "Ubuntu precise 64 Virtualbox" 를 선택했다.

vagrant box add appserver http://files.vagrantup.com/precise64.box

다운로드 완료후 초기화 실행

vagrant init appserver

이렇게 하면 appserver 폴더에 Vagrantfile 이 생성된다. 이를 아래와 같이 추가하였다.

Vagrant::Config.run do |config|
  config.vm.box = "appserver"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
  config.vm.network :hostonly, "33.33.33.10"
end


IP 는 취행이니 편하게 설정한다. 위와 같이 설정하면 네트워크가 NAT 와 Host Only 를 모두 사용할 수 있다. Virtualbox 를 살펴보면 어댑터1은 "NAT"로 어댑터2는 "호스트 전용 어댑터"로 설정되어 있는 것을 확인할 수 있다.

Vagrantfile 를 수정한 후 해당 VM을 실행하였다.

vagrant up

그리고 접속하기 

vagrant ssh

vagrant 라는 계정으로 접속되는 것을 확인할 수 있다. 참고로 비밀번호는 vagrant 이다.

이런 방식으로 dbserver 를 포함하여 몇개의 서버를 더 만들었다.

시간이 될 때 hadoop와 zookeeper 를 분산 모드로 설치하는 것을 하도록 한다.

Java Virtual Machine 공부 하다 그려본 다이어그램

Java Virtual Machine 를 공부할 필요가 있어서 공부하다 한눈에 볼수 있도록 다이어그램을 그려봤다.
완벽하지는 않지만 적어도 내가 보고 기억해 낼 수 있도록 만들었다.

나중에 좀 더 잉여시간이 된다면 차근차근 정리해야겠다.


2014년 2월 18일 화요일

docker 맛보기

맥북프로를 구매했다.
좀 더 다양하게 여러가지를 수행하고 싶은데 맥북에어로서는 한계가 있어서 맥북프로를 구매했다.

그리고 docker를 설치해보기로 했다.

참고 페이지 : http://docs.docker.io/en/latest/installation/vagrant/

1. virtualbox 를 다운로드 받아 설치 : https://www.virtualbox.org/

2. vagrant 를 다운로드 받아 설치 : http://www.vagrantup.com/

3. git 으로 docker source 다운로드
    git clone https://github.com/dotcloud/docker.git

4. 다운로드 받은 docker 로 이동
    cd docker

5. docker 폴더를 살펴보니 이상한 것들이 많다.
AUTHORS Vagrantfile dockerinit nat tags.goCHANGELOG.md api dockerversion networkdriver tags_unit_test.goCONTRIBUTING.md archive docs pkg utilsDockerfile auth engine registry utils.goFIXME buildfile.go execdriver runconfig utils_test.goLICENSE commands_unit_test.go graph.go runtime.go vendorMAINTAINERS config.go graphdriver server.go version.goMakefile container.go hack server_unit_test.go volumes.goNOTICE container_unit_test.go image.go sorter.goREADME.md contrib integration state.goVERSION docker links sysinit

6. vagrant 실행
    vagrant up

  • vagrant 를 실행하면 ubuntu 64bit 를 다운로드 받는다.
  • 해당 ubuntu 에는 docker 가 이미 설치되어 있다.    

7. vagrant 를 통해 ubuntu 에 접속
    vagrant ssh

8. 이제부터 docker 를 공부해서 사용해 본다.
    아래 Hello World 를 출력하는 것 외에도 많은 예제가 있으니 참고하면 된다.
    http://docs.docker.io/en/latest/examples/hello_world/

그런데 중간에 나온 vagrant 를 좀더 알아야겠다.

쉽게 이해할 수 있는 발표자료 : http://www.slideshare.net/arawnkr/vagrant-chef
조대협님의 블로그 : http://bcho.tistory.com/806
vagrant box list : http://www.vagrantbox.es/

위의 box list 를 활용하여 개발환경을 구축하는 방법 : http://ppiazi.tistory.com/m/post/view/id/230

이로서 맥북프로에서 다양한 개발 환경을 만들어 사용할 수 있게 되었다.
하지만 아직 네트워크에 대하여는 지식이 매우 부족한 편이다.
어제 갔던 Openstack Day In Korea 에서 네트워크에 대한 질문을 하고 싶었는데 여건이 안되어서 물어보지 못했다.

나중에 네트워크에 대하여 좀 더 공부해 봐야겠다.


2014년 2월 13일 목요일

ASM 4.0 Example - Hello World 주석 달기

import java.io.FileOutputStream;
import java.io.PrintStream;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.GeneratorAdapter;
import org.objectweb.asm.commons.Method;

/**
 * @author Eric Bruneton
 */
public class Helloworld extends ClassLoader implements Opcodes {

public static void main(final String args[]) throws Exception {

        // 아래의 소스에 대하여 자바 클래스 파일에 해당하는 바이트 코드를 만들기
        /**********************************************************************
        public class Example {
            public static void main (String[] args) {
                System.out.println("Hello world!");
            }
        }
        **********************************************************************/

// ClassWriter 만들기 - Object 를 상속 받아서
ClassWriter cw = new ClassWriter(0);
        // visit(int version, int access, String name, String signature, String superName, String[] interfaces)
cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);

// 생성자 MethodWriter 만들기
        // visitMethod(int access, String name, String desc, String signature, String[] exceptions)
MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);

        // visitVarInsn(int opcode, int var)
        // opcode 는 ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE, RET 중 선택사용
        // opcode 참조 : http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html
        // 'this' 변수 지정
mw.visitVarInsn(ALOAD, 0);

// super class constructor
        // visitMethodInsn(int opcode, String owner, String name, String desc)
        // opcode 는 INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC, INVOKEINTERFACE 중 선택사용
mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");

        // visitInsn(int opcode)
mw.visitInsn(RETURN);

        // visitMaxs(int maxStack, int maxLocals)
        // 메소드의 최대 스택 사이즈
        // 메소드를 위한 로컬 변수의 최대 사이즈
mw.visitMaxs(1, 1);

mw.visitEnd();

// main 함수 만들기
        // visitMethod(int access, String name, String desc, String signature, String[] exceptions)
mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);

// System 클래스의 'out' field 사용
        // visitFieldInsn(int opcode, String owner, String name, String desc)
        // opcode 는 GETSTATIC, PUTSTATIC, GETFIELD, PUTFIELD 중 선택사용
mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");

// "Hello World!" String 상수 사용 (ldc instruction)
        // ldc pushes a one-word constant onto the operand stack. int, float, String 등
  mw.visitLdcInsn("Hello world!");
        
// 'prinln' 수행
mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");

        mw.visitInsn(RETURN);

        // visitMaxs(int maxStack, int maxLocals)
        // 메소드의 최대 스택 사이즈
        // 메소드를 위한 로컬 변수의 최대 사이즈
mw.visitMaxs(2, 2);

mw.visitEnd();

// 바이트코드 값 얻기
byte[] code = cw.toByteArray();

// class 파일 만들기
        FileOutputStream fos = new FileOutputStream("Example.class");
fos.write(code);
fos.close();

// 클래스로더로 읽어 들이기
        Helloworld loader = new Helloworld();
Class<?> exampleClass = loader.defineClass("Example", code, 0, code.length);

// 로딩된 클래스의 main 메소드 수행하기
exampleClass.getMethods()[0].invoke(null, new Object[]{null});

// ------------------------------------------------------------------------
// GeneratorAdapter를 이용하여 만들기 (편리하지만 느리다 ㅡ.ㅡ;;)
// ------------------------------------------------------------------------
        
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);

        // 생성자 만들기
Method m = Method.getMethod("void <init> ()");
        // GeneratorAdapter(int access, Method method, String signature, Type[] exceptions, ClassVisitor cv)
GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, null, null, cw);
mg.loadThis();
mg.invokeConstructor(Type.getType(Object.class), m);
mg.returnValue();
mg.endMethod();

// main 함수 만들기
m = Method.getMethod("void main (String[])");
        // GeneratorAdapter(int access, Method method, String signature, Type[] exceptions, ClassVisitor cv)
mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw);
mg.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
mg.push("Hello world!");
mg.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println (String)"));
mg.returnValue();
mg.endMethod();

cw.visitEnd();

        // 바이트코드 값 얻기
code = cw.toByteArray();

        // 클래스로더로 읽어 들이기
loader = new Helloworld();
exampleClass = loader.defineClass("Example", code, 0, code.length);

        // 로딩된 클래스의 main 메소드 수행하기
exampleClass.getMethods()[0].invoke(null, new Object[]{null});
}
}


2014년 2월 12일 수요일

node.js 살펴보기

node.js 에 대하여 많이 듣기는 했으나 제대로 머리속에 정리가 안되어 있어서 정리를 해보도록 하자.

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

node.js  확장성 있는 네트워크 어플리케이션 개발을 쉽고 빠르게 할 수 있도록 지원하는 자바스크립트 런타임 기반의 플랫폼이다. (특히 server-side 에 유용하다.)
event-driven, non-blocking I/O model 을 사용한다. (기타 좋은 말은 영문으로... ^^)

위키 : http://ko.wikipedia.org/wiki/Node.js

음... 잘 모르겠다 ㅡ.ㅡ;;

그럼 예제를 보면 좀 더 이해가 가리라..... 역시 node.js 홈페이지(http://www.nodejs.org/) 의 예제를 보도록 하자.


  • 웹 서버 띄우기
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

자바스크립트를 이용하여 'http' 프로토콜을 지정하고 createServer 를 통해 서버를 만들었다. 웹 서버니까 listen 으로 포트를 열어두고. 서버의 요청이 있는 경우 'Hello World'를 출력하는 함수를 만들어 두었다.
간단한 예제이지만 쉽게 이해가 갈 것이다. 서버를 생성할 때 function 에 필요한 로직을 두면 웹 어플리케이션이 되는 것이다. 물론 이때 MVC 패턴 등을 이용하여 만들어 두면 훨씬 쉽게 작성할 수 있다. 아직 찾아보지는 않았지만 아마도 잘 정리된 개발 패턴이 있거나 node 기반의 프레임워크가 존재할 것이다. 꼭 찾아보자...

네트워크 어플리케이션을 작성할 수 있다고 하지 TCP 기반의 어플리케이션을 만드는 예제를 살펴보자


  • TCP 서버 띄우기 
var net = require('net');

var server = net.createServer(function (socket) {
  socket.write('Echo server\r\n');
  socket.pipe(socket);
});

server.listen(1337, '127.0.0.1');

명확하고 심플하다. net 객체를 받아서 TCP Server 를 만들었다. listen 함수를 통해 아이피와 포트를 지정하였다. 아직 살펴본 것은 아니지만 server객체로 부터 request 를 받아서 처리하는 로직을 주도 response 객체를 만들어 전달하면 응답하는 형태일 것이라는 추정이 된다. 아님 말구. ^^

자바스크립트만을 이용해서 어플리케이션을 만들 수 있고, 복잡한 서버 설정을 하는 것이 아니라 코드로 설정 정보를 세팅하는 방식이어서인지 매무 심플하고 명료하다.

관련 API 문서는 한글화 된 버전이 있다.

http://nodejs.sideeffect.kr/docs/

Node.js 관련 잘 정리된 사이트 : http://octoberskyjs.github.io/home/


docker 를 따라가기

어떤 분의 페북글에 docker.io 에 대하여 언급이 나와 이를 찾아보게되었다.

도커(docker)는 기존의 가상화 어플리케이션에서 하드웨어 전체를 가상화하는 것과 달리 리눅스 컨테이너를 활용하고 있는 도커는 아주 빠르고 쉽게 가상화 환경을 사용할 수 있도록 해준다.

http://docker.io

docker 에 대한 발표자료

http://www.slideshare.net/modestjude/dockerat-deview-2013

발표 내용을 보다가 궁금해진 hipache. 분산 프록시

https://github.com/dotcloud/hipache


다시 docker 에 대한 개념 정리... 역시 조대협님!!!

http://bcho.tistory.com/805

이어서 등장한 vagrant

http://bcho.tistory.com/806


다음에 도전하고 싶은 것은

맥북프로를 구매하여 vagrant 와 docker 를 이용하여 개발 장비 구축

Reference

* http://judekim.tistory.com/category/Programmer/Docker



2014년 2월 7일 금요일

ASM 4.0 Guide - 1 Days

1. introduction

1.1 Movivations

ASM 은 자바 바이트코드 엔지니어링 라이브러리(a java bytecode engineering library)으로 다음의 이점이 있다.


  • Program analysis : 파싱에서 부터 애플리케이션의 잠재적인 버그를 찾거나, 사용하지 않는 코드, 역공학에 사용
  • Program generation : 일반 컴파일러나 Just in Time 컴파일러 같이 분산 프로그래밍에서 사용할 스텁, 스켈레톤 컴파일러가 사용할 프로그램을 작성
  • Program transformation : 프로그램을 최적화 하거나 AOP같이 성능 모니터링 이나 디버깅용 코드를 추가
그것도 runtime 시에 가능하다.

1.2 Overview

1.2.1 Model

ASM 라이브러리는 2개의 API 를 제공한다.

  • core API : event based model
- 연속적인 이벤트로 클래스를 표현한다.
- 각 이벤트는 클래스의 특정 구성 요소를 나타낸다.
- 이벤트 기반 API는 사용 가능한 이벤트, 반드시 따라야 하는 순서, 파싱할 엘리먼트 당 하나의 이벤트를 생성하는 클래스 파서, 연속적인 이벤트에서 컴파일된 클래스를 생성하는 클래스 작성기를 제공한다.
  • tree API : object based model
- 객체 트리로 클래스를 표현한다.
- 각 객체가 클래스 구성 요소를 나타낸다.
- 각 객체는 자신의 하위 구성 요소에 대한 객체들을 나타내는 레퍼런스를 가지고 있다.
- 객체 기반 API는 연속적인 이벤트 모델을 객체 트리 모델로 변경하는 하거나 그 반대로 변경하는 기능을 제공한다.
- 객체 기반 API는 이벤트 기반 API를 근간으로 만들어졌다.

이벤트 기반 API가 더 좋다.

- 객체 기반 API 보다 빠르고 메모리 소비가 적다.
- 클래스 변형이 객체 기반 모델 보다 어렵다. 한번에 한 엘리먼트만 조작하니까.


1.2.2 Organization


  • asm.jar
org.objectweb.asm, org.objectweb.asm.signature
event based API
클래스 파서, 클래서 생성기(class writer) 등의 컴포넌트

  • asm-util.jar 
org.objectweb.asm.util

  • asm-common.jar
 org.objectweb.asm.commons
미리 정의해 둔 클래스 트랜스포머

  • asm-tree.jar 
 org.objectweb.asm.tree
object based API

  • asm-analysis.jar 
tree API 기반의 클래스 분석 프레임워크와 미리 만들어 둔 클래스 분석기 제공 

2014년 2월 5일 수요일

레고 시리어스 플레이

우연찮게 페친이 올린 글에서 "비주얼씽킹"이라는 말을 알게 되었다. 아이가 박물관에서 보았던 것들을 한 장의 그림으로 잘 표현한 것이다. 그 그림을 보는 순간 나한테도 저런 정리가 필요해 보인다는 생각이 들었다. 그리고 얼마 안있어 다른 페친이 공유한 "사장84"라는 그림을 보게 되었는데 그 웹 사이트가 "비주얼씽킹" 이었다.

http://www.visualthinking.kr/

그리고 생각정리 워크샵 에 대한 글도 보게되었다. 사실 이 글을 쓰고 있는 현재 갈지말지 고민중에 있다. 거금 10만원이기 때문이다. 그러다가 다른 워크샵이 있다는 것을 알게 되었다. 물론 그것도 10만원 ㅡ.ㅡ;;;

그것이 "레고 시리어스 플레이" 라는 워크샵이다.
어릴적부터 지금까지 레고를 갖고 싶다는 생각만하고 비싸다는 이유로 구매를 망설였던 나에게 엄청난 유혹이었다. 게다가 레고로 회의를 할 수 있다는 것도 매력적이었다. 일단 레고 시리어스 플레이에 대하여 자세히 알고 싶어서 여기저기 검색을 해보았다.

디지털 인사이트 투데이에서 작성한 기사가 있는데 제법 많이 설명한 편이다.


스토리텔링 UX, 레고시리어스플레이


간단한 절차를 요약하면 다음과 같다.

  1. 개별 모델 만들기 = Building Individual Models
  2. 내가 만든 모델 공유하기 = Building Share Models
  3. 시스템 뽑아내기 = Building a System
  4. 랜드스케이프 만들기 = Creating a Landscape
  5. 연결하기 = Making Connections
  6. 의견 말하기 = Playing Emergence and Decisions
  7. 원칙 도출하기 = Extracting Simple Guiding Principles 
정확한 방법은 직접 워크샵에 참여해 봐야겠지만 한번쯤 그냥 실험해 볼 만하다.

꼭 레고가 없더라도 어떻게 해볼수 없을까라는 생각을 하다보니 크롬에서 레고를 사용하여 만들 수 있는 서비스가 최근에 나왔다는 것을 알았다.


바로 들어가서 시작해 본 Build Academy



아직 많이 사용해 보지는 않았지만 이걸 사용할 수도 있겠구나 싶기도 하다.

또 찾은 흥미로운 것이 있는데 레고로 게임을 하는 것이다. 국내에 판매가 되는지는 확인안해 봤지만 레고와 이미지 인식 기술을 이용한 게임. Life of Georage


처음에는 "비주얼씽킹"에 대한 생각이 이렇게 번져버리고 말았다. 나중에 한번씩 다 해보고 싶다.

Reference
* 레고 시리어스 플레이 워크샵 후기 : http://story.pxd.co.kr/778
* 아이폰과 레고 : http://story.pxd.co.kr/512
* 돈 없이 즐기는 레고 ... : http://thebluexpanse.tistory.com/383

2014년 2월 4일 화요일

오픈 소스 관련 기사

올 한 해 계속 기억해야 할 오픈소스 수퍼 루키 10선

위 링크 기사 요약 정리

애피엄

애피엄(Appium, http://appium.io )은 네이티브와 하이브리드 모바일 앱을 위한 오픈 소스 테스트 자동화 프레임워크다.

다커

다커(Docker, https://www.docker.io)는 오픈소스 프로젝트 루키에게는 드문 유형의 흥분을 자아내왔다. 다커는 모든 애플리케이션의 경량, 이동형, 자족식 컨테이너의 손쉬운 생성을 가능하게 하는데 있다.

엑서시즘

엑서시즘(Exercism, http://exercism.io)은 프로그래밍 언어를 배우는 이들을 위한 협력적 교육 툴로, 학생들의 협동학습을 지원하기 위해 미국 콜로라도주의 작은 기술학교 강사인 카트리나 오웬가 시작한 이후 큰 성공을 거뒀다.

고스트

웹상에 콘텐츠를 퍼블리시한다는 한가지 목표만을 설정하고 있는 고스트(Ghost, https://ghost.org)는, 아름답게 설계되었고, 완벽히 커스터마이징 가능하며, 완전히 오픈소스다. 코스트는 사용자 스스로 블로그를 작성하고 포스트할 수 있게 해줘 이를 쉽고 심지어 재미있게 할 수 있게 만드는 툴을 제공한다.

인플럭스DB

인플럭스DB(InfluxDB, http://influxdb.org)는 시계열, 이벤트, 메트릭스 데이터베이스다. 고(Go)로 작성되었으며 외부 의존도가 없어서 한번 설치하면 더 이상 관리할 필요가 없다는 점에서 레디스(Redis), H베이스(Hbase) 등과 다르다.

오픈데이라이트

오픈데이라이트(OpenDaylight, http://www.opendaylight.org)의 목표는 다른 요소 없이 직접적으로 배치할 수 있는 완전하게 기능적인 SDN 플랫폼을 제공하는 것이다.

오픈사물인터넷

오픈사물인터넷(OpenIoT, http://openiot.eu)는 유럽연합 집행위원회의 자금지원을 받은 연구 프로젝트로 클라우드 컴퓨팅 제공 모델을 활용하는 새로운 오픈, 대규모, 지능형 사물인터넷 애플리케이션을 새롭게 총체적으로 활성화하는 것이 목표다.

서버스펙

서버스펙(Serverspec, http://serverspec.org)은 다른 모든 구성 관리 툴과 독립적으로 서버 구성을 테스트하는 단순한 접근방식을 제공한다.

톡스

프로젝트 톡스(Tox, http://tox.im)는 AIM, 스카이프(Skype)등을 대체하기 위한 보안 IM과 영상채팅 애플리케이션이다.

X프라이버시

X프라이버시(Xprivacy, https://github.com/M66B/XPrivacy)는 애플리케이션을 통한 데이터 유출을 막기 위해 만들어졌다. 앱에 가짜 데이터를 피딩하거나 아예 데이터를 들이지 않는 방식으로 애플리케이션이 접속할 수 있는 데이터 카테고리를 제한시킨다.

플라이트

플라이트(Flight, https://www.ohloh.net/p/flightjs)는 웹 애플리케이션에 데이터 렌더링이나 제공에 특정 접근방식을 규정하지 않는다는 점에서 다른 자바스크립트 프레임워크들과 다르다.

Front-end Framework & Javascript Framework

Front-end Framework 와 Javascript Framework 에 대하여 찾아둔 것을 정리해 본다.

Front-end Framework



Twitter Bootstrap

Foundation

Skeleton

HTML5 Boilerplate

HTML KickStart

Reference

* http://designinstruct.com/roundups/html5-frameworks/
* http://usablica.github.io/front-end-frameworks/compare.html

Javascript Framework


Reference

* http://www.infoq.com/research/top-javascript-mvc-frameworks?utm_source=infoq&utm_medium=popular_links_homepage
* http://matthiasschuetz.com/javascript-framework-matrix/en/
* http://designemerald.com/inspiration/javascript-mvc-frameworks/


2014년 2월 3일 월요일

심심할 때 새로운 언어에 대하여 배울 만한 사이트

스터디 그룹 패턴

스터디 그룹을 만들고자 할 때 봐두면 좋은 글


스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)

글쓰기가 안되는 나를 위한 4단계 작문법 리뷰

오늘 일과를 마무리하면서 나의 이슈와 관련된 글을 정리한다.

Reference : 글쓰기기 안되는 이들을 위한 4단계 작문법


  • 1단계 자유롭게 쓴다 : 이왕이면 영감이 떠오르는 환경을 만들고...
  • 2단계 버릴걸 버린다 : 정신과 체력이 좋을 때...
  • 3단계 논리적 순서를 만든다 : 많은 시간이 소요되니 각오하고...
  • 4단계 사소한 것까지 따지기 : 까칠해 지니 주변에 지인을 두지 말고 ^^

2014년 2월 2일 일요일

람다 아키텍처(Lambda Architecture)

우연잖게 찾게 된 람다 아키텍처(Lambda Architecture)
제대로 기억해 두기 위하여 글로 남겨둔다.

람다(Lamdba)는 도대체 무엇인가?
람다 대수라는 정의가 있고 람다(λ)에 대한 다양한 쓰임을 설명한 것도 있다. 간단하게는 축약 함수라는 단어로 설명하기도 한다.
또 Java 8 에 적용될 람다의 경우 병렬 처리를 위한 작업 함수를 정의하는 간결한 방식이라고 설명할 수 있다.
람다 아키텍처도 병렬 처리에 대한 간력한 방식을 설명하고 있는 것이라고 볼 수 있다.

우선 아키텍처의 High-Level 개념도를 살펴보자.



개념도를 살펴보면 batch layer 에서 배치 작업을 통해 데이터를 생산해 내고 serving layer 에서 데이터를 조회할 수 있다. 물론 배치 작업이 이루어지지 않은 부분에 대하여 speed layer 에서 조회할 수 있다. 조회된 2개의 데이터 덩어리를 merge 하면 원하는 데이터를 얻는다는 것이 람다 아키텍처의 내용이다.

빅데이터가 나오면서 람다 아키텍처에 대한 사항이 많이 나왔지만 예전부터 쓰던 방식이다. 예를 들어 일별 통계 데이터와 실시간 통계 데이터에 대한 것을 들수 있다. 전일까지의 데이터는 새벽 배치작업을 통해 작업해 두고 당일 데이터는 실시간으로 조회할 수 있도록 하여 SQL 문에서 union 을 통해 데이터를 조회하도록 하는 방식이다. 이렇게 생각하면 람다 아키텍처는 쉽게 이해할 수 있을 것이다.

조금 더 상세한 내용을 살펴보도록 하자.

  • Batch Layer

더 이상 변하지 않는 데이터들에 대하여 배치 작업을 통해 결과 값을 저장해 둔다.
가능하다면 변하지 않는 데이터들이어야하나 실무에서 수작업이라는 엄청나게 무서운 일들이 발생하는 경우가 있어 가능하다면 수동으로 재작업이 가능하도록 만들어 두는 것이 좋다.


  • Serving Layer


배치 작업을 통해 저장된 Batch View 에 대하여 조회할 수 있도록 제공한다. 데이터에 대한 업데이트는 반드시 Batch Layer 의 배치작업을 통해 이루어져야 한다. Batch Layer 에서도 언급하였지만 실무에서는 뜻하지 않은 수작업이라는 것이 존재한다. 절대로 Batch View 에 대하여 직접적인 작업을 하지 말아야한다. 건드리는 순간 쓰레기가 된다. 굳이 하자면 원본 데이터를 수정하고 Batch Layer 에서 배치작업을 수동으로 하여야한다. 가능하다면 이런 수작업을 하지 말아야 한다.

  • Speed Layer
일반적인 데이터 조회 기능을 제공한다. 다만 배치 작업을 통해 생성된 Batch View 와 중복되는 데이터가 없도록 처리하는 것이 중요하다. 그리고 실시간 데이터 조회를 처리하므로 되도록 퍼포먼스에 대하여 신경을 써야한다. 퍼포먼스를 위하여 많은 부분을 Batch Layer 으로 넘겨 처리를 하거나 조회 쿼리에 대하여 훌륭하게 튜닝해두면 된다.

아래는 빅데이터 처리에 적용한 람다 아키텍처 예이다. 실제 빅데이터에서 어떻게 사용하는지 조금더 구체적인 사항들이 나와있다.


어설픈 설명이지만 일단 이렇게 정리를 해둔다.
차후 직접 만들어 볼 기회가 있다면 이를 바탕으로 만들어보고 구축 경험을 더 정리해 보자.



reference
* http://lambda-architecture.net/
* http://www.databasetube.com/database/big-data-lambda-architecture/
* http://www.datasciencecentral.com/profiles/blogs/lambda-architecture-for-big-data-systems

Open Sources Library 정리

Apache Reference

Apache Commons : http://commons.apache.org/
Component
Desc
Commons BeanUtils
Easy-to-use wrappers around the Java reflection and introspection APIs.
Commons Codec
General encoding/decoding algorithms (for example phonetic, base64, URL).
Commons Collections
Extends or augments the Java Collections Framework.
Commons DBCP
Database connection pooling services.
Commons Digester
XML-to-Java-object mapping utility.
Commons FileUpload
File upload capability for your servlets and web applications.
Commons IO
Collection of I/O utilities.
Commons Lang
Provides extra functionality for classes in java.lang.
Commons Logging
Wrapper around a variety of logging API implementations.
Commons Pool
Generic object pooling component.

Apache HttpComponents : http://hc.apache.org/

Other

Mock

Xml

cache

UI

Json

AOP

SSH

Apache Axis
  • Apache Axis is an implementation of the SOAP ("Simple Object Access Protocol") submission to W3C
  • http://axis.apache.org/axis/
  • 의존라이브러리
    • axis-jaxrpc : javax/xml/rpc
    • aixs-saaj : javax/xml/soap
    • axis-wsdl4j : JWSDL (IBM Corporation)

Code Generation Library

Oracle Coherence

Ajax

Guava
  • The Guava project contains several of Google’s core libraries that we rely on in our Java-based projects
    • collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.
    • Each of these tools really do get used every day by Googlers, in production services.
  • https://code.google.com/p/guava-libraries/wiki/GuavaExplained?tm=6

DataBase

Jfree

Restful

Java Mail

Apache POI

logging

Javascript

OGNL
Quartz
UUID
Velocity
XStream
Zip4j

Open Source Framework 정리하기

반응형 웹 UI 프레임워크 (reference : http://gokgo.tistory.com/96)

웹 프레임워크 (reference : 웹 프레임워크 조사)

Javascript (reference : http://html5experts.kr/archives/2039)

Other
  • JADE : http://jade.tilab.com/
    • JADE (Java Agent DEvelopment Framework)는 Java기반 다중 에이전트 시스템 개발을 돕는 미들웨어이며 Framework 이기도 하다. 국제적인 통신사들(Telecom Italia)을 위주로 개발/사용되고 있는 듯하며, 2013년 3월 29일 4.3.0 version이 배포될 정도로 현재 활발하게 진행 중인 open source project 이다.