실습 가이드
1. 웹 브라우저에서 http://localhost:8080/mvcexam/plusform 이라고 요청을 보내면
서버는 브라우저에게 2개의 값을 입력받을 수 있는 입력창과 버튼이 있는 화면을 출력
2. 웹 브라우저에 2개의 값을 입력하고 버튼 클릭하면
http://localhost:8080/mvcexam/plusform URL로 2개의 입력값이 POST 방식으로 서버에 전달
서버는 2개의 값을 더한 결과를 JSP에게 request scope로 전달하여 출력
프로젝트 생성 및 라이브러리 추가
Maven Proejct
archetypes : webapp
group id : kr.or.connect
artifact id : mvcexam
src/main/ 에 java 폴더 생성
pom.xml에 수정 및 추가
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- Spring Version -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Spring Web and MVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
web.xml 수정
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee;http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
프로젝트 우클릭 -> Project Facets -> Runtimes -> Apache Tomcat v8.5 선택
마지막으로 Update Project (Alt+5)
Spring MVC 설정
1. Front Controller _ DispatcherServlet
servlet 파일은 web.xml 파일로 설정 가능
Servlet 3.0 이상에서
-> web.xml 대신 ServletContainerInitializer를 이용할 수 있지만 별로 안 쓰는 방법
-> 또는 WebApplicationInitializer 인터페이스를 구현
way 1) web.xml 파일
실제 servlet-name과
servlet mapping이 갖고 있는 servlet-name이 일치하면 서블릿이 등록됨
servlet-class는 실제로 내가 동작시킬 클래스를 의미
이 때 Spring이 제공하는 DispatcherServlet을 이용하기 때문에,
반드시 패키지 명을 포함해서
Spring이 제공하는 클래스 명을 제대로 넣어주어야 함
init-param에는 실제로 내가 하고 싶은 일에 대한 내용을 적음
xml 파일에 실제로 어떤 일을 하게 되는지 여기에다 알려주는 것
way 2) Java Config
init-param에 xml 파일이 아닌, 자바 클래스 이름을 넣어서
java config 파일을 읽어온다는 것을 알려줌
요청이 들어오면 Servlet일 경우,
url-pattern에 원하는 URL 주소를 넣어 실제 servlet-name과 같은 name으로 맵핑된
servlet-class를 실행함
url-pattern이 / 의 의미는
어떤 특정한 하나의 요청만 받지 않고 모든 요청을 받게 됨
그래야 DispatcherServlet이 모든 요청을 받을 수 있음
way 3) WebApplicationInitializer
- Spring MVC는 ServletContainerInitializer를 구현하고 있는 SpringServletContainerInitializer를 제공한다.
- SpringServletContainerInitializer는 WebApplicationInitializer 인터페이스를 구현하고 있는 구현체를 찾아 인스턴스를 만들고, 해당 인스턴스의 onStartup 메소드를 호출하여 초기화한다.
- 이 방법의 단점은, 처음 웹 어플리케이션이 구동될 때 오래 걸린다는 점
Spring MVC 설정
DispatcherServlet 설정은 web.xml에서 하고,
여기서 읽어들어야 할 설정은 자바 config에서 함
DispatcherServlet은 해당 설정 파일을 읽어들여서, 내부적으로 Sprint의 컨테이너인 ApplicationContext를 생성
이 때 사용되는 어노테이션을 자세히 보자면...
- kr.or.connect.webmvc.config.WebMvcContextConfiguration
@Configuration
- org.springframework.context.annotation의 Configuration 애노테이션과 Bean 애노테이션 코드를 이용하여 스프링 컨테이너에 새 로운 빈 객체를 제공할 수 있다.
- 이 어노테이션으로 자바 config 파일임을 알 수 있게 하기위한 역할
@EnableWebMvc
- 웹에 필요한 bean들을 대부분 자동으로 설정해주는 역할
- 예로, DispatcherServlet의 RequestMappingHandlerMapping, RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver, MessageConverter 등 Web에 필요한 빈들을 대부분 자동으로 설정해준다.
- java config가 아닌 xml로 설정했다면 <mvc:annotation-driven/> 태그가 해당 역할을 대신해 줌.
- 기본 설정 이외의 설정이 필요하다면,
- WebMvcConfigurerAdapter 를 상속받도록 Java config class를 작성 후, 필요한 메소드를 오버라이딩 한다.
- 소스코드를 보면, WebMvcConfigurationSupport를 상속 받고 있음. 여유가 되면 이 클래스의 객체는 무슨 일을 할 수 있는지 살펴보기
@ComponentScan
- ComponentScan애노테이션을 이용하면
- Controller, Service, Repository, Component 어노테이션 붙은 클래스를 찾아 Spring 컨테이너가 관리하게 된다.
- xml 파일에서 Bean element를 일일이 등록할 필요가 없어짐
- 이번에 작성해볼 Controller에는 URL Mapping 정보가 어노테이션으로 설정되어 있음
- 이런 URL Mapping 정보는 DispatcherServlet이 관리하는 RequestMapping 객체들로 설정됨
- 이를 위해 DefaultAnnotationHandlerMapping과 RequestMappingHandlerMapping의 구현체를 사용
- 이 둘은 다른 핸드러 매핑보다 훨씬 더 정교한 작업을 수행
- 이 두 개의 구현체는 애노테이션을 사용해 매핑 관계를 찾는 매우 강력한 기능을 가지고 있다.
- Spring 컨테이너, 즉 애플리케이션 context에 있는 요청 처리 빈에서
- RequestMapping 노테이션을 클래스나 메소드에서 찾아 HandlerMapping 객체를 생성
- HandlerMapping은 서버로 들어온 요청을 어느 핸들러로 전달할지 결정하는 역할을 수행
- 이런 URL Mapping 정보는 DispatcherServlet이 관리하는 RequestMapping 객체들로 설정됨
- DefaultAnnotationHandlerMapping은 DispatcherServlet이 기본으로 등록하는 기본 핸들러 맵핑 객체
- RequestMappingHandlerMapping은 더 강력하고 유연하지만 사용하려면 명시적으로 설정해야 한다.
WebMvcConfigurerAdapter
- org.springframework.web.servlet.config.annotation. WebMvcConfigurerAdapter
- @EnableWebMvc 를 이용하면 기본적인 설정이 모두 자동으로 되지만
- 기본 설정 이외의 설정이 필요할 경우 자바 config 클래스 파일이 해당 클래스를 상속 받은 후, 메소드를 오버라이딩 하여 구현한다.
Controller(Handler) 클래스 작성하기
- @Controller 애노테이션을 클래스 위에 붙인다.
- 실제로 요청을 처리하는 Controller 클래스는 @Controller 어노테이션을 붙여주기만 하면 됨
- 이것이 Controller 클래스라는 것을 @ComponentScan가 읽어들여서 Spring 컨테이너로 관리
- 맵핑을 위해 @RequestMapping 애노테이션을 클래스나 메소드에서 사용한다.
@RequestMapping
- Http 요청과 이를 다루기 위한 Controller 의 메소드를 연결하는 어노테이션
- 요청이 오면 어떤 URL로 온 요청인지 알아내서
- 실제로 처리해야 되는 Controller가 무엇인지
- 그 Controller가 구현하고 있는 메소드가 무엇인지 지정 -> 저마다 다른 어노테이션을 세세히 구별해줌
- Http Method 와 연결하는 방법
- @RequestMapping(value="/users", method=RequestMethod.POST)
- 이렇게 url 모양과 요청에 대한 종류(메소드)를 함께 지정
- From Spring 4.3 version
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
- @RequestMapping(value="/users", method=RequestMethod.POST)
- Http 특정 헤더와 연결하는 방법
- @RequestMapping(method = RequestMethod.GET, headers = "content-type=application/json") - Http Parameter 와 연결하는 방법
- @RequestMapping(method = RequestMethod.GET, params = "type=raw") - Content-Type Header 와 연결하는 방법
- @RequestMapping(method = RequestMethod.GET, consumes = "application/json") - Accept Header 와 연결하는 방법
- @RequestMapping(method = RequestMethod.GET, produces = "application/json")
실습
1. WebMvcContextConfiguration 클래스 파일 생성
1. 설정 파일을 담아둘 패키지 생성
프로젝트 우클릭 -> New -> Pacakge -> 이름: kr.or.connect.config
2-1. WebMvcContextConfiguration 클래스 파일 생성
생성한 패키지에 클래스 파일 만들기
이름: WebMvcContextConfiguration
2-2. WebMvcConfigurerAdapter 상속받기
Browse 클릭 -> WebMvcConfigurerAdapter 검색하여 선택
package kr.or.connect.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"kr.or.connect.mvcexam.controller"})
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
// 요청이 들어오면 찾아야할 위치를 지정
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// /js/**, ./img/**같은 url요청은 디렉토리에 따라서 배치되게 해줌
// 지정하지 않은 것이 나오려하면 에러 발생
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(31556926);
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
// DefaultServletHttpRequestHandler : 매핑 정보가 없는 URL 요청을 다룸
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); //DefaultServletHandler 사용하기
// WAS의 DefaultServlet에 해당 일을 넘겨서 WAS가 DefaultServlet의 static한 자원을 읽어서 보여줌
}
//특정 url에 대한 처리를 controller 클래스를 작성하지 않고 맵핑할 때 사용
@Override
public void addViewControllers(ViewControllerRegistry registry) {
System.out.println("addViewControllers 호출");
registry.addViewController("/").setViewName("main");
// "/"라고 들어온 요청은 "main"이란 이름의 뷰로 보여줌
// 그 뷰는 ViewResolver 객체를 이용해서 찾음
}
// 해당 이름의 View를 찾기 위해 사용
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
// 들어온 이름(main)의 앞뒤에 붙여줄 내용 지정
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
// /WEB-INF/views/main.jsp 를 찾게됨
return resolver;
}
}
2. Spring에서 제공하는 DispatcherServlet이 FrontController의 역할 임을 지정하기
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee;http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Spring JavaConfig Sample</display-name>
<servlet>
<servlet-name>mvc</servlet-name>
<!--Spring이 제공하는 DispatcherServlet을 FrontController 정하기 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- AnnotationConfigWebApplicationContext을 사용할 것을 명시 -->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<!-- 이전에 작성한 config 클래스 파일을 읽을 수 있도록 명시해둠 -->
<!-- 클래스를 등록할 땐 꼭 패키지 명도 명시하기 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>kr.or.connect.mvcexam.config.WebMvcContextConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name> <!-- 이 이름과 같은 servlet element 실행 -->
<url-pattern>/</url-pattern> <!-- / : 모든 요청을 받음 -->
</servlet-mapping>
</web-app>
3. 테스트
1. main.jsp 파일 생성
/src/main/java/webapp/WEB-INF에
views 폴더 생성하여 main.jsp 파일 생성
<body>
<h1>main page~~~!!</h1>
</body>
2. index.jsp 파일 삭제 후 프로젝트 우클릭 -> Run on Server
'Web > Java+Spring' 카테고리의 다른 글
Spring MVC - Controller 작성 실습 3 (0) | 2021.06.07 |
---|---|
Spring MVC - Controller 작성 실습 2 (0) | 2021.06.07 |
Spring MVC (0) | 2021.06.04 |
Spring JDBC - DTO/DAO (0) | 2021.06.02 |
Spring JDBC (0) | 2021.06.02 |