
@RequestMapping은 "이 URL 요청이 들어오면 이 메소드가 처리한다" 를 스프링 MVC에게 알려주는 어노테이션이다.
즉,
“누가 어떤 요청을 처리할지 매핑하는 주소록 역할”
아무 method 지정 없이 이렇게 쓰면:
@RequestMapping("/menu/regist")
public String registMenu(Model model) {
model.addAttribute("message", "신규 메뉴 등록용 핸들러 메소드 호출함...");
return "mappingResult";
}
Model model : 스프링에서는 HtttServletRequest와 respond 에서 받아왔던 형태를 이용한다. 스프링은 이를 Model 이라는 클래스로 가져왔다.✔ 같은 URL로 오는 GET 요청, POST 요청 둘 다 처리함
✔ 즉, 요청 방식 상관없이 /menu/regist를 부르면 이 메소드가 실행됨
@RequestMapping은 Method에 상관없이 GET 버튼, POST form 둘 다 정상 처리 된다.
@RequestMapping(value = "/menu/modify", method = RequestMethod.GET)
이렇게 하면:
✔ GET만 처리 가능
✔ POST 요청이 들어오면?
→ 스프링이 “이 메소드는 GET 전용이니까 POST는 안됨” 해서 405 에러(Method Not Allowed) 발생
즉:
동일 URL이라도 HTTP 방식이 다르면 다른 메소드가 실행되거나, 에러가 뜰 수 있다.
@GetMapping, @PostMapping 등은 다음과 같은 축약형이야.
| 요청 방식 | 축약 어노테이션 |
|---|---|
| GET | @GetMapping |
| POST | @PostMapping |
| PUT | @PutMapping |
| DELETE | @DeleteMapping |
| PATCH | @PatchMapping |
아래 둘은 완전히 같은 의미이다.
@RequestMapping(value="/menu/delete", method=RequestMethod.GET)
@GetMapping("/menu/delete")
스프링에서는@GetMapping / @PostMapping을 사용한다.
아래는 index.html이다.
<h3>GET : /menu/delete</h3>
<button onclick="location.href='/menu/delete'">GET 메뉴 삭제 요청</button>
<h3>POST : /menu/delete</h3>
<form action="/menu/delete" method="post">
<button type="submit">POST 메뉴 삭제 요청</button>
</form>
사용자가 요청한 http 요청을 처리하는 기능을 수행하는 역할인 것이다.
클래스에 @RequestMapping("/order/*")를 달면 모든 메소드에 /order/가 기본으로 붙는다.
@Controller
@RequestMapping("/order/*")
public class ClassMappingTestController {
@GetMapping("/regist")
public String registOrder(Model model) {
model.addAttribute("message", "GET 주문 등록...");
return "mappingResult";
}
}
위 처럼 @RequestMapping에서 클래스의 경로를 결정해주면 아래와 같은 사항을 확인할 수 있다.
클래스:
/order/*메소드:
/regist최종 URL:
/order/regist
즉, 공통 URL을 묶어 관리할 때 사용함.
@RequestMapping(value={"modify", "delete"}, method=RequestMethod.POST)
public String modifyAndDelete(Model model) {
model.addAttribute("message", "POST로 modify/delete 둘 다 처리");
return "mappingResult";
}
→ /order/modify POST
→ /order/delete POST
두 요청이 모두 같은 메소드로 들어온다.
공통 로직을 묶고 싶을 때 좋다.
GET 방식으로 주소를 다루면 쿼리스트링이 주소창에 떠서 내가 사용하려는 정보가 적나라하게 드러나게 된다. 이러한 점을 보완하기 위해 key, value 를 모두 보여주는게 아니라 값을 주소처럼 사용할 수 있도록 하는 방식을 Path Variable이라고 한다.
→ 요청주소에 포함된 변수이다.
REST 스타일에서 자주 쓰는 방식.
@GetMapping("/detail/{orderNo}")
public String selectOrderDetail(
Model model,
@PathVariable("orderNo") int orderNo
) {
model.addAttribute("message", orderNo + "번 주문 상세 조회...");
return "mappingResult";
}
✔ /order/detail/3 → orderNo = 3
✔ /order/detail/100 → orderNo = 100
주의:
{orderNo} 값이 int인데 문자를 넣으면? → 스프링이 변환 못 해서 400 에러(Bad Request) 발생/order/detail/ 처럼 값이 빠지면 → 매핑되는 메소드가 없어서 404 발생@PathVariable("이름") int 변수 → 이름 에서 변수 로 값을 할당해주는 것임을 알 수 있다.이런 형태는 기타 요청 처리 역할로 쓰인다:
@RequestMapping
public String otherRequest(Model model) {
model.addAttribute("message", "order 요청이지만 아직 준비되지 않음...");
return "mappingResult";
}
클래스 레벨이 /order/*라면
→ /order/anything 중에 매핑된 메소드가 없으면 여기로 빠짐.
즉,
“해당 Controller에서 처리할 수 없는 나머지 모든 URL을 받는 fallback 메소드”
@RequestMapping = URL + HTTP method 매핑