IT 공부/새로운 시작

HTTP(9) - 클라이언트에서 서버로 데이터를 전송하는 케이스

수박한암살자 2021. 10. 27. 22:49

클라이언트에서 서버로 데이터를 전송할 때에 대해서 상세하게 알아보자.

우선 데이터를 전달하는 방식은 두 가지가 있다.

 

1. 쿼리 파라미터

- GET 메서드에서 많이 쓰인다.

- 주로 정렬 필터(검색어) 파라미터를 보낼 때 많이 쓰이곤 한다.

 

2. 메시지 바디

- POST, PUT, PATCH에서 많이 쓰인다.

- 회원 가입, 상품 주문, 글 수정 등에서 많이 쓰인다.

 

그렇다면 어떤 상황일 때 데이터를 전송하게 될까?

 

1. 정적 데이터 조회

- 쿼리 파라미터 미사용

- 이미지나 정적 텍스트 문서 조회

- 주로 GET 사용

 

2. 동적 데이터 조회

- 쿼리 파라미터 사용

- 주로 검색, 게시판 정렬 등에서 사용

- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 사용

- 주로 GET 사용

 

3. HTML Form 사용

다소 느낌이 다른 사용 방식이다.

기본적으로 아래와 같은 형태의 HTML Form에서 사용하게 된다.

<form action="/save" method="post">
	<input type="text" name="username" />
	<input type="text" name="age" />
	<button type="submit">전송</button>
</form>

 

여기서 button을 누르면 브라우저에서 HTTP 요청 메시지를 만들게 된다.

POST /save HTTP/1.1 Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

username=kim&age=20 

자세히 보면 form 내의 action, method, input 내의 name 프로퍼티 등 데이터를 읽어서 HTTP 메시지를 만드는 것을 볼 수 있다.

예제는 username과 age를 저장하는 용도로 POST가 쓰였지만

GET 메서드로도 사용 가능하며 GET으로 할 경우에는 적절한 URL을 조합하여 조회하는 형태가 될 것이다.

 

여기에 더하여 파일 업로드와 같은 바이너리 데이터 전송 시에도 사용 가능하다.

<form action="/save" method="post" enctype="multipart/form-data">
	<input type="text" name="username" />
	<input type="text" name="age" />
	<input type="file" name="file1" />
	<button type="submit">전송</button>
</form>

이 경우에 만들어진 HTTP 요청 메시지는 아래와 같다.

POST /save HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=-----XXX
Content-Length: 10457

------XXX
Content-Disposition: form-data; name="username"

kim
------XXX Content-Disposition: form-data; name="age"

20
------XXX Content-Disposition: form-data; name="file1"; filename="intro.png"
Content-Type: image/png

109238a9o0p3eqwokjasd09ou3oirjwoe9u34ouief...
------XXX--  <!-- 맨 끝에는 --가 추가 된다. -->

 

HTTP 요청 메시지 두 개를 보면 Content-Type을 강조 했는데 이에 대해서도 간단하게 알아보도록 하자.

 

Content-Type: application/x-www-form-urlencoded

- form의 내용을 메시지 바디를 통해 전송(key=value, 쿼리 파라미터 형식)

- 전송 데이터를 url encoding 처리

 

Content-Type: multipart/form-data

- 파일 업로드와 같은 바이너리 데이터 전송에 사용

- 다른 종류의 파일들과 함께 전송 가능 (그래서 multipart라는 단어가 들어감)

 

4. HTTP API 데이터 전송

개발을 하다보면 많이 보게 되는 방식이다. 우리가 직접 만들어서 전송하게 된다.

이 케이스 내에서도 여러 케이스로 갈리게 된다.

 

1) 서버 to 서버 - 백엔드 시스템끼리의 통신

2) 앱 클라이언트에서 서버로 전송

3) 웹 클라이언트에서 서버로 전송

- 이 방식의 경우, JavaScript 등을 통해 통신에 사용하는 방식을 많이들 짜봤을 것이라 생각한다. 대표적으로 ajax가 있다.

 

POST, PUT, PATCH 사용 시 메시지 바디를 이용하고,

GET 사용 시 쿼리 파라미터로 데이터를 전송하게 되는 것은 다른 케이스들과 거의 동일하다.

 

참고로 Content-Type 헤더는 주로 application/json을 사용한다.

 

 

반응형