관리 메뉴

기록하는 공간

경로 매개변수(@PathVariable)와 쿼리 매개변수(@RequestParam) 본문

Spring

경로 매개변수(@PathVariable)와 쿼리 매개변수(@RequestParam)

giwoong01 2023. 8. 3. 12:55

코드를 짜면서 controller 들을 훑어보았는데, 대부분 @RequestParam을 사용하였다.

 

문득 생각이 들었다. @RequestParam은 무엇일까? 왜 이걸 사용하는거지? 내가 이걸 잘 알고 사용하는 건가?

대충은 알고 있다. URL뒤에 ?를 붙이고 key=value 형태로 전달된다는 것을.

 

근데 또 @PathVariable 이란 어노테이션도 사용가능하지 않나? 어디서 본 적이 있었는데?

둘이 뭐가 다른거지?

 

그래서 알아보기로 했다.


@PathVariable와 @RequestParam 어노테이션은 무엇인가.

💡 클라이언트가 호출한 URL의 파라미터를 받아서 처리하는 어노테이션이다.

 

@PathVariable 이란?

  • 경로 매개변수라고 하고, URL에 직접 포함이 된다.
  • 주로 리소스의 식별자를 전달하거나(상세 조회, 수정, 삭제), 특정 리소스를 조회하는 데 사용된다.

사용법은 아래와 같다.

요청 : 
1. <http://localhost:8080/giwoong>
2. <http://localhost:8080/giwoong/23>
@RestController
public class example() {

	// 1.
	@GetMapping("/{name}")
	public String myName(@PathVariable("name") String name) {
		return name; // giwoong이 반환된다
	}

	// 2.
	@GetMapping("/{name}/{age}")
	public String myNameAndAge(@PathVariable("name") String name,
				@PathVariable("age") String age) {
		return "성공!";
	}

}

2번 경우를 보면 name에는 giwoong이 할당되고 age에는 23이 할당된다.

 

이와 같이 여러 개의 인자를 정의하는 것도 가능하다.

만약 변수가 많다면 Map<String, String> 형식도 이용가능하다.

 

2번 코드를 가져와서 변형해 보겠다.

	@GetMapping("/{name}/{age}")
	public String myNameAndAge(@PathVariable Map<String, String> map) {
		return "성공!";
	}

똑같이 2번 요청을 보냈을 경우 name에는 giwoong이 할당되고 age에는 23이 할당된다.


@RequestParam이란?

  • 서두에서 언급했듯이, URL뒤에 ?를 붙이고 key=value형태로 전달되는 파라미터를 의미한다.
  • 쿼리 매개변수는 주로 필터링, 정렬, 페이지네이션 등 검색 조건을 전달하거나 추가적인 정보를 전달하는 데 사용된다.

사용법은 아래와 같다.

요청:
1. <http://localhost:8080/user?name=giwoong>
2. <http://localhost:8080/user?name=giwoong&age=23>
@RestController
public class example() {

	// 1.
	@GetMapping("/user")
	public String myName(@RequestParam("name") String name) {
		return name; // giwoong이 반환된다
	}

	// 2.
	@GetMapping("/user")
	public String myNameAndAge(@RequestParam("name") String name,
				@RequestParam("age") String age) {
		return "성공!";
	}

}

@PathVariable과 같이 여러 인자를 정의하는 것도 가능하다.

@RequestParam을 사용하여 여러 개의 쿼리 매개변수를 전달할 때는 &으로 구분하여 나열한다.


@PathVariable과 @RequestParam을 복합적으로도 사용이 가능하다.

요청:
<http://localhost:8080/user?name=giwoong>
@RestController
public class example() {

	@GetMapping("/{category}")
	public String myNameAndAge(@PathVariable("category") String category,
				@RequestParam("name") String name) {
		return "성공!";
	}

}

여기서 category은 user이 할당되고, name은 giwoong이 할당된다.


마무리

두 어노테이션이 비슷하면서도 다르다.

… 마무리 멘트 할 게 없네요.