20141130 SpringSprout’s Last Conference

침대에서 뭉기적거리다가 일어나 눈을 뜨니 10시 반.
습관적으로 열어본 스마트폰에 올라와 있는 일정알림.
봄싹의 컨퍼런스가 있다는 것을 뒤늦게 인지한 나는 부랴부랴 씻고 밥먹고(점심시간 넘겨서 도착할테니, 밥은 먹고가야지)
정자동 네이버 그린팩토리를 향했다.

멀긴 멀다. ㅡ_-);; 전 회사는 1년여를 전철타고 왔다갔다 했었지.

내가 도착했을 때는 이미 세미나 중반쯤 다다른 상황이었다. 접수대에는 익숙한 얼굴들이 있었다.
그중 한 사람은 마지막 까지도 발표자료를 정리하느라 정신없었다.





Front-end development process


0123


  • 발표자: 변정훈(Outsider)
  • 발표자료: Adieu 2014, 봄싹에서 발표한 “프론트엔드 개발프로세스, 어디까지 개선할 수 있나” 발표자료

  • 게으른 개발자
    ‘게으른’과 ‘개발자’의 어울림
    개발자는 “1시간이면 할 일’을 ‘7~8시간동안 하는’ 사람이다.

  • 프론트엔드의 개발자동화는 서버사이드에 비해 많이 뒤쳐져 있었다.
    그러나 프론트엔드도 다양해지기 시작했다. 2~3년 사이에 빠르게 변화했다.
    그 중심에는 node.js 가 있다. 프론트엔드도 자동화된 개발프로세스를 가질 수 있는 환경을 가지게 되었다.
    언어에 대한 ‘커뮤니티, 문화’ 가 형성하는 문화였다?
    자바에서 쓰는 방법, 루비에서 쓰는 방법.
    node.js가 출현하면서 이런 환경이 생겨나기 시작했고, 2~3년의 짧은 기간 동안 일어나면서 앞으로도 빠른 변화가 일어날 것이다.

