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를 사용할 때 특이점

  1. 모든 메서드의 요청 매핑에 대한 응답은 데이터 (text, json, xml 데이터를 클라이언트에 전달)

  2. @PathVariable을 사용하여 요청 경로에 데이터를 전달시킬 수 있다

    • @RequestMapping("/board/{no}/{uname}")
      public String getPath(@PathVariable("no") Integer no, @PathVariable("uname") String uname) {
        return no+"g"+uname;
      }
      
    • 요청경로상 사용된 {no}, {uname}을 경로변수라고 한다

    • 경로변수를 사용하는 경우 {} 중괄호 갯수만큼 메서드 매개변수에 @PathVariable 선언이 되어 있어야 함

    • 경로변수와 같은 이름으로 정의되어 있어야 함
  3. 응답데이터로 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)에게 문자열뿐만 아니라 조작된 서버의 상태도 전달하는 것이 가능
  4. @RequestBody 는 클라이언트(내의 JavaScript)가 보낸 JSON 데이터를 VO로 변환하는 역할을 한다

    • @PostMapping(value = "/start", consumes = "application/json")
      public String create(@RequestBody ReplyVO vo) {
        return "시작";
      }
      
  5. 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);
      }