@PathVariable은 URL 경로 자체에 포함된 값을 컨트롤러 메서드 파라미터로 바인딩해주는 Spring MVC 애노테이션입니다.
RESTful API 스타일에서 주로 사용되며,
/{id}, /{name}같은 경로 값을 가져올 때 사용합니다.
GET /news/123
GET /news/123
DispatcherServlet이 모든 HTTP 요청을 먼저 가로챕니다.DispatcherServlet은 등록된 RequestMappingHandlerMapping에게 요청 URI(/news/123)와 일치하는 메서드가 있는지 묻습니다.@GetMapping("/news/{id}")
public String getNews(@PathVariable("id") int id) { ... }
HandlerMapping은 이 URI 템플릿 /news/{id}와 /news/123이 패턴 매칭으로 일치한다고 판단합니다. RequestMappingHandlerAdapter가 선택됩니다.@PathVariable이 붙은 파라미터는 PathVariableMethodArgumentResolver가 처리합니다.// 예시 URI: /news/123
// URI 템플릿: /news/{id}
Map<String, String> uriVariables = Map.of("id", "123");
int, long, UUID 등일 경우, 스프링은 내부의 ConversionService를 사용하여 문자열 값을 자동으로 타입 변환합니다.// 예시
int id = Integer.parseInt("123");
MethodArgumentTypeMismatchException 예외가 발생하고 400 오류 반환@GetMapping("/news/{id}")
public String getNews(@PathVariable int id) {
// id = 123
...
}
@ResponseBody, @RestController 사용 시).@GetMapping("/news/{id}")
public String viewNews(@PathVariable("id") int id, Model model) {
model.addAttribute("newsId", id);
return "newsDetail";
}
GET /news/101
@PathVariable("id")은 {id}에 해당하는 값을 바인딩@GetMapping("/user/{username}")
public String userProfile(@PathVariable String username) {
return "사용자 이름: " + username;
}
GET /user/Daniel
{username}과 메서드 파라미터 이름이 같으면 "username" 생략 가능@GetMapping("/category/{categoryId}/item/{itemId}")
public String itemDetail(@PathVariable int categoryId,
@PathVariable int itemId) {
return "카테고리: " + categoryId + ", 아이템: " + itemId;
}
GET /category/5/item/10
@PathVariable은 각 {} 이름과 파라미터를 정확히 매칭해야 함