Spring 19 Restful

Kang.__.Mingu·2024년 9월 22일

Spring

목록 보기
18/21

REST(Representational State Transfer)

  • 자원(Resoutce)의 표현(Representational)에 의해 상태(State)를 전달(Transfer)하는 것을 의미

  • 페이지 요청에 대한 실행결과를 XML 문서 또는 JSON 형식의 문서로 클라이언트에게 응답 처리

Restful API

  • REST 기능을 사용해 두 컴퓨터의 시스템이 안전하게 값을 주고 받기 위한 프로그램

  • 스마트기기의 프로그램(앱) 실행에 필요한 정보를 전달받거나 실행결과를 제공하기 위해 실행

RestfulController.java

  • 페이지 요청시 요청 처리 메소드를 호출해 요청 처리 후 실행결과를 Model 객체로 Request Scope 속성값으로 저장하고 뷰이름(ViewName)을 반환하여 뷰(View)로 응답 처리 => 기존에 했던 방식
@RequestMapping(value = "/join", method = RequestMethod.POST)
public String join(@RequestParam String id, @RequestParam String name, Model model) {
	model.addAttribute("id", id);
	model.addAttribute("name", name);
	return "rest/output";
}
  • @ResponseBody: 요청 처리 메소드의 반환값을 리스폰즈 메세지 몸체부에 저장하여 일반 문서로 클라이언트에게 전달하여 응답하는 기능을 제공하는 어노테이션
    => Front Controller가 요청 처리 메소드의 반환값을 뷰로 변환하여 응답 처리하지 않고 요청 처리 메소드의 반환값으로 직접 응답 처리

  • @ResponseBody 어노테이션 대신 ResponsEntity 클래스를 요청 처리 메소드의 반환형으로 작성해 응답 처리 가능

  • 페이지 요청시 JSON 형식의 문자열로 클라이언트에게 응답 처리하기 위해 사용

  • @RequestBody: 리퀘스트 메세지 몸체부에 저장된 모든 전달값을 문자열로 제공받아 매개변수에 전달하기 위한 어노테이션
    => POST, PUT, PATCH, DELETE 등의 요청방식으로 페이지를 요청한 경우 리퀘스트 메세지 몸체부에 저장된 모든 전달값을 문자열로 제공받아 매개변수에 저장
    => GET 방식으로 페이지를 요청한 경우 리퀘스트 메세지 몸체부가 비어 있으므로 @RequestBody 어노테이션 사용 불가능

  • 페이지 요청시 JSON 형식으로 전달된 값(문자열)을 제공받아 매개변수에 저장하기 위해 사용

  • @RequestBody 어노테이션 대신 RequestEntity 클래스로 요청 처리 메소드의 매개변수를 작성해 전달값을 제공받아 매개변수에 저장

@Controller
@RequestMapping("/rest")
public class RestfulController {
    @RequestMapping(value = "/join", method = RequestMethod.GET)
    public String join() {
        return "rest/input";
    }
    
    @RequestMapping(value = "/join", method = RequestMethod.POST)
    @ResponseBody
    public String join(@RequestBody String input) {
        return input;
    }
    //@ResponseBody 어노테이션을 사용해 요청 처리 메소드의 반환값(RestMember 객체)을 리스폰즈
	//메세지 몸체부에 문자열로 저장하여 클라이언트에게 응답 처리
	//문제점 : 리스폰즈 메세지 몸체부에 Java 객체를 저장해 응답 처리 불가능 - 406 에러코드 발생
	//해결법 : 요청 처리 메소드에 의해 반환받는 Java 객체를 문자열(XML 또는 JSON)로 변환하여
	//리스폰즈 메세지 몸체부에 저장해 응답 처리
	// => jackson-databind 라이브러리를 프로젝트에 빌드 처리하면 요청 처리 메소드에 의해 반환되는
	//Java 객체를 JSON 형식의 문자열로 변경하여 리스폰즈 메세지 몸체부에 저장해 응답 처리 가능
	@RequestMapping("/member")
	@ResponseBody
	public RestMember restMember() {
		//RestMember 객체를 자바스크립트의 Object 객체로 변환하여 응답 처리
		return RestMember.builder().id("abc123").name("홍길동").email("abc@itwill.xyz").build();
	}

    /*
    //@ResponseBody 어노테이션 대신 요청 처리 메소드의 반환형을 ResponseEntity 클래스로 설정해
    //ResponseEntity 객체를 반환해도 문자열로 응답 처리 가능
    // => ResponseEntity 클래스의 제네릭에는 응답 처리될 Java 객체의 자료형을 설정
    @RequestMapping("/member")
    public ResponseEntity<RestMember> restMember() {
        try {
            RestMember member=RestMember.builder().id("abc123").name("홍길동").email("abc@itwill.xyz").build();
            return new ResponseEntity<RestMember>(member, HttpStatus.OK);
        } catch (Exception e) {
            return new ResponseEntity<RestMember>(HttpStatus.BAD_REQUEST);
        }
    }
    */

    @RequestMapping("/member_list")
    @ResponseBody
    public List<RestMember> restMemberList() {
        List<RestMember> list=new ArrayList<RestMember>();
        list.add(RestMember.builder().id("abc123").name("홍길동").email("abc@itwill.xyz").build());
        list.add(RestMember.builder().id("opq456").name("임꺽정").email("opq@itwill.xyz").build());
        list.add(RestMember.builder().id("xyz789").name("전우치").email("xyz@itwill.xyz").build());
        //List 객체를 자바스크립트의 Array 객체로 변환하여 응답 처리
        // => List 객체의 요소값(RestMember 객체)는 자바스크립트의 Object 객체로 변환
        return list;
    }

    @RequestMapping("/member_map")
    @ResponseBody
    public Map<String, Object> restMemberMap() {
        Map<String, Object> map=new HashMap<String, Object>();
        map.put("id", "abc123");
        map.put("name", "홍길동");
        map.put("email", "abc@itwill.xyz");
        //Map 객체를 자바스크립트의 Object 객체로 변환하여 응답 처리
        return map;
    }
}

@RequestBody@ResponseBody의 역할

  • @RequestBody

    • 클라이언트에서 보낸 HTTP 요청의 본문(Body)에 있는 데이터를 자바 객체로 변환해서 컨트롤러 메서드의 매개변수로 사용할 수 있게 한다.
    • 주로 JSON 형식의 데이터를 받을 때 많이 사용되지만, 텍스트나 다른 형식의 데이터를 받을 때도 사용할 수 있다.
  • @RequestBody

    • 컨트롤러 메서드에서 반환하는 값을 뷰로 처리하지 않고, HTTP 응답 본문으로 직접 보낸다.
    • 이를 통해 데이터를 응답 본문으로 클라이언트에게 전달할 수 있다. 주로 REST API를 구현할 때 JSON, XML, 텍스트 등의 데이터를 반환할 때 사용된다.
  • 한 가지 주의할 점은, 기본적으로 HTML 폼 데이터는 application/x-www-form-urlencoded 형식으로 전송된다. 하지만 @RequestBodyJSON형식으로 데이터를 주고받을 때 주로 사용된다.
    따라서, 일반적인 HTML 폼 데이터를 처리할 때는 @RequestParam을 사용하는 경우가 많다.

profile
최선을 다해 꾸준히 노력하는 개발자 망고입니당 :D

0개의 댓글