의존성 관리

  • 사용패턴
    1. 라이브러리 사이트 검색
    2. 프로젝트 폴더에 다운로드
    3. HTML에 코드 추가

      프로젝트, 라이브러리를 추가할 떄마다 반복

  • 패키지 매니저Package manager
    • Bower(http://bower.io, browserify(http://browserify.org)
      • browserify는 npm을 활용한다.

        도구들을 소개하지만 상세한 설명은 생략한다!

    • Bower 사용방법
      • bower install jquery bootstrap
      • 컴포넌트를 사용한다. 명령이 수행된 위치 하위에 component 폴더를 생성한다.
      • 노드의 npm과 유사
  • 패키지 매니저를 사용할 때의 장점
    • 라이브러리 파일을 형상관리에 넣지 않는다.
    • CSS나 JS가 아닌 컴포넌트 단위로 관리한다.
      = 도구들의 최근 배포형태가 JS, CSS 가 하나의 컴포넌트로 묶여 배포되는 형태에서는 ‘컴포넌트Component‘라는 이름이 이해가 된다.
    • 버전만 관리하면 필요에 따라 업데이트하기 쉽다.
    • 보통은 min 버전이 함께 제공한다.

웹서버 실행

  • 사용패턴
    • 로컬 파일을 브라우저에서 실행
    • Apache, nginx에 설정해서
    • WAS 실행(Tomcat 등)
      • 서버의 템플릿파일과 연동하여 보이는 것을 제공하지만,
      • 분리하는 것이 더욱 적합하다고 본다.
  • 빌드도구: Grunt와 Gulp
    • Grunt
      • grunt-contrib-connect, grunt-contrib-watch
  • 장점
    • 프로젝트 별로 필요한 환경을 자동화
    • 프로젝트 내에서 자동화된 환경을 공유
    • 다른 개발도구에 종속되지 않는다.
      • 에디터에 종속적인 기능?
    • CI 서버 등에서 사용할 수 있다.

코드의 품질관리


  • 여러가지 방법!?
    • Lint, Linting
  • recess!?
    recess style.css
    
  • JShint
    jshint util.js
    
  • Flow
    페이스북에서 내놓은 타입체크기
    /* @Flow */
    ...
    flow check hello.js
    

    Grunt를 이용한 설정을 할 수 있다.

Pre-processor

  • sass, less, coffeescript, stylus
  • 전처리자는 빌드가 필요하다. 빌드를 해서 그 결과물을 봐야한다.
    • grunt에 등록해두면 less를 수정할 때마다 자동으로 빌드되어, 브라우저에서는 자동빌드된 less의 결과물로 변경사항을 확인
  • 사용방법
    • 코드 수정
    • 빌드
    • 확인
    • 수정

Unit test

  • Assert: chai
  • test framework: mocha, jasmine
  • test runner: Karma
    • 브라우저에서는 별도로 실행할 방법이 없으나, Karma를 이용하면 실행해볼 수 있다.
    • 브라우저(지정한)를 띄워서 자동으로 불러들여서 실행시킨다.
    • socket.io와 브라우저가 연결되어 있어 자동으로 실행 및 확인이 가능하다.
    • 실행방법
      • 필요한 파일 로딩, socket.io로 쏘고~
  • 작성한 자동화 스크립트는 최대한 써먹자.
    • coveralls, BrowserStack, Gemnasium, SauceLabs

배포

  • 기존의 소스코드를 어떻게 배포할 것인가
  • 어떻게 사용하고 있는가?
    • CSS/JS 병합
    • CSS/JS 압축
    • HTML에서 링크변경
  • grunt
    • usemin
      • 압축대상 파일에 주석으로 build:와 endBuild로 처리가능하다.
      • 이게 JSP 에서도 적용이 될까… 했는데, JSP 하기전에 하면 되지.

정리

프론트엔드의 개발프로세스는 몇년 사이 매우 빠른 속도로 변화했다. node.js의 출현과 함께 npm의 패키지 관리 기능이 가져온 변화가 자바스크립트를 기반으로 하는 프론트엔드에 큰 변화를 가져왔으며, 그 변화는 앞으로도 지속될 것으로 보인다. 프론트엔드쪽에서도 백엔드와 마찬가지로 의존성을 관리하고 빌드, 배포를 자동화하려는 시도가 지속적으로 변화를 야기할 것이다. 다양한 자바스크립트 프레임워크들의 춘추전국시대가 당분간은 계속 될 것으로 보인다.

우선은, 현재에 사용목적에 적합하다고 생각되는 기술을 찾아 그것을 잘 활용하는 것에 집중하는 것만으로도 충반하다고 본다.


Resource Handling in Spring MVC

01234567


  • 발표자: 박용권(SK planet)
  • 발표자료: Slideshare
  • Github: resource-handling-in-springmvc

    Spring MVC에서 정적자원(css, js, etc)을 처리해본 경험을 공유
    프론트엔드에서 개발, 빌드된 정적자원을 백엔드에서 어떻게 가져와서 사용할 것인가?

Spring MVC: 리소스 제공(Serving)

  • ResourceHttpRequestHandler
  • 설정 간소화 기능제공
  • 리소스 제공 설정
     registry.addResourceHander("/resources/**").addResourceLocation("/resources/*")
    

    Spring Boot에서는 어떻게 설정할까나? -> classpath:를 붙여!!

     registry.addResourceHander("/resources/**").addResourceLocation("classpath:/resources/*")
    
     public class ResourceWebMvcConfiguration extends WebMvcConfigureAdapter {
     }
    

Resource 인터페이스에 대한 다양한 구현체

  • ServletCOntextResource
  • ClassPathResource
  • FileSystemResource
  • UrlResource
  • etc

캐시 설정이 가능하다.

registry.setCachePeriod(31556926); //캐시 주기는 1년이 적당하다!?
  • 로그를 보라~~
    • 캐시가 있을 때, 브라우저의 행동을 파악
    • 조건부 요청이 날아가는 경우!!

      웹을 확인하려고 하면,

Multi Module Web Application

  • Backend
    • SpringBoot
    • Thymeleaf
  • Frontend
    • NPM
    • Bower
    • Grunt
  • 핑거프린트(캐시에 대한 이야기, 두 파일의 내용, 조합)
  • assemble: hbs 파일들을 엮어서 HTML로…
  • 개발develop과 출시release 두가지의 형태로 처리
  • 개발에서는 usemin의 작업이 필요없다.

프론트엔드가 가출한 이유

  • 의존성관리
  • 사용된 라이브러리들의 모듈화, 조각으로 나누고 조합하여 사용한다.
  • 테스트
  • 빌드 자동화

    프론트엔드와 백엔드의 개발을 분리하여 진행

프론트엔드의 자원을 사용하는 방법

  • 프론트엔드의 의존성 다루기
  • WebJars
    • Client-side 웹 라이브러리를 JAR로 묶어서 제공하는 서비스
    • JVM 기반 빌드도구를 지원
  • Front-end를 빌드 후 jar로 만들기
    • 프론트엔드

개발 배포는 다르다.

  • 프론트엔드: 배포시에는 최적화된 자원을 사용한다.
  • 프론트엔드: 배포시에는 작성중인 css, js 사용
  • 백엔드: 환경에 따른 자원접근방법을 변경
    • Profile, Environment
    • 개발과 배포에 대한 캐시사용 전략도 변경하라~~ +_+)

