REST

Let's Just Go·2022년 7월 19일
0

Spring

목록 보기
11/26

Spring

REST

JSON

  • JSON (JavaScript Object Notation)

    • XML 처럼 데이터를 전송하는 방식

      • XML은 태그형식으로 되어 있어 복잡하고 길어질 수 있는 단점이 존재
    • JSON은 JavaScript의 Object 표현 방식만 가져온 것이고 JavaScript가 절대 아니고 그저 데이터를 표현 방식

    • 데이터 포맷이며 어떤 통신 방법도, 프로그래밍 문법도 아닌 데이터를 표시하는 표시 방법 중 하나이며 그냥 텍스트 형식일 뿐임

    • {Key : Value} 형식

    • 서버와 클라이언트 간 교류에서 많이 사용

    • 원하는 만큼 중첩시켜서 사용할 수 있음


REST 전송 방식

  • REST 전송 방식

    • Client가 모두 웹에서만 요청을 보내는 것이 아니라 모바일 등 다양한 환경에서 서버에 요청을 보냄

    • 서로 다른 언어로 구성된 것들의 요청을 하나의 서버에서 처리하기 위해 사용

      • 모바일은 다른 언어로 구성되어 있으므로 모든 언어 플랫폼이 알 수 있는 문법(JSON)으로 표기해야 요청과 응답을 주고 받을 수 있음
    • JSON은 JavaScript의 객체 형태로 표현하여 통신 진행

    • 데이터를 직접 클라이언트에 전송하는 방식


Controller Annotation

  • @RestController

    • 기존 @Controller는 Model에 데이터를 담아서 return하는 경로로 데이터를 보내 JSP에서 값을 뿌려주는 방식을 사용

    • RestController는 비동기 요청 전용 컨트롤러이며 return에 처리하는 데이터를 조금 다른 타입으로 처리하는 형식

    • RequestMapping으로 들어오는 요청을 받아들이는 것을 동일하지만 return의 결과는 ViewResolver가 아니라 요청한 화면으로 리턴

    • 즉, 객체나 문자열을 반환할 수도 있고 객체를 받을 수 있음

      • 메서드에 작성한 데이터를 요청한 곳에 바로 보냄
    • @ResponseBody

      • 일반 Controller에서는 @ResponseBody을 작성하면 비동기 방식으로 데이터 처리 할 수 있음
      • @Restcontroller이면 작성하지 않아도 됨
      @Controller
      @RequestMapping("/rest")
      public class RestControllerTest {
      		@GetMapping("/hobby")
      		@ResponseBody
      		public List<String> hobby() {
      			List<String> hobby = Arrays.asList("축구", "운동", "잠");
      			return hobby;
      			
      		}
      }

    • pom에 등록한 jackson-databind가 데이터를 비동기 통신으로 보낼 때 JSON형식으로 보내줌

    • @RequestBody

      • 클라이언트 쪽에서 전송하는 JSON 데이터를 서버에서 사용하는 자바 언어에 맞게 변환하여 받을 수 있게 해주는 annotation
      // client에서 json형태로 값을 보냄 
      	@PostMapping("/getObject")
      	public Person getObject(@RequestBody Person person) {
      		// 보내는 파라미터 key가  Person객체 변수의 이름과 같으므로 커맨드 객체 사용
      		// @RequestBody라는 annotation을 사용하면 JSON형식의 데이터를 java의 객체형식으로 변환해줌
      		// 해당 annotation을 사용하지 않으면 JSON을 변환하지 못하고 null이 들어옴
      		
      		System.out.println("/getObject 요청이 들어옴");
      		System.out.println("이름 : " + person.getName());
      		System.out.println("나이 : " + person.getAge());
      		System.out.println("취미 : " + person.getHobby());
      		// 값을 제대로 받아오는지 확인
      		
      		person.setAge(431);
      		// 파라미터로 저장된 person객체의 값을 바꿔줌
      		
      		return person;
      	}

    • @PathVariable

      • 경로에 저장된 값을 가져와서 사용하고 싶을 때 사용하는 annotation
      • URL경로에 파라미터를 줄 수 있으며 URL 경로의 있는 값을 추출할 때 사용
      @GetMapping("/getPath/{id}/{cpp}/{page}")
      	// 영역에 이름을 지정 
      	public Map<String, Object> getPath(@PathVariable String id, 
      									   @PathVariable int cpp,
      									   @PathVariable int page) {
      		Map<String, Object> map = new HashMap<>();
      		map.put("아이디", id);
      		map.put("게시물 개수 " , cpp);
      		map.put("페이지 번호", page);
      		
      		// 경로에서 값을 가져와서 해당 메서드에서 포장해서 값을 보냄
      		return map;
      	}

