본문 바로가기

Spring

스프링부트 어노테이션 / @PathVariable

@PathVariable?

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/{userName}")
	public String user(@PathVariable String userName){
		System.out.println(userName);
		return "index";
	}
}

@PathVariable 사용의 예시이다.

여기서 주목해야할 점은 @GetMapping 의 URI 값이다.

실제 URI 이 아닌 URI템플릿 을 지정하고 @PathVariable 을 활용하여 URI 의 특정 부분에 접근하였다.

 

이처럼 @PathVariable 은 메서드 인자에 사용되어 URI 템플릿 변수의 값을 메서드 인자로 할당하는데 사용된다.

 

사용법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
//이름은 홍길동

 

@PathVariable 이 달려있는 인자의 이름으로 URI 를 확인하여 값을 할당하고 있다.

만약 URI 에 있는 특정값을 지정하여 변수로 지정하고 싶다면 다음과 같이 @PathVariable 의 value 값을 지정해주면 가능하다.

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";
	}
}

 

만약 user/13 으로 접근한다면 age 메서드를 호출하고

user/홍길동 으로 접근한다면 name 메서드를 호출한다.

반응형