* 내 패키지 구조
  * package.domain.system
  * package.domain.document
* 변경된 패키지 구조
  * package.domain.entity

회사에서 다른 개발자들이 쓰는 패키지 구조가 맘에 들지 않는다.
패키지의 구조를 통해서 기능을 분리할 수가 있는데...
그건 하지 않고 하나의 패키지에 모두 몰아넣는 방식이
왜 이렇게 거북스러운거냐.

내가 만든 구조가 싫다면,
왜 싫은지 이유를 설명해주고 바꾸면 좋겠는데...
내가 만든 구조를 어느새 자신의 구조로 만들어놓을 뿐 설명이 없다.

단지 패키지 경로가 길어지기 때문인가?


NHN 그린팩토리 주변에 보면 고급 아파트들이 둘러쳐져 있다. 

  처음으로 와본 그린 팩토리. 2층과 1층은 일반인에게 개방되어 있기에 인근 주민들이 찾아와 시간을 보내는 모습이 색다르다. 하지만, 이 주민들 중 누군가는 그린팩토리의 창으로 비치는 태양이 눈부시다고 넣은 민원에 서명을 한 이도 있지 않을까? ㅋㅋ


  접수창구에는 올드멤버중 한분이신 채수원님이 주말알바로 접수요원을 하고 계셨다. 오랜만에 뵙기에 반갑게 인사드리고 약간의 기념품(스티커, 배지, 군것질류, 생수)을 챙기며 커넥트 홀로 들어섰다.




  앞자리로 이동하니, 첫발표자인 정상혁님과 다다음 발표자인 백기선님을 뵐 수 있었다.




  정상혁님은 '[Spring 3.0 -> 3.1 -> 3.2 따라하기]'라는 주제로 발표를 시작하신다. 소스코드가 많은 발표이기에 github 에 마크다운으로 작성된 문서를 기반으로 발표를 진행하신다. 이런 방법도 괜찮다 싶다. 개발과 관련된 발표자료를 만들때 소스코드를 이쁘게 표현하기가 참 쉽지 않은데, 그럴바에는 차라리 마크다운 문서로 보여주고 이를 공요하는 것이 적절해보인다. 프리젠테이션 파일로 만들어진 발표자료는 나중에 보기가 쉽지 않고, 시스템에서 텍스트 검색도 되지 않아서 나중에 다시볼 가능성이 극히 희박하다.


  스프링의 버전이 3.0에서 3.1로 넘어가면서 많은 변화가 일어났다. 스프링이 하위호환성(새로 출시된 프레임워크가 이전 프레임워크에 맞춰 개발된 기능을 그대로 유지-지원하는 것)을 강조하는 프레임워크지만, 코드의 개선을 위해서 3.1에서는 꽤 많은 부분이 변경되었다. 이 변경된 항목들에 대해서 찬찬히 짚어가는 시간이 지속되었다. 여전히 스프링 3.0을 이용하고 있는 프로젝트가 많은 상황에서 스프링 3.1 이상으로 업그레이드를 하려고 하는 이들에게 도움이 되었으리라고 본다.


  다음 발표는, 성능테스트 툴로 사람들의 많은 관심을 받고 있는 nGrinder에 관한 발표였다. 'nGrinder 초딩도 하는 성능 테스트'라는 제목으로 윤준호님이 발표하셨다. 낼모레 불혹을 앞두고 있는 '디자이너 출신'의 개발자는 nGrinder의 미려함에 대해서 강조하셨다.

  창조자인 개발자에게 자신의 창조물을 파괴하는 행위인 '테스트'는 참 힘든 일이다. 하지만, 자신이 만든 창조물의 성능과 안정성을 높이는 일은 외면해서는 안될 일이다. 어느 개발자들은 '테스트'는 품질관리QA(Quility Assurance)자에 의해서 진행이 되어야 한다고 말하지만, 나는 개발자가 일정수준 이상의 품질을 갖춘 제품을 만들어낼 의무가 있다고 본다.

  개발자가 일정수준 이상의 품질을 갖춘 제품을 만들어내기 위해서는 '테스트'를 진행해야 하는데, 그 테스트를 개발자 스스로 하게 하려면 어떻게 해야할까? '테스트'가 쉬워야 한다. 쉬워야 테스트를 쉽게 하고 제품의 품질을 높이면 자랑할 수가 있다. 테스트를 하면할수록 성능이 개선된다면 개발자는 자발적으로 테스트를 수행하게 될 것이다.


  nGrinder는 Grinder에서 시작되었다. Java 이외의 Jython과 Groovy를 지원하며, 테스트에 사용되는 스크립트를 자동생성하고 자체 SVN으로 관리해주고 테스트 결과를 저장하여 살펴볼 수 있는 기능을 제공한다. IDE와 클러스터링을 지원하면서 개발자의 '제품'에 대한 성능 테스트를 용이하게 한다. 이렇게 테스트를 용이하게 하면서 NHN내부에서도 620여명의 사용자가 11,000건의 테스트를 진행하며 성능 테스트 활동이 10배이상 증가하는 테스트를 달성했다고 한다.

  내가 만든 제품에 대해서도 성능테스트를 진행해봐야겠어. ㅡ_-);;


  세번째 발표는, whiteship 이라는 닉네임으로 '스프링 프레임워크'와 관련해서 잘 알려진 백기선님이 'Vert.x와 socket.io 이해 및 활용'이라는 주제로 발표하셨다. 특이하게, 자신의 큰 딸 '서연이'와 함께하는 발표였다. 발표 중간중간에 서연이의 돌발 행동에 참석자들은 흐뭇한 '아빠미소'를 짓고 있지 않았을까?



  시작에 '왕좌의 게임'에 나오는 말을 인용하며 '개발이 딸보다 쉬웠다' 라는 그의 말을 조금은 이해할 수 있는 순간이었달까?

