톰캣 구현 미션 구조 정리

주성천·2023년 11월 26일

클래스 연결 관계


처리 흐름


핵심 코드


FrontController

public class FrontController implements Controller{
    private final Map<String, Controller> controllers;

    public FrontController() {
        controllers = new HashMap<>();
        controllers.put("/login", new LoginController());
        controllers.put("/register", new RegisterController());
    }

    @Override
    public HttpResponse handleRequest(HttpRequest httpRequest) throws IOException {
        HttpRequestHeader httpRequestHeader = httpRequest.getHttpRequestHeader();

        String path = httpRequestHeader.getPath();
        Controller controller = null;

        for (String key : controllers.keySet()) {
            if (path.startsWith(key)) {
                controller = controllers.get(key);
            }
        }

        if (controller == null) {
            controller = new StaticResourceController();
        }

        return controller.handleRequest(httpRequest);
    }
}

Router

public class Router {
    private static final String NOT_FOUND_PAGE_URL = "404.html";

    private Map<HttpMethod, Map<String, Controller>> routes;

    public Router() {
        this.routes = new HashMap<>();
    }

    public void addHandler(HttpMethod httpMethod, String uri, Controller handler) {
        Map<String, Controller> endpointHandler = new HashMap<>();
        endpointHandler.put(uri, handler);
        routes.put(httpMethod, endpointHandler);
    }

    public HttpResponse mappingEndpointHandler(HttpRequest httpRequest) throws IOException {
        String requestUri = httpRequest.getHttpRequestHeader().getPath();
        HttpMethod httpMethod = HttpMethod.valueOf(httpRequest.getHttpRequestHeader().getMethod());

        Map<String, Controller> endpointHandlers = routes.get(httpMethod);

        if (endpointHandlers != null) {
            Controller endpointHandler = endpointHandlers.get(requestUri);
            if (endpointHandler != null) {
                // 해당 URL과 메소드에 맞는 컨트롤러 메소드 실행
                return endpointHandler.handleRequest(httpRequest);
            }
        }

        // 등록된 컨트롤러 메소드가 없을 경우 404 Not Found 반환
        return HttpResponse.builder()
                .statusCode(HttpStatusCode.FOUND.getCode())
                .statusMessage(HttpStatusCode.FOUND.getMessage())
                .addHeader("Location", NOT_FOUND_PAGE_URL)
                .build();
    }
}

느낀점


소스 파일을 직접 찾아서 반환하도록하는 코드 작성은 처음이었는데 직접 구현해보니 생각보다 어렵다는 것을 느낌

profile
기록과 정리

1개의 댓글

comment-user-thumbnail
2023년 11월 26일

흐름 도식화 너무 멋져요

답글 달기