제 14회 한국 자바 개발자 컨퍼런스의 커뮤니티 세션에서 공유한 `overview of spring4` 의 발표 자료
스프링 프레임워크는 2004년에 출시된 이후 지금까지 많은 변화를 겪어왔습니다. 기억에 남아 있는 굴직한 변화를 더듬어 보면 버전 2.0은 XML 네임스페이스와 AspectJ 지원, 버전 2.5부터 애노테이션을 활용한 프로그래밍 기능이 추가되었습니다. 그리고 버전 3.0으로 올라가며 Java 5+ 기반으로 코드 구조가 바뀌고 자바 코드 기반 설정 기능이 추가되었습니다. 2013년 12월 13일에 버전 4.0 발표이 발표되었습니다. 주목할 변화는 바로 Java 8 지원과 제거 대상(@Deprecated)으로 선언되었던 많은 클래스와 메소드들이 삭제되었다는 것입니다. 이 외에도 많은 변화가 있습니다. 이번 시간에는 조금 높은 곳에서 내려다보는 느낌으로 무엇이 추가되었고, 어떤게 바뀌었는지 살펴보려고 합니다.
예제코드 : https://github.com/arawn/overview-of-spring4
스프링군살없이세팅하기(The way to setting the Spring framework for web.)EunChul Shin
깔끔하게 스프링 프레임워크 세팅하는 것에 대한 이야기 입니다.
군살없이 프레임워크를 세팅한다는 의미와 이유, 그리고 스프링 기본 설정 및 설정들의 역할에 대해서 정리해 보았습니다.
This presentation is about Spring framework.
I want to talk about the way to setting the spring framework as tidy in this presentation.
spring.io 레퍼런스(sagan project)를 통해서 배우는 spring 개발사례에 대해서 발표하고 정리한 프레젠테이션입니다. 작년에 SpringOne에서 발표된 inside spring.io 내용과 저의 개인적인 분석을 통해서 내용을 정리했습니다.
'입문자' 분들을 대상으로 정리했기 때문에 가능한한 간결하고 직관적으로 내용들을 표현했으며 깊게 들어가는 내용들은 거의 생략을 하였습니다.
자세한 내용들을 원하시면 프레젠테이션 중간중간에 관련 link를 첨부하였으니 같이 보시면은 도움이 되실것 같습니다.
스프링군살없이세팅하기(The way to setting the Spring framework for web.)EunChul Shin
깔끔하게 스프링 프레임워크 세팅하는 것에 대한 이야기 입니다.
군살없이 프레임워크를 세팅한다는 의미와 이유, 그리고 스프링 기본 설정 및 설정들의 역할에 대해서 정리해 보았습니다.
This presentation is about Spring framework.
I want to talk about the way to setting the spring framework as tidy in this presentation.
spring.io 레퍼런스(sagan project)를 통해서 배우는 spring 개발사례에 대해서 발표하고 정리한 프레젠테이션입니다. 작년에 SpringOne에서 발표된 inside spring.io 내용과 저의 개인적인 분석을 통해서 내용을 정리했습니다.
'입문자' 분들을 대상으로 정리했기 때문에 가능한한 간결하고 직관적으로 내용들을 표현했으며 깊게 들어가는 내용들은 거의 생략을 하였습니다.
자세한 내용들을 원하시면 프레젠테이션 중간중간에 관련 link를 첨부하였으니 같이 보시면은 도움이 되실것 같습니다.
The Spring Web model-view-controller (MVC) framework is designed around a DispatcherServlet that dispatches requests to handlers, with configurable handler mappings, view resolution, locale and theme resolution as well as support for uploading files.
배민찬(https://www.baeminchan.com) 서비스의 백엔드 시스템 중 일부가 지난 1년간 어떤 고민과 아이디어, 결과물을 만들어냈는지 공유하려고 합니다. 발표 중 언급되는 용어나 도구에 대해 일반적인 정의나 간단한 설명은 언급되나 자세히 다루지 않습니다. 사용된 도구들로 어떻게 이벤트 기반 분산 시스템을 만들었는지에 대한 이야기가 중심입니다.
Adied 2014, 봄싹 세미나에서 발표한 `Resource Handling in Spring MVC`의 발표자료입니다.
주요 내용으로 Spring MVC에서 정적 자원(css, js, etc)을 다루는 방법을 다루고 있습니다.
데모 코드 : https://github.com/arawn/resource-handling-in-springmvc
스트림 API는 람다 표현식을 적극적으로 활용해서 만들어진 자바의 새로운 API 입니다.
스트림 API를 통해서 자바에서도 맵/리듀스 방식으로 대량의 데이터를 순차 또는 병렬 처리를 할 수 있게 되었는데요, 이번 발표를 통해 스트림 API가 무엇인지- 어떻게 써먹는지에 대해 가볍게 씹고 뜯고 맛보고 즐기셨으면 좋겠습니다. :)
예제코드 : https://github.com/arawn/jdk8-stream-api
The Spring Web model-view-controller (MVC) framework is designed around a DispatcherServlet that dispatches requests to handlers, with configurable handler mappings, view resolution, locale and theme resolution as well as support for uploading files.
배민찬(https://www.baeminchan.com) 서비스의 백엔드 시스템 중 일부가 지난 1년간 어떤 고민과 아이디어, 결과물을 만들어냈는지 공유하려고 합니다. 발표 중 언급되는 용어나 도구에 대해 일반적인 정의나 간단한 설명은 언급되나 자세히 다루지 않습니다. 사용된 도구들로 어떻게 이벤트 기반 분산 시스템을 만들었는지에 대한 이야기가 중심입니다.
Adied 2014, 봄싹 세미나에서 발표한 `Resource Handling in Spring MVC`의 발표자료입니다.
주요 내용으로 Spring MVC에서 정적 자원(css, js, etc)을 다루는 방법을 다루고 있습니다.
데모 코드 : https://github.com/arawn/resource-handling-in-springmvc
스트림 API는 람다 표현식을 적극적으로 활용해서 만들어진 자바의 새로운 API 입니다.
스트림 API를 통해서 자바에서도 맵/리듀스 방식으로 대량의 데이터를 순차 또는 병렬 처리를 할 수 있게 되었는데요, 이번 발표를 통해 스트림 API가 무엇인지- 어떻게 써먹는지에 대해 가볍게 씹고 뜯고 맛보고 즐기셨으면 좋겠습니다. :)
예제코드 : https://github.com/arawn/jdk8-stream-api
Spring Framework 4.0과 4.1의 주요 업데이트 내용을 정리했습니다. 그리고, Spring I/O 2015 | The conference 에서 공개된 4.2의 소식들을 모아보았습니다. :)
ps. 제가 웬만하면 자료는 한글로 바꾸는 편인데... 이번에는 시간이 너무 부족해서 대부분 영어를 그대로 사용했네요. 다음에 기회가 되면 한글화시키는걸로...
[Spring Camp 2013] Java Configuration 없인 못살아!Arawn Park
Spring Camp 2013 / Track B Session 2
Java Configuration은 Spring 3.0과 함께 등장했습니다. 초기에는 '이게 뭐야?' 싶은 정도로 제대로된 모습을 갖춘 상태가 아니었습니다. 뒤돌아보면 스프링 1.0 시절의 XML을 보는것 같았지요. (웃음)
하지만 3.1이 발표되며 상황이 바뀌었습니다. XML 설정을 대체할 정도로 성장했을 뿐만 아니라 더 많은 것들을 할 수 있게 되었거든요.
이 시간에는 Spring을 사용하는 대표적인 예제 PetClinic(https://github.com/arawn/spring-petclinic)을 Java Configuration으로 재구성한 모습을 코드로 보여드립니다. 그리고 제가 보는 Java Configuration의 매력요소를 공유합니다.
스프링 WEB MVC에서 컨트롤러에서 예외처리하는 방법에 관해 설명한 PPT 입니다.
@ExceptionHandler는 스프링 컨트롤러에서 정의한 메소드에서 기술한 예외가 발생되면 자동으로 받아낼 수 있는데 이를 이용하여 컨트롤러에서 발생하는 예외를 View단 JSP등으로 보내서 처리할 수 있으며@ControllerAdvice는 스프링3.2 이상에서 사용가능하며 @Controller 나 스프링 4.0이상에서 지원하는 @RestController 에서 발생하는 예외 등을 catch하는 기능을 가지고 있으며 클래스 위에 @ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지 메소드 상단에 @ExceptionHandler(예외클래스명.class)를 기술합니다. 스프링4.0이상에서는 특정한 컨트롤러만 지정해서 캐치할 수 있죠
제10회 개발자를 위한 ‘共感(공감)’ 세미나 - Session 5 Vagrant와 Chef로 개발서버 구축 자동화하기의 장표입니다.
규모가 있는 자바 웹 프로젝트는 대부분 개발, 테스트, 이관, 운영 등 n개의 서버로 배포/관리가 된다.
테스트, 이관, 운영과 같은 서버는 별도의 서버가 마련되어 구축되지만 개발서버는 일반적으로 개발자 자신의 PC에 구축해서 진행하는 경우가 많다. 이러다보니 개발자별로 조금씩 미묘하게 다른 서버 환경이 자신의 PC에서는 잘 되는 기능이 다른 서버에 배포되면 구동되지 않는 경우도 많고, 프로젝트에 참여하는 개발자들이 개발서버를 구축하기 위해서 들이는 비용도 만만치 많이 들어간다.
Vagrant와 Chef라는 도구를 사용하면 개발자들이 자신의 PC에 개발서버를 구축하고 관리하는데 들어가는 비용을 획기적으로 줄일 수 있다.
예제에 보여준 동영상 : http://youtu.be/W28iX5WFRXU
예제에 사용된 소스 : https://gist.github.com/4366784
MEAN 스택을 사용한 IoT 개발 예제를 설명합니다.
* MEAN 스택 기본 내용 소개
* Node.js와 Express를 활용한 간단한 CRUD 서버 작성 방법(아주 단순하지만 (인증을 제외한 나머지) RESTful 서버의 기본 내용을 구현함)
* MongoDB와 Mongoose ODM를 사용한 영속적인 자료 저장 방법
* AngularJS를 사용한 아주 간단한 모니터링 도구 구현(하지만 의존성 주입, 양방향 자료 결합, 라우팅 활용 방법이 모두 들어 있음)
* 모든 예제는 bitbucket(git 호스팅 서비스)에 공개되어 있음
탑크리에듀교육센터(www.topcredu.co.kr)제공
15번째 스프링프레임워크 & 마이바티스(Spring Framework, MyBatis)자료입니다.
Spring JDBC에서 DB 접근하는 방법, Spring JDBC에서 DB 접근하는 방법 – jdbcTemplate, Maven, Gradle에서 오라클 설정에 대해 설명한 자료이니 많은 참고 바랍니다.
탑크리에듀교육센터(www.topcredu.co.kr)제공
스프링프레임워크 & 마이바티스(Spring Framework, MyBatis)
17번째 자료입니다. 참고하시어 많은 도움되셨길 바랍니다.
교육 및 수강문의/기타문의사항은 홈페이지(www.topcredu.co.kr)를 통하여 하실 수 있습니다.^^
기존 내용을 수정. Edit가 안되어 다시 올림.
기존 내용을 보셨으면 안보셔도 됩니다.
GraphQL overview,
GraphQL란
Schema (entity 및 entity간 관계설정)
graphiql 이란?
query + mutation sample
Sample code,
https://github.com/gidong-lee/graphQL_exam
본 장표는 인프콘 2022 / 코틀린 멀티플랫폼, 미지와의 조우 세션에 대한 강연 자료입니다.
코틀린은 멀티플랫폼을 지원하는 언어로 Server-side와 Android뿐만이 아니라 JavaScript 엔진이 있는 브라우저나 Node.js도 지원하며, Native 등 다양한 플랫폼에서 쓸 수 있습니다. 이를 이용해 코틀린 코드를 공유하는 단일 코드베이스로 모바일부터 웹과 데스크톱, 서버에 이르기까지 다중 플랫폼 애플리케이션을 작성할 수 있습니다.
본 핸즈온 세션을 통해 코틀린 멀티플랫폼과 함께 리액트, 스프링부트로 웹 애플리케이션의 프론트엔드부터 백엔드까지 직접 개발하며 친해져 보는 시간을 가져보세요. 참가자는 코틀린 멀티플랫폼 프로젝트를 이해하고, 더 나아가 프론트엔드와 백엔드 간의 공유 로직 작성, Kotlin/JS 기반 리액트 및 스프링 웹 프로그래밍을 경험할 수 있습니다.
https://github.com/arawn/building-fullstack-webapp-with-kotlin-multiplatform
https://infcon.day/speaker/박용권-김지헌-코틀린-멀티플랫폼/
코틀린이 제공하는 직렬화 라이브러리인 kotlinx.serialization를 소개하고, 왜 만들었는지 그리고 어떤 특징을 가지고 있는지 공유합니다.
슬라이드 내 예제 코드는 github 에 공개되어 있습니다.
https://github.com/arawn/kotlinx-serialization-overview
자프링(자바 + 스프링) 외길 12년차 서버 개발자가 코프링(코틀린 + 스프링)을 만난 후 코틀린의 특징과 스프링의 코틀린 지원을 알아가며 코프링 월드에서 살아남은 이야기…
코드 저장소: https://github.com/arawn/kotlin-support-in-spring
마이크로서비스 스타일로 만들어진 시스템을 모노리틱 스타일로 이관한 사례와 함께 스프링을 이용해 모듈형 모노리스(modular monoliths)를 만든 경험을 바탕으로 모노리틱/마이크로서비스 보다 본질적인 문제를 제기하고, 문제 해결을 위한 아이디어와 코드를 공유합니다.
https://github.com/arawn/building-modular-monoliths-using-spring
이 자료는 2019년 KSUG 세미나에서 진행한 "잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다"를 기반으로 몇가지 내용을 추가하고, 전개 방식을 다듬어 조금 더 친절하게 만들어졌습니다.
마이크로서비스 스타일로 만들어진 시스템을 모노리틱 스타일로 이관한 사례와 함께 스프링을 이용해 모듈형 모노리스(modular monoliths)를 만든 경험을 바탕으로 모노리틱/마이크로서비스 보다 본질적인 문제를 제기하고, 문제 해결을 위한 생각을 공유합니다.
https://github.com/arawn/building-modular-monoliths-using-spring
Reactive Web - Servlet & Async, Non-blocking I/OArawn Park
자바 서블릿(Java Servlet) 기술을 기반으로
리액티브 웹(REACTIVE WEB) 구현 과정을 공유!
1부, Servlet & Async, Non-blocking I/O
2부, Reactive Programing (작성 중)
3부, Spring Reactive Web (작성 중)
Spring framework 3.2 > 4.0 — themes and trendsArawn Park
제 13회 한국 자바 개발자 컨퍼런스 커뮤니티 세션에서 공유한 `Spring Framework 3.2 > 4.0 — Themes and Trends` 의 발표 자료
Spring Framework 3.1에 공개된 후 약 1년만에 Spring Framework 3.2개 공개되었습니다.
3.2에는 비동기 요청 처리와 향상된 JAVA 7 지원, Spring MVC Test framework 합류 등으로 자바 엔터프라이즈 애플리케이션을 개발하는데 있어 편리함과 함께 세련미를 더해주고 있습니다.
최근 Spring Framework 핵심 개발자인 Juergen Hoeller는 springsource blog에 "NEXT STOP: SPRING FRAMEWORK 4.0"라는 제목으로 앞으로 Spring Framework에 어떤 변화들이 찾아올지에 대해서 미리 귀뜸을 해주었습니다.
이 시간을 통해 Spring Framework 3.2의 새로운 기능들과 개선사항을 살펴보고, Spring Framework의 미래 모습에 대해 이야기를 나눠보는 자리를 만들고자 합니다.
5. “스프링 4.0”
볼거리
✔ 자바 8 지원
✔ 자바 EE 6 및 7 지원
✔ 그루비 빈 정의 DSL
✔ 자바 웹소켓 API 지원
✔ 경량 메시지 아키텍처 지원
✔ REST Client 개발시 비동기 처리
✔ 그외 개선사항
✔ @Deprecated클래스및메소드삭제
6. Java 8
✔ lambda expressions
✔ method references
✔ JSR-310 Date and Time
✔ repeatable annotations
✔ parameter name discovery
: based on the -parameters compiler flag
지원 기능
동작 환경
✔ Java SE 6+ (JDK 6 update 10, ~2008)
✔ JDK 8 기반 애플리케이션은 4.0 이상 권장
20. Lambdas with JdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
!
ListPerson persons = jdbcTemplate.query(
SELECT name, age FROM person where age = ?,
new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
ps.setInt(1, 35);
}
},
new RowMapperPerson() {
@Override
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Person(rs.getString(1), rs.getInt(2));
}
});
21. Lambdas with JdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
!
ListPerson persons = jdbcTemplate.query(
SELECT name, age FROM person where age = ?,
new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
ps.setInt(1, 35);
}
},
new RowMapperPerson() {
@Override
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Person(rs.getString(1), rs.getInt(2));
}
});
(
30. Lambdas with JdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
!
ListPerson persons = jdbcTemplate.query(
SELECT name, age FROM person where age = ?,
(PreparedStatement ps) - {
ps.setInt(1, 35);
},
(ResultSet rs, int rowNum) - {
return new Person(rs.getString(1), rs.getInt(2));
}
);
31. Lambdas with JdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
!
ListPerson persons = jdbcTemplate.query(
SELECT name, age FROM person where age = ?,
(PreparedStatement ps) - {
ps.setInt(1, 35);
},
(ResultSet rs, int rowNum) - {
return new Person(rs.getString(1), rs.getInt(2));
}
);
!
ListPerson persons = jdbcTemplate.query(
SELECT name, age FROM person where age = ?,
ps - ps.setInt(1, 35),
(rs, rowNum) - new Person(rs.getString(1), rs.getInt(2))
);
32. Method References with JdbcTemplate
public ListPerson findAll() {
return jdbcTemplate.query(SELECT name, age FROM person,
new RowMapperPerson() {
@Override
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Person(rs.getString(1), rs.getInt(2));
}
});
}
33. Method References with JdbcTemplate
public ListPerson findAll() {
return jdbcTemplate.query(SELECT name, age FROM person,
new RowMapperPerson() {
@Override
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Person(rs.getString(1), rs.getInt(2));
}
});
}
!
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Person(rs.getString(1), rs.getInt(2));
}
34. Method References with JdbcTemplate
public ListPerson findAll() {
return jdbcTemplate.query(SELECT name, age FROM person, this::mapRow);
}
!
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Person(rs.getString(1), rs.getInt(2));
}
35. JSR-310: Java의 새로운 날짜와 시간 API
✔ 'java.util.Date' 와 ' java.util.Calendar ' 대체
✔ 직관적이고 사용하기 쉬운 API
✔ 오픈소스 참고: Joda-Time, Time and Money, ICU 등
✔ hello world(NHN 개발자 블로그): Java의 날짜와 시간 API
36. JSR-310: 날짜와 시간 API 지원
✔ 날짜와 시간 타입에 대한 다양한 컨버터 / 포맷터 제공
: DateTimeConverters
: DateTimeFormatterRegistrar
: Jsr310DateTimeFormatAnnotationFormatterFactory
!
✔ @DateTimeFormat: 포맷팅을 손쉽게 설정
: java.util.Date
: java.util.Calendar
: java.long.Long
: Joda-Time
: JSR-310: java.time.*
37. JSR-310: 날짜와 시간 API 지원
import org.springframework.format.annotation.DateTimeFormat;
import java.time.*;
@Controller
public class JSR310Controller {
@RequestMapping(value = /jsr310, params = localDate)
@ResponseBody
public LocalDate test(LocalDate localDate) {
return localDate;
}
@RequestMapping(value = /jsr310, params = localDateTime)
@ResponseBody
public LocalDateTime test(@DateTimeFormat(pattern = yyyy-MM-dd HH:mm:ss)
LocalDateTime localDateTime) {
return localDateTime;
}
}
39. Java EE
6 and 7
✔ JPA 2.1
✔ JTA 1.2
✔ JMS 2.0
✔ Bean Validation 1.1
✔ JSR-236 Concurrency Utilities
지원 명세
동작 환경
✔ Java EE 6+ 이상
✔ Servlet 2.5 도 호환되나, 3.0 이상 권장
40. 그루비
빈 정의 DSL
✔ JVM에서 동작하는 동적 언어
✔ 컴파일 하지 않고 실행하는 스크립트 언어
✔ Java + Python, Ruby, Smalltalk
✔ 간결한 문법, 강력한 기능 그리고 DSL 지원
Groovy
빈 정의 DSL
✔ 간결한 문법으로 빈 정의
✔ XML NameSpace 기능 지원
44. WebSocket
and
Messaging
✔ JSR 356: Java 웹소켓 API 지원
✔ SockJS: 웹소켓 미지원 브라우저 대응
spring-websocket module
spring-messaging module
✔ 메시지, 채널 등 추상화 모델 제공
✔ 고수준 메시지 프로토콜 STOMP 지원
45. ✔ HTML5 표준
✔ API: W3C / 프로토콜: IETF
✔ 웹 소켓 프로토콜 사용
✔ 양방향 통신
JSR 356: Java WebSocket API
46. ✔ Tomcat 7.0.47+ and 8.0
✔ Jetty 9.0 and 9.1
✔ WildFly 8.0 (JBoss Application Server)
✔ GlassFish 4.0
JSR 356: Java WebSocket API
47. WebSocketHandler 인터페이스
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.WebSocketMessage;
public class EchoHandler implements WebSocketHandler {
@Override
public void handleMessage(WebSocketSession session
, WebSocketMessage? message) throws Exception {
sessions.forEach(session - {
try { session.sendMessage(message); }
catch (IOException ignore) { }
});
}
// 생략
}
예제 코드 : http://goo.gl/SNzGQ2
48. WebSocket 활성화 및 WebSocketHandler 등록
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
!
@Configuration
@EnableWebSocket
public class ExampleWebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(echoHandler(), /websocket/echo);
}
@Bean
public EchoHandler echoHandler() {
return new EchoHandler();
}
}
예제 코드 : http://goo.gl/SNzGQ2
49. JavaScript: WebSocket Client
var echoUri = ws://ksug.org/websocket/echo;
var websocket = new WebSocket(echoUri);
!
// 접속, 접속종료, 메시지 수신, 오류 이벤트 처리
websocket.onopen = function(event) {
};
websocket.onclose = function(event) {
};
websocket.onmessage = function(event) {
};
websocket.onerror = function(event) {
};
!
// 메세지 전송
websocket.send(message!);
예제 코드 : http://goo.gl/iAcbX6
50. Can I use WebSockets?
✔ Chrome 14.0+ (Current 32.0)
✔ Safari 6.0+ (Current 7.0)
✔ Firefox 11.0+ (Current 27.0)
✔ Internet Explorer 10.0+ (Current 11.0)
✔ iOS Safari 6.0+ (Current 7.0)
✔ Android Browser 4.4
51. !
!
!
!
!
!
JavaScript로
브라우저 종류에 상관없이
실시간 웹 구현 기술
SockJS 는...
✔ SockJS-client JavaScript client library
✔ SockJS-node Node.js server
✔ SockJS-erlang Erlang server
✔ SockJS-tornado Python server
✔ SockJS-twisted Python server
✔ vert.x Java/vert.x server
✔ SockJS-cyclone Python server
SockJS family
✔ WebSocket
✔ AJAX long polling
✔ AJAX multipart streaming
✔ Forever Iframe
✔ JSONP Polling
지원 기술
52. SockJS WebSocketHandler 등록하기
@Configuration
@EnableWebSocket
public class ExampleWebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(echoHandler(), /websocket/echo).withSockJS();
}
@Bean
public EchoHandler echoHandler() {
return new EchoHandler();
}
}
예제 코드 : http://goo.gl/SNzGQ2
53. JavaScript: SockJS Client
var echoUri = /websocket/echo/sockjs;
var sock = new SockJS(echoUri);
!
// 접속, 접속종료, 메시지 수신, 오류 이벤트 처리
sock.onopen = function(event) {
};
sock.onclose = function(event) {
};
sock.onmessage = function(event) {
};
sock.onerror = function(event) {
};
!
// 메시지 전송
sock.send(message!);
예제 코드 : http://goo.gl/iAcbX6
55. STOMP Message 처리
import org.springframework.stereotype.Controller;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.Message;
@Controller
public class EchoController {
@Autowired
private SimpMessageSendingOperations messagingTemplate;
@MessageMapping(/echo)
public void echo(MessageString message) {
messagingTemplate.send(/topic/echo, message);
}
}
예제 코드 : http://goo.gl/SNzGQ2
56. STOMP 활성화 및 설정
@Configuration
@EnableWebSocketMessageBroker
public class ExampleWebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint(/websocket/endpoint/stomp);
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes(/stomp);
registry.enableSimpleBroker(/topic/);
}
@Bean
public EchoController echoController() {
return new EchoController();
}
}
예제 코드 : http://goo.gl/SNzGQ2
57. JavaScript: STOMP Client
var echoUri = ws://ksug.org/websocket/endpoint/stomp;
var websocket = new WebSocket(echoUri);
!
var stompClient = Stomp.over(websocket);
stompClient.connect(' ', ' ', function(frame) {
// 접속성공
!
stompClient.subscribe(/topic/echo, function(message) {
// echo 채널 메시지 수신
});
}, function (error) {
// 접속실패
});
!
// 메시지 전송
stompClient.send('/stomp/message', {}, message!);
예제 코드 : http://goo.gl/iAcbX6
60. 병렬적으로 API 호출시 응답시간이 짧다
SNS에서 URL 공유 횟수를 알고싶다!
Server
Google PlusREST
FacebookREST
TwitterREST
61. REST 클라이언트 개발시 비동기 지원
AsyncRestTemplate
final String FACEBOOK_COUNT_API = http://graph.facebook.com/?id={url};
!
ListenableFutureResponseEntityRepository[] reposForEntity =
asyncRestTemplate.getForEntity(GITHUB_API_USERS_REPOS, Repository[].class, uriVariables);
!
reposForEntity.addCallback(new ListenableFutureCallbackResponseEntityRepository[]() {
@Override
public void onSuccess(ResponseEntityRepository[] entity) {
// 응답 데이터 처리
}
@Override
public void onFailure(Throwable throwable) {
// 예외 처리
}
});
예제 코드 : http://goo.gl/YspZGN
62. 그외
개선사항
✔ Generics 기반 의존성 주입
✔ 메타 애노테이션 속성 재정의
✔ 조건부 빈 정의
✔ 기타
Core Container
✔ @RestController 추가
✔ Spring MVC: TimeZone 사용 지원
Web
✔ 테스트용 메타 애노테이션 정의
✔ mock.web.* 이하 Servlet 3.0 필요
Testing
63. Generics 기반 의존성 주입
public interface RepositoryT {
...
}
public interface PlayerRepository extends RepositoryPlayer {
...
}
!
@Controller
public class PlayerController {
@Autowired
private RepositoryPlayer playerRepository;
}
64. 메타 애노테이션 속성 재정의
@Transactional(indexDataSource)
@Retention(RetentionPolicy.RUNTIME)
public @interface IndexDataSourceTransactional {
boolean readOnly() default false;
}
@Transactional(metaDataSource)
@Retention(RetentionPolicy.RUNTIME)
public @interface MetaDataSourceTransactional {
boolean readOnly() default false;
}
@Service
public class ExampleServiceImpl implements ExampleService {
@IndexDataSourceTransactional(readOnly = true)
public IndexEntity findIndex() { ... }
@MetaDataSourceTransactional(readOnly = true)
public MetaEntity findMeta() { ... }
}
65. 조건에 따른 빈 정의
✔ 조건에 따라 빈을 필터링하는 일반적인 방법 추가
: Spring 3.1 @Profile 보다 더욱 유연하고 동적으로 지원
: Spring Boot 프로젝트에서 적극적으로 사용
!
✔ @Conditional 과 Condition 인터페이스로 조건부 필터링 구현
: 다양한 조건에 따라 대응 가능(시스템 OS, 자바 버전, 빈 등록여부 등...)
: @Profile도 ProfileCondition을 통해 동작되도록 구현
: 사용자 정의 조건부 빈 정의 지원
66. 조건에 따른 빈 정의: Spring Boot
@Configuration
@ConditionalOnWebApplication
public class EmbeddedServletContainerAutoConfiguration {
!
@Configuration
@ConditionalOnClass({ Servlet.class, Tomcat.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class)
public static class EmbeddedTomcat {
// Tomcat 구동
}
!
@Configuration
@ConditionalOnClass({ Servlet.class, Server.class, Loader.class })
@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class)
public static class EmbeddedJetty {
// Jetty 구동
}
}
67. Core Container 개선사항: 기타
✔ 기본 생성자 없이 CGLIB 프록시 생성
: 오픈소스 objenesis를 사용한 프록시 대상 객체 생성
!
✔ 순서를 보장하는 의존성 주입
: Ordered 인터페이스 또는 @Ordered 에 따른 정렬 후 의존성 주입
!
✔ 의존성 주입시 @Lazy 지원
!
✔ @Description: 빈 정의시 주석 작성
68. 테스트용 메타 애노테이션 정의
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({/app-config.xml, /test-data-access-config.xml})
@ActiveProfiles(dev)
@Transactional
public class OrderServiceTests {
...
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({/app-config.xml, /test-data-access-config.xml})
@ActiveProfiles(dev)
@Transactional
public class UserServiceTests {
...
}
69. 테스트용 메타 애노테이션 정의
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionalDevTest
public class OrderServiceTests {
...
}
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionalDevTest
public class UserServiceTests {
...
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration({/app-config.xml, /test-data-access-config.xml})
@ActiveProfiles(dev)
@Transactional
public @interface TransactionalDevTest { }
70. @Deprecated 클래스 및 메소드 삭제
✔ @Deprecated 클래스 및 메소드 모두 삭제
: API Differences Report에서 확인 가능
!
✔ Third-Party 라이브러리 호환
: 버전 4.0 기준 2010/2011년도 이후 버전을 사용
: Hibernate 3.6+, EhCache 2.1+, Quartz 1.8+, Groovy 1.8+, Joda-Time 2.0+
: 예외적으로 Hibernate Validator는 4.3+ 버전이 필요
: Jackson 1.8/1.9는 @Deprecated 선언, 2.0+ 이상을 지원하는데 집중
73. Special Thanks to
✔ Designed for Sails.js,
an MVC framework for Node by Balderdash
@mikermcneil / @KallunaLovegood
✔ OXQuiz Fornt-end by @outsideris
74. 한국 스프링 사용자 그룹
(KSUG)
https://www.facebook.com/groups/springkorea/
http://groups.google.com/group/ksug
http://www.ksug.org/