Spring MVC 2

사나이장대산·2024년 11월 1일

Spring

목록 보기
2/26

Controller Interface

- 구현 예시

package com.example.springbasicmvc.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

// Spring Bean 이름을 URL로 설정
@Component("/example-controller")
public class ExampleController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("example-controller가 호출 되었습니다.");
        return null;
    }
}

http://localhost:8080/example-controller 로 HTTP 요청을 하게 되면 응답결과가 반환된다.

  • 출력결과
  • @Component
    - Spring Bean에 등록하는 역할을 수행한다.
    - Spring Bean은 애플리케이션의 구성 요소를 정의하는 객체이다.
    - 마치 Servlet이 Servlet Container에 등록되는 것과 같다.

    그림 중요!

  1. Handler Mapping

    • 핸들러 매핑에서 ExampleController를 찾을 수 있어야 한다.
      → Spring Bean의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다.
  2. Handler Adapter

    • Handler Mapping을 통해 찾은 핸들러를 실행할 수 있는 Handler Adapter가 필요

    → Controller Interface를 실행할 수 있는 Handler Adapter를 찾고 실행한다.

Spring Boot의 Handler Mapping, Handler Adapter

  1. Handler Mapping

    • 핸들러 매핑에서 ExampleController를 찾을 수 있어야 한다.

    → Spring Bean의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다.

  2. Handler Adapter

    • Handler Mapping을 통해 찾은 핸들러를 실행할 수 있는 Handler Adapter가 필요

    → Controller Interface를 실행할 수 있는 Handler Adapter를 찾고 실행한다.

HttpRequestHandler로 알아보는 Spring MVC 동작 순서

  • 기존 방식에서 사용하는 Servlet과 가장 유사한 Handler이다

- 예시 코드

// 인터페이스
public interface HttpRequestHandler {
	void handleRequest(HttpServletRequest request, HttpServletResponse response)
					throws ServletException, IOException;

}
// 구현체
@Component("/request-handler")
public class ExampleRequestHandler implements HttpRequestHandler {

	@Override
	public void handleRequest(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
		System.out.println("request-handler Controller 호출");
		// 구현 로직
	}

}

- Postmasn

- 출력결과

1.HandlerMapping으로 핸들러 조회

  • BeanName으로 Handler 조회 (BeanNameUrlHandlerMapping 실행)
  • ExampleRequestHandler반환
  1. HandlerAdapter 조회
  • HandleAdapter의 supports()를 우선순위 순서대로 호출

  • HttpRequestHandlerAdapter HttpRequestHandler Interface를 지원한다

    • HttpRequestHandlerAdapter.supports()
  1. HandlerAdapter 실행
  • DispatcherServlet이 조회한 HttpRequestHandlerAdapter를 실행하며 Handler 정보도 넘긴다
  • HttpRequestHandlerAdapter 는 ExampleRequestHandler를 내부에서 실행 후 결과를 반환
    • HttpRequestHandlerAdapter.handle()
      → 단순히 handleRequest를 호출한다 = 오버라이딩된 handleRequest() 호출
    • DispatcherServlet에서 호출 → ha.handle()

profile
사나이 張大山 포기란 없다.

0개의 댓글