봄싹의 모두가 같은 생각을 했는지는 모르겠지만 저는 지식을 서로 나누는 형태가 의도였지만 결과적으로는 단방향으로 전달하는 형태가 된듯합니다.(뭐 크게 불만까지는 없습니다. 서로 나누는게 그렇게 쉽다면 누가 고민하겠습니까.) 어쨌든 올해 중순부터는 장소도 제대로 확보하지 못하면서 어려움이 있다가 이번 세미나를 통해서 2011년 스웨거를 마무리하게 되었습니다.
SpringOne 2011 키노트 요약 - 백기선
10월 25~28일에 시카고에서 진행된 SpringOne 2GX 2011에 갔다온 내용을 간단히 요약해서 정리해 준 시간이었습니다. SpringOne은 SpringSource에서 진행하는 컨퍼런스로 Spirng 프레임워크에 대한 가장 대형 컴퍼런스입니다. 스프링원의 발표자료는 [SpringOne 2011] Spring 발표 자료에 올려져 있습니다. 스프링원에 대한 얘기라 다양한 얘기가 오갔기 때문에 기억나는 것만 적습니다.
스프링원의 첫째날 이야기 부터 시작했습니다. 키노드는 로드존슨이 다친 관계로 아드리안 콜리어가 진행했다고 합니다. 아드리안 콜리어는 스프링이 인기 있는 이유를 Simple + Powerful로 이야기 했습니다. 여기서 Simple은 간단하다는 이야기가 아니고 사용하기 쉽다는 것입니다. 그리고 스프링을 사용하면 테스트하기 쉬운(Testable) 코드를 작성할 수 있고 스프링은 오픈소스입니다.
스프링 3.1에 추가된 기능은 C:Namespace와 환경에 따라 다른 프로파일을 적용할 수 있는 Environment Profiles, 그리고 Web.xml 없이 Java로 설정을 할 수 있습니다. Cache Abstaction이 추가되었고 Java 7을 지원하고 JPA지원이 개선되었습니다. 그리고 스프링 프로젝트가 Github로 저장소를 이동하였습니다.(잘못된 내용이었습니다. 스프링 저장소의 미러를 Github에 만들었을 뿐 저장소자체가 이동한 것은 아닙니다.) 더 자세한 내용은 아드리안 콜리어의 발표자료를 참고하면 됩니다.
둘째날에 들은 세션은 Jeremy Grelle의 You want to do *WHAT* in the browser!? A heretic’s guide to building the “impossible” on the modern web이었는데 웹의 역사와 앞으로의 웹에 대해서 이야기 했다고 합니다. 앞으로 주목해야 할 기술로 HTML5와 자바스크립트를 꼽았으면 자바스크립트에서도 AMD를 특히 강조했다고 합니다. AMD는 Asynchronous Module Definition의 약자인데 비동기로 관련모듈을 불러오는 것을 이야기하고 최근에 크게 각광받고 있습니다. 그리고 Rossen Stoyanchev의 What’s New in Spring MVC 3.1세션을 들었는데 @MVC가 2.5버전에서 소개되고 3.0에서 REST를 지원했는데 3.1에서는 consume과 produce가 추가되어서 사용하기가 좀더 편해졌습니다.(제가 스프링을 자세히 모르는데 기존에 쓰던기능을 따로 분리해서 쓰기 편하게 한 기능이었습니다.) 다음은 Keith Donald의 Modern JavaScript세션을 들었는데 자바스크립트의 핵심개념과 인기있는 자바스크립트 라이브러리에 대해서 이야기 했답니다.
그리고 노드와 스프링을 연동한 예제를 보여주었습니다. 앞단은 스프링으로 만들었고 노드의 매력적인 모듈중 하나인 Socket.IO의 리얼타임기능을 사용하기 위해서 둘을 조합한 예제였습니다. 사용자가 요청을 보내면 스프링이 RabbitMQ에 넣고 노드가 RabbitMQ에서 꺼내서 Socket.IO를 통해서 사용자한테 푸쉬하는 구조였는데 사실 현업에서 노드를 쓴다면 노드만 쓰기보다는 이런식으로 레거시 플랫폼에 섞어서 쓸 가능성이 높기 때문에 인상적인 예제였습니다.
이 다음부터는 점심준비하느라고 뒷부분은 못들었네요 ㅡㅡ;; 이 세션에 대한 예제는 백기선님의 블로그에 올라와 있습니다.
스프링 어디까지 써봤니? - 박용권
@MVC로 간단한 쇼핑몰을 만들면서 중복코드를 제거하고 어떻게 개선해나가는지 보여주는 세션이었습니다. 저한테는 수준도 딱 좋고 직접 시연하면서 보여주어서 가장 좋았던 세션입니다. 먼저 컨트롤러에서 각 요청마다 클라이언트를 생성하는 코드가 반복되는 부분을 WebArgumentResolver를 이용해서 중복을 제거했습니다.(3.1에서는 WebArgumentResolver가 다른 이름으로 바뀐것 같다고 했는데 이름이 기억나지 않는군요.) 그리고 습관적으로 @Autowired를 쓰고 있었는데 이는 DI에 대한 표준이 없을때 스프링이 만든 어노테이션으로 현재는 JSR 330에서 정의된 @Inject 어노테이션을 쓰는 것도 인상적이었습니다.
다음은 쇼핑몰이 책, 음반, 영화를 파는 쇼핑몰인 관계로 각 요청별로 전체로직은 거의 동일하지만 책/음반/영화에 대한 서비스만 달라지는 부분을 해결하기 위해서 타입을 @PathVariable로 변환해서 여러개의 메서드를 하나로 합쳤습니다. 상품 타입에 대한 변수를 String으로 받던 것을 GenericConverter인터페이스의 구현클래스를 만들어서 상품에 대한 서비스를 리턴해주도록 만들어서 Enum을 이용해서 비교하도록 리팩토링 했습니다.
이렇게 하면 내부에서 타입을 구별하기 위해서 if-else 구분이 생기는데 요구사항은 항상 변경될 수 있기 때문에 새로운 상품이 추가될 경우 if문마다 추가상품에 대한 코드를 매번 추가해 주어야 합니다. 이를 해결하기 위해서 Service Locator를 만들어서 if-else문을 제거하고 상품의 타입을 넘기면 serviceLocater가 상품에 맞는 서비스를 리턴해 주도록 리팩토링해서 아주 깔끔한 코드가 되었습니다.
그리고 일반적으로 하듯이 컨트롤러에서 @RequestMapping에서 뷰를 결정하기 위해서 보통 뷰에 대한 문자열을 리텅해 주는데 박용권님은 컨트롤러가 뷰를 선택해야 하는가에 대한 의문을 가졌습니다. 표현을 그대로 빌리자면 Spring MVC의 라이프 사이클에서 컨트롤러와 뷰리졸버가 나누어져 있기 때문에 박용권님의 고집으로는 이를 용납할 수 없었다고 합니다. 그래서 컨트롤러는 뷰리졸버에서 상품종류만 전달하고 ContentsNagotiationViewResolver를 이용해서 클라이언트에 따라서(최초 요구사항에 폰/테블릿/기타에 따라 다른 화면을 보여준다는 내용이 있었습니다.) 다른 뷰화면을 선택하도록 했습니다.전달하는데 약간의 모호함이 있었습니다. 정확히는 뷰는 컨트롤러가 선택하는게 맞고 뷰의 형태를 선택하는 것은 뷰리졸버라는 의도였습니다. 그래서 ContentsNagotiationViewResolver를 이용해서 뷰이름을 선택하고 ClientViewResolver로 요청클라이언트에 따라 다른 형태를 보여줍니다.
MVC를 사용할 때 흔히 만날 수 있는 이슈들을 어떻게 리팩토링 하는지 보여주었기 때문에 상당히 유용한 세션이었습니다. 발표자료와 예제소스는 박용권님의 블로그에 올라와 있습니다.
Spring Data - 백기선
제가 스프링도 잘 모르긴 하지만 JPA에 대해서는 더욱 잘 모르기 때문에 듣고도 다 이해하기는 어려웠던 세션입니다. 먼저 앞의 스프링원 키노트세션에서 살짝 언급했던던 XML설정 없이 자바설정만으로 프로젝트를 구성하는 예제를 보여주었습니다. 먼저 일반적인 web.xml, applicationContext.xml등으로 간단한 프로젝트를 구성하고 이를 자바설정으로 모두 대체해서 XML을 제거한 다음에도 프로젝트가 정상적으로 동작하는 것을 보여주었습니다. 그리고 자바 컨피그를 사용할 때는 컴포넌트 스캔에서 Configration과 Controller를 제외시켜주어야 한다더군요. 저는 코드로 하는 것을 더 좋아하긴 하지만 XML설정이 좋은가 자바설정이 좋은가는 호불호가 있을텐데 둘다 지원이 되니까 편한 것을 사용하면 될듯 싶더군요.
Spring Data에 대해서는 주요기능중 하나인 QueryDSL에 대해서 먼저 설명했습니다. QueryDSL을 사용하면 SQL을 다음처럼 작성할 수 있습니다.
query.from(customer)
.where(customer.firstName.eq("Bob"))
.list(customer.lastName);
함수형태로 사용하는 것이기 때문에 자동완성을 사용할 수 있고 컴파일단계에서 오류를 발견할 수 있기 때문에 SQL을 작성할 때 흔히 하는 오타로 인한 오류를 줄일 수 있습니다. 그리고 이러한 함수들은 제공되는 것 외에 spec을 이용해서 원하는 함수를 만들어서 재사용할 수 있습니다. 그리고 쿼리를 직접 사용해야 할 때는 Custom Repo를 쓰면 됩니다. 전 SQL을 잘 못하기 때문에 이런 부분은 무척 좋아보이더군요.(못해서 안좋아하는 건지 안좋아해서 못하는건지 잘 모르겠네요 ㅎ)
더 자세한 내용은 백기선님이 올리신 발표자료와 예제소스를 참고하시면 될듯 합니다.
Epilogue
마지막으로 박용권님의 Spring Social발표가 있었는데 이 프로젝트는 개인적으로도 관심이 있어서 듣고 싶었지만 오후에 집에 일이 좀 있어서 마지막 발표는 듣지 못하고 세미나장을 나왔습니다. 저도 봄싹에 속해있는 멤버인 관계로 세미나를 준비할 때 발표에 대한 고민을 했었지만 요즘 개인적으로 바쁜 일이 있어서 발표는 하지 않았습니다.(11월에 정신없었던거 생각하면 발표했으면 민폐끼칠뻔했네요.) 백기선님과 박용권님이 수고해준 덕분에 알찬 내용으로 세미나가 진행된것 같습니다. 사람들도 꽤 많이 오셨고 다들 반응이 좋은걸 보니 기분이 좋군요.
웹 개발자가 아니라서 쓰신 글을 다 이해할 수는 없지만,
이런 세미나도 개최하시고... 정말 대단하신 것 같습니다. ㅠㅠ
봄싹 멤버들 사이에 정보 교류가 잘 되는 것 같아서 무척 부럽네요. ㅠㅠ
앞으로도 좋은 세미나 부탁드립니다.
(나중에 저도 꼭 한번 들어보고 싶군요. ㅠㅠ)
별말씀으로.. 사실 적극성만 있다면 누구나 할수 있는일입니다. 내년에도 기회가 되면 이런자리를 마련하면 좋겠지요... ^^; 감사합니다.