[API]@RequestParam/ @RequestBody & @ModelAttribute/PathVariable/QueryParam

·2023년 7월 10일
0

프로젝트 공부

목록 보기
9/33

특정 대상을 지목할 때는 PathVariable을 사용하고,
정렬Sort필터링Filtering, 여러정보를 전달 하는 경우 QueryParam을 사용하는 것이 옳은 방법

위의 어노테이션은?

위의 어노테이션들은 모두 view로부터 값을 가져오기 위한 어노테이션이다.

✔️@RequestBody

@Controller
public class UserController {

	@PostMapping("/receive")
	public String age(@RequestBody String req) {
		System.out.println("통신 성공");
		System.out.println(">>> " + req);
		return "result";
	}
}
//출력 결과
//통신 성공
//>>> name=jun&age=13

위의 값을 @RequestBody로 전송한 결과
name=jun&age=13이라는 String으로 전달된다.

✔️@RequestParam

@Controller
public class UserController {

	@PostMapping("/receive")
	public String age(@RequestParam String name) {
		System.out.println("통신 성공");
		System.out.println(">>> " + name);
		return "result";
	}
}

//출력 결과
//통신 성공
//>>> jun

@RequestParam = 클라이언트가 요청한 URL의 쿼리 파라미터에 대한 값을 받아온다(url 상에서 데이터를 찾음)

  • @RequestParam 으로 데이터를 받을때는 데이터를 저장하는 이름으로 메서드의 변수명을 설정해주어야 한다.

/users?id=123 # 아이디가 123인 사용자를 가져온다.

required = true/false

기본적으로 required = true이기 때문에 어노테이션을 사용하면 기본적으로 해당하는 key값과 value가 url상에 무조건 나타나야 한다.

만약 쿼리 파라미터가 필수가 아니게 하려면
@RequestParam(value="name", required=false) string msg처럼 작성한다

만약 required=true 일 때, 값을 입력하지 않거나 잘못 입력하면 에러 발생
만약 required=false 일 경우, default 값을 줘야 한다.

📌@RequestBody와 @RequestParam의 차이

@RequestBody@RequestParam
객체 생성가능불가능
각 변수별로 데이터 저장불가능가능

PathVaribale

✔️@PathVariable

데이터를 넘기는 또 다른 방법
/users/123 # 아이디가 123인 사용자를 가져온다

Path Variable과 Query Parameter를 각각 언제 사용해야 하는가?

만약 어떤 resource를 식별하고 싶으면 Path Variable을 사용하고,
정렬이나 필터링을 한다면 Query Parameter를 사용하는 것이 Best Practice이다.
/users # 사용자 목록을 가져온다.
/users?occupation=programer # 프로그래머인 사용자 목록을 가져온다.
/users/123 # 아이디가 123인 사용자를 가져온다.
또한, 기본적인 CRUD 기능을 위해서 또 다른 URL이나 query parameter를 정의할 필요는 없다.
대신 원하는 기능에 맞게 HTTP 메소드를 바꾸어야 한다.

/users [GET] # 사용자 목록을 가져온다.
/users [POST] # 새로운 사용자를 생성한다.
/users/123 [PUT] # 사용자를 갱신한다.
/users/123 [DELETE] # 사용자를 삭제한다.

✔️@ModelAttribute

@ModelAttribute: 매개변수에 Model model이 없어도 스프링에서 자동으로 만들고 넣어주는 어노테이션

@ModelAttribute = 적용 대상을 Model의 속성으로 자동 추가해주는 애너테이션

@ModelAttribute의 역할

  1. 요청 파라미터 처리
    객체를 생성하고, 요청 파라미터의 값을 setter를 이용해 입력해준다.
  2. Model 추가
    모델에 @ModelAttribute로 지정한 객체를 자동으로 넣어준다.

예시

//2번 예시
@PostMapping
public String addItem(@ModelAttribute(name="item") Item item, Model model) {
	itemRepository.save(item);
    // model.addAttribute("item", item);
    return "item";
}

@RequestParam과 @ModelAttribute차이

@RequestParam으로 요청 파라미터를 받았으면, 모델객체에 데이터를 넣어줘야 view 쪽에서 데이터를 사용할 수 있다.
하지만 @ModelAttribute를 사용했을 경우에는 모델에 넣는 코드가 없어도 스프링에서 자동으로 넣어준다.

1. @RequestParam 사용시

@PostMapping("/add")
public String addItemV1(@RequestParam String itemName,
                       @RequestParam int price,
                       @RequestParam Integer quantity,
                       Model model) {
    Item item = new Item();
    item.setItemName(itemName);
    item.setPrice(price);
    item.setQuantity(quantity);

    itemRepository.save(item);

    model.addAttribute("item", item);

    return "basic/item";
}

파라미터 값이 넘어올 때 @RequestParam을 사용하면 파라미터 하나에 변수를 하나씩 생성해줘야 하고, 이 값을 뷰로 넘기려면 Model을 이용하여 데이터를 전송하기 때문에 번거로울 수 있다.

2. @ModelAttribute 사용시

@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item) {

    itemRepository.save(item);
    return "basic/item";
}

Item이라는 DTO역할을 하는 클래스를 선언하여 객체 item으로 데이터를 주고 받는다.
@RequestParam이랑 비교하면 파라미터를 따로 받을 필요도 없고, Model을 호출하여 객체 바인딩을 할 필요도 없다.
@ModelAttribute("item") 이렇게 선언하면 Model에 item이라는 이름으로 객체를 넣어준다

  • 어노테이션 뒤의 (name)생략 시 객체의 첫 글자만 소문자로 치환하여 모델에 추가 ex)@ModelAttribute Item item -> item

참고
[번역] Path Variable과 Query Parameter는 언제 사용해야 할까?
@RequestParam
@ModelAttribute
@ModelAttribute

profile
개발자가 되고싶은 낭랑 24세

0개의 댓글

관련 채용 정보