1. 스프링 MVC 웹 요청 처리 과정
주의!
JSP/Servlet MVC 패턴에서의 컨트롤러와 Spring에서의 컨트롤러는 다른 의미
JSP/Servlet MVC 패턴에서 C인 Controller(서블릿)은 Spring에서 front Controller
JSP/Servlet MVC 패턴에서 M인 Model Handler는 Spring에서 Controller 이다.
위에서 그렸던 Spring MVC 웹 요청 처리과정 그림을 글로 풀어보자면..
1) 클라이언트가 XXX.do 라는 어떠한 요청 URL로 요청
2) 요청URL을 가지고 :DispatcherSrvlet 구성요소(front Controller)가 요청 URL과 매칭되는 Controller(M)를 검색해 달라고 :HandlerMapping 구성요소에게 전달
3) :HandlerMapping 구성요소는 매칭되는 Controller를 :DispatcherSrvlet 구성요소(front Controller)에게 알려줌
4) :DispatcherSrvlet 구성요소(front Controller)는 :Handler Adapter 구성요소에게 처리 요청
5) :Handler Adapter 구성요소는 Controller(M)에게 로직 처리를 요청
6) Controller(M)은 처리 결과를 :Handler Adapter 구성요소에게 반환
7) :Handler Adpater는 Controller의 실행 결과를 ModelAndView로 변환해서 :DispatcherSrvlet 구성요소(front Controller)에게 리턴
8) :DispatcherSrvlet 구성요소(front Controller)는 :View Resolver 구성요소에게 Controller(M)의 처리 결과를 보여줄 View를 검색하라고 요청
9) :View Resolver 구성요소는 검색된 View를 :DispatcherSrvlet 구성요소(front Controller)에게 알려줌
10) :DispatcherSrvlet 구성요소(front Controller)는 :View에게 화면에 보여줄 응답을 생성하라고 요청
11) :View가 응답을 생성(JSP)
2. 스프링 MVC의 주요 구성요소
구성 요소 | 설명 |
DispatcherServlet | 클라이언트의 요청을 전달 받는다. 컨트롤러에게 클라이언트의 요청을 전달하고, 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성하도록 함 |
HandlerMapping | 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지를 결정 |
HandlerAdapter | DispatcherServlet의 처리 요청을 변환해서 컨트롤러에게 전달하고, 컨트롤러의 응답 결과를 DispatcherServlet이 요구하는 형식으로 변환. 웹 브라우저 캐시 등의 설정도 담당 |
Controller | 클라이언트의 요청을 처리한 뒤 결과를 리턴한다. 응답 결과에서 보여줄 데이터를 모델에 담아 전달 |
ModelAndView | 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다. |
ViewResolver | 컨트롤러의 처리 결과를 보여줄 뷰를 결정 |
View | 컨트롤러의 처리 결과 화면을 생성 JSP나 Velocity 템플릿 파일 등을 이용해서 클라이언트에 응답 결과를 전송 |
* 예제를 다루기 전에 springMVC라는 Dynamic Web Project를 생성 및 DB에 테이블 생성
> 톰캣은 8.5.78 / JRE는 jre1.8.0_321 사용
프로젝트를 생성하였으면
1) WEB-INF 폴더 안에 lib 폴더에 필요한 jar 파일 추가
2) 스프링 주요 모듈 + 의존 모듈 jar 파일 추가
- spring-framework-3.0.2.RELEASE-with-docs\dist 에서 jar 파일만 다 추가
- 아래 4가지 jar 파일을 lib 폴더에 붙여넣기 하기
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
com.springsource.net.sf.cglib-2.2.0.jar
- Server 포트번호 수정하기(본인은 server.xml의 포트번호를 7080으로 수정)
sql디벨로퍼에서 SCOTT 계정에 아래 2개 테이블 생성
3. 스프링 MVC 예제(일부만 구현)
JSP/Servlet MVC에서 아래와 같이 처리했던 행위를 스프링 MVC에서는 하지 않아도 된다.
1. 컨트롤러 생성 + web.xml 등록
ㄱ. DispatcherServlet 선언
ㄴ. commandHandler.properties 선언
ㄷ. web.xml 등록
2. CommandHandler 인터페이스 선언
ListHandler 클래스 생성(MVC의 M인 모델객체)
스프링 MVC 에서는 요청URL과 매칭되는 컨트롤러를 HandlerMapping이 검색하며 이 또한 우리가 만들지 않아도 된다. web.xml에 서블릿을 등록하러 가자!
Tip! 완벽한 클래스명을 사용하기 위해서는 아무 java 파일을 만들어서 import 구문을 가져오면 오타가 날 일도 없고 확실하다!
[web.xml]
*** HandlerMapping과 HandlerAdapter, ViewResolver는 스프링 버전에 따라 자동으로 생성되거나 직접 설정해주어야 하는데 예제에서는 자동 생성이 되어진다.
- org.springframework.web.servlet.DispatcherServlet 클래스는 스프링에서 제공하는 DispatcherServlet(== front Controller)이다.
- 스프링에서 제공하는 EncodingFilter 클래스도 사용하여 필터도 등록하자(org.springframework.web.filter.CharacterEncodingFilter)
이제 빈 객체 생성과 조립을 해주는 역할을 하는 스프링 컨테이너도 생성해 주어야 한다.
이전 예제에서 다뤘던 GenericXmlApplicationContext과는 다르게 Web에서는 WebXmlApplicationContext 객체를 생성하여 사용하는데 이 클래스 또한 우리가 만들지 않아도 된다.
서버(톰캣)이 시작되면 자동으로 생성되어지기 때문!!
* org.springframework.web.servlet-3.0.2.ReLEASE.jar 모듈로 인해서 해당 클래스 파일에 코딩을 확인하면 알 수 있음
DispatcherServlet .class 파일 안에 DispatcherServlet 클래스를 상속받은 FrameworkServlet 코드 중 아래와 같은 코딩이 있음
public final WebApplicationContext getWebApplicationContext() {
return this.webApplicationContext;
}
그럼 어떻게 xml 파일 설정으로 빈 객체를 생성하고 의존성 주입을 하는걸까?
스프링에서 자동으로 서블릿명-servlet.xml 파일 생성하면 자동으로 찾아서 스프링 컨테이너를 생성한다.
web.xml에서 등록한 DispatcherServlet(== front Controller)의 이름을 dispatcher로 설정했기 때문에 dispatcher-servlet.xml 파일을 생성하여 그 안에서 빈 객체를 생성해 주자
빈 객체를 생성하기 전에 위에서 생성한 2개의 테이블에 맞는 VO와 DAO, MVC의 M인 Controller를 생성하였다.
Controller 클래스는 스프링에서 제공하는 Controller 인터페이스를 구현하여 ModelAndView를 리턴하는 handleRequest 메서드를 오버라이딩 하였다.
controllers.customer 패키지 추가
ㄴNoticeController
ㄴNoticeDetailController
newlecture.vo 패키지 추가
ㄴ Member.java
ㄴ Notice.java
newlecture.dao 패키지 추가
ㄴ MemberDao.java
ㄴ NoticeDao.java
[NoticeController]
- Controller에 DAO를 주입하기 위해서 필드와 생성자, getter/setter 생성
handleRequest 메서드를 구현할 때는
ModelAndview 객체를 생성하여 addObject() 메서드를 사용하여 처리 결과를 담아주고
setViewName() 메서드에는 처리한 결과를 보여줄 응답(View)을 설정해준다.
[NoticeDetailController]
- Controller에 DAO를 주입하기 위해서 필드와 생성자, getter/setter 생성
> 상세보기를 하는 공지사항 번호를 가져와서 getNotice(seq) 메서드로 해당하는 공지사항의 정보를 가져와 Notice 객체에 담고 ModelAndView 객체에 담아서 jsp 페이지에 정보를 가져가서 출력
그 후에 컨트롤러를 dispatcher-servlet.xml에서 <bean> 태그에 name 속성으로 요청URL을 주면 자동으로
요청URL과 매칭되는 컨트롤러를 검색할 수 있도록 설정하였고 <property> 태그로 DI(의존 주입) 해주었다.
'TIL > Spring' 카테고리의 다른 글
[SIST] Spring_days05_Spring 파일 업로드 (0) | 2022.07.16 |
---|---|
[SIST] Srping_days04_Spring MVC (0) | 2022.07.14 |
[SIST] Spring_days03_@Aspect 애노테이션 기반 AOP 구현 (0) | 2022.07.13 |
[SIST] Spring_days02_스프링 AOP와 스프링 API / XML 스키마 기반으로 AOP 구현 (0) | 2022.07.13 |
[SIST] Spring_days02_자바 코드를 이용한 DI 설정 / 애노테이션을 이용한 자동 의존 주입 / 컴포넌트 스캔 (0) | 2022.07.12 |