개인 공부 (23.07~

@RequestParam @PathVariable @RequestBody @ModelAttribute 간단 정리

Song쏭 2023. 8. 6. 17:29

매번 헷갈리는 저 어노테이션들...

적재적소에 쓰기 위해!

드디어 정리해본다.

 

4가지 이외에도 여러가지 어노테이션들이 있지만,

내가 여태껏 많이 보았던 것들 기준으로 정리해보았다. 

 

@RequestParam, @PathVariable, @RequestBody, @ModelAttribute는 

Spring MVC에서 클라이언트가 보낸 HTTP 요청 본문을

Java 객체로 변환하여 

컨트롤러 메서드의 매개변수에 바인딩할 때 사용되는 어노테이션이다.

 

[ @RequestParam ]
주로 쿼리 매개변수를
컨트롤러의 메서드 매개변수에 바인딩할 때 사용된다.
쿼리 매개변수는 주로 URL의 끝에 '?key=value' 형식으로 붙는다.
여러개의 쿼리 매개변수는 '&'으로 구분된다.

예시
http://localhost:8080/api/books?title=spring&author=John
이런 URL에서 title과 author를
@RequestParam을 이용해 가져올 수 있다. 
@GetMapping("/api/books")
public String getBookByTitleAndAuthor(@RequestParam String title, @RequestParam String author) {
    // ...
}​

 

[ @PathVariable ]
URL경로에 있는 변수를
컨트롤러의 메서드 매개변수에 바인딩할 때 사용된다.
주로 RESTful 서비스에서 리소스를 식별하는 데 사용한다.

예시
http://localhost:8080/api/books/1
이런 URL에서 1이라는 값을 @PathVariable을 이용해 가져올 수 있다.
@GetMapping("/api/books/{id}")
public String getBookById(@PathVariable Long id) {
    // ...
}​

 

Q : 여기서 잠깐! 어찌보면 매개변수를 주는 것이니까 ..

@RequestParam이랑 @PathVariable이랑 비슷한대..

끌리는 대로 쓰면 되는 것인가..???

 

A: 예를들어 도서라는 도메인에서 고유번호 1번의 책을 가져온다고 했을때는

/books/{bookId} 라고 @PathVariable을 사용하면 좋고

 

도서라는 도메인에서 특정 조건을 정하여 조회한다면,

/books?category=novel&type=sicence로 @RequestParam을 사용하면 좋다. 

 

정리하자면,

단건조회의 경우 @PathVariable을

조건이나 필터 기반의 조회의 경우 @RequestParam을 사용하는 것이 일반적이다.

[ @RequsetBody ]
주로 POST나 PUT과 같은 HTTP 메서드에서 사용된다.
클라이언트가 보내는 본문에 있는 JSON, XML과 같은 데이터를
Java객체로 변환하는데 사용된다.

클라이언트가 JSON형식의 데이터를 보낸다고 하면,
이 JSON데이터는 @RequestBody를 사용하여 Java 객체로 변환할 수 있다.

@RequestBody를 사용하면 클라이언트가 서버에 복잡한 데이터 구조를 보낼 수 있으며,
서버는 이 데이터를 쉽게 처리할 수 있다.

예시
BookRequest는 클라이언트가 보내는 JSON데이터의 형식을 표현하는 DTO이다.
이 객체는 @RequestBody에 의해 자동으로 생성되고, 
요청 본문의 JSON데이터가 이 객체에 바인딩된다.
@PostMapping("/api/books")
public Book createBook(@RequestBody BookRequest bookRequest) {
    // bookRequest 객체는 클라이언트가 보낸 JSON 데이터를 Java 객체로 변환한 것입니다.
    // 이제 이 객체를 이용해서 비즈니스 로직을 수행할 수 있습니다.
}​


 

 

[ @ModelAttribute ] 메서드 인자에서 사용될 경우.
HTTP 요청의 매개변수를 자바 객체에 바인딩한다.
즉, HTTP요청에 들어있는 값들을 자동으로 객체의 필드 값에 매핑한다.
이 어노테이션을 사용하면 복잡한 데이터 구조를 쉽게 바인딩할 수 있다.

예시
HTTP요청의 파라미터는 user객체의 필드와 일치해야하며,
@ModelAttribute가 이를 자동으로 매핑한다.

@PostMapping("/submitForm")
public String submitForm(@ModelAttribute("user") User user) {
    // user 객체는 HTTP 요청의 파라미터를 사용하여 자동으로 생성되고 채워집니다.
    // 이제 user 객체와 관련된 작업을 수행할 수 있습니다.
    return "userDetail";
}​