HTTP Request 헤더를 읽어오는 여러가지 방법과 추가하는 방법에 대해 기록을 남겨보고자 한다.
커스텀 헤더 네이밍(Naming)
커스텀 헤더의 이름을 지을 때, 이 헤더를 사용하는 측에서 헤더의 목적을 쉽게 이용할 수 있도록 대시(-)를 기준으로 의미가 명확한 용어를 사용해야 한다. 대시(-)를 기준으로 각 단어의 첫 글자를 대문자로 작성하는 것이 관례이지만 Spring에서 Request 헤더 정보를 확인할 때, 대/소문자를 구분하지는 않는다.
HttpServletRequest와 HttpServletResponse는 저수준(Low Level)의 서블릿 API를 사용할 수 있기때문에 복잡한 HTTP Request/Response를 처리하는데 사용할 수 있다.
반면에 ResponseEntity나 HttpHeaders는 Spring에서 지원하는 고수준(High Level) API로써 간단한 HTTP Request/Response 처리를 빠르게 진행할 수 있다.
복잡한 처리가 아니라면 코드의 간결성이나 생산성 면에서 가급적 Spring에서 지원하는 고수준 API를 사용하길 권장한다.
@RestController
public class MemberController{
@PostMapping
public ResponseEntity headTest(@RequestHeader(HttpHeaders.USER_AGENT) String userAgent,
@RequestHeader Map<String,String> headers,
HttpServletRequest httpServletRequest,
HttpEntity httpEntity,
HttpServletResponse response) {
//@RequestHeader 활용하기
System.out.println("user-agent: " + userAgent);
for(Map.Entry<String,String> entry : headers.entrySet()){
System.out.println("key: " + entry.getKey() + "value: " + entry.getValue());
}
//HttpServletRequest 활용하기
System.out.println("user-agent: " + httpServletRequest.getHeader("user-agent"));
//HttpEntity 활용하기
for(Map.Entry<String, List<String>> entry : httpEntity.getHeaders().entrySet()){
System.out.println("key: " + entry.getKey() + "value: " + entry.getValue());
}
//HttpHeaders를 이용하여 커스텀헤더 추가
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Client-Geo-Location", "Korea,Seoul");
//HttpServletResponse를 이용하여 커스텀헤더 추가, 헤더 정보만 추가할 뿐 별도의 처리가 필요없음
response.addHeader("Client-Geo-Location", "Korea,Seoul");
//ResponseEntity를 이용하여 HttpHeaders 를 추가하여 반환함
return new ResponseEntity<>(new Member(email, name, phone), httpHeaders,
HttpStatus.CREATED);
}
}