Vert.x는 매우 쉽게 확장 가능한 차세대 비동기 애플리케이션 개발 플랫폼이다.

  Vert.x는 자바스크립트 엔진을 이용한 node.js와 비교되는 Java를 기반으로 하는 비동기 애플리케이션 개발 플랫폼이다. 백기선님은 Vert.x에 관심을 가지고 관련한 글을 꾸준하게 작성하고 있다. 지금도 꾸준하게 관련한 소식들을 게재하고 있다.

  Vert.x의 핵심요소는 Netty(IO 처리), Hazelcast(메모리형 데이터를 분산처리할 수 있는 그리스 시스템 제공)이다.

  Vert.x 의 주요 개념으로 Verticle, Vert.x. instance, Ployglot, Concurrency 에 대해서 하나하나 짚어나간다.

  Verticle은 Vert.x 에서 배포가능한 애플리케이션 단위이며 개별적인 클래스로더를 사용하여 실행해주며, 손쉽게 클러스터링할 수 있다. 수평적인 확장을 지원하며, 확장된 Verticle 간에는 메시지를 주고 받을 수 있다.

  Polyglot은 JVM에서 실행가능한 다양한 언어들로 작성할 수 있다.JavaScript, Ruby, Java, and Groovy 등의 언어를 지원하고 있으며 추가적으로 Clojure, Scala and Python 등의 다양한 언어를 지원할 것으로 보인다.

  Vert.x 를 이용할 때는 vertx-core, vertx-platform을 이용하면 된다. 버전업 되면서 사용하는 방법이 달라졌다고 한다. 라이브코딩을 하다가 당황하셨지만 능숙하게 대처하는 모습에서 그의 발표경험의 연륜을 짐작하게 만든다.



  node.js가 많은 인기를 끌게 만든 모듈 중 하나가 socket.io(전송 방식을 추상화하여 모든 브라우저와 모바일 기기용 실시간 애플리케이션을 개발가능하도록 하는 것이 목적)다. Socket.io를 이용해서 실시간 웹 기술을 이용하여 요즘 많이 관심받는 푸쉬Push 기술을 구현하기가 용이해진다. Socket.io 는 node.js의 모듈이다보니 자바쪽에서 아쉬워하는 녀석 중에 하나였는데, 기선님이 keesun/mod-socket-io 를 만들어내어 오픈소스로 제공하고 있다.

  스프링 4.0에서는 자체로 웹소켓WebSocket을 지원하는데, SockJS 구현체가 들어 있어 지원한다고 한다. SockJS가 서버의 연결이 끊어졌을 때 서버와 클라이언트가 서로 그 정보를 주고 받는 핑퐁(Ping-Pong, 이걸 핑퐁이라고 하는 것이군!)을 지원하지 않아 아쉽다고 하였는데, 과연 스프링에 포함되었을 때는 어떤 모습을 가질 수 있을지... 궁금하군.


