Web/Java+Spring

Spring MVC - Controller 작성 실습 1

WakaraNai 2021. 6. 7. 18:58
728x90
반응형

실습 가이드

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/> 태그가 해당 역할을 대신해 줌.
  • 기본 설정 이외의 설정이 필요하다면,

@ComponentScan

  • ComponentScan애노테이션을 이용하면
    • Controller, Service, Repository, Component 어노테이션 붙은 클래스를 찾아 Spring 컨테이너가 관리하게 된다.
    • xml 파일에서 Bean element를 일일이 등록할 필요가 없어짐
    • 이번에 작성해볼 Controller에는 URL Mapping 정보가 어노테이션으로 설정되어 있음
      • 이런 URL Mapping 정보는 DispatcherServlet이 관리하는 RequestMapping 객체들로 설정됨
        • 이를 위해 DefaultAnnotationHandlerMapping과 RequestMappingHandlerMapping의 구현체를 사용
        • 이 둘은 다른 핸드러 매핑보다 훨씬 더 정교한 작업을 수행
        • 이 두 개의 구현체는 애노테이션을 사용해 매핑 관계를 찾는 매우 강력한 기능을 가지고 있다.
          • Spring 컨테이너, 즉 애플리케이션 context에 있는 요청 처리 빈에서
          • RequestMapping 노테이션을 클래스나 메소드에서 찾아 HandlerMapping 객체를 생성
        • HandlerMapping은 서버로 들어온 요청을 어느 핸들러로 전달할지 결정하는 역할을 수행
  • 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
  • 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

728x90
반응형

'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