spring 4
REST(Representational State Transfer) 방식
-
하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념에 전송방식을 결합해서 원하는 작업 지정
-
원래 컨트롤러에서 String 값을 return 해주면
servlet-context.xml
에서 지정해준 prefix, suffix와 결합되어 jsp 파일로 이동해주었지만 리턴값 앞에@ResponseBody
를 명시하여 데이터를 반환하도록 해준다 -
@Controller public class MyController { @RequestMapping("/hello") public @ResponseBody String hello() { return "hello"; } }
-
또는
@RestController
를 사용하여 이 컨트롤러 내의 모든 요청매핑은 데이터를 응답하도록 해준다 -
@RestController public class MyController { @RequestMapping("/hello") public String hello() { return "hello"; } @RequestMapping("/hello2") public String hello2() { Person vo = new Person("홍길동", 25, "학생"); return vo; // JSON 리턴 } }
@RestController
를 사용할 때 특이점
-
모든 메서드의 요청 매핑에 대한 응답은 데이터 (text, json, xml 데이터를 클라이언트에 전달)
-
@PathVariable
을 사용하여 요청 경로에 데이터를 전달시킬 수 있다-
@RequestMapping("/board/{no}/{uname}") public String getPath(@PathVariable("no") Integer no, @PathVariable("uname") String uname) { return no+"g"+uname; }
-
요청경로상 사용된 {no}, {uname}을 경로변수라고 한다
-
경로변수를 사용하는 경우 {} 중괄호 갯수만큼 메서드 매개변수에 @PathVariable 선언이 되어 있어야 함
- 경로변수와 같은 이름으로 정의되어 있어야 함
-
-
응답데이터로
ResponseEntity<리턴할 데이터 타입>
을 사용할 수 있다-
@RequestMapping("/hello") public String m1() { return "안녕하세요"; } @RequestMapping("/good") public ResponseEntity<String> m2() { return new ResponseEntity<>("좋아요", HttpStatus.OK); // return new ResponseEntity<>("좋아요", HttpStatus.INTERNAL_SERVER_ERROR); }
- 클라이언트(HTML 내의 JavaScript)에게 문자열뿐만 아니라 조작된 서버의 상태도 전달하는 것이 가능
-
-
@RequestBody
는 클라이언트(내의 JavaScript)가 보낸 JSON 데이터를 VO로 변환하는 역할을 한다-
@PostMapping(value = "/start", consumes = "application/json") public String create(@RequestBody ReplyVO vo) { return "시작"; }
-
-
pom.xml에 XML 컨버터 추가시 변화
-
<!-- JSON Converter(컨트롤러에서 전달한 VO데이터를 JSON으로 변경하기 위해 사용) --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.6</version> </dependency> <!-- XML Converter(컨트롤러에서 전달한 VO데이터를 XML로 변경하기 위해 사용) --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.9.6</version> </dependency>
-
@ResponseBody
의 한글 깨짐 처리
servlet-context.xml
<annotation-driven>
<!-- @ResponseBody의 한글 깨짐 처리 -->
<message-converters>
<beans:bean class="org.springframework.http.converter.StringHttpMessageConverter">
<beans:property name="supportedMediaTypes">
<beans:value>text/html;charset=UTF-8</beans:value>
</beans:property>
</beans:bean>
</message-converters>
</annotation-driven>
Controller의 리턴
-
void
-
요청 URL이 뷰페이지와 같음
-
@RequestMapping("hello") public void test1() { }
-
-
String
-
리턴 스트링값의 이름을 가진 .jsp 출력
-
페이지 이동 O
-
@RequestMapping("hello2") public String test2() { return "good"; }
-
-
@ResponseBody String
-
리턴 문자열을 전달
-
페이지 이동 X
-
@RequestMapping("hello3") public @ResponseBody String test3() { return "good"; }
-
-
@ResponseBody DTO
-
데이터 전달
-
페이지 이동 X
-
@RequestMapping("hello4") public @ResponseBody DTO test4() { DTO dto = new DTO("홍길동", 25); return dto; // --> {"name":"홍길동", "age":25} JSON 전달 }
-
-
@ResponseEntity<데이터타입>
-
전달데이터와 그 외의 정보를 같이 보내는 것이 가능
-
그 외의 정보(헤더 정보, 응답코드 종류)를 조작하는 것이 가능
-
@RequestMapping("hello5") public ResponseEntity<String> test5() { return new ResponseEntity<>("SUCCESS", HttpStatus.OK); }
-