티스토리 뷰

1.    @RequestBody

-      : 요청 메시지의 Body에 포함되어 있는 순수한 데이터( XML, JSON)를 끄집어 내어, Rest 컨트롤러의 헨들러 메소드의 매개변수에 넣어주는 역할을 수행

 

2.    Interceptor

-      Spring Interceptor Class는 반드시 HandlerInterceptor Interface implements 해야 된다.


[ 1. ResponseEntity <T> ] (****)

 

 

[ + 테스트 ]

 

더보기

[ + 코드 보기 ]

package org.zerock.myapp.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.ResponseEntity.BodyBuilder;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.zerock.myapp.domain.Sample2VO;

import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@CrossOrigin

@RequestMapping("/entity/")
@RestController
public class ResponseEntityController {
	
	// ===================================================================
	// + params 속성에 지정한 이름은 바로 "반드시" 들어와야 할 전송파라미터의
	// + 이름을 지정하게 된다. 여기에 지정된 전송 파라미터가 하나라도 수신되지
	// + 않았다면, 예외가 발생하게 된다. (****)
	// ===================================================================
	
	@GetMapping( 
				path="/check", 
				params = {"weight", "height"},
				produces = MediaType.APPLICATION_JSON_VALUE )
	public ResponseEntity<Sample2VO> check( Double weight, Double height ){
		
		log.trace("check({}, {}) invoked.", weight, height );
		
		Sample2VO vo = new Sample2VO(height, weight);
		log.info("\t + vo : {}", vo);
	
		ResponseEntity<Sample2VO> response = null;
		BodyBuilder bodyBuilder = null;
		
		// -----------------------------------------------------------------
		// + 상태 코드 지정
		// -----------------------------------------------------------------
		// + ResponseEntity는 정적 메소드이기에 response 대신 ResponseEntity를 사용하였다.
		// -----------------------------------------------------------------
		
		if ( height < 10 ) {
			bodyBuilder = ResponseEntity.status(HttpStatus.BAD_REQUEST);
		} else {
			bodyBuilder = ResponseEntity.status(HttpStatus.OK);
		} // if - else
		
		log.info("\t + bodyBuilder : {}", bodyBuilder);
		
		// -----------------------------------------------------------------
		// + 바디에 넣는다.
		// -----------------------------------------------------------------
		
		response = bodyBuilder.<Sample2VO>body(vo);
		log.info("\t + response : {}", response);
		
		return response;
		
	} // check

} // end class

[ 2. @RequestBody ] (****)

 

 

[ + 테스트 하기 ]

 

더보기

[ + 코드 보기 ]

package org.zerock.myapp.controller;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.zerock.myapp.domain.Ticket;

import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@CrossOrigin

@RequestMapping("/request")
@RestController
public class RequestBodyController {
	
	// ========================================================================
	// + @RequestBody : (***)
	// + 요청 메시지의 body 에 포함되어 있는 순수한 데이터(XML or JSON)를 끄집어내어, 
	// + Rest 컨트롤러의 핸들러 메소드의 매개변수에 넣어주는 역할 수행
	// ========================================================================
	
	@PostMapping(path="/ticket", produces = MediaType.APPLICATION_JSON_VALUE)
	public Ticket ticket( 
						 // @RequestBody String tickets // ok!
							@RequestBody Ticket tickets ) {
		
		log.trace( "\t + ticket({}) invoked.", tickets );
		// + ticket(Ticket(tno=1008, grade=A, price=15400.0)) invoked.
		// + 요청 메시지에 들어있는 순수한 데이터를 매개변수로 하여, Ticket으로 받아들였다.
		
		return tickets;
	} // Ticket

} // end class

[ 3. 인터셉터 ( Interceptor ) ]

 

[ 3 - 1. 가로체일 URI 생성 ]

 

더보기

[ + 코드 보기 ]

package org.zerock.myapp.controller;

import java.util.Locale;

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.zerock.myapp.exception.ControllerException;

import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@RequestMapping("/sample/")
@Controller
public class SampleController {
	
	// ==================================================================================
	
	@ResponseStatus(code = HttpStatus.OK)
	@GetMapping("/doA")
	public String doA ( Locale locale, Model model ) throws ControllerException {
		// + Locale locale : Locale은 현재 거주하고 있는 지역을 얻어낼 수 있다.
		log.trace("doA() invoked.");
		
		try {
			
			model.addAttribute("serverTime", "/sample/doA");
			return"home";
			
		} catch (Exception e) {
			throw new ControllerException(e);
		} // try - catch
		
	} // doA
	
	// ==================================================================================
	
	@ResponseStatus(code = HttpStatus.OK)
	@GetMapping("/doB")
	public String doB ( Locale locale, Model model ) throws ControllerException {
		// + Locale locale : Locale은 현재 거주하고 있는 지역을 얻어낼 수 있다.
		log.trace("doB() invoked.");
		
		try {
			
			model.addAttribute("serverTime", "/sample/doB");
			return"home";
			
		} catch (Exception e) {
			throw new ControllerException(e);
		} // try - catch
		
	} // doB
	
	// ==================================================================================
	
	@ResponseStatus(code = HttpStatus.OK)
	@GetMapping("/doC")
	public String doC ( Locale locale, Model model ) throws ControllerException {
		// + Locale locale : Locale은 현재 거주하고 있는 지역을 얻어낼 수 있다.
		log.trace("doC() invoked.");
		
		try {
			
			model.addAttribute("serverTime", "/sample/doC");
			return"home";
			
		} catch (Exception e) {
			throw new ControllerException(e);
		} // try - catch
		
	} // doC
	
