Request Mapping

컨테이너·2025년 11월 29일

Spring Boot

목록 보기
2/7
post-thumbnail

@RequestMapping

@RequestMapping"이 URL 요청이 들어오면 이 메소드가 처리한다" 를 스프링 MVC에게 알려주는 어노테이션이다.

즉,

“누가 어떤 요청을 처리할지 매핑하는 주소록 역할”


1-1. Method Mapping (핸들러 메소드 매핑)

1-1-1. method 미지정 → GET/POST 둘 다 처리

아무 method 지정 없이 이렇게 쓰면:

@RequestMapping("/menu/regist")
public String registMenu(Model model) {
    model.addAttribute("message", "신규 메뉴 등록용 핸들러 메소드 호출함...");
    return "mappingResult";
}
  • 이러한 메소드를 Handler Method라고 한다. 요청 받는 방식을 따로 정해주지 않았는데 이는 어떤 요청 방식이든 상관없이 받을 수 있다.(Get/Post)
  • Model model : 스프링에서는 HtttServletRequest와 respond 에서 받아왔던 형태를 이용한다. 스프링은 이를 Model 이라는 클래스로 가져왔다.

✔ 같은 URL로 오는 GET 요청, POST 요청 둘 다 처리함

✔ 즉, 요청 방식 상관없이 /menu/regist를 부르면 이 메소드가 실행됨

@RequestMapping은 Method에 상관없이 GET 버튼, POST form 둘 다 정상 처리 된다.


1-1-2. method 지정 → 특정 method만 처리

@RequestMapping(value = "/menu/modify", method = RequestMethod.GET)

이렇게 하면:

GET만 처리 가능

✔ POST 요청이 들어오면?

→ 스프링이 “이 메소드는 GET 전용이니까 POST는 안됨” 해서 405 에러(Method Not Allowed) 발생

즉:

동일 URL이라도 HTTP 방식이 다르면 다른 메소드가 실행되거나, 에러가 뜰 수 있다.


1-1-3. http 전용 어노테이션 (since Spring 4.3)

@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>

@Controller 어노테이션

사용자가 요청한 http 요청을 처리하는 기능을 수행하는 역할인 것이다.


1-2. Class Mapping

1-2-1. 클래스 레벨에 공통 경로 매핑

클래스에 @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을 묶어 관리할 때 사용함.


1-2-2. 여러 개의 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

두 요청이 모두 같은 메소드로 들어온다.

공통 로직을 묶고 싶을 때 좋다.


1-2-3. PathVariable — URL 속 숫자/문자 값을 변수로 받기

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) 발생
  • URL 말미에 /order/detail/ 처럼 값이 빠지면 → 매핑되는 메소드가 없어서 404 발생
  • @PathVariable 의 괄호는 생략해줄 수 있으나, 담는 변수가 이름이 다르면 오류가 발생할 수 있다. 이 오류를 방지하고 싶으면 괄호안의 내용을 채워주면 된다.
    • @PathVariable("이름") int 변수이름 에서 변수 로 값을 할당해주는 것임을 알 수 있다.

1-2-4. URL 없이 @RequestMapping 사용하기

이런 형태는 기타 요청 처리 역할로 쓰인다:

@RequestMapping
public String otherRequest(Model model) {
    model.addAttribute("message", "order 요청이지만 아직 준비되지 않음...");
    return "mappingResult";
}

클래스 레벨이 /order/*라면

/order/anything 중에 매핑된 메소드가 없으면 여기로 빠짐.

즉,

“해당 Controller에서 처리할 수 없는 나머지 모든 URL을 받는 fallback 메소드”


요약

  • @RequestMapping = URL + HTTP method 매핑
  • method 안 쓰면 GET/POST 모두 처리
  • GET/POST 구분하고 싶으면 method 지정 or @GetMapping / @PostMapping 사용
  • 클래스 레벨 @RequestMapping은 공통 경로를 묶는 데 사용
  • 여러 URL을 하나의 메소드에 매핑 가능
  • PathVariable로 URL 중 일부 값을 변수처럼 받기 가능
  • URL 매핑 없으면 fallback 메소드로 처리

profile
백엔드

0개의 댓글