DispatcherServlet 왜 필요한가
**요약**
- DispatcherServlet은 모든 웹 요청에 대해 적절한 Controller로 라우팅을 해준다
예제 코드를 분석하면서 DispatcherServlet이 왜 필요한가 알아봅시다
아래 코드는 RequestMapping
어노테이션을 사용하여 특정 URI를 메서드에 연결하고 있습니다.
이는 스프링 프레임워크의 RequestMapping과 유사한 동작을 수행합니다.
코드 분석
public class App {
public static void findUri(UserController uc, String uri) throws Exception {
boolean isFind = false;
Method[] methods = uc.getClass().getDeclaredMethods();
for (Method mt : methods) {
Annotation anno = mt.getDeclaredAnnotation(RequestMapping.class);
RequestMapping rm = (RequestMapping) anno;
if (rm.uri().equals(uri)) {
isFind = true;
mt.invoke(uc);
}
}
if(isFind == false){
System.out.println("404 Not Found");
}
}
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
String uri = sc.nextLine();
findUri(new UserController(), uri);
}
}
RequestingMapping.java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestMapping {
String uri();
}
Controller
public class UserController {
@RequestMapping(uri = "/login")
public void login(){
System.out.println("login() 호출됨");
}
@RequestMapping(uri = "/join")
public void join(){
System.out.println("join() 호출됨");
}
}
문제
OCP (Open-Closed Principle) 위배
OCP (Open-Closed Principle)는 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다는 원칙입니다.
즉, 기존의 코드를 변경하지 않고(닫혀 있음) 기능을 추가(열려 있음)할 수 있어야 합니다.
하지만 현재 코드는 새로운 컨트롤러를 추가할 때마다 findUri
메서드에 새로운 컨트롤러를 전달해야 합니다.
즉, 기존의 App
클래스의 코드를 수정해야 하므로 OCP 원칙을 위반하고 있습니다.
새로운 컨트롤러 추가 시의 문제
현재 findUri
메서드는 UserController
타입의 객체만을 파라미터로 받을 수 있습니다.
이는 새로운 컨트롤러를 추가할 때 매우 제한적입니다.
새로운 컨트롤러를 추가하려면, 각각의 컨트롤러에 대해 별도의 findUri
메서드를 작성하거나 findUri
메서드를 수정해야 합니다.
결론
Spring의 @RequestMapping 추가하는 것까지는 좋았지만, 여러 개의 Controller에 대해서는 유지 보수의 어려움이 있습니다
이 때 인터페이스가 떠오르지 않나요? 서로 다른 Controller에 대해 공통 되는 부분을 묶는다!
UserController
와 같은 모든 컨트롤러가 공통 인터페이스를 구현합니다.
그런 다음 findUri
메서드는 이 인터페이스의 타입을 파라미터로 받을 수 있습니다.
이렇게 하면, 어떠한 종류의 컨트롤러든 동일한 findUri
메서드를 통해 처리할 수 있습니다.
이와 같은 기능을 Spring에서는 DispatcherServlet을 통해 모든 웹 요청을 받아 적절한 컨트롤러로 라우팅합니다.
이는 어노테이션을 통해 처리되며, 개발자가 직접적으로 라우팅 로직을 작성할 필요가 없습니다. 이로 인해 OCP를 준수하면서도 코드의 유지 보수성을 높일 수 있습니다.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
IoC (0) | 2023.07.07 |
---|---|
DispatcherServlet은 어떻게 View와 Controller를 구별할까 (0) | 2023.07.05 |
Spring의 @RequestMapping (0) | 2023.07.05 |
Spring Security (0) | 2023.07.04 |
Easy Random (0) | 2023.06.02 |