[봄싹 스웨거] Spring Data

원래는 키노트 시간에 하나 더 보여드렸어야 하는데, 그게 뭐였냐면 NoXML 웹 애플리케이션이거든요. 그런데 시간이 부족해서 이쪽 시간으로 넘겼습니다. 물론 Spring Data도 소개해 드렸죠. 멋진 플젝 아닌가요? 흠~ 난 왜 저런걸 만들 생각을 못했나 몰겠더군요. GenericDao면 끝인 줄 알았지… 뭐에요;; 후기를 보니까 저랑 비슷한 생각하신 분들이 많으신 것 같더군요.

소스코드는 위에 있습니다. NoXML 예제에 test 디렉토리 안에서 Spring Data 예제 코드도 넣어뒀습니다.

NoXML 데모는 이렇게 보여드렸지요.

  1. 먼저 applicationContext.xml, spring-servlet.xml, web.xml 이 세개를 가지고 만든 웹 애플리케이션 간단 설명.
  2. 모든 스프링 XML 설정 삭제하고 자바 설정으로 대체
  3. WebApplicationInitializer로 web.xml 대체
  4. 잘 뜨죠?

Spring Data 데모는 이렇게 보여드렸지요.

  1. JPA를 사용해서 만든 DAO 간단 설명.
  2. 다 지우고, Spring Data JPA로 인터페이스만 남김
  3. 근데도 잘 돌아가죠?

발표자료는 별로 볼게 없지만.. 그래도 올려놓지요 뭐;; 사실 이 발표자료는 그날 점심 때 급조해서 만든거랍니다. 시간은 별로 없고, 발표자료 보다는 동작하는 소스코드가 더 중요하니까요. 소스코드부터 만들고 그 다음에 발표자료를 만들다가… 그전 날 맥주 마시고 뻗어가지고요. 후훗;;

http://whiteship.me/file/swagger-spring-data.pdf

[봄싹 스웨거] Swagger 2011 keynote

봄싹 스웨거 2011 마무리 세미나, 책걸이에서 발표했던 자료 공유 합니다.

주요 내용은 다음과 같습니다.

  • SpringOne 2011 2GX 후기 공유
  • 자바와 node.js 연동

후기 공유는 제가 참석했던 세션에 대한 후기를 짧게 공유해 드렸습니다. 그런 다음, 자바와 RabbitMQ, MongoDB, Node.JS, Socket.io를 사용해서 간단한 비동기 Push 시스템을 보여드렸습니다. 원래 이 Demo는 SpringOne 한 주 전에 있었던 VMWare 컨퍼런스에서 토비님이 보고 오신 데모였는데, 그걸 전해 듣고 직접 구성해 본 것입니다. 원래 여기서 보여드렸던 모든걸 CloudFoundry에 올리는 것으로 마무리 했어야 완벽한 재현이었을텐데, Node쪽 모듈이 잘 올라가질 않아서(제가 미숙한 것도 있지만.. CloudFoundry가 아직 좀 불편한 것도 있습니다. 흑.. ㅠ_ㅠ) 차마 못 보여드렸습니다.

어쨋거나..

소스 코드는 이 두 프로젝트를 살펴보시면 됩니다. Spring –> MongoDB와 Spring –> RabbitMQ 코드는 swagger-spring에 들어있고, RabbitMQ –> Node.js, Node.js –> MongoDB, Node.js –> Socket.IO는 swagger-node에 들어있습니다.

http://whiteship.me/file/swagger2011-keynote.pdf

이건 발표 자료입니다.

[스프링 3.1] web.xml이 없는 자바 웹 애플리케이션

Spring 3.1부터 Servlet 3.0을 지원하는데, Servelt 3.0 부터 web.xml 없이 자바 웹 애플리케이션을 배포하는 것이 가능합니다. 따라서 정확히는 스프링 3.1 없이도 web.xml 없는 자바 웹 애플리케이션을 만들 수 있습니다.

그런데.. 조금 귀찮은 부분이 있거든요; 그런 귀찮은 작업을 스프링이 대신 해주고 개발자는 서블릿이나 필터만 등록할 수 있게 해줍니다.

귀찮은 작업엔 뭐가 있냐면… 일단 자바 SPI를 사용하는 방식이기 때문에, META-INF/services 디렉토리에 javax.servlet.ServletContainerInitializer라는 이름의 파일을 만들어 줘야 합니다.

