본문 바로가기
Spring|Spring-boot

Spring MVC HTTP Header 처리와 Arguments, Return

by oncerun 2021. 12. 29.
반응형

웹 요청을 처리할 때 HTTP Header에 대한 정보가 필요한 경우

Servlet을 통해 Header를 받는 방법은 알고 있지만 Spring MVC가 편리한 방법을 제공해주기 때문에 오늘은 Header정보를 편하게 받는 방법을 알아보자.

 

 

Spring MVC도 서블릿을 활용하기 때문에 WAS가 생성해서 넘겨주는 HttpServletRequest와 HttpServletResponse를 활용할 수 있다.

 

    @RequestMapping("/headers-servlet")
    public String servletHeaders(HttpServletRequest request,
                          HttpServletResponse response){
                          
        String header1 = request.getHeader("host");

        log.info("header name 지정하여 값 받기 : {}", header1);
        request.getHeaderNames().asIterator()
                .forEachRemaining( header -> log.info( "headers 순환하여 받기 \n header name = {} , value = {}", header, request.getHeader(header)));

        request.getHeaders("myHeader").asIterator()
                .forEachRemaining( accLang -> log.info( "하나의 헤더이름으로 여러 개의 값이 있는 경우 : {}", accLang));

        return "ok";

    }

 

Header의 설정은 PostMan을 이용했다.

결과는 다음과 같다.

 

이와 반면에 Spring MVC는 어노테이션과, MultivalueMap을 통해 header를 쉽게 받을 수 있도록 지원해준다.

    @RequestMapping("/headers")
    public String headers(HttpServletRequest request,
                          HttpServletResponse response,
                          HttpMethod httpMethod,
                          Locale locale,
                          @RequestHeader MultiValueMap<String, String> headerMap,
                          @RequestHeader("host") String host,
                          @CookieValue(value = "myCookie", required = false) String cookie){
        log.info("request={}", request);
        log.info("response={}", response);
        log.info("httpMethod={}", httpMethod);
        log.info("locale={}", locale);  // localResolver가 있기 때문에 활용가능.
        log.info("headerMap={}", headerMap);
        log.info("header host={}", host);
        log.info("myCookie={}", cookie);
        return "ok";

    }

 

여기서 알아볼 것은 MultiValueMap이다.

 

MultiValueMap은 header값을 Map 형태로 활용할 수 있도록 파싱 해준 다점 이외에 헤더의 값이 여러 개 있는 것 또한 배열로 만들어주어 접근할 수 있다.

 

Map은 Key에 Value가 1:1매칭이 되는 것을 좋은 케이스라 할 수 있지만 해시 충돌이 일어나는 경우 대처하는 여러 가지 방안 중 하나로 동일 Key 값에 대한 값을 링크드 리스트로 연결하여 접근할 수 있도록 하는 방법이 있는데,  그 방법을 구현한 구현체일 듯 싶다.

 

 

headerMap={accept-language=[ko-KR, ko;q=0.9, en-US;q=0.8, en;q=0.7], 

 

myheader=[1, 2], 
포스트맨 설정에 보면 myheader를 두 개를 보내는 것을 확인할 수 있으며, 중복되는 헤더의 값들을 배열에 push 하는 것을 확인할 수 있다.

content-type=[application/json], 

user-agent=[PostmanRuntime/7.28.0], 

accept=[*/*], 

postman-token=[5 da9 b061-da98-4ec5-82da-94 a 55 ccc6192], 

host=[localhost:8080], 

accept-encoding=[gzip, deflate, br], 

connection=[keep-alive], 

content-length=[147]}

 

Web on Servlet Stack (spring.io)

 

Web on Servlet Stack

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more com

docs.spring.io

위 링크에서 Spring MVC에서 agument로 받을 수 있는 구현체들 혹은 그 밑으로 조금 내리다 보면 return 할 수 있는 종류들과 자세한 설명이 나와있다. 

 

앞으로 해당 링크를 자주 사용할 것 같은데, 해당 유형의 데이터를 어떻게 받으면 더 깔끔할지를 고민할 때 한 번쯤 참고할만한 링크가 아닌가 싶다. 공식문서를 전부 읽는 것은 부담이 되지만 필요할 때 찾아서 읽는 습관은 일을 편하게 도와줄 수 있기 때문이다.!! 

 

 

 

-- 야근해서 피곤쓰

반응형

'Spring|Spring-boot' 카테고리의 다른 글

Spring Web Validation (1)  (0) 2022.01.08
Spring 메시지, 국제화  (0) 2022.01.06
뷰 리졸버  (0) 2021.12.25
핸들러 매핑과 핸들러 어댑터  (0) 2021.12.25
싱글톤과 함께 사용하는 프로토타입 문제점  (0) 2021.12.18

댓글