회고

  • 학습의 요구곡선은 높아졌다.
  • 헨들바 + Thymeleaf만….

정리

코드에 금칠하던 냥겐의 비법공개의 느낌이랄까?

Spring Boot를 사용하면서 여기서 어떻게 더 나아갈까?

라는 고민을 하고 있던 찰라에 ‘희망의 빛’을 주는 발표였다.
지금 프로젝트는 Spring Boot를 기반으로 해서, 프로젝트의 resource 폴더에 static 폴더를 만들어 그 안에 css와 js 파일을 위치시켰는데, 생각해보니까 이녀석들을 최적화작업을 하고 하는 과정이 필요하다는 것을 간과했다. 두 개의 서브프로젝트로 나누고 프론트 프로젝트에서 최적화작업하고 그것을 백엔드 프로젝트에서 참조하는 형태로 가면 될 듯 싶다.


Building REST API Server

0123456


라이브 코딩!!

한국스프링의 살아있는 개발자, 백기선님의 발표!

  • 개발자 코드
  • ResponseEntity를 사용하면, HttpStatus 코드를 이용해서 응답상태를 결정지을 수 있어 좋다.

  • 크롬 확장플러그인: Postman 을 통해서 설정정보를 처리

  • DTO

    • static class Request {}
    • static class Response {}
  • ModelMapper 사용

    • Bean 등록
        @Bean
        public ModelMapper modelMapper() {
            return new ModelMapper();
        }
      

      Spock 과 MVC 테스트

  • spock-spring 추가

    • groovy 추가

      @ContextConfiguration(loader=SpringApplicationContextLoader.class, classes = Applications.class)
      @WebApplicationConfiguration
      public ExampleControllerTest extends Specification {
      @Autowired
      WebApplicationContext wac;
      
      def "POST /accounts"() {
           given:
        when:
        then:
      }
      }
      

      JSON으로 리턴할 때는 ObjectMapper(By Jackson)를 등록

  • Controller에 대한 테스트는 Spock를 사용해보자.

@Valid와 검증

  • 컨트롤러에서 @Valid ExampleDto exampleDto, BindingResult bindingResult 처리

스프링시큐리티 추가

  • starter-spring-security
  • Application을 재가동 시키면 스프링시큐리티가 켜져있다.
  • config 파일을 만들어서 WebSecurityConfigureAdapter를 생성
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigureAdapter {
      ..
      http.csrf().disabled();
      http.authorizeRequest()
      ...
    }
    
  • UserDetails 구현

    public class AccountUserDetails extends UserDetails {
    }
    
  • UserDetails를 제공할 서비스 생성

    @Service
    public AccountUserDetailsService implements UserDetailsService {
      @Autowired
      AccountRepository repository;
    }
    
  • WebSecurityConfig 에 userDetails 설정

    @Autowired AccountUserDetailService
    coufigure(AuthenBuilder auth) {
    ...
    }
    
  • 비밀번호 암호화
    @Bean
    public PasswordEncoder passwordEncoder() {
      return new StandardPasswordEncoder();
    }
    

