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); } 
 -