💙 들어가며
SPRING 입문 첫 단계!
Dispatcher Servlet에 대해서 알아보자.
✏️ 학습내용 정리
#Controller의 분리와 POJO 컨트롤러
편리한 MVC모델이지만
Controller가 많이 생기면 생길수록
이 또한 반복되는 코드가 발생한다.
또한 톰캣이라는 특정 플랫폼에 종속된 느낌이 많이 든다.
(꼭 service 함수를 이용해서 request와 response를 사용해야 함)
그래서 front를 담당할 front Controller가 등장했다.
이 front Controller의 등장으로
기존에 Controller로 역할하던 녀석들은
일반 자바 클래스(POJO)처럼 사용할 수 있게 되었다.
💡 POJO란?
POJO(Plain Old Java Object)는 "평범한 예전 자바 객체"를 나타내는 용어이다.
즉, POJO는 더 이상 서블릿이 아니다!
POJO는 특정한 자바 기술이나 프레임워크에 의존하지 않는 순수한 자바 객체를 의미한다.
이 용어는 자바 개발에서 객체 지향 프로그래밍의 간결하고 단순한 접근 방식을 강조하는 데 사용된다.
✏️ POJO의 주요 특징 및 원칙
1. 순수한 자바 객체:
POJO는 자바 언어의 기본 기능만을 사용하여 작성된 객체이다.
특정 자바 기술이나 프레임워크에 종속되지 않는다.
2. 특정 규칙에 따르지 않음:
POJO는 특정한 인터페이스를 구현하거나 특정한 클래스를 상속받지 않아도 된다.
따라서 POJO는 객체의 클래스 계층 구조를 간소화하고 유연성을 제공한다.
3. 의존성 주입(Dependency Injection):
POJO는 종속성 주입(Dependency Injection) 패턴을 쉽게 적용할 수 있다.
이를 통해 객체 간의 의존성을 외부에서 주입하고 테스트하기 쉬운 코드를 작성할 수 있다.
4. 객체 지향 원칙 준수:
POJO는 객체 지향 프로그래밍(OOP) 원칙을 따른다.
이러한 원칙은 캡슐화, 상속, 다형성 등을 포함한다.
5. 객체 상태와 동작:
POJO 객체는 상태와 동작을 함께 포함하며, 객체 지향 설계의 핵심 원리를 따른다.
흐름을 살펴본다면 다음과 같다.
#Front Controller
SPRING에서는 Front Controller를
Dispatcher Servlet이라는 이름의 컴포넌트로 구현했다.
Front Controller라는 개념은 이전에도 있었던 것이지만
SPRING에서는 이를 아예 컴포넌트로 구현해서 가지고 있다.
💡 Dispatcher Servlet이란?
웹 어플리케이션에서 "Dispatcher"는 주로 "Front Controller"라고도 불린다.
Front Controller는 클라이언트로부터 오는 모든 웹 요청을 받아서
해당 요청을 처리할 컨트롤러로 분배하거나 그에 따른 응답을 생성하는 핵심 컴포넌트이다.
Front Controller 패턴은 웹 애플리케이션에서 일관된 방식으로 요청을 처리하고,
애플리케이션의 로직을 중앙에서 관리하기 위해 사용된다.
Dispatcher Servlet은 Spring Framework에서 Front Controller 패턴을 구현한 예이다.
Spring 웹 애플리케이션에서 Dispatcher Servlet은 웹 요청을 받아서
적절한 핸들러(Controller)에게 요청을 전달하고,
그 결과를 기반으로 뷰를 렌더링하여 클라이언트에게 응답을 반환한다.
따라서 웹 어플리케이션에서 "Dispatcher"와 "Front Controller"는 일반적으로 동일한 개념을 나타내며,
클라이언트와 웹 애플리케이션 사이의 중앙 관리 및 라우팅 역할을 수행하는 핵심 구성 요소이다.
출처: 챗지피티(https://chat.openai.com/)
스프링에서는 반복되는 코드를 집중화하여
Controller의 Controller인 Front Controller를 만들었고,
이를 Dispatcher Servlet이라고 명명했다.
Front Controller가 일을 많이 할수록
일반 Controller가 할 일이 적어진다.
그래서 Front Controller는 많은 내용을 매핑하고 있어야 한다.
Front Controller도 누가 만들든 비슷한 구조를 가지게 되어서
이것 또한 라이브러리 형태로 등장했는데,
이전에는 structure를 사용했는데 현재는 spring을 사용한다.
(디스패처서블릿.jar파일)
Dispatcher가 각각의 POJO를 적절하게 불러올 수 있게
이름-servlet.xml파일에 각각의 정보를 매핑해야 한다.
여기서 이름은 web.xml에 서블릿을 매핑한 것에 대한 이름이다.
#web.xml에 Spring mapping하기
web.xml을 복사해서 WEB-INF 폴더 안에 붙여넣고
아래 서블릿 내용을 매핑한다.
💡 web.xml파일에 서블릿 매핑하기
<web-app>
//Listner 설정
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
//Dispatcher Servlet 설정
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
//(아래 servlet-mapping과 한 쌍) Dispatcher Servlet 설정
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
//(위 servlet과 한 쌍) 여기서 매핑할 때 사용한 이름으로 xml파일을 하나 더 만들어야 한다.
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app>
Listener는 서블릿으로 했으니
web.xml에서 metadata-complete = "false"로 바꿔준다.
(false로 해줘야 나중에 어노테이션으로 설정한 클래스들의 정보를 다 읽어줄 수 있다.)
💡 web-app 태그안의 meta-data false로 바꾸기
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
version="6.0"
metadata-complete="false">
#*-servlet.xml에 POJO 매핑하기
디스패쳐가 우리가 만든 POJO를 찾을 수 있게
디스패쳐를 위한 url을 만들자!
web.xml에 서블릿을 매핑했다면
별도로 WEB-INF에 xml파일을 하나 더 만들어서 매핑한다.
이때 xml파일 이름은 우리가 web.xml에 설정한 서블릿 이름으로 한다.
위에서 "app"으로 명명했었기 때문에
app.servlet.xml이라는 이름으로 파일을 만든다.
💡 app-servlet.xml 설정하기
<?xml version="1.0" encoding="UTF-8"?>
//xml 네임스페이스 설정
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="실제 파일이 있는 경로" class="구현한 클래스명(패키지까지 다 써줘야 함)">
</bean>
</beans>
💙 마치며
1.
언제나 마지막 지향점은
코드의 집중화와 분리인 것 같다.
Controller를 분리했더니
그 Controller마저 Front Controller로 분리하기!
2.
Front Controller와 Dispatcher Servlet이
조금 헷갈리는 개념이었는데,
Dispatcher Servlet은
단순히 SPRING에서 Front Controller를 구현한
자체 컴포넌트라는 것을 이해할 수 있었다.
즉, Front Controller는 패턴이고
Dispatcher Servlet은 스프링에서 이 패턴을 구현한
컴포넌트!