패키징 및 배포

war로 패포하기 위해서는

  • build.gradle 혹은 pom.xml provide() 선언하고,
  • SpringBootServletInitializer 구현한 클래스를 선언하고
    public class ServletInitializer extends SpringBootServletInitializer {
      @Override
      protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
          return application.sources(Application.class);
      }
    }
    
    만들어진 war를 배포할 수 있다.

● 정리

SpringBoot는 스프링을 사용하는 사람이라면 결국 끌려들어올 수밖에 없는 블랙홀과 같은 강한 마력을 가지고 있다.
물론 이것을 바탕으로 보다 강력한 힘을 사용하기 위해서는 스프링에 대한 프레임워크가 어떻게 동작하는지 이해하고, 자바가 가지고 있는 언어의 특징을 이해하는 등의 학습이 필요하지만,

먼저 만들고 본다!

라는 논리로 보자면 Spring boot는 스프링을 기반으로 한 프로젝트를 구성할 때 부딪힐 수밖에 없는 설정의 벽을 많이 낮춰주는 것이 사실이다. 기선님의 라이브 코딩은 언제나 역동적이다. 이제는 능수능란하게 청중들과 반응하며 코딩을 이끌어가는 모습에서 라이브코딩의 관록을 느낀다.

따라올테면 따라와 봐.

라며 라이브코딩을 따라오던 자와의 신경전 또한 흥미로웠다. ㅎㅎ
스프링 시큐리티를 활용하는 방법에 대해서 힌트를 얻었다. 가볍게 던지는 이야기들 속에서 JavaConfig에 대한 막연했던 것들이 가볍게 정리되며 해소되는 이런 느낌 때문에 이런 컨퍼런스를 오게 되는 것이 아닐까?


Adieu, SpringSprout.


0123456789101112131415


  • 2008.08 스프링 스터디를 하기 위해 모여든 사람들.
  • 2008.08.31. 스프링 첫스터디 진행
  • 2009.03 KSUG 에서 봄싹 독립
  • 2009.06 봄싹 첫 MT
  • 2009.08.27 아지트가 생기다. 봄싹 사이트
  • 2010.07 봄싹을 떠나는 윤군!
  • 2010.11 ~2011.11 봄싹 스웨거 스터디 개설, 기존 스터디에 문제가 생기다.
    • 봄싹 스웨거
  • 2012.06 기선, 스터디 은퇴
  • 2014.08.20 봄싹이 싹을 피워 무럭무럭 자라서 멋진 이들로 제어났다.
  • 2014.11.30 봄싹 세미나, Adieu, 2014

○ 총정리




끊임없이 공부하고 코드로 만들어내는 배움의 장이었던 봄싹의 활동이 2014년 11월 30일, 그 대단원의 막을 내렸다.

이름처럼 새싹개발자들이 무럭무럭 성장하여 자신의 분야에서 한몫하는 멋진 개발자들로 성장하였다. 그들은 앞으로도 꾸준하게 개발자의 길을 걷고 있을 것이라 생각한다. ^^

나도 2011년도엔가 잠시 봄싹 스터디에 합류했다가 3주 정도 참여했다가 꼬리를 내리고 도망간 하드코어한 스터디그룹이었는데…
멋지게 유종의 미를 거둔, 봄싹의 마지막 컨퍼런스를 보면서 많은 사람들이 무엇인가를 얻어갔다는 것만으로도 충분히 보람찬 것이지 않을까?

모두 수고하셨습니다. ^^ 많은 가르침을 받았습니다.


