티스토리 뷰
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
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 124일차 - Spring ( 인터셉터 - 세션 트레킹 : 로그인 / 로그아웃 / 인증 / 인가 / 자동 로그인 기능 ) (*********) (0) | 2022.08.24 |
---|---|
KH 123일차 - Spring ( 인터셉터 ) (***) (0) | 2022.08.24 |
KH 121일차 - Spring ( Restful 방식 ) (****) (0) | 2022.08.19 |
KH 120일차 - Spring ( 페이징 처리 ) (******) (0) | 2022.08.18 |
KH 119일차 - Spring ( Oracle 힌트 / 게시판 만들기 / 페이징 처리 ) (*******) (0) | 2022.08.17 |
댓글