그리고 ServletContainerInitializer의 구현체를 만들고 그 위에 @HandlerTypes라는 애노테이션을 붙이면서 @HandlerTypes 애노테이션 안에.. ServletContainerInitializer의 onStart 메서드의 첫번째 매개변수로 받을 클래스 타입을 명시해 줘야 합니다. 그 타입을 A라고 해보죠.

그럼 이제 A 타입의 구현체를 만들거나, 상속 받은 클래스가 onStart 메서드의 첫번째 매개변수로 전달 됩니다.

귀찮죠;; 그래서 스프링이 다 해뒀고, 우리는 그냥 WebApplicationInitializer 인터페이스만 구현하면 됩니다.

이렇게요. 이게 web.xml을 대신한다고 보면 됩니다.

나머지 XML은 스프링 빈 설정 파일이 있는데, 스프링 3.0부터 이미 자바로 빈 설정을 할 수 있었습니다. 그런데, 이번 스프링 3.1은 그 기능을 대폭 강화하여 XML 네임스페이스에 해당하는 빈 설정도 자바 설정으로 가능하게 해줍니다. 물론 전부는 아니구요. 일부만요… (그래서 사실 스프링 자바 설정을 그리 많이 사용될 것 같진 않다고 생각합니다.)

자바 설정도 xml 처럼 웹용 설정과 비웹용 설정으로 나눠서 설정할 수 있습니다. 이건 Root ACWAC에서 사용할 비웹용 설정이고…

이건 웹용 빈을 설정한 Child ACWAC입니다.

전체 앱은 Github에 올려두었습니다.

https://github.com/keesun/swagger-noxml-mvc

자세한 내용은 이번주 토요일 봄싹 스웨거 책걸이때 말씀드리겠습니다.

[Sprng 3.1] 다음 코드가 왜 문제인지…

이 설정은 스프링 3.1을 사용해서 web.xml 없이 Servlet 3.0 기반 자바 웹 애플리케이션을 배포하는데 필요한 스프링 설정이다.

여기서 중간에 있는 servletContext.addListner()를 사용하는 코드에 무슨 문제(버그는 아니고..)가 있는지 알려면 Servlet 3.0 API 중에 두 개를 알아야 이해할 수 있다.

http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/HandlesTypes.html

http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html

자세하고 친절한 설명은 토스3 개정판을 기대하시라…

[Spring 3.1] EmbeddedDatabaseBuilder

빌더 패턴이 꽤 유용하다는 걸 알게 됐다. 외울 수 밖에 없던 API가 외우지 않아도 되는 API로 변모하는 모습을 보게 됐다. 물론 자바가 static 타입 언어이고, IDE 지원이 빠방하다는 것도 한 몫 했을 것이다.

오늘도 예제를 만들다가 문득.. 이전에 만들었던 EmbeddedDatabaseFactory 코드를 찾아보게 되었다. 메모리 DB는 예제용으로 사용하기 정말 좋다. 별다른 DB 설정 없이 예제를 바로 실행할 수 있기 때문이다.

이전에 블로깅했던 EmbeddedDB 설정은 다음과 같은 과정을 거쳐야 한다.

  1. EDF 객체 생성
  2. EDF 객체에 DB 이름과 DB 종류 설정
  3. RDP(ResourceDatabasePopulator) 객체 생성
  4. RDP에 스프링 Resource 추상화 사용해서 스크립트 추가
  5. EDF에 RDP 객체 설정
  6. EDF.getDatabase() 호출

족히 6~7 라인은 필요한 과정이다. 코드는 이전 글에 있으니까 생략. 게다가 외우고 있어야 하는 API가 최소 세개 등장한다. EDF, RDP, Resource 게다가 마지막에 getDatabase() 메서드 호출까지.. 알고 이어야 한다.

빌더 패턴으로 바뀌면 다 필요 없고, EDB(EmbeddedDatabaseBuilder)만 알면 된다. 그런 다음 네 가지 작업만 하면 된다.

  1. DB 이름 설정
  2. DB 종류 설정
  3. 스크립트 추가
  4. build()

코드는 다음과 같다.
[java]@Bean(destroyMethod = "shutdown")
public DataSource dataSource(){
return new EmbeddedDatabaseBuilder()
.setName("bookDB")
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:whiteship/book-schema.sql")
.build();
}[/java]