8번째 DEVIEW라고 했던가? DEVIEW는 워낙 인기가 좋은 컨퍼런스다보니 늘 참가신청 하기가 쉽지 않았다. 올해에도 참가신청을 하는데 1차에는 1분, 2차에는 50초(다행히 2차에서 참가신청을 할 수 있었다)만에 참가신청이 완료되는 진기록을 세웠다. 모두들 어떻게 그리 재빠르게 신청을 하는지 놀랍기 그지없다. ㅎㅎ

지금 회사에 입사한지 이틀만에 컨퍼런스에 참가한다고 하는 것이 약간 눈치가 보이기는 했지만, 어쨌든~ 입사하기 전에 신청한 컨퍼런스이고 한번은 가봐야겠다는 생각을 가지고 있었기에 비오는 날에 롯데호텔로 향했다. 교복을 입은 학생들도 꽤 많았는데, DEVIEW에 대한 높은 관심을 옅볼 수 있었다.


● Keynote


현재 하드웨어는 성능적인 한계에 도달하였다. CPU의 클럭속도는 당분간 상승할 수 없는 상황(트랜지스터의 집적률이 높아지면서 그로 인해 많은 전력을 필요로 하고 높은 열이 발생하는 벽에 부딪쳤다)에 도달하면서 멀티코어 아키텍처쪽으로 방향을 잡았다. 과거 싱글코어에 익숙한 프로그래밍을 하던 개발자들은 이 멀티코어를 활용하여 성능을 향상시킬 수 있는 프로그래밍을 할 수 있는 능력을 키워야 한다. 개발자는 이제 하드웨어에 대해서도 이해해야 한다.


신개념 N스크린 웹앱 프레임워크 ‘PARS’

  • 발표자: 이동영 LG전자

    신개념 멀티스크린 웹 아키텍처의 발전방향

LG전자에서 연구중인 N스크린 웹앱 프레임워크 ‘PARS’에 대한 발표였다.
node.js를 기반으로 하여 다양한 기기의 화면을 브라우저 상에서 제어할 수 있는 웹앱 프레임워크.
아직은 연구단계이기 때문에 진행상황을 지켜보기 바람.


네이버 모바일 홈을 움직이는 반응형 무한스크롤의 비밀

  • 발표자: 손찬욱 Naver

  • Why Cards are the Future of the Web
    카드는 다양한 화면 디자인에 대해 유연성Scalability이 높다.
    네이버도 일부분 카드UI 사용: 사용자 최적화된 그리드 레이아웃 + 무한스크롤

  • 교훈

    모든 사람들은 비슷한 고민을 한다. 하지만, 모든 사람들이 똑같은 고민을 하지 않는다.
    다른 사람이 한 삽질이 있고, 본인이 해야할 삽질이 있다.

  • 그리드 레이아웃 처리방식에 대한 고민

  • 무한 스크롤 처리에 대한 고민
  • 사용한 방법에서 발생되는 문제들

소프트웨어개발 방법론을 건축가에게만 배워야 하는가?

  • 발표자: 신현묵 스윗트래커


  • TO-BE 모델이 확실한 건축가보다, 경험을 기반으로 기록(증거)를 남기며 전문적인 기술을 관리하는 의사들에게서 배우는 것이 개발자들에게 더욱 적합하다는 생각을 전달함.

  • 과거에 이발사는 의사(외과의)의 역할을 수행해왔다. 그 이발사는 현재에 이르며 이발사/의사로 분리되었다. 의사들은 오래전부터 쌓아온 자신들의 경험(치명적인 실수 포함)을 기록으로 관리하며 학문으로 발전시키고 학회를 통해 공유하며 자신들의 경험을 수많은 실험을 통해서 체계화하여왔다.

  • 의사들이 일하는 방식 -> 배워야할 것

    • 문제를 인식하는 방법
    • 문제를 지식화하는 방법
    • 문제를 전파하는 방법
    • 문제를 끊임없이 연구하는 자세
    • 애자일 선언
    • 무엇을 진행했고, 어떤 것을 얻었으며, 어떤 것을 실패하였는가?
      • 기록하고 관리하고, 연구하고, 대비한다.
      • 잦은 실수가 발생하는 것을 어떻게 관리하는 지가 중요하다. 이것이 회사의 역량차이가 될 수 있다.
  • 근거중심의 소프트웨어 개발방법론

    1. 문제점으로부터 명료한 질문을 파악
    2. 이에 상응하는 과거의 아키텍처와 패턴 탐색
    3. 해당 내용에 타당도와 유용성에 대한 비여적 평가수행
    4. 실무에서 찾아진 유용한 내용을 적용
  • 의료에서 배워야할 4가지

    1. 요구사항과 환자에 대한 진단이 명확해야 한다.
    2. 그리고, 세심하게 관리해야 한다.
    3. 책임을 누군가가 가지고 주도해야 한다.
    4. 당연 비용을 관리해야 한다.
    • 그리고 기록해야 한다.
  • 코드

    • 정량적인 검토는 자동화, 정성적인 검토는 기준을 명확하게 하라.
    • 자기만의 표기법을 만들고, 타인의 ‘표식’과 호흡하다.

