요약 : 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 메서드의 흐름:
- 클라이언트 요청 → preHandle 호출 → true 반환 → 컨트롤러 메서드 실행
- 요청이 들어오면, 인터셉터에서 preHandle가 먼저 호출됩니다.
- true가 반환되면, 요청은 다음 단계인 컨트롤러 메서드로 진행됩니다.
- 클라이언트 요청 → preHandle 호출 → false 반환 → 요청 종료
- false가 반환되면, 요청은 바로 종료되며, 컨트롤러 메서드가 실행되지 않음.
- 이때 응답은 preHandle에서 직접 처리될 수 있습니다.
응답 반환 시
- 컨트롤러 메서드 실행 → postHandle 호출 → afterCompletion 호출 → 응답 반환 → 클라이언트 응답.
postHandle이 없을 때
- 컨트롤러 메서드 실행 → 응답 반환
'Spring' 카테고리의 다른 글
application/json으로 데이터를 받는 방법 (JAVA 1.7) (1) | 2025.06.14 |
---|---|
문자열을 JSONObject로 변환 (Java 1.7) (0) | 2025.06.14 |
Bean named '***Service' must be of type [****.****.****.****.service.impl.****ServiceImpl], but was actually of type [com.sun.proxy.$Proxy99] (0) | 2025.03.13 |
Spring 디버깅 하는 법 (0) | 2023.04.05 |
Spring Eclipse 파일 위치 (0) | 2023.03.30 |