2월 05, 2024

[Spring MVC] Controller Interface, Forward Controller, Handler Mapping 자바 소스로 구현해보기

 https://www.programmingstory.com/2024/01/forward-redirect.html

이전 포스팅에서 Forward 방식과 Redirect 방식의 차이점에 대해 다루어보았다. 


오늘은 Forward 방식을 구현한 Forward Controller와 Controller Interface를 구현해보겠다. 


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class ForwardController implements Controller {

    private String url;


    public ForwardController(String url) {

        this.urlurl;

    }


    @Override

    public String handle(HttpServletRequest request, HttpServletResponse response) throws Exception {

        return url;

    }

}

위가 Forward 방식을 구현한 간단한 Controller이다. 


다양한 방식의 Controller가 있을 수 있기 때문에 Controller라는 Interface를 하나 더 만드는 것이 좋다.


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public interface Controller {

    String handle(HttpServletRequest request, HttpServletResponse response) throws Exception;

}


이런 식으로 구현을 할 수 있다.


또 MVC에서는 HandlerMapping을 통해 Controller를 찾아주는데 위 소스도 아래와 같이 구현해볼 수 있다. 


즉, 원하는 HandlerMap과 Controller를 Map<> 자료구조로 받아 놓고 HandlerMap을 Key값으로 하여 매핑되어 있는 Controller를 반환해주는 형식이다. 아래 소스에서는 /user/register로 URL이 GET 요청으로 들어오면 ForwardController가 해당 url로 forward 시켜주는 소스이다. 


import java.util.HashMap;

import java.util.Map;


public class RequestMappingHandlerMapping{

    private Map<HandlerMap, Controller> handlerMappings = new HashMap<>();


    void init() {

        handlerMappings.put(new HandlerMap("/user/register", RequestMethod.GET), new ForwardController("/user/register"));

    }

    public Controller findHandler(HandlerMap handlerMap) {

        return handlerMappings.get(handlerMap);

    }

}