대화하라. 애자일을 실천하라.



GitHub’s First Principles


  • 소프트웨어가 세상을 변화시켰다. software is changed the world

  • 소프트웨어는 세상을 변화시키고 있다. software is changing the world
  • 콘웨이법칙

    하나의 시스템을 설계하는 집단은, 그 집단의 의사소통 구조와 유사한 시스템을 설계한다.

◎ Traits

  • Do real work and Ship it!: 최선을 다해서 작업하고 곧바로 배송하라.
  • Automate all the things: 모든 것을 자동화하기: hubot
  • Always be classy: 항상 세련되기
    • 항상 기술을 연마하는 것을 게을리하지 않는 것이 중요하다.
  • Create a better future: 더 나은 미래를 만들기
  • Love your work: 자신의 일을 사랑하기
  • Never work just for Money: 결코 돈만을 위해 일하지 않기
    • 그렇지만~ 이왕이면 좀 더 많이 벌 수 있으면 좋지.
  • Optimize for happiness: 행복을 위해 최적화하기
    • 개발자의 행복은 뭘까나?
    • autonomy 자율성
    • mastery 숙달
    • purpose 목적
  • No Set work hours: 고정된 근무시간 없애기
  • No meeting: 회의 없애기
  • No deadlines: 마감시간 없애기
    • 마감시간이 개발자에게 주는 정신적 압박감은 매우 크지.
  • Take vacation when you need it
    • 휴가는 필요할 때마다 가기
    • 휴식이 필요하다고 생각되는 순간에 훌쩍 떠날 수 있다면 참 좋지.
  • Dunbar’s number 라는 것은, 개인이 사회적 관계를 안정적으로 유지할 수 있는 사람의 숫자를 말한다.

◎ 탁월한 소프트웨어를 개발하기 위해서는, 탁월한 소프트웨어 회사를 세워라.

to build great software build a great software company.


Docker로 보는 클라우드 서버 운영의 미래

  • 발표자: 김대권Leevi


  • 빌드-배포에 대한 새로운 패러다임을 제공하고 있는 도커Docker는 내부적으로는 IaaS에 가까운 환경 구축의 유연성을 제공하면서, 외부적으로는 Docker만 있다면 언제 어디서도 실행 가능한 형태로 이미지를 만들 수 있도록 지원해 PaaS나 SaaS에 가까운 장점을 누릴 수 있도록 해준다고 한다.

    아직 Docker에 대해서는 제대로 살펴보지 못했기에 뭐라고 단정할 수는 없지만, 많은 개발자들이 도커에 열광하는 이유에 대해서 살펴볼 필요가 있다.

전체적으로 좋은 컨퍼런스였다. 조금 아쉬운것이 있었다면, 발표를 위한 음향처리부스가 입구쪽에 마련되어 있는 탓에 많은 사람들이 들어오고 나가는 곳이 협소하여 제대로 움직이기가 쉽지 않았다. 한편으로는 출입을 통제하기 위한 목적으로 그럴 수도 있겠다 싶었지만, 많은 사람이 움직이는데 불편함을 야기했다.


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시에 체력저하로 다운.

+ Recent posts