스프링 3.0 & restful

25
스프링 3.0 & RESTful 백기선, 김성윤

Upload: javacommunityorg

Post on 23-Jun-2015

7.099 views

Category:

Technology


2 download

DESCRIPTION

2010 한국 자바 개발자 페스티벌 Track 1 Session 4 발표자료

TRANSCRIPT

Page 1: 스프링 3.0 & RESTful

스프링 3.0 & RESTful

백기선, 김성윤

Page 2: 스프링 3.0 & RESTful

봄싹 즐겨찾기 서비스

Page 3: 스프링 3.0 & RESTful

To Do

• 링크 등록

• 링크 목록 조회

• 링크 조회

• 링크 수정

• 링크 삭제

Page 4: 스프링 3.0 & RESTful

즐겨찾기 서비스 URL

작업 URL Method

목록 조회 /link GET

추가 (폼) /link/form GET

추가 (폼 서브밋) /link POST

뷰 /link/1 GET

수정 (폼) /link/1/form GET

수정 (폼 서브밋) /link/1 PUT

삭제 /link/1 DELETE

Page 5: 스프링 3.0 & RESTful

주요 기술 :: 스프링 3.0 @MVC

• @RequestMapping

• @PathVariable

• hiddenMethodFilter

• 스프링 form 태그

• ContentsNegotiatingViewResolver

Page 6: 스프링 3.0 & RESTful

@RequestMapping

• DefaultAnnotationHandlerMapping이@RequestMapping 정보를 참조해서 핸들러 찾아줌.

@RequestMapping(value = ”/link/{id}", method = RequestMethod.DELETE)public String delete(@PathVariable int id){

postService.delete(id);return ”/link";

}

Page 7: 스프링 3.0 & RESTful

@PathVariable

• /link/1 => /link/{id}

• 기본값 설정 가능

@RequestMapping(value = "/link/{id}", method = RequestMethod.GET)public String view(@PathVariable int id, Model model){

model.addAttribute(”link", linkService.get(id));return ”link/view";

}

Page 8: 스프링 3.0 & RESTful

hiddenMethodFilter

• 기본값: _method

<filter><filter-name>httpMethodFilter</filter-name><filter-

class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter>

<filter-mapping><filter-name>httpMethodFilter</filter-name><url-pattern>/*</url-pattern>

</filter-mapping>

Page 9: 스프링 3.0 & RESTful

스프링 form 태그

• form 태그 사용하면 PUT, DELETE 사용시자동으로 히든 파라미터로 값 넘겨줌.

<form:form commandName=”link" action=”/link/${link.id}" method="PUT">

<form:form action=”/link/${link.id}" method="DELETE">

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

Page 10: 스프링 3.0 & RESTful

ContentsNegotiatingViewResolver이게 없다면…

if ("xml".equals(req.getParameter("type"))) { return new ModelAndView(helloMarshallingView, model);

} else { return new ModelAndView("/WEB-INF/view/hello.jsp", model);

}

Page 11: 스프링 3.0 & RESTful

ContentsNegotiatingViewResolver이게 있다면?

Page 12: 스프링 3.0 & RESTful

ContentsNegotiatingViewResolver동작 방식

1. 미디어 타입 결정

2. 뷰 후보 선정

3. 최종 뷰 결정

Page 13: 스프링 3.0 & RESTful

1. 미디어 타입 결정

1. URL 확장자로 결정– /book.json

2. 요청 파라미터로 결정– /book?format=json

3. Access 헤더 정보로 결정

4. defaultContentType 속성 값 사용.

Page 14: 스프링 3.0 & RESTful

2. 뷰 후보 선정

1. viewResolvers 미사용시: 서블릿 콘텍스트에 등록된 모든 ViewResolver 사용해서뷰 후보 선정

2. viewResolvers 사용시: 모든 뷰 리졸버가돌려주는 뷰를 후보 목록에 추가

3. defaultView 속성에 설정한 뷰는 무조건후보 목록에 추가

Page 15: 스프링 3.0 & RESTful

3. 최종 뷰 결정

• 미디어 타입과 뷰 목록 비교해서 뷰 결정

– 뷰의 contents-type과 미디어 타입 비교

• 예제

– 미디어 타입은 JSON

– 뷰 후보: JSON 뷰, JSTL 뷰, XML 뷰

– 결과: JSON뷰 사용

Page 16: 스프링 3.0 & RESTful
Page 17: 스프링 3.0 & RESTful

RestTemplate

• Spring 3.0 M2 추가됨.

• Spring’s Template series와 비슷한 형태

(JdbcTemplate, JmsTemplate ... )

• RESTful 스타일 URL 지원.

• HTTP access 단순화.

• 사용자 정의 콜백 및 결과 추출 클래스 지원.

Page 18: 스프링 3.0 & RESTful

RestTemplate Hierarchy

Page 19: 스프링 3.0 & RESTful

RestTemplate methods

HTTP method RestTemplate methods

GET getForObject(…)getForEntity(…)

POST postForLocation(…)postForObject(…)

PUT put(…)

DELETE delete(…)

HEAD headForHeaders(…)

OPTIONS optionForAllow(…)

Page 20: 스프링 3.0 & RESTful

HttpRequests

SimpleClientHttpRequest( java.net. HttpURLConnection)

CommonsClientHttpRequest( jakarta Commons HttpClient)

사용자 정의 HttpRequest

Page 21: 스프링 3.0 & RESTful

HttpMessageConverters

• application/octet-streamByteArray

• text/plainString

• resource file typeResource

• text/xml or application/xmlSource

• text/xml or application/xml XmlAwareForm

• text/xml or application/xml Jaxb2RootElement

• application/jsonMappingJackson

• application/atom+xmlAtomFeed

• application/rss+xmlRssChannel

Page 22: 스프링 3.0 & RESTful

RestTemplate – 사용전

String uri = "http://example.com/hotels/1/bookings";

PostMethod post = new PostMethod(uri);

String request = // create booking request content

post.setRequestEntity(new StringRequestEntity(request));

httpClient.executeMethod(post);

if (HttpStatus.SC_CREATED == post.getStatusCode()) {

Header location = post.getRequestHeader("Location");

if (location != null) {

System.out.println(location.getValue());

}

}

Page 23: 스프링 3.0 & RESTful

RestTemplate – 사용후

String uri = "http://example.com/hotels/{id}/bookings";

RestOperations restTemplate = new RestTemplate();

Booking booking = // create booking object

URI location = restTemplate.postForLocation(uri, booking, “1”);

System.out.println(location);

Page 24: 스프링 3.0 & RESTful

Authentication

Basic Authentication

• CommonsClientHttpRequest

Open Authorization(OAuth)

• 미지원 (3.1M1 Fix 예정)

Page 25: 스프링 3.0 & RESTful

RestTemplate @ Twitter RESTful