개발자 준비/Spring

@RequestBody, @ModelAttribute , @RequestParam , 추가로 @PathVariable

osul_world 2022. 1. 13. 19:53
728x90

사용자 요청 데이터 매핑하기

  • @RequestBody, @ModelAttribute , @RequestParam , 추가로 @PathVariable

 

초기 서버 구축단계에서 서버사이드 랜더링을 하다가 프론트 서버를 따로 만들게 되면서 모든 통신을 JSON으로 하도록 구조를 바꾸게 되어 코드 수정이 필요해졌다.

 

기존에 ModelAttribute로 동작하던 로직들이 모두 null을 뱉으면서 문제가 생겨 알아보던 와중에 @RequestBody, @ModelAttribute의 차이를 알게 되어서 정리하는 김에 요청 데이터를 매핑할때 쓰는 에너테이션 3종을 정리하려고한다.

 

추가로 PathVariable 도 정리하려고 한다.

 

 

@RequestBody

클라이언트가 HTTP body에 보통 application/json 형태로 값(보통 객체)을 담아 전송하면, body의 내용을 다시 Java Object(객체)로 변환해주는 역할을 수행

 

Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverter를 통해 Java 객체로 변환

변환시 누락된 데이터들에 디폴트 값을 부여하기 위해서 기본생성자 필요

 

body에 담긴 내용을 생성자를 통해 변환하기 때문에 @ModelAttribute 처럼 Setter 함수가 없어도 됨

@PostMapping("/login")
private String login(@RequestBody Member member){
 //..
}

 

 

 

@ModelAttribute

클라이언트가 전송하는 HTTP parameter(URL 끝에 추가하는 파라미터) 또는 HTTP Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 바인딩

 

HTTP Body 내용은multipart/form-data 형태이어야 한다.

 

Form 안에 input 값을 담아 보낼 때 사용

@PostMapping("/login")
private String login(@ModelAttribute Member member){
 //..
}

 

 

@RequestParam

HTTP 요청 parameter를 @RequestParam이 쓰이는 메소드의 변수로 Mapping 해주는 역할

www.home.com/ops?name="dd" <- 쿼리파라미터

 

get 요청시 url 끝에 담겨오는 쿼리 파라미터를 맵핑함

 

@GetMapping("/login")
private String login(@RequestParam("name") String name){
 //..
}

 

 

@PathVariable

url에서 각 구분자에 들어오는 값을 지정한 자료형으로 처리해야 할 때 사용

@GetMapping("members/{id}")
private String member(@PathVariable Long id){
 //..
}

 

 

728x90