본문 바로가기

JAVA/Spring

http의 요청방법과 통신방식, header와 body

HTTP 1.1 (GET, POST, PUT, DELETE)

기본적으로 통신을 위해서는 두 개의 대상에 스트림이 연결되어야 한다.

여기서 연결되는 스트림은 바이트스트림이라고 해서 이 선에 파일 비트가 왔다갔다하며 통신을 한다.

서로 두 개의 스트림으로 연결되어 하나는 write, 하나는 read를 하는데 이것이 일반적인 통신의 방법이다.

 

요청은 항상 클라이언트가 하며, 응답은 서버가 한다. http 통신은 데이터를 가지고 있는 서버(갑) 입장에서는 데이터를 요청하는 클라이언트(을)이 궁금하지 않고, 클라이언트가 서버에게 데이터를 요청하면서 서버가 응답을 하는데 이 때 클라이언트가 요청하는 약속된 방법이 get, post, put, delete이다.

 

1. GET 요청

-데이터를 줘(데이터를 요청)

-데이터베이스의 SELECT와 비슷한 기능

-인터넷 브라우저의 URL로 요청 가능

 

2. POST 요청

-데이터를 추가해줘(데이터를 추가)

-데이터베이스의 INSERT와 비슷한 기능

 

3. PUT 요청

-데이터를 수정해줘(데이터를 수정)

-데이터베이스의 UPDATE와 비슷한 기능

 

4. DELETE 요청

-데이터를 삭제해줘(데이터를 삭제)

-데이터베이스의 DELETE와 비슷한 기능

//사용자가 요청할때 html 파일을 응답 -> @Controller 
//사용자가 요청할때 그에 대한 데이터 응답 -> @RestController
@RestController
public class HttpControllerTest {

	//인터넷 브라우저 요청은 get 요청만 가능하다
	//http://localhost:8080/http/get (select)
	@GetMapping("/http/get")
	public String getTest(){
		return "get 요청";
	}

	//http://localhost:8080/http/post (insert)
	@PostMapping("/http/post")
	public String postTest(){
		return "post 요청";
	}

	//http://localhost:8080/http/put (update)
	@PutMapping("/http/put")
	public String putTest(){
		return "put 요청";
	}

	//http://localhost:8080/http/delete (delete)
	@DeleteMapping("/http/delete")
	public String deleteTest(){
		return "delete 요청";
	}
}

인터넷 브라우저 요청은 GET 요청만 가능하다

브라우저에 주소를 입력했을 때 GET요청은 가능하지만 POST, PUT, DELETE 요청은 불가능하다.

개발자도구 F12 -> HEADER에서 확인해보면 GET은 200으로 성공, POST는 405로 해당 메소드가 허용되지 않음

 

POST, PUT, DELETE 요청은 포스트맨과 같은 프로그램을 사용하여 확인할 수 있다

데이터를 요청할 때 어떤 데이터를 말하는 것인지 알려면?

요청 뒤에 ?로 데이터에 대한 정보를 입력한다.

ex)

  • 사과 데이터를 요청: get?사과
  • 포도 데이터를 수정: put?포도
  • 마늘 데이터를 추가: post?마늘
  • id가 1인 데이터 요청

 

stateless 방식 : http는 stateless 통신방식을 사용한다.

소켓통신이란 포트통신을 말한다.

두 개의 포트가 스트림으로 연결이 되어서 통신이 되는데

만약 데이터를 주고받으면서 연결된 스트림이 계속 연결되어 있고, 다른 포트가 데이터를 요청할 때마다 다른 스트림이 연결되어 한쪽 포트에 여러개의 스트림이 연결되게 된다면 해당 포트는 바쁘고 힘들어질 것이다.

http 통신은 데이터를 응답하면 바로 연결을 끊어서 스트림이 계속 연결되어있지 않게 하는데 이것이 stateless 방식이다. 요청시마다 선을 연결해서 데이터를 주고 받는 방식이 stateless 방식이며 http통신에서 사용하고, 서버 입장에서는 부하가 줄어든다.

 

데이터의 응답이 끝나도 계속 스트림이 연결되어 있는 통신방식은 stateful 방식인데 채팅과 같은 프로그램에서 사용하며, 연결이 지속되어 있다. 서버의 부하가 커지지만 예전에 연결된 포트를 계속 기억하고 있기 때문에(세션이 만들어져 있기 때문에) 인증이 필요없다. 항상 데이터에 응답할 준비가 되어있는 것이다.

반대로 stateless 방식은 한번 인증을 해도 바로 연결이 끊어지기 때문에 세션 유지가 어렵고, 새로운 요청이 들어오면 새로운 인증이 필요해진다. stateless 방식은 세션을 유지하는 방법이 중요해진다.

 

http header와 body, mime 타입

클라이언트가 서버에게 어떤 데이터를 요청할 땐 어떤 데이터인지 해당 데이터의 정보를 담아서 보내야 하는데 그 정보는 헤더와 바디라는 곳에 달고 간다.

예를 들어 사진 정보라면 헤더에는 Image/JPEG와 같은 파일정보(데이터를 설명해주는 내용), 바디에는 실제 이미지(실제 데이터)가 들어가는 것이다. 헤더는 데이터의 조립을 위해 필요하다.

 

http 통신은 패킷 스위칭 방식을 사용하는데, 

서킷 스위칭 방식은 데이터를 보낼 때 한번에 실어서 보내는 것이고, 속도가 빠르지만 추가적으로 데이터를 보내고 싶으면 선을 계속 추가적으로 연결해야 하는 단점이 있다(비용 증가)

패킷 스위칭 방식은 데이터를 한번에 보내지 않고 쪼개서 하나씩 전송하는데 이렇게 쪼개진 정보를 패킷이라고 하며,

추가적으로 데이터를 보낼 때 하나의 선을 공유하여 패킷을 하나씩 올리게 되는데,

이러면 데이터가 섞여서 전송이 되게 되고 받는 입장에서는 섞인 데이터를 받아 조립(분류)를 하게 된다.

이러한 조립을 위해 모든 패킷에는 데이터의 순서정보, 데이터를 보낸 자의 정보가 담겨 있는 헤더가 붙어서 전송된다.

실제 데이터는 바디이며, 데이터를 전송할때 조립을 위하여 헤더가 필요해지는 것이다.

 

내가 보내는 바디(실제 데이터)의 데이터의 종류 또한 헤더에 적어서 보내게 되는데, 데이터의 종류를 적는 방식은 mime 타입이다. 수많은 mime타입들이 존재하며 type/subtype으로 나뉘어져 있다. 예를 들면 text/plain, text/html, image/jpeg, image/png와 같은 형식이다.

이미 형식들은 정의가 되어있으며, 보내야할 데이터가 정해지면 홈페이지 같은 곳에서 확인해서 그대로 보내면 된다.

ex) .acc 데이터를 보내고 싶으면 audio/aac 라고 mime타입을 입력

 

 

 

 

 

 

본 강의는 '메타코딩'님의 동영상 강의를 참고하였습니다.

출처 : https://www.youtube.com/playlist?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm

'JAVA > Spring' 카테고리의 다른 글

Maven과 라이브러리/Builder 패턴/yaml 설정  (0) 2022.02.17
포스트맨 실습 : 데이터 요청하기  (0) 2022.02.17
프로젝트 만들기  (0) 2022.02.17
[스프링] 패키지 이름, UTF-8  (0) 2022.02.17
스프링 컨테이너  (0) 2022.01.08