개인적인 일정으로 여기까지만 듣고 Helloworld 세미나장을 나온다.

비가 내리는 날에도 많은 사람들이 참여한 세미나였고, 나로서는 처음 그린팩토리를 살펴볼 수 있는 좋은 기회였다. ㅎㅎ 하지만, 우리집(경기도 남양주시)에서 정자동까지는 멀고먼 여정이었다. Orz... 집에 돌아와서는 10시에 체력저하로 다운.

첨부파일 : 

20130515_Vagrant_chef.md


동일한 개발환경을 지닌 가상머신(인스턴스) 의 배포를 손쉽게할 수 있다면, 얼마나 좋을까! 라는 생각을 구현한 멋진 서비스가 아닐까? 서버 리소스를 스케일업하는 클라우드 컴퓨팅 환경에서 인스턴스 관리를 위한 도구로 사용할 수 있지 않을까라는 상상을 잠시 해본다. 사용하려는 서버환경을 구축한 후에 이것을 box로 만들어 확장하는 서버 이미지를 대신하도록 만들어두고, 처음 가동할 때 chef에 의해서 기본적인 추가작업(내가 우분투를 설치하고 로그인하여 처음 실행하는 sudo apt-get update; sudo apt-get upgrade; 도 자동화할 수 있겠지.)이 실행되도록 할 수 있으니, 증설한 서버에 대한 반복적인 작업이 확실히 줄어들 것이다. 스터디가 진행될수록, 개발PC 가상머신을 배포하기 위한 용도보다는 클라우드 컴퓨팅에서 사용할 인스턴스 배포용으로 적합할 것 같다는 생각을 가지게 되었다.