	// ==================================================================================
	
	@ResponseStatus(code = HttpStatus.OK)
	@GetMapping("/doD")
	public String doD ( Locale locale, Model model ) throws ControllerException {
		// + Locale locale : Locale은 현재 거주하고 있는 지역을 얻어낼 수 있다.
		log.trace("doD() invoked.");
		
		try {
			
			model.addAttribute("serverTime", "/sample/doD");
			return"home";
			
		} catch (Exception e) {
			throw new ControllerException(e);
		} // try - catch
		
	} // doD
	
	// ==================================================================================

} // end class

 

[ 3 - 2. Interceptor 클래스 생성 ]

 

더보기

[ + 코드 보기 ]

package org.zerock.myapp.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@Component
public class SampleInterceptor implements HandlerInterceptor {
	// + 인터셉터는 반드시 HandlerInterceptor를 상속받아야 한다. (***)
	
	// =======================================================================================================
	
	// + 1. Dispatcher Servlet이 받은 request를 Controller의 Handler Method로 전달되기 전에 가로챈다.
	// + Servlet-context/xml에서 sample/doA에 들어오는 것을 SampleInterceptor가 가로채도록 되어 있기에,
	// + /sample/doA로 접속을 시도하면, 그 전에 preHandle(req, res, handler) invoked.가 발생한다.
	@Override
	public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler)
			throws Exception {
		
		log.trace("preHandle(req, res, handler) invoked.");

		return true; // 기본값이 true로 설정되어 있다.
	} // preHandle
	
	// =======================================================================================================

	// + 2. Controller의 Handler Method가 수행된 직후 ( 단, view가 호출되기 전 )
	// + (*주의*) 단, Controller의 Handler Method에서 예외가 발생하면, 아래의 메소드는 호출되지 못한다.
	@Override
	public void postHandle(HttpServletRequest req, HttpServletResponse res, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		log.trace("postHandle(req, res, handler, modelAndView) invoked.");

	} // postHandle
	
	// =======================================================================================================

	// + 3. View까지 호출이 완료되어, request에 대한 response가 전송완료된 직후
	// + (*주의*) 단, Controller의 Handler Method에서 예외가 발생하든 안하든, 무조건 호출된다.
	// + afterCompletion는 응답을 완전히 바꿔버릴 수도 있다.
	@Override
	public void afterCompletion(HttpServletRequest req, HttpServletResponse res, Object handler, Exception e)
			throws Exception {
		
		log.trace("afterCompletion(req, res, handler, e) invoked.");

	} // afterCompletion
	
	// =======================================================================================================

} // end class

 

[ 3 - 3. Servlet-context.xml 파일에 Bean으로 등록 ]

 

더보기

[ + 코드 보기 ]

<?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"
	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.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 -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- < resources mapping location >의 경우 파일을 생성하여 매핑할 수 있으며, 같은 location이여도 mapping을 추가할 수 있다. -->
	<!-- 아래의 태그로 인해 URL mapping처럼 http://localhost:8080/resources/파일명으로 접근이 가능하다. -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- [ 현재 버전 ] -->
	<!-- View Resolver -->
	<view-resolvers>
		<jsp prefix="/WEB-INF/views/" suffix=".jsp" />
	</view-resolvers>

	<!-- 파일 업로드 -->
	<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="defaultEncoding" value="utf8" />
		<!-- 최대 10mb까지 업로드 가능 -->
		<beans:property name="maxInMemorySize" value="10485760" />
		<beans:property name="maxUploadSize" value="10485760" />
		<!-- 파일 1개당 최대 사이즈는 2mb로 제한 -->
		<beans:property name="maxUploadSizePerFile" value="2097152" />
		<!-- 파일의 이름을 저장할지 지정 -->
		<beans:property name="preserveFilename" value="true" />
		<!-- 업로드할 정소 지정 -->
		<!-- 로컬에서는 경로를 file:///로 시작해야 한다. -->
		<!-- multipartResolver 빈에서는 임시폴더를 지정해야 하기에 Temp까지만 지정해 준다. -->
		<beans:property name="uploadTempDir" value="file:///C:/Temp/" />
	</beans:bean>

	<!-- 수동 등록 방법 -->
	<!-- <beans:bean id="sampleInterceptor" class="org.zerock.myapp.interceptior.SampleInterceptor" /> -->

	<!-- 인터셉터 등록 방법 (***) -->
	<interceptors>

		<interceptor>
			<!-- + path지정한 URI를 보고 가로채서, bean에서 지정한 인터셉터가 처리한다. (***) -->
			<!-- + path는 여러개 지정이 가능하다. ( 이렇게 되면 sampleInterceptor가 2개의 URI를 인터셉트하게 된다. -->
			<!-- + path="/sample/do*"와 같이 와일드 카드를 사용하여 지정해 줄 수도 있다. -->
			<mapping path="/sample/doA" />
			<mapping path="/sample/doB" />
			<mapping path="/sample/do*" />
			<beans:ref bean="sampleInterceptor" />
		</interceptor>

	</interceptors>

	<!-- base-package에 작성한 패키지 내에 있는 것을 빈으로 등록시킨다. -->
	<context:component-scan base-package="org.zerock.myapp.controller" />
	<context:component-scan base-package="org.zerock.myapp.exception" />
	<context:component-scan base-package="org.zerock.myapp.interceptor" />
	
</beans:beans>

 

 

 

728x90
댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항