- @참고 : https://www.baeldung.com/spring-response-header
1. 개관
이 빠른 튜토리얼에서, 비 반응형 엔드포인트 또는 스프링 5 WebFlux 프레임워크를 사용하는 API를 위한 서비스 응답에 헤더를 설정하는 다양한 방법을 살펴 볼 것이다.
이전 포스트에서 이 프레임워크에 대해 더 많은 정보를 찾을 수 있다.
2. 논-리액티브 구성 요소의 헤더
하나의 응답에 대해 헤더를 설정하는 걸 원한다면 HttpServletResponse 또는 ResponseEntity 오브젝트를 사용 할 수 있다. 반면에, 우리의 목표가 전체 또는 다수의 응답에 필터를 추가하는 것이라면, 필터를 구성해야 한다.
2.1. HttpServletResponse 사용
단순히 HttpServletResponse 객체를 REST 엔드포인트에 인수로 추가한 다음, addHeader() 메소드를 사용하면 된다.
@GetMapping("/http-servlet-response")
public String usingHttpServletResponse(HttpServletResponse response) {
response.addHeader("Baeldung-Example-Header", "Value-HttpServletResponse");
return "Response with header using HttpServletResponse";
}
예제에 보이는 것처럼, 응답 객체를 반환 할 필요는 없다.
2.2. ResponseEntity 사용
이 경우에, ResponseEntity 클래스에 의해 제공되는 BodyBuilder를 사용하자.
@GetMapping("/response-entity-builder-with-http-headers")
public ResponseEntity<String> usingResponseEntityBuilderAndHttpHeaders() {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("Baeldung-Example-Header", "Value-ResponseEntityBuilderWithHttpHeaders");
return ResponseEntity.ok()
.headers(responseHeaders)
.body("Response with header using ResponseEntity");
}
HttpHeaders 클래스는 가장 일반적인 헤더를 설정하기 위한 많은 편리한 메소드를 많이 제공한다. GitHub repo에 이러한 요점을 보여주는 더 많은 예제를 볼 수 있다.
2.3. 모든 응답에 헤더 추가
이제 많은 엔드포인트에 특정 헤더를 설정하려고 한다고 생각해보자.
물론, 이전 코드를 각각의 매핑 메소드에 복제해야 한다면 실망스러울 것이다.
이를 달성하기 위한 더 좋은 방법은 서비스에 필터를 구성하는 것이다.
@WebFilter("/filter-response-header/*")
public class AddResponseHeaderFilter implement Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setHeader("Baeldung-Example-Filter-Header", "Value-Filter");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// ...
}
@Override
public void destroy() {
// ...
}
}
@WebFilter 어노테이션은 이 필터가 적용될 url패턴을 나타내는 수 있게 한다.
아래와 같이 필터를 스프링이 검색 할 수 있게 하려면 스프링 어플리케이션 클래스에 @ServletComponentScan 어노테이션을 추가해야 한다.
@ServletComponentScan
@SpringBootApplication
public class ResponseHeadersApplication {
public static void main(String[] args) {
SpringApplication.run(ResponseHeaderApplication.class, args);
}
}
@WebFilter에 의해 제공되는 기능이 필요하지 않다면 필터 클래스에서 @Component 어노테이션을 사용해 이 마지막 단계를 피할 수 있다.
3. 반응형 엔드포인트를 위한 헤더
다시, ServletHttpResponse, ResponseEntity 또는 ServerResponse(기능적 엔드포인트의 경우) 클래스 및 인터페이스를 사용하여 단일 엔드포인트 응답에 헤더를 어떻게 설정하는지 볼 것이다.
모든 응답에 헤더를 추가하기 위해 스프링 5 WebFilter를 어떻게 구현하는지 배울 것이다.
3.1. ServerHttpResponse 사용
이 접근법은 HttpServletResponse 부분과 상당히 비슷하다.
@GetMapping("/server-http-response")
public Mono<String> usingServerHttpResponse(ServerHttpResponse response) {
response.getHeader().add("Baeldung-Example-Header", "Value-ServerHttpResponse");
return Mono.just("Response with header using ServerHttpResponse");
}
3.2. ResponseEntity 사용
비 반응형 엔트포인트와 마찬가지로 ResponseEntity 클래스를 사용할 수 있다.
@GetMapping("/server-http-response")
public Mono<ResponseEntity<String>> usingResponseEntityBuilder() {
String responseHeaderKey = "Baeldung-Example-Header";
String responseHeaderValue = "Value-ResponseEntityBuilder";
String responseBody = "Response with header using ResponseEntity (builder)";
return Mono.just(ResponseEntity.ok()
.header(responseHeaderKey, responseHeaderValue)
.body(responseBody));
}
3.3. ServerResponse 사용
마지막 두 하위 섹션에 소개된 클래스와 인터페이스는 @Controller가 달린 클래스에서 사용될 수 있으나 새로운 스프링 5 기능적 웹 프레임워크에는 적합하지 않다.
HandlerFunction에 대한 헤더를 설정하고 싶다면 ServerResponse 인터페이스에 손을 대야 한다.
public Mono<ServerResonse> userHandler(final ServerRequest request) {
return ServerResponse.ok()
.header("Baeldung-Example-Header", "Value-Handler")
.body(Mono.just("Response with header using Handler"), String.class);
}
3.4. 모든 응답에 헤더를 추가
마지막으로, 스프링 5는 서비스가 검색한 모든 응답에 헤더를 설정하는 WebFilter 인터페이스를 제공한다.
@Component
public class AddResponseHeaderWebFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
exchange.getResponse()
.getHeaders()
.add("Baeldung-Example-Filter-Header", "Value-Filter");
return chain.filter(exchange);
}
}
4. 결론
결론적으로, 응답에 헤더를 설정하는 다양한 다른 방법을 배웠고, 또한 단일 엔드포인트에 설정하길 원하거나 모든 rest API를 구성하길 원하면, 반응형 스택에 마이그레이션하더라도, 이제 우리는 그 모든 것을 할 지식을 갖고 있다.
항상 그래왔듯, 비 반응형과 스프링 5 명세 기능을 사용한 것 둘 다 모든 예제는 깃헙 저장소에 있다.
'Spring' 카테고리의 다른 글
[Spring] @Configuration @Bean vs @Component (0) | 2021.12.14 |
---|---|
[Spring] 스프링 프레임워크 실행 순서 (0) | 2021.01.15 |
Spring MVC Swagger(스웨거) 샘플 프로젝트 만들기 (0) | 2020.06.17 |
[Spring-MVC JUnit Test Error] No qualifying bean of type [javax.servlet.ServletContext] found for dependency.. (0) | 2020.06.17 |
Spring MessageSource 튜토리얼 (0) | 2019.12.20 |