Tata AIG General Insurance Company - Insurer Innovation Award 2024
Spring MVC 3 Restful
1. Spring 3 MVC Rest (3.0.5 기준) 김용환 Knight76 at gmail.com Knight76.tistory.com 맛보기
2. 특징 REST를 쓰기 위해서 Spring MVC 모델을 그대로 차용, Annotation 이용(Controller) JSR 311을 따르지는 않지만, 대부분의 기능 구현 하나의 리소스는 여러 개의 Represenation을 가질 수있도록함 (JSON/XML/ATOM/RSS) 브라우저에서 지원하지 않는 PUT & POST 요청을 처리할 수 있음 Custom parser 이용 가능 UTIL(converter..) 클래스 지원 => REST 관련 Conception만 조금 공부하면 되고, 나머지는 기존 MVC만 알면 되기 까닭에재사용성이 큼
3. Spring 3 Rest 지원#1 Annotation 지원 @Controller : MVC @RequestMapping : HTTP 메소드, URI, 헤더 처리@RequestMapping(method=RequestMethod.GET, value="/members", @PathVariable: 메소드 안에서 파라미터와매핑하기 위해서 사용public ModelAndViewgetEmployee(@PathVariable String id) { … } @RequestParam : URL 매개변수 이용 @RequestHeader @RequestBody @HttpEntity<T> @ResponseEntity<T> : 정의한대로 response 리턴 public @ResponseBody Employee getEmployeeBy(@RequestParam("name") String name, @RequestHeader("Accept") String accept, @RequestBody String body) {…} public ResponseEntity<String> method(HttpEntity<String> entity) {…}
4. Spring 3 Rest 지원 #1 Annotation 지원 @ResponseStatus @ExceptionHandler
5. Spring 3 Rest 지원 #2 ContentNegotiatingViewResolver 요청 데이터 포맷에 맞춰 다양한 MIME(미디어 타입) 이나 content type으로 전달 가능 ATOM, RSS, XML, JSON, OXM 예) http://localhost:8080/fruit/banana.xml http://localhost:8080/fruit/banana.rss http://localhost:8080/fruit/banana.html Accept : application/xml Accept : application/json Accept : application/html
24. Content Negotiation HTTP 1.1 스펙에서 정의 의미 media type, 언어, 문자집합, 인코딩 등에 대해 브라우저가 제공한 선호도에 따라 자원의 가장 적합한 표현을 선택. 불완전한 협상 정보를 보내는 브라우저의 요청을 지능적으로 처리하는 기능 일반적으로 다른 프로토콜을 쓰려면, request의 “type” 파라미터를 확인하고, 이에 맞는 marshalling정보를 전달해야 한다. 트위터API가 이렇게 사용되고 있음 Spring MVC에서는 한번에 해결해주는 클래스 사용 ContentNegotiatingViewResolver
30. Demo에서 @XmlElement사용시 유의할 점 Set메소드를 사용하려면, 다음과 같이 한다. 클래스의 멤버 필드에서 @XmlElement를 정의할 때는 set 메소드를 사용하지 않는다. @XmlRootElement(name = "fruit") public class Fruit { private String name; private int quality; @XmlElement public void setBody(Body body) { this.body= body; } public String getName() { return name; } @XmlElement public void setQuality(int quality) { this.quality= quality; } public intgetQuality() { return quality; } … } @XmlRootElement(name = "fruit") public class Fruit { @XmlElement private String name; @XmlElement private int quality; public String getName() { return name; } public intgetQuality() { return quality; } … } JAXB에서 property를 읽을 때, 잘 사용해야 하는 구조
31. Demo에서 @XmlElement사용시유의할 점 Body 클래스앞에@XmlRootElement선언이 되어 있으면, Fruit 클래스 에서 @XmlElement를 사용하지 않아도 된다. @XmlRootElement(name = "body") public class Body { @XmlElement private String msg; // set/get accessory …. } @XmlRootElement(name = "fruit") public class Fruit { @XmlElement private String name; @XmlElement private int quality; private Body body; public String getName() { return name; } public intgetQuality() { return quality; } … }
33. 웹 브라우져 제약 #1 GET/POST만 쓸 수 있는 웹 브라우져가 있을 수 있다. PUT과 DELETE 을 쓰기 위해서는 trick을 써야 한다. HiddenHttpMethodFilter이용 Web.xml <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>
34. 웹 브라우져 제약 #2 // spring mvc form tag <form:form method="delete"> <p class="submit"><input type="submit" value="Delete Pet"/></p> </form:form> @RequestMapping(method = RequestMethod.DELETE) public String deletePet(@PathVariableintownerId, @PathVariableintpetId) { this.clinic.deletePet(petId); return "redirect:/owners/" + ownerId; } 아마도 예전처럼 내부적으로 name=“_method” value=“Delete” 하는 형태로 전달하고, Spring 서버는 이 정보를 바탕으로 구현 했을 것으로 예상 <form action="POST"> <input type="hidden" id="_method" value="PUT"> </form>
35. PUT/DELETE in HTML HTML version 4 과 XHTML 1에서는 HTML form안의 HTTP 요청은 GET과 POST 방식만 허용. 그동안put/delete 메소드를 사용하려면, XMLHttpRequest를 이용하였음 HTTP상에서는 ok! HTML5에서 put/delete는 사용하지 못한다고 나와 있음 http://www.w3.org/TR/html5-diff/ Using PUT and DELETE as HTTP methods for the form element is no longer supported. 참고