본문 바로가기

Spring

[Spring] @RequestParam, @PathVariable, @RequestBody, @ResponseBody 차이

@RequestParam @PathVariable 차이는 URI를 어떻게 전달하느냐에 따라 어떤 것을 쓸지 결정하면 된다.

 

Case 1) http://xxx.x.x?index=1&page=2 //@RequestParam
Case 2) http://xxx.x.x/index/1 //@PathVariable

 

여러개의 데이터를 받아오는 첫번째 방식은 @RequestParam을 통해 받아오고, 한가지만 받아오려면 @PathVariable을 사용하면 된다.

쉽게 생각하면, 보통 @RequestParam은 파라미터의 값과 이름을 함께 전달하는 방식으로 게시판 등에서 페이지 및 검색 정보를 함께 전달하는 방식으로 많이 사용된다.

@PathVariable은 id와 같이 필수로 입력되어야 하는 값이면 @PathVariable을 사용하여 구현하면 된다.
Rest api에서 값을 호출할 때

 

@RequestParam 사용 예시

@GetMapping({"board", "board?page={page}&listSize={listSize}"})
	public String getBoardList(Model model
		, @RequestParam(value = "page", required = false, defaultValue = "1") int page
		, @RequestParam(value = "listSize", defaultValue = "10") int listSize
        ) throws Exception {
		...
        }
		return "board/boardList";
	}

위 코드는 게시판 글 리스트를 받아오는 api다. get 요청을 받으면 쿼리스트링을 통해 전달된 page값과 listSize값을 받아와서 @RequestParam이 파라미터인 int page와 int listSize에 각각 대입해준다.

@RequestParam은 이처럼 하나 이상의 타입을 적용할 수 있다.

 

괄호 안의 속성 값은 이렇다.

  • value : URI에서 바인딩하게 될 값
  • required = true일 시, 필수적으로 값이 전달되어야 하며, 그렇지 않다면 Error 발생
  • defaultValue = " " : 값이 없을 때 기본적으로 사용할 값

 

@PathVariable 사용 예시

@PostMapping("/board/{id}")
	public ResponseDto<Integer> updateBoard(@PathVariable("id") int id, @RequestParam Map<String, Object> params, MultipartFile[] files) throws Exception {
    	Board board = new Board();
		board.setId(id);
		board.setTitle((String) params.get("title"));
		board.setContent((String) params.get("content"));
		
        //코드 작성
        
		return new ResponseDto<Integer>(HttpStatus.OK.value(), ...);
	}

@PathVariable은 어떤 요청이든 간에 딱 하나만 쓸 수 있다.

 


클라이언트에서 서버로 통신 = 요청(request)

서버에서 클라이언트로 통신 = 응답(response)

 

@RequestBody

JSON ➡ 자바 객체

클라이언트에서 데이터를 요청하기 위해 JSON 데이터를 HTTP 요청 바디에 담아서 서버로 보내면

서버에서는 HTTP 요청 바디에 담긴 값들을 자바 객체로 변환시켜 객체에 저장한다.

클라이언트 -> 서버로

받아온다는 개념이다. 즉 클라이언트의 JSON 값들을 받아와 자바 객체로 바꾸어 사용해야 할 때

// 객체
public class Entity{
	private Long id;
    private String name;
    private String address;
}

// API Controller
@PostMapping("/api/post")
public void requestTest(@RequestBody Entity entity) {
    System.out.println("id = " + entity.id);
    System.out.println("name = " + entity.name);
    System.out.println("address = " + entity.address);
}

POST /api/post HTTP/1.1

{

      "id": 1,

       "name" : "user1"

}

이와 같은 내용을 HTTP Body에 담아서 POST 요청을 보내게 될 경우,

@RequestBody는 본문의 내용을 매핑해서 객체를 생성한다.

  • entity.id // 1
  • entity.name // "user1"
  • entity.address // null

요청 보낸 JSON값을 자바 객체로 변환시켜 @RequestBody 어노테이션이 붙은 변수에 담아 저장한다.

@ResponseBody

자바 객체 ➡ JSON

@RestController는 리턴값에 자동으로 @ResponseBody가 붙게되어 별도의 어노테이션을 명시해주지 않아도 된다.

서버 -> 클라이언트

 


출처

https://cheershennah.tistory.com/179