HTTP 요청에 따른 결과물 반환

Spring은 백엔드 프레임워크로 많이 사용하게 된다. 때문에 API서버처럼 특정 요청이 들어오면 HTTP에 맞게, 클라이언트에게 반환을 해주어야 합니다.

여기서 스프링을 접하고 나서 모두 아는 단어들이지만, HTTP는 많이는 들어봤지만 어떤 의미인지 모르는 상황이었습니다.

HTTP는 어떤 것일까요?

 

HTTP 응답 요소의 많은 구성

HTTP는 HyperText Transport Protocol의 약자로 웹 통신을 위한 하나의 약속이라고 보면 됩니다.

REST하게 짜져 있으면, HTTP 규격에 맞춘 요청만 보더라도, 어떤 요청인지를 알 수 있다고 합니다. 

 

HTTP의 경우 응답, 요청 모두 크게 세 가지 요소로 나뉘어져 있습니다.

네이버를 접속했을 때의 예시를 먼저 보도록 하겠습니다.

 

먼저 요청입니다.

GET / HTTP/2
Host: www.naver.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: (중략)
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
TE: Trailers

 

첫줄에 Get / HTTP /2 는 HTTP StartLine이라고 합니다.

메소드 및 요청 주소 그리고 HTTP 버전으로 구성되어 있습니다.

 

두번째로는 HTTP Header입니다.

요청 사항 및 요청 보내는 사람의 부가적인 정보들이 들어 있습니다.

 

세번째로는 Body입니다.

요청에 있어서 POST나 PUT과 같은 정보들을 함께 넣어줄 때 쓰이게 되는데 header에서는 보이지 않지만,

보통은 json 형태로 브라우저에서 확인할 수가 있습니다.

 

두 번째로는 응답입니다.

 

HTTP/2 200 OK
server: NWS
date: Sun, 09 May 2021 18:14:40 GMT
content-type: text/html; charset=UTF-8
cache-control: no-cache, no-store, must-revalidate
pragma: no-cache
p3p: CP= 중략
x-frame-options: DENY
x-xss-protection: 1; mode=block
content-encoding: gzip
strict-transport-security: max-age=63072000; includeSubdomains
referrer-policy: unsafe-url
X-Firefox-Spdy: h2

첫 줄에 HTTP/2 200 OK는 HTTP StatusLine이라고 합니다.

방금 주었던 요청에 대한 상태가 저장되어 있습니다.

 

나머지 HTTP Header와 Body는 응답의 경우와 같은 맥락의 정보를 담고 있습니다.

 

응답의 경우에는 우리 백엔드 개발자들의 주 관심분야가 될 것 같습니다. 실제로 생성해서 반환을 해주어야하니까요.

하지만, 저것을 일일히 지정하는 것은 까다로운 일일 것 같습니다.

이것을 Spring-boot에서 쉽게 적용시켜주는 것이 바로, ResponseEntity입니다.

응답을 자동으로 만들어주는 ResponseEntity

ResponseEntity<T>는 제네릭 형식으로 외부에서 Body로 보낼 데이터 형식을 지정이 가능합니다.

@RestController의 Annotation이 붙은 부분에서 많이 사용이 됩니다.

간단한 ResponseEntity 샘플을 보고 가도록 하겠습니다.

public ResponseEntity<String> createResponse(final String sample) {
	return ResponseEntity.ok()
      .body(sample);
}

위의 형식들의 경우에는 "SampleString"이라는 내용을 Body안에 담으며, Status Code는 200, 즉 OK로 발송하겠다라는 내용을 담게 됩니다.

생성자보다는 Builder를

public ResponseEntity<String> createResponse(final String sample) {
	return ResponseEntity.ok()
      .body(sample);
}

생성자로 사용하는 것도 좋지만, 빌더로 사용하는 것을 추천드립니다.

그 이유는 Status Code인데요.

200, 204, 400 그렇게 차이가 크게 나지 않을 것만 같은 숫자 코드들도 제각각의 상태를 가지고 있습니다.

이 때문에 오류나 실수가 날 수 있는 생성자 패턴보다는

빌더로 직접 ok, bad reqeust, no content 등을 지정해줌으로써, 번호에 대해서 실수를 할 것을 막을 수가 있습니다.

+ Recent posts