RestController

  • @RestController
    • 비동기 방식의 요청만 처리하는 Cotnroller라는 것을 뜻하는 Annotation

    • 해당 annotation을 사용하게 되면 @ResponseBody 사용하지 않아도 됨

      package com.spring.mvc.test;
      
      import java.util.Arrays;
      import java.util.HashMap;
      import java.util.List;
      import java.util.Map;
      
      import org.springframework.stereotype.Controller;
      
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.PathVariable;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RequestBody;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.ResponseBody;
      import org.springframework.web.bind.annotation.RestController;
      
      @RestController
      @RequestMapping("/rest")
      public class RestControllerTest {
      	
      	
      	/*
      	 @ResponseBody
      	 - 메서드가 리턴하는 데이터를 viewResolver에게 전달하지 않고 클라이언트에게 해당
      	 데이터를 바로 응답하게 함 
      	 주로 비동기 통신에서 많이 사용 
      	 
      	 @RestController를 사용하면 모든 메서드에 @ResponseBody를 붙인 결과와 같음
      	 
      	 참고 
      	 	- 동기 : 순서대로 일을 처리 (순서대로 요청과 응답을 처리)
      	 	- 비동기 : 번호표를 뽑는다고 생각 (순서대로 일을 처리하지 않고 특정 요청이 오게 된다면 바로 처리)
      	 */
      	@GetMapping("/hello")
      //	@ResponseBody
      	// 비동기 방식으로 데이터를 처리하고 싶으면 사용하는 annotation
      	public String hello() {
      		return "Hello World!";
      		// rest방식은 viewresolver로 보내서 url을 만들어주는 것과 다르게 
      		// 페이지 이동 없이 데이터를 요청을 보낸 화면에 던짐
      	}
      	
      	
      	@GetMapping("/hobby")
      //	@ResponseBody
      	public List<String> hobby() {
      		List<String> hobby = Arrays.asList("축구", "운동", "잠");
      		return hobby;
      	}
      	
      	@GetMapping("/study")
      	public Map<String, Object> study() {
      		Map<String, Object> subject = new HashMap<>();
      		subject.put("자바", "java");
      		subject.put("jsp", "java server pages");
      		subject.put("스프링", "Spring Framework5");
      		return subject;
      	}
      	
      	@GetMapping("/person")
      	public Person person() {
      		Person p = new Person();
      		p.setName("문경록");
      		p.setAge(28);
      		p.setHobby(Arrays.asList("공부", "잠", "맛집탐방"));
      		return p;
      		// 자바 객체를 전달했을 때 JSON으로 어떻게 변화되는지 확인 
      	}
      	
      	// client에서 json형태로 값을 보냄 
      	@PostMapping("/getObject")
      	public Person getObject(@RequestBody Person person) {
      		// 보내는 파라미터 key가  Person객체 변수의 이름과 같으므로 커맨드 객체 사용
      		// @RequestBody라는 annotation을 사용하면 JSON형식의 데이터를 java의 객체형식으로 변환해줌
      		// 해당 annotation을 사용하지 않으면 JSON을 변환하지 못하고 null이 들어옴
      		
      		System.out.println("/getObject 요청이 들어옴");
      		System.out.println("이름 : " + person.getName());
      		System.out.println("나이 : " + person.getAge());
      		System.out.println("취미 : " + person.getHobby());
      		// 값을 제대로 받아오는지 확인
      		
      		person.setAge(431);
      		// 파라미터로 저장된 person객체의 값을 바꿔줌
      		
      		return person;
      	}
      	
      	@GetMapping("/getPath/{id}/{cpp}/{page}")
      	// 영역에 이름을 지정 
      	public Map<String, Object> getPath(@PathVariable String id, 
      									   @PathVariable int cpp,
      									   @PathVariable int page) {
      		Map<String, Object> map = new HashMap<>();
      		map.put("아이디", id);
      		map.put("게시물 개수 " , cpp);
      		map.put("페이지 번호", page);
      		
      		// 경로에서 값을 가져와서 해당 메서드에서 포장해서 값을 보냄
      		return map;
      	}
      	
      }
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글