[Spring 11-2] Annotation을 이용한 MVC 만드는법

임승현·2023년 2월 22일

Spring

목록 보기
30/46

※ src/main/java 폴더에 xyz.itwill10.controller 패키지 생성

🌈환경설정

📢xyz.itwill10.controller 패키지에 요청 처리 클래스(Model)를 작성하고 스프링 어노테이션을 Spring Bean으로 등록
📢servlet-context.xml : appServlet 이름의 Front Controller에서 사용될 클래스의 Spring Bean을 등록하기 위한 Spring Bean Configuretion File

📃servlet-context.xml

※ src/main/webapp/WEB-INF/spring/appServlet 폴더에 servlet-context.xml 수정

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
	<!-- ================================================================================ -->
	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	<!-- servlet-context.xml : appServlet 이름의 Front Controller에서 사용될 클래스의 Spring Bean을 등록하기 위한 Spring Bean Configuretion File -->
	<!-- ================================================================================ -->
	<!-- Enables the Spring MVC @Controller programming model -->
	<!-- annotation-driven : @Controller 어노테이션을 사용하여 요청 처리 클래스를 Spring Bean으로 등록하고 @RequestMapping 어노테이션을 사용하여 작성된
		메소드를 요청 처리 메소드로 등록하여 클라이언트 요청에 의해 요청 처리 클래스의 메소드가 호출되어 처리되도록 설정하는 엘리먼트 -->
	<!-- → HandlerMapping 객체를 사용하지 않아도 요청 처리 클래스의 요청 처리 메소드가 클라이언트의 요청에 의해 호출되도록 자동으로 매핑 처리 -->
	<annotation-driven />
	<!-- ================================================================================ -->
	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />
	<!-- ================================================================================ -->
	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<!-- InternalResourceViewResolver 클래스를 Spring Bean으로 등록 -->
	<!-- InternalResourceViewResolver 객체 : 클라이언트 요청에 의해 호출되는 요청 처리 메소드의 반환값(ViewName)을 제공받아 응답 가능한 JSP 문서로 변환하여 반환하는 객체 -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	<!-- ================================================================================ -->
	<!-- component-scan : 스프링 컨테이너가 스프링 어노테이션을 검색하여 처리하기 위한 엘리먼트 -->
	<!-- base-package 속성 : 스프링 어노테이션을 검색하기 위해 어노테이션을 사용한 클래스의 패키지를 속성값으로 설정 -->
	<!-- <context:component-scan base-package="xyz.itwill.controller" /> --><!-- 기존 코드 -->
	<!-- xyz.itwill10.controller 패키지에 요청 처리 클래스(Model)를 작성하고 스프링 어노테이션을 Spring Bean으로 등록 -->
	<context:component-scan base-package="xyz.itwill10.controller" /><!-- 새로 작성한 코드 -->	
</beans:beans>

🌈요청 처리 클래스 생성

📃HelloController.java

※ xyz.itwill10.controller 패키지에 HelloController.java 클래스 생성

package xyz.itwill10.controller;
//
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//@Controller : 요청 처리 클래스를 Spring Bean으로 등록하기 위한 어노테이션
//→ 클래스의 이름을 Spring Bean의 식별자(beanName)으로 자동 설정 - 첫문자는 소문자로 변환
//→ value 속성을 사용하여 Spring Bean의 식별자(beanName) 변경 가능
//→ Controller 인터페이스를 상속받지 않아도 요청 처리 클래스로 처리
//→ @RequestMapping 어노테이션으로 다수의 요청 처리 메소드를 작성하여 클라이언트의 요청에 대한 처리 가능
//
//모델(Model) 역할을 제공하는 클래스 - 요청 처리 클래스
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
	private static final Logger logger=LoggerFactory.getLogger(HelloController.class);
	//
	//요청 처리 메소드는 Front Controller에게 반드시 뷰이름(ViewName) 제공
	//→ Front Controller는 제공받느 뷰이름을 이용하여 응답 관련 정보로 변환(ViewResolver)하여 응답 처리
	//
	//Front Controller에 의해 JSP 문서로 포워드 이동하여 응답되도록 뷰이름을 제공하는 방법
	//방법1. 요청 처리 메소드의 반환형을 void로 설정한 경우 Front Controller에게 메소드의 이름을 뷰이름으로 제공 
	//방법2. 요청 처리 메소드의 반환형을 String로 설정한 경우 Front Controller에게 반환값을 뷰이름으로 제공
	//방법3. 요청 처리 메소드의 반환형을 ModelAndView로 설정한 경우 Front Controller에게 ModelAndView 객체의 뷰이름을 저장하여 제공
	//JSP 문서로 응답 처리하지 않을 경우 요청 처리 메소드의 반환형을 Model 또는 Map으로 설정 
	//
	//@RequestMapping : 클라이언트 요청을 처리하기 위한 메소드를 선언하기 위한 어노테이션
	//→ 기본적으로 클라이언트의 모든 요청방식(Method - GET, POST, PUT, PATCH, DELETE 등)에 의해 호출되는 요청 처리 메소드를 작성할 경우 사용하는 어노테이션
	//→ 클라이언트의 요청방식을 구분하여 요청 처리 메소드가 호출되고자 할 경우 @GetMapping, @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping 등의 어노테이션 사용
	//value 속성 : 클라이언트의 요청 URL 주소를 속성값으로 설정
	//→ Front Controller에 의해 등록된 클라이언트 요청 URL 주소(식별자)로 요청 처리 메소드가 호출되어 클라이언트의 요청 처리
	//→ 다른 속성이 없는 경우 속성값만 설정 가능
	//→ 다른 요청 처리 메소드의 value 속성값과 요청 URL 주소가 중복될 경우 WAS 실행시 에러 발생
	@RequestMapping(value = "/hello")//이게 있어야 밑에있는 hello()가 요청 처리 메소드가 됨
	public void hello() {//요청 처리 메소드
		//메소드 안에 요청 처리 명령 작성 - Service 객체의 메소드 호출
		logger.info("[/hello] 페이지 요청 : HelloController 클래스의 hello() 메소드 호출");//info 레벨을 출력하려면 log4j.xml logger 엘리먼트 추가해야함
	}
	//
	@RequestMapping(value = "/helloViewName")
	public String helloViewName() {
		logger.info("[/helloViewName] 페이지 요청 : HelloController 클래스의 helloViewName() 메소드 호출");
		return "hello";
	}
	//
	@RequestMapping(value = "/helloModelAndView")
	public ModelAndView helloModelAndView() {
		logger.info("[/helloModelAndView] 페이지 요청 : HelloController 클래스의 helloModelAndView() 메소드 호출");
		//
		//ModelAndView 객체 : 요청에 대한 처리 결과를 속성값으로 저장하고 뷰이름을 저장하기 위한 객체
		//ModelAndView modelAndView=new ModelAndView();
		//modelAndView.setViewName("hello");//Setter 메소드를 이용하여 뷰이름 변경
		//
		ModelAndView modelAndView=new ModelAndView("hello");//생성자를 이용하여 뷰이름 변경
		//
		return modelAndView;
	}
}

🌈JSP 문서 생성

📃hello.jsp

※ WEB-INF/views 폴더에 hello.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
	<h1>Hello, Spring!!!</h1>
	<hr>
</body>
</html>

0개의 댓글