

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);
}
}
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();
}
}
소스 파일을 직접 찾아서 반환하도록하는 코드 작성은 처음이었는데 직접 구현해보니 생각보다 어렵다는 것을 느낌
흐름 도식화 너무 멋져요