@PathVariable 이란?

도윤·2023년 12월 4일
0

PathVariable 이란??

  • 경로 변수를 표시하기 위해 메서드에 매개변수에 사용된다.
  • 경로 변수는 중괄호 {id}로 둘러싸인 값을 나타낸다
  • url 경로에서 변수 값을 추출하여 매개변수에 할당한다.
  • 기본적으로 경로 변수는 반드시 값을 가져야 하며, 값이 없는 경우 404 오류가 발생한다.
  • 주로 상세 조회, 수정, 삭제와 같은 작업에서 리소스 식별자로 사용된다.

사용법 1

URI 상에서 '{ }' 로 감싸여있는 부분과 동일한 변수명을 사용하는 방법이다.
이때 여러 개의 인자를 정의하는 것도 가능하다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Controller
public class UserController {

	@GetMapping("/user/{age}/{name}")
	public String user(@PathVariable String age, @PathVariable String name) {
		System.out.println("나이는 " + age);
		System.out.println("이름은 " + name);
		return "index";
	}
}

//'http://localhost:8080/user/30/홍길동' 으로 접속했을 때의 출력 결과
//나이는 30
//이름은 홍길동
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("user/{name}")
public class UserController {

	@GetMapping("/{age}")
	public String user(
			@PathVariable(value = "age") String userAge,
			@PathVariable(value = "name") String userName) {
		System.out.println("나이는 " + userAge);
		System.out.println("이름은 " + userName);
		return "index";
	}
}

사용법2

만약 변수가 많아 하나씩 작성하기 힘들다면 Map<String, String> 형식을 이용하여 할당하는 방법도 있다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;

@Controller
@RequestMapping("user/{age}")
public class UserController {

	@GetMapping("/{name}")
	public String user(@PathVariable Map<String,String> map) {
		System.out.println(map);
		return "index";
	}
}


//'http://localhost:8080/user/30/홍길동' 으로 접속했을 때의 출력 결과
//{name=30, age=홍길동}




모든 URI 상의 접근가능한 변수들이 map 에 추가된 것을 확인할 수 있다.

여기서 주목해야할 부분은 클래스 단계의 @RequestMapping 에 포함된 값도 가져올 수 있다는 것이다.

(이 부분은 사용방법1. 의 방식으로도 가능하다)

사용법3

정규식 사용

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Controller
public class UserController {

	@GetMapping("/user/{age:\\d+}{name:\\D+}")
	public String user(
			@PathVariable("age") String age,
			@PathVariable("name") String name) {
		System.out.println("나이는 " + age);
		System.out.println("이름은 " + name);
		return "index";
	}
}

//'http://localhost:8080/user/30홍길동' 으로 접속했을 때의 출력 결과
//나이는 30
//이름은 홍길동

정규식을 사용한다면 다음과 같은 방식도 사용 가능하다

package study.oc.base;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

	@GetMapping("/user/{age:\\d+}")
	@ResponseBody
	public String age(@PathVariable Long age) {
		System.out.println("나이는 " + age);
		return "age";
	}

	@GetMapping("/user/{name:\\D+}")
	@ResponseBody
	public String name(@PathVariable String name) {
		System.out.println("이름은 " + name);
		return "name";
	}
}
profile
기록은 기억을 이긴다⭐

0개의 댓글