Skip to content

Commit

Permalink
refactor: DispatcherServlet에서 JspView 의존성 제거
Browse files Browse the repository at this point in the history
  • Loading branch information
carsago committed Sep 28, 2023
1 parent bf4630c commit 0fa520f
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 41 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package com.techcourse;

import com.techcourse.exception.NotFoundExceptionHandler;
import jakarta.servlet.ServletContext;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import web.org.springframework.web.WebApplicationInitializer;
import webmvc.org.springframework.web.servlet.DispatcherServlet;
import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.AnnotationHandlerAdapter;
import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.HandlerAdapterFinder;
import webmvc.org.springframework.web.servlet.mvc.tobe.exception.ExceptionResolver;
import webmvc.org.springframework.web.servlet.mvc.tobe.handler.AnnotationHandlerMapping;
import webmvc.org.springframework.web.servlet.mvc.tobe.handler.HandlerMapping;

/**
* Base class for {@link WebApplicationInitializer}
Expand All @@ -18,7 +25,7 @@ public class DispatcherServletInitializer implements WebApplicationInitializer {

@Override
public void onStartup(final ServletContext servletContext) {
final var dispatcherServlet = new DispatcherServlet();
final var dispatcherServlet = initDispatcherServlet();

final var registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet);
if (registration == null) {
Expand All @@ -31,4 +38,12 @@ public void onStartup(final ServletContext servletContext) {

log.info("Start AppWebApplication Initializer");
}

public DispatcherServlet initDispatcherServlet() {
HandlerMapping handlerMapping = new AnnotationHandlerMapping();
handlerMapping.initialize();
HandlerAdapterFinder handlerAdapterFinder = new HandlerAdapterFinder(List.of(new AnnotationHandlerAdapter()));
ExceptionResolver exceptionResolver = new ExceptionResolver(List.of(new NotFoundExceptionHandler()));
return new DispatcherServlet(handlerMapping, handlerAdapterFinder, exceptionResolver);
}
}
4 changes: 2 additions & 2 deletions app/src/main/java/com/techcourse/TomcatStarter.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.techcourse;

import com.techcourse.exception.UncheckedServletException;
import java.io.File;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.tomcat.util.scan.StandardJarScanner;

import java.io.File;

public class TomcatStarter {

public static final String WEBAPP_DIR_LOCATION = "app/src/main/webapp/";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.techcourse.exception;

import webmvc.org.springframework.web.servlet.ModelAndView;
import webmvc.org.springframework.web.servlet.mvc.tobe.exception.HandlerNotFoundException;
import webmvc.org.springframework.web.servlet.mvc.tobe.handler.ExceptionHandler;
import webmvc.org.springframework.web.servlet.view.JspView;

public class NotFoundExceptionHandler implements ExceptionHandler {

@Override
public boolean support(Throwable ex) {
return ex instanceof HandlerNotFoundException;
}

@Override
public ModelAndView handle() {
return new ModelAndView(new JspView("/404.jsp"));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.techcourse;
package com.techcourse.exception;

public class UncheckedServletException extends RuntimeException {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,27 @@
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.AnnotationHandlerAdapter;
import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.HandlerAdapter;
import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.HandlerAdapterFinder;
import webmvc.org.springframework.web.servlet.mvc.tobe.exception.ExceptionResolver;
import webmvc.org.springframework.web.servlet.mvc.tobe.handler.AnnotationHandlerMapping;
import webmvc.org.springframework.web.servlet.mvc.tobe.handler.HandlerMapping;

public class DispatcherServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
private static final Logger log = LoggerFactory.getLogger(DispatcherServlet.class);

private HandlerMapping handlerMapping;
private HandlerAdapterFinder handlerAdapterFinder;
private ExceptionResolver exceptionResolver;
private final HandlerMapping handlerMapping;
private final HandlerAdapterFinder handlerAdapterFinder;
private final ExceptionResolver exceptionResolver;

public DispatcherServlet() {
}

@Override
public void init() {
handlerMapping = initHandlerMappings();
handlerAdapterFinder = initHandlerAdapterFinder();
exceptionResolver = new ExceptionResolver();
}

private HandlerMapping initHandlerMappings() {
HandlerMapping handlerMapping = new AnnotationHandlerMapping("com");
handlerMapping.initialize();
return handlerMapping;
}

private HandlerAdapterFinder initHandlerAdapterFinder() {
return new HandlerAdapterFinder(
List.of(new AnnotationHandlerAdapter()));
public DispatcherServlet(HandlerMapping handlerMapping, HandlerAdapterFinder handlerAdapterFinder,
ExceptionResolver exceptionResolver) {
this.handlerMapping = handlerMapping;
this.handlerAdapterFinder = handlerAdapterFinder;
this.exceptionResolver = exceptionResolver;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package webmvc.org.springframework.web.servlet.mvc.tobe.adapter;

import com.sun.jdi.InternalException;
import java.util.List;
import webmvc.org.springframework.web.servlet.mvc.tobe.exception.HandlerNotFoundException;

public class HandlerAdapterFinder {

Expand All @@ -15,6 +15,6 @@ public HandlerAdapter find(Object handler) {
return handlerAdapters.stream()
.filter(it -> it.supports(handler))
.findFirst()
.orElseThrow(InternalException::new);
.orElseThrow(HandlerNotFoundException::new);
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
package webmvc.org.springframework.web.servlet.mvc.tobe.exception;

import com.sun.jdi.InternalException;
import java.util.List;
import webmvc.org.springframework.web.servlet.ModelAndView;
import webmvc.org.springframework.web.servlet.view.JspView;
import webmvc.org.springframework.web.servlet.mvc.tobe.handler.ExceptionHandler;

public class ExceptionResolver {

public ModelAndView handle(Throwable ex) {
ModelAndView mv = null;
if (ex instanceof HandlerNotFoundException) {
mv = new ModelAndView(new JspView("/404.jsp"));
}
private final List<ExceptionHandler> handlers;

if (mv == null) {
return new ModelAndView(new JspView("/500.jsp"));
}
public ExceptionResolver(List<ExceptionHandler> handlers) {
this.handlers = handlers;
}

return mv;
public ModelAndView handle(Throwable ex) {
ExceptionHandler handler = handlers.stream()
.filter(it -> it.support(ex))
.findFirst()
.orElseThrow(() -> new InternalException());
return handler.handle();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package webmvc.org.springframework.web.servlet.mvc.tobe.handler;

import webmvc.org.springframework.web.servlet.ModelAndView;

public interface ExceptionHandler {

boolean support(Throwable ex);

ModelAndView handle();
}

0 comments on commit 0fa520f

Please sign in to comment.