본문 바로가기
개발자 준비/RestAPI

[restAPI] 응답 헤더 다루기

by osul_world 2022. 1. 20.
728x90

[restAPI] 응답 헤더 다루기


restAPI를 개발하다보면 클라이언트로부터 온 요청에대한 응답을 처리할때 HTTP body에 json 등의 데이터만 담아주는게 아니라

response HTTP header에 다양한 속성을 다뤄주거나 그 응답에 맞는 상태코드들도 함께 내려줘야한다.

상태 코드는 다음에 다루겠다. 오늘은 헤더 컨트롤만!

 

Spring boot는 이런 기능을 손쉽게 할수있도록 여러 기능을 제공한다

ServletHttpResponse 같은건 서블릿이라고 할수도있겠다.

Spring boot는 Spring의 기능을 더 간편화 한것이기때문에 Spring에서도 일치한다.

 

응답 HTTP 헤더를 설정하는 방법

 

단일 응답에 헤더를 설정하려면 HttpServletResponse 또는 ResponseEntity 객체를 사용할 수 있다.

 

꼭 한정되는것은 아니지만 보통 @RestController , @ResponseBody 환경에서 헤더를 설정한다.

해당 서버는 RestAPI이기 때문에 프론트엔드 작업은 분리되어 있을것이다.

 

HttpServletResponse 사용

HttpServletResponse 객체를 인수로 추가 한 다음 addHeader() 메서드를 사용하기만 하면 된다.

@ResposeBody
@GetMapping("/http-servlet-response")
public String usingHttpServletResponse(HttpServletResponse response) { //!
    
    response.addHeader("Baeldung-Example-Header", "Value-HttpServletResponse"); //!
    
    return "Response with header using HttpServletResponse";
}

return이 없어도 상관없다. 저기 return부분은 HTTP body에 들어갈 json이기 때문

HttpMessageConveter

 

ResponseEntity 사용

@GetMapping("/response-entity-builder-with-http-headers")
public ResponseEntity<String> usingResponseEntityBuilderAndHttpHeaders() {
    
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("Baeldung-Example-Header", 
      "Value-ResponseEntityBuilderWithHttpHeaders");

    //빌더를 이용해 response HTTP를 구축
    return ResponseEntity.ok()
      .headers(responseHeaders)
      .body("Response with header using ResponseEntity");
}

ResponseEntity에 관한 자세한 내용은 다른 포스트에 다룬바있다.

 

모든 응답에 대한 헤더 추가

지금도 개발을 하면서 느끼지만 매번 이 헤더설정들을 메서드마다 따로 작성해야 한다는 불편함이 있다.

메서드화 한다던지 AOP를 통해 해결할수있을것같은 느낌은 있어서 나중에 프로젝트 보수작업때 도전해볼예정이다.

 

일부 전역적인 헤더 설정을 적용할수있는 경우 내가 참고한 자료에서는 Filter를 이용하면 된다고 한다.

@WebFilter("/filter-response-header/*")
public class AddResponseHeaderFilter implements 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() {
        // ...
    }
}

필터가 적용되서 사용자 요청을 차단하는 순간 응답 헤더를 적용하면 전역적인 헤더 설정이 가능할것이다.

 

Reference


https://www.baeldung.com/spring-response-header

728x90