본문 바로가기
Spring

@RequestMapping 호출 했는데 406 에러 뜰 때

by ESTP 개발자 2025. 6. 14.

요약 :  DispatcherServlet ➞ web.xml ➞ @RequestMapping

 

 

1. DispatcherServlet:

모든 HTTP 요청은 Spring의 DispatcherServlet에 의해 가장 먼저 처리됩니다.
DispatcherServlet은 웹 애플리케이션의 중앙 서블릿으로, 들어오는 요청을 처리할 수 있는 핸들러(주로 컨트롤러 메서드)로 매핑합니다.

 

2. web.xml 또는 Spring Boot 설정에서 DispatcherServlet 설정:

만약 Spring MVC를 사용한다면, web.xml 파일에서 DispatcherServlet을 설정하여 모든 요청을 DispatcherServlet이 처리하도록 설정합니다. Spring Boot를 사용하는 경우, DispatcherServlet이 자동으로 설정됩니다.

예시 (web.xml에 설정된 경우):

// xml
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern> <!-- 모든 요청을 DispatcherServlet이 처리 -->
</servlet-mapping>


3. @RequestMapping 또는 @GetMapping 등의 매핑:

 

DispatcherServlet은 요청 URL을 확인하고, 매핑된 컨트롤러 메서드로 요청을 전달합니다.
.do 확장자를 처리하는 URL 패턴을 @RequestMapping("/API/getMyInfo.do")와 같은 방식으로 컨트롤러 메서드에 매핑할 수 있습니다.

@RequestMapping 예시 (컨트롤러에서 처리)

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/API")
public class ApiController {

    @RequestMapping("/getMyInfo.do")
    public String getMyPhoto() {
        // .do 요청을 처리하는 로직
        return "Info data response";
    }
}


위 예시에서, /API/getMyPhoto.do 경로로 요청이 들어오면 ApiController의 getMyInfo() 메서드가 실행됩니다.
URL 패턴 매핑의 흐름: DispatcherServlet이 요청을 받습니다.
URL 매핑에 따라 요청을 처리할 컨트롤러 메서드로 전달됩니다.
컨트롤러에서 정의한 @RequestMapping이나 @GetMapping 등의 어노테이션을 통해 요청이 해당 메서드로 매핑됩니다.
해당 메서드가 응답을 반환하면, DispatcherServlet이 이 응답을 클라이언트로 반환합니다.

 


< DispatcherServlet >
DispatcherServlet은 모든 요청을 한번에 받고, 그 요청에 맞는 컨트롤러에게 처리를 맡김

- 요청이 들어오면 어떤 URL을 처리할지를 HandlerMapping에 맡기고 처리 방법(?)을 찾은 후 요청을 핸들러(컨트롤러 메서드)로 전달함

 

< HandlerMapping 이란? >

HandlerMapping은 DispatcherServlet이 어떤 URL을 처리할지 결정하는 도구..

예를 들어 /api/hello.do라는 요청이 들어오면 HandlerMapping은 이 URL에 해당하는 컨트롤러 메소드를 찾아서 DispatcherServlet에게 알려줌

@Controller
@RequestMapping("/api")
public class MyController {

    @RequestMapping("/hello.do")
    public String sayHello() {
        return "Hello, World!";
    }
}

위 코드에서 /api/hello.do를 요청하면 HandlerMapping은 sayHello() 메서드를 요청으로 넘겨줌

 

< Interceptors 란? >

Interceptors는 요청이 컨트롤러로 가기 전에 or 응답이 클라이언트로 가기전에 어떤 작업을 할 수 있는 '중간 작업' 같은 거임.

요청 전, 후에 작업을 하는 것

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 요청이 들어오기 전에 실행
        System.out.println("Request coming in!");
        return true;  // true이면 요청을 계속 진행
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 요청 처리 후, 응답을 보내기 전에 실행
        System.out.println("Request handled, now sending response.");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 응답이 완료된 후 실행
        System.out.println("Response sent!");
    }
}

위 코드에서 preHandle() 메서드는 요청이 컨트롤러로 전달되기전에 실행되고, 

postHandle() 메서드는 컨트롤러에서 처리된 후 응답을 보내기 전에 실행 됨

 

< List, Ref, Bean은 뭔가요? >

Spring에서 사용하는 설정파일에 나오는 개념

- Bean : Spring에서 관리되는 객체

 List : 여러개의 Bean을 배열처럼 나열 한 것

 Ref : 다른 Bean을 참조하는 것

 

 

< List, Ref, Bean은 뭔가요? >

Spring에서 사용하는 설정파일에 나오는 개념

- Bean : Spring에서 관리되는 객체

-  List : 여러개의 Bean을 배열처럼 나열 한 것

-  Ref : 다른 Bean을 참조하는 것

 


preHandle 메서드의 흐름:

  1. 클라이언트 요청preHandle 호출true 반환컨트롤러 메서드 실행
    • 요청이 들어오면, 인터셉터에서 preHandle가 먼저 호출됩니다.
    • true가 반환되면, 요청은 다음 단계컨트롤러 메서드로 진행됩니다.
  2. 클라이언트 요청preHandle 호출false 반환요청 종료
    • false가 반환되면, 요청은 바로 종료되며, 컨트롤러 메서드가 실행되지 않음.
    • 이때 응답은 preHandle에서 직접 처리될 수 있습니다.

 


응답 반환 시

  1. 컨트롤러 메서드 실행 → postHandle 호출 → afterCompletion 호출 → 응답 반환 → 클라이언트 응답.

postHandle이 없을 때

  1. 컨트롤러 메서드 실행   → 응답 반환