Vagrant

  • 사이트 : http://www.vagrantup.com/
  • 동일한 서버 개발환경 꾸미기
    • 개발과 실서버의 일치를 위해 로컬 가상머신을 손쉽게 관리하자.
    • 로컬 개발서버를 가상머신으로 관리하나? ㅡ_-)? 그러고보니, 전에 몇번 그랬던 적은 있다.
  • 관련 정보
    • 작성자 : @mitchellh
    • 오픈소스 MIT 라이센스
    • Ruby로 작성됨
    • 현재 1.0.5
    • 사용OS : ubuntu 12.04까지 나왔심.
  • Vagrant Command Line Interface
    • package : 지금까지 구성된 인스턴스를 vox로 만들어서 배포
    • halt : shutdown
    • provision :
    • up : start!
  • 실행방법
    1. vagrant box add <config.vm.box name> http://files.vagrantup.com/<box-image>.box
    2. vagrant init <config.vm.box name>
      • 선택적으로 config.vm.box 에 지정되는 value를 지정할 수 있다.
      • <config.vm.box name>을 지정하지 않으면 base로 기본등록된다.
      • 이 명령이 실행된 위치에 Vagrantfile 라는 설정파일이 생성된다.
    3. vagrant up : 실행!!

      Bringing machine ‘default’ up with ‘virtualbox’ provider…
        [default] Setting the name of the VM…
        [default] Clearing any previously set forwarded ports…
        [default] Creating shared folders metadata…
        [default] Clearing any previously set network interfaces…
        [default] Preparing network interfaces based on configuration…
        [default] Forwarding ports…
        [default] – 22 => 2222 (adapter 1)
        [default] Booting VM…
        [default] Waiting for VM to boot. This can take a few minutes.
        [default] VM booted and ready for use!
        [default] Configuring and enabling network interfaces…
        [default] Mounting shared folders…
        [default] – /vagrant
        ihoneymon:vagrant ihoneymon$

      • 실행이 완료된 후 vagrant ssh 를 입력하면 실행된 가상머신에 터미널로 접속가능하다.
      • port forwarding : 22 => 2222
    4. vagrant halt : 가상머신 끄기
  • 기타명령
    • package
      • vagrant package –help
        • VirtualBox에 이미 등록되어 있는 가상머신을 vagrant box로 패키징하여 바이너리 파일로 만들어 배포가능하도록 만든다.
      • vagrant package –base vagrant_1368646716 –output ubuntu-lucid32.box
        • ubuntu-lucid32.box
    • vagrant package 로 box 만들기

      • vagrant package –base vagrant_1368621809 –output ubuntu-lucid32.box

      ihoneymon:temp ihoneymon$ vagrant package –base vagrant_1368621809 –output ubuntu-lucid32.box
        [vagrant_1368621809] Clearing any previously set forwarded ports…
        [vagrant_1368621809] Creating temporary directory for export…
        [vagrant_1368621809] Exporting VM…
        [vagrant_1368621809] Compressing package to: /ihoneymon/temp/ubuntu-lucid32.box
        ihoneymon:temp ihoneymon$ ls
        vagrant_lucid32.box

      package로 생성한 ubuntu-lucid32.box를 test라는 이름으로 추가하고 확인

      • vagrant box add test ./ubuntu-lucid32.box

      ihoneymon:temp ihoneymon$ vagrant box add test ./ubuntu-lucid32.box
        Downloading or copying the box…
        Extracting box…te: 200M/s, Estimated time remaining: –:–:–)
        Successfully added box ‘test’ with provider ‘virtualbox’!
        ihoneymon:temp ihoneymon$ vagrant box list
        lucid32 (virtualbox)
        test    (virtualbox)
        ihoneymon:temp ihoneymon$


Chef

  • vagrant up 실행시 최초실행되는 매크로(간단하게 말하면, 스크립트를 조건에 맞춰서 자동실행하는 것이랄까?
  • 운영체제에 종속적인 편이다.
    • 스터디 중에 능력자가 운영체제를 식별하여 실행환경에 맞는 명령을 수행하는 것이 하지 않을까 하는 이야기를 나누었지만, 그런 수고스러운 삽질을 하는 것을 권장하고 싶지는 않다. 운영체제에 맞춰서 작성하면 간결하고 깔끔하겠다는 개인적인 생각을 했다.
  • Chef Solo Provisioning
    • Chef Server 없이 미리 opscode-cookbooks organization 에서 설정하려고 하는 운영체제에 맞춰서 receipe를 내려받은 후 가상머신 실행 후 추가명령 실행을 지원하는 기능이다. 이걸 잘 설정해두면, 여러 개의 인스턴스를 만들어서 실행할 때, 서버의 업데이트 상태를 최신상태로 갱신하고 사용하는데 필요한 패키지를 설치하도록 만들 수 있다.


참고자료


### 문제발생

vagrant box add "lucid32" http://files.vagrantup.com/lucid32.box

명령으로 lucid32.box를 내려받고 실행할려고 하는 순간 아래의 메시지가 보여지며 실행되지 않는다.

The box 'base' could not be found.

'base' box를 찾을 수 없단다. 내가 추가한 box는 'lucid32'인데?


### 해결책

box를 내려받은 위치에보면 

Vagrantfile

라는 파일이 있다. 이 파일을 열어보자.

파일의 내용 중 

config.vm.box = "base"

로 되어 있는 항목이 보일 것이다.

config.vm.box = "lucid32"

로 변경하자.


box 'base' not fond 문제 처리 후 실행화면


### 설명

vagrant box를 내려받으면서 "lucid32"라는 이름을 부여했는데, vagrant 설정파일Vagrantfile에 기본설정에는 "base"로 되어 있어서 발생한 문제다.


+ Recent posts