@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 메서드를 호출한다.
'Spring' 카테고리의 다른 글
스프링부트 / JWT 방식으로 로그인 구현하기 (5) | 2020.05.20 |
---|---|
Spring / @RequestBody vs @RequestParam 이해하기 (6) | 2020.05.09 |
스프링부트 어노테이션 / @RestController(vs @Controller) 이해하기 (0) | 2020.05.01 |
스프링부트 / Bean 이해하기 (0) | 2020.04.27 |
스프링부트 어노테이션 / @RequestParam (0) | 2020.04.25 |