티스토리 뷰

반응형

(참고: 단순히 HTTP 요청 데이터의 매커니즘을 파악하기 위한 글로써 Servlet을 기준으로 작성되었다)

 

클라이언트(사용자)가 HTTP 요청 메시지를 통해 서버에 데이터를 전송하는 방법을 정리해보고자 한다

데이터를 전송하는 방법은 3가지의 방식으로 나뉘며

이 3가지 방식으로 클라이언트가 보내는 모든 요청 데이터를 받을 수 있다

 

쿼리 파라미터 (HTTP GET)

MessageBody가 아닌 URL의 쿼리 파라미터에 데이터를 포함해서 전달하는 방식이다

검색, 필터, 페이징 등에서 많이 사용되는 방식이며 클라이언트에게 직접적으로 노출이 되기 때문에 민감한 정보는 제외해야 한다

또한 쿼리파라미터의 경우 message body가 아닌 url을 통하여 데이터를 전송하기 때문에 content-type이 없다

HTTP의 GET 방식을 사용하여 전송하는 쿼리 파라미터는 '?' 을 시작으로 보낼 수 있다

key = value 형식으로 구성되게 되며 ' & ' 를 사용하여 추가 파라미터를 구분할 수 있다

 

만약 이 키 값을 중복으로 보내게 되면 우선권은 앞에 있는 쿼리 파라미터가 가져가게 된다

(중복으로 사용하는 경우는 거의 없다고 한다)

 

Form (HTTP POST)

주로 회원 가입이나 상품 주문 등에서 사용하는 Form 방식은 HTML의 Form을 활용하여 서버로 데이터를 전송하는 방식이다

<form action="/request-param" method="post">
	username: <input type="text" name="username" /> 
	age: <input type="text" name="age" /> 
	<button type="submit">전송</button>
</form>

//전송 예시
username=kim&age=20

쿼리 파라미터와 같이 key = value의 형식으로 message body에 전송하게 된다

POST의 HTMl Form을 전송하면 웹 브라우저는 다음의 형식으로 HTTP 메시지를 만들게 된다

content-type : application/x-www.form-urlencoded //메시지 바디의 데이터 형식을 지정
message body : username=kim&age=20

 

Message Body

위에서 살펴 본 쿼리 파라미터나 form의 형식이 아니라

HTTP Message Body에 데이터 자체를 넣어서 보낼 수도 있다

content-type : text/plain
message body : hello

//출력 예시
System.out.println("messageBody = " + messageBody);
message body = hello

하지만 이렇게 메시지 바디에 날것의 데이터를 전송하는 경우는 없을 것이다

보통 JSON , XML 같은 데이터 포맷을 사용하는데

최근에는 JSON이 사실상 표준이 되어 JSON을 사용하면 된다

 

JSON

쿼리파라미터나 form처럼 key=value의 형식으로 데이터를 전송했듯이

JSON 또한 데이터 포맷으로써 JSON 형식으로 데이터를 포맷하여 서버에 전송하게 된다

content-type : application/json
message body : {"username" : "kim" , "age" : 20}

//출력 예시
System.out.println("messageBody = " + messageBody);
messageBody = {"username" : "kim" , "age" : 20}

여기서의 핵심은 결국 JSON 또한 데이터 포맷일 뿐이라 위의 예시 같은 형식으로 데이터를 보낼 뿐이지

결국엔 텍스트로 서버에 전송이 된다는 것이다

하지만 JSON의 라이브러리를 사용하면 이 텍스트를 객체처럼 활용할 수 있다는 것이 바로 JSON의 장점이다

이러한 장점을 활용하여 주로 HTTP API에서 데이터를 주고받을 때 사용한다

 

JSON parsing(변환)을 위해 객체를 하나 생성하였다

@Getter @Setter
public class JsonData {
	
    private String username;
    private int age;
    
}

JSON의 라이브러리인 jackson을 활용하여 메시지 바디에 JSON 형식으로 온 데이터를 JsonData 형식으로 출력하게 되면

@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
	
    // JSON 라이브러리인 jackson으로 객체 선언
	private ObjectMapper objectMapper = new ObjectMapper();

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
    
    //Servlet의 inputStream으로 messageBody를 받아올 수 있다
    ServletInputStream inputStream = request.getInputStream();
    String messageBody = StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8);
    
    //readvalue를 사용하여 메시지 바디를 어떠한 형태의 객체에 담을지 작성
    JsonData jsonData = objectMapper.readValue(messageBody, JsonData.class);
    
    System.out.println("jsonData.username = " + jsonData.getUsername());
    System.out.println("jsonData.age = " + jsonData.getAge());
    
    }
}

//출력 예시
jsonData.getUsername() = kim
jsonData.getAge() = 20

객체를 통하여 Json 데이터 포맷으로 전송받은 메시지바디안의 데이터가 출력이 되는 것을 확인할 수 있었다

 

핵심정리

클라이언트가 서버에 요청 데이터를 보내는 방법은 3가지로 나뉜다

1. HTTP GET을 활용한 쿼리파라미터를 URL을 통해 전송

주로 검색, 필터, 페이징 등에서 사용한다

 

2.HTTP POST를 활용한 HTML Form을 메시지 바디에 담아 전송

주로 회원 가입, 상품 주문 등에서 사용한다

 

3. 메시지 바디에 JSON 데이터 포맷으로 담아 전송

주로 HTTP API에 사용한다

 

이렇게 세가지의 방식이면 모든 요청 데이터를 서버에서 전송받을 수 있다

 

더보기

개인 학습을 위해 작성되는 글입니다.

제가 잘못 알고 있는 점에 대한 지적 / 더 나은 방향에 대한 댓글을 환영합니다.

 

참조 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

https://ko.wikipedia.org/wiki/JSON

 

반응형

'WEB > HTTP' 카테고리의 다른 글

[HTTP-Servlet] Response Data (응답 데이터)  (0) 2021.08.20
[HTTP] HTTP 상태코드  (0) 2021.08.02
[HTTP] 쿠키와 세션 그리고 캐시(2)  (0) 2021.08.01
[HTTP] 쿠키와 세션 그리고 캐시(1)  (0) 2021.08.01
[HTTP] Header(헤더)  (0) 2021.08.01
댓글