Spring MVC
Spring Framework 에서는 클라이언트의 화면을 표현하기 위한 View와 서비 스를 수행하기 위한 개발 로직 부분(Model)을 나누는 MVC 2 패턴을 지원한다. 또한 Model, View, Controller 사이의 의존 관계를 DI 컨테이너에서 관리 하여 유연한 웹 어플리케이션을 쉽게 구현 및 개발할 수 있다.
Spring MVC 구성 요소
○ Dispatcher Servlet
클라이언트의 요청을 전달받음 요청에 맞는 컨트롤러가 리턴한 결과값을 View에전달하여 알맞은 응답을 생성
○ Handler Mapping
클라이언트의 요청 URL을어떤 컨트롤러가 처리할지 결정
○ Controller
클라이언트의 요청을 처리한 뒤,결과를 DispatcherServlet에게 리턴
○ Model AndView
컨트롤러가 처리한 결과 정보 및뷰선택에 필요한 정보를 담음
○ ViewResolver
컨트롤러의 처리 결과를 생성할 View를결정
○ View
컨트롤러의 처리 결과 화면을 생성,JSP나Velocity템플릿 파일 등을 View로사용
Spring 프로젝트 구조
main 폴더
java → 우리가 작성하는 .java 파일의 위치
resources → 프로젝트 설정에 필요한 xml 등의 설정파일들
webapp → 사용자 화면에 표시할 view 관련 파일들과 웹 컨테이너 설정에 필요한 xml 파일들
webapp folder 웹 상의 루트 역할인 webapp 폴더
resources → 웹 상에서 사용될 CSS, JS 파일을 저장한다
classes src → 에서 작성한 .java 파일을 컴파일하여 만든 .class 파일을 저장한다.
spring spring → 의 설정 xml 문서들을 저장한다.
views → HTML, JSP 등 사용자 화면에 보여질 웹 문서를 저장한다.
web.xml → 웹 서버에서 사용할 기본 설정을 기록한다
1. sts에서 프로젝트 생성
File → New → Spring Legacy Project → 프로젝트명 지정 → Templates 항목에서 Spring MVC Project 선택
스프링에서 제공해주는 클래스의 패키지명을 입력한다. ( 메인패키지.sub.sub2 지정 )
sub2 패키지명이 자동으로 Context명이 된다.
예) com.xxx.app 지정하면 자동으로 app가 context명이 된다.
http://localhost:8090/context명/서블릿맵핑명
http://localhost:8090/app 가 된다.
2. pom.xml 에서 수정
- spring framework 버전 수정
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
👇
<org.springframework-version>5.2.25.RELEASE</org.springframework-version> - <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
👇
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>5.2.25</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
- 프로젝트 오른쪽 클릭 후 > maven > update project 선택하면 새롭게 갱신된다.
3. 디렉토리 구조
- 이전 서블릿/jsp
Webcontent → WEB-INF → web.xml (서블릿맵핑, filter 등록)
→ JSP/html/image/css/js 저장
- 스프링 MVC
src
- main
- webapp (Webcontent와 동일)
- WEB-INF (WEB-INF 폴더 내의 파일들은 외부에서 직접 접근이 불가능하다.)
- web.xml (DispachterServlet을 서블릿맵핑( / ), servlet-context.xml을 init-param으로 설정,
root-context.xml을 context-param으로 설정)
- views
- *.jsp (외부에서 직접 jsp 접근 금지)
- spring
- appServlet
- servlet-context.xml (스프링 설정 파일, 웹과 의존적인 빈들을 등록, @Controller)
- root-context.xml (스프링 설정 파일, DB연동시 필요한 빈 등록, 웹과 독립적인 빈 등록)
4. root-context.xml 복사해서 servlet-context.xml에 덮어쓰기 함
5. SpringMVC에서도 MVC 패턴 기반이기 때문에 서블릿이 필요하다.
스프링에서는 서블릿을 생성해서 제공한다. ( DispacherServlet )
web.xml에서 DispachterServlet을 서블릿 맵핑한다. ( 맵핑값: / )
요청 URL: http://localhost:8090/context명/서블릿맵핑명
👇
http://localhost:8090/app/ ⇒ DispacherServlet이 요청을 받는다.
6. spring configuration 파일(xml) 등록
- 이전 xml 등록
main메서드에서 GenericXmlApplicaton ctx = new GenericXmlApplication(”classpath:com/config/spring-config.xml”); - spring mvc 등록
- DispachterServlet 등록 시 init-param으로 xml을 등록한다.
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- 멀티 xml 등록이 가능하다. <param-value> 안에 여러개 등록.
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml
/WEB-INF/spring/appServlet/test-context.xml
/WEB-INF/spring/appServlet/test-context.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- 멀티 xml 등록 시 *로 지정 가능하다.
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/*-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- root-context.xml 등록시 <context-param>으로 등록하고 ContextLoaderListener로 활성화 시킨다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
7. Spring MVC 아키텍쳐 ★
- 이전 서블릿/JSP 요청 URL
http://localhost:8090/컨텍스트명/서블릿맵핑
예> http://localhost:8090/xxx/hello
⇒ 모든 요청처리 및 응답처리를 서블릿에서 모두 처리했음 (우리가 직접 서블릿을 작성했기 때문)
브라우저 ---------> MyServlet---> XXXService --> XXXDAO ----> 오라클
<----- <--- <--
jsp선택
- Spring MVC 요청 URL
http://localhost:8090/컨텍스트명/서블릿맵핑/요청맵핑
예> http://localhost:8090/app/요청맵핑
⇒ 스프링에서는 DispatcherServlet 라는 서블릿을 제공하기 때문에 요청처리 및 응답처리를 서블릿에서 처리할 수 없다.
⇒ 대신 Controller 클래스가 이전 서블릿에서 했던 요청처리 및 응답처리를 한다.
http://localhost:8090/app/요청맵핑값 ==> 요청맵핑값에 의해서 실제로 처리되는 XXXController 선택이 된다.
http://localhost:8090/app/del --> DeleteController
http://localhost:8090/app/add --> InsertController
@Controller @Service @Repository
브라우저 ---------> DispatcherServlet(제공) -----> XXXController ---> XXXService --> XXXDAO ----> 오라클
<----- <--- <--
jsp 선택
8. Controller 클래스
- POJO(Plain Old Java Object) 기반 ( 어떤 클래스 및 인터페이스를 상속받거나 구현하지 않은 순수한 클래스)
- 반드시 @Controller 어노테이션을 지정한다.
- 웹 클라이언트에서 들어온 요청을 해당 비즈니스 로직으로 분기시켜주고, 수행 결과의 응답을 해주는 Dispatcher 역할을 한다.
예) 저장하는 기능
@Controller
public class InsertController{
//url의 요청맵핑값과 Controller안의 특정메서드를 묶어야 된다.
@RequestMapping(”/add”)
public void insert(){
// 저장기능
}
}
예) 삭제하는 기능
@Controller
public class DeleteController{
//url의 요청맵핑값(/로 시작) 과 Controller안의 특정메서드를 묶어야 된다.
@RequestMapping(”/del”)
public void delete(){
// 삭제기능
}
}
⇒ 모든 기능을 하나의 Controller에서 처리할 수도 있다. (일반적인 코드)
@RequestMapping("/")
웹 클라이언트에서 들어온 요청에 해당하는 비즈니스 로직을 찾아주는 역할
주의할 점은 요청 맵핑값은 반드시 /로 시작해야 되고 유일한 값이어야 된다.
@Controller
public class DeptController{
//url의 요청맵핑값(del)과 Controller안의 특정메서드를 묶어야 된다.
// 요청url: http://localhost:8090/app/del
@RequestMapping("/del")
public String delete(){
//요청처리 ( 삭제기능 )
//응답처리 : 보여줄 jsp 설정 ( /WEB-INF/views/main.jsp )
return "/WEB-INF/views/main.jsp"; // 이전 서블릿의 forward 기능과 동일
}
// 요청url: http://localhost:8090/app/add
@RequestMapping("/add")
public String insert(){
// 요청처리 (저장기능)
//응답처리 : 보여줄 jsp 설정 ( /WEB-INF/views/list.jsp )
return "/WEB-INF/views/list.jsp"; // 이전 서블릿의 forward 기능과 동일
}
}
// 이전 서블릿에서의 forward 기능
reqeust.getRequestDispatcher("/WEB-INF/views/list.jsp").forward(request, response);
- JSP 생성 및 작성 후, controller에서 보여줄 jsp로 return값 작성
src/main/webapp/WEB-INF/views 아래에 jsp 파일 생성
- 반드시 xml에 빈으로 등록해야 된다.
- 첫번째 방법 : 명시적으로 <bean> 이용
- 두번째 방법 : component-scan
- 반드시 servlet-context에 빈으로 등록해야 한다.
'Framework > SPRING FRAMEWORK' 카테고리의 다른 글
@RequestMapping - URL 패턴 이용 (0) | 2023.09.14 |
---|---|
Multi (0) | 2023.09.14 |
Transaction 처리 (0) | 2023.09.13 |
Spring에서의 MyBatis 연동 (1) | 2023.08.31 |
(사용자가 만든) bean들을 등록없이 객체 생성하는 방법 (0) | 2023.08.31 |