개발정리

SpringMVC 동작 과정

ejkings 2022. 12. 28. 14:30
반응형


Spring MVC동작 과정

클라이언트 요청 > 디스패처서블릿 > 핸들러어댑터(스프링빈) 요청 > 컨트롤러(스프링빈) 요청 > 핸들러어뎁터(MVC로 변환하여) 반환 > 디스패처서블릿(컨트롤러의 실행결과에 대응하는 뷰 검색) > 뷰리졸버(스프링빈) > 뷰(생성) > 디스패처서블릿으로 응답 > 클라이언트 응답

디스패처서블릿

web.xml에서 설정, appServlet이 dispathcherServlet임

appServlet을 보면 init-param(초기화 파라미터)의 값으로 /WEB-INF/spring/appServlet/servlet-context.xml을 가지고 생성하는것을 볼 수 있음

WEB-INF/spring/appServlet/servlet-context.xml 으로 가보면 InternalResourceViewResolver를 bean으로 가지게 되는데 사용자에게 보여울 view를 찾기위한 prefix, suffix를 제공
예를 들면 controller에서 home을 retrun하게 되는데 prefix인 /WEB-INF/views/ 와 home 그리고 suffix인 .jsp를 합쳐 .WEB-INF/views/ 하위에 존재하는 home.jsp를 찾아 사용자에게 보여줌
ViewResolver는 사용자에게 결과를 렌더링하여 보여주는 역할
UriBaseViewResolver : view 이름을 URL로 사용, View이름과 실제 view 자원과 이름이 같을때 사용

Controller가 어떻게 알고 요청 전달을 하는지는

DispatcherServlet이 초기값으로 가지는 설정파일(servlet-context.xml)에 <context:component-scan base-package="패키지경로"/> 가 적혀있음, 바로 어노테이션을 이용해 Bean을 등록 할때 사용했던 태그!
component-scan는 @Component 어노테이션 뿐만 아니라 StreoType(@Contaroller, @Service, @Repository) 등을 자동 스캔하여 Bean으로 등록 해주는 태그, 이 덕분에 HomeController 상단에 @Controller 어노태이션을 보고 Bean으로 등록한 후에 Controller에게 요청할 수 있음!

<context:component-scan/> 태그안에 base-package를 뒤져가며 @Controller 가 부여된 Class를 찾습니다. HomeController 클래스있군요 여기서 @RequestMapping()의 value를 보고 사용자가 요청한 url에 대응이 되면 해당 메소드가 실행 됩니다. 여기서 인자로 전달받은 model의 addAttribute("key", "value"); 메소드를 이용해 view의 값을 전달 할 수 있습니다. 그리고 return이 적혀 있는 view를 사용자에게 응답하게 됩니다.

annotation 기본개념
xml 설정이 너무 길어짐에 따라 그 대안으로 나타남
클래스/메서드/필드에 어노테이션을 달아 그자체로 설정이 가능하도록한다.
* 그래도 xml이 우선순위가 더 높음
mvc:annotation-driven
스프링이 mvc컴포넌트들을 그것의 디폴트 설을 가지고 활성화하기위해 사용
이 태그는 SpringMVC가 @Controller에 요청을 보내기 위해 필요한 HandlerMapping과 HandlerAdapter를 bean으로 등록한다
- 이렇게 등록된 bean에 의해 요청 url과 컨트롤러를 매칭 할 수 있다.
- 또한 컨트롤러(@Controller)에서는 @RequestMapping, @ExceptionHandler 등과 같은 주석을 통해 해당 기능을 사용 할 수 있도록한다.
- 근본적으로 @Controller 없이는 이 태그는 아무것도 하지 않는다고 할 수 있다.
- bean을 생성하기 위해 xml파일에 context:component-scan을 명시하면 이 태그를 포함하지 않아도 mvc애플리케이션은 작동한다
- RequestMappingHandlerMapping? 요청 url과 매칭되는 컨트롤러(@Controller)를 검색하는 역할, 요청 url을 보고 어떤 컨트롤러가 처리할지 결정한다
- RequestMappingHandlerAdapter? 컨트롤러의 실행 결과(요청을 처리한 결과)를 리턴하는 역할, 어노테이션 기반의 Controller 처리를 위해 반드시 필요하다




웹서버랑 WAS는 무엇인지?
웹서버
클라이언트에게 HTML 문서나 각종 리소스 응답을 전달해주는 역할
서버 범위 중에 클라이언트와 가장 맞닿아 있음
ex) Nginx, Apache

WAS(Web application server)
웹 어플리케이션이 동작하도록 지원하는 목적을 가짐
즉, 서비스 및 비즈니스 로직을 담고있는 서버
ex) Tomcat

보통 WAS도 웹서버 기능을 내장하지만, 규모가 커지면 이 둘을 분리
웹 서버는 주로 정적 컨텐츠를, WAS는 동적 컨텐츠를 지원

Servlet과 JSP
Servlet
웹에서 동작해야하는 로직을 담고 있는 클래스(코드)
uri 매핑, 다른 로직에 전달, WAS로 응답 전달 등의 기능을 함
init > service > destroy의 라이프 사이클을 가짐

JSP
응답 웹 페이지 구성을 하는 파일로, html과 유사함
해당 JSP 파일요청이 들어왔을때, Servlet 클래스 및 인스턴스로 구현됨

둘다 톰캣에 기반하여 작동
보통 서블릿파일로 요청받고 jsp파일로 포워드함

Maven
빌드 및 라이브러리 의존성 관리 등을 해주는 도구
별도의 양식과 디렉토리 구성이 존재하며, 정해진 관습이 있음
pom.xml에서 빌드 및 의존성 설정

JDBC
Java 기반의 웹 어플리케이션과 외부 DB를 연동시켜주는 라이브러리
Connection, PreparedStatement 객체로 Java 코드로 SQL 쿼리문을 작성하여 실행가능

반응형