본문 바로가기

개발/프로젝트

[스프링부트 게시판] 4. Http 요청

Http는 'HyperText Trransfer Protocol'의 약자입니다.

 

하이퍼텍스트(HTML) 문서를 교환하기 위해 만들어진 Protocol(통신 규약)이며 웹 상에서 통신할 때 형식을 정하여 통신을 하자는 약속입니다. 여기서 Http는 요청(Request)와 응답(Response)의 구조로 이루어져 있는데

 

Http 요청은 클라이언트가 서버에게, Http 응답은 서버가 클라이언트에게 받은 요청에 대해 응답하는 것입니다.

 

여기서 Http 요청에서 Http Method가 존재하는데 요청할 때 의도하는 행동을 정의하는 것입니다. 총 4가지가 있는데

 

  • get : 데이터를 받아오기 위함
  • post : 데이터를 추가하기 위함
  • put : 데이터를 변경하기 위함
  • delete : 데이터를 삭제하기 위함

위의 4가지 Http 요청에 대해 알아보도록 하겠습니다.


Controller를 만들어서 아래와 같이 구현을 했습니다.

 

HttpControllerTest

 

서버를 실행시키고 웹 브라우저에서 경로를 입력하여 확인하겠습니다.

 

Get
Post

get 요청을 정상적으로 나타나고 있지만, 나머지 post, put, delete 요청은 동작하지 않을 것입니다. 이유는 웹 브라우저에서는 get 요청만 할 수 있기 때문입니다. 위의 에러 페이지에서 'Method 'GET' is not supported'로 나타나 있는 이유가 get만 요청할 수 있는 것의 문제입니다.

 

나머지 요청을 테스트하기 위해 프로그램을 따로 마련해두겠습니다.

 

https://www.postman.com/downloads/

 

Download Postman | Get Started for Free

Try Postman for free! Join 20 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.

www.postman.com

 

해당 애플리케이션은 서버로 요청을 보낼 때 유용하게 테스트를 할 수 있는 앱으로 크롭 확장프로그램으로도 사용할 수 있지만 저는 설치형으로 준비했습니다.

 

설치형으로 회원가입 후 Http Request 확인 창!

Postman을 통해 다음과 같이 post 요청을 진행했습니다.

Post
Put
Delete

나머지 요청들도 위와 같이 카테고리를 제대로 변경 후, 주소 입력을 한다면 원하는 요청한 글이 확인 될 것입니다.

 


이번에는 실질적인 데이터를 통해 서버로부터 요청하거나 추가하는 작업을 테스트하려고 합니다.

 

1. GET

우선 데이터베이스가 있지만 임의로 클래스를 만들고 변수를 정의, 생성자와 Getter, Setter를 구현하겠습니다.

 

Member 엔티티

 

해당 Member라는 클래스에 아이디, 패스워드, 사용자이름, 이메일 변수를 추가하였습니다. 이후 Source -> Generate Constructor using Fields... / Generate Getter and Setter를 통해 생성할 수 있습니다.

생성자와 Getter, Setter 생성
생성 완료!

 

다음으로 HttpController Test 클래스로 돌아와 getTest()를 다음과 같이 변경해주었습니다.

 

HttpControllerTest

 

@RequestParam은 HttpServletRequest 객체에서 getParameter() 메소드를 통해 갖고오는 형식과 같습니다. 이는 URL에서 쿼리 스트링을 통해 데이터를 받아온 뒤, 해당 데이터를 출력하는 구문입니다. 따라서 서버에 요청을 할 때 다음과 같은 형식으로 요청할 수 있습니다.

 

Postman

 

기존의 URL뒤에 ?id=1이 추가가 되었는데 ?는 쿼리 스트링을 하기 위한 구분점이고 [Key값]=[Value값]으로 붙어집니다. id말고도 다른 데이터들을 추가 할 거면 id=1뒤에 &를 작성 후 [Key값]=[Value값]를 반복하시면 됩니다.

 

HttpControllerTest

 

Postman

 

위의 방법으로 각각의 데이터를 받아올 수도 있지만, 아래와 같이 만들어놓은 Member 객체를 통해 받아올 수도 있습니다.

 

HttpControllerTest

 

2. POST

이번에는 post 요청을 해보겠습니다. post는 데이터를 추가하기 위한 요청으로써 서버에서는 추가시킬 데이터를 받아와야 할 것입니다. 즉 다음과 같이 코드를 구현할 수 있습니다.

 

HttpControllerTest

 

단, Post 요청 시 Get 요청과 같이 쿼리 스트링을 통한 데이터 전송이 불가합니다.

 

post 요청은 데이터를 주소에 붙여 전송하는 것이 아닌, 'Body'라는 공간에 담아서 전송합니다. 이때 전송하는 방법으로는 크게 두 가지 방법이 있습니다.

 

첫 번째 방법은 'x-www-form-urlencoded' 방식으로 전송하는 방법으로 이는 html에서 <form> 태그를 통해 데이터를 요청하는 것과 동일한 방법입니다. 따라서 Postman 앱에서는 다음과 같이 데이터를 전송할 수 있습니다.

 

Postman

 

두 번째 방법은 'raw' 방식으로 전송하는 방법으로 이는 text 또는 JSON 형태로 데이터를 요청하는 방법입니다. Postman 앱에서는 다음과 같이 데이터를 전송할 수 있습니다.

 

HttpControllerTest

 

Postman

위 예제는 MIME 타입이 'text/plain'으로써 평문을 보낸 것입니다. 여기서 MIME 타입이란 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘으로써, 브라우저들이 리소스를 내려받았을 때 해야 할 기본 동작이 무엇인지를 결정하기 위해서 사용합니다.

 

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types

 

MIME 타입 - HTTP | MDN

MIME 타입이란 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘입니다: 웹에서 파일의 확장자는 별 의미가 없습니다. 그러므로, 각 문서와 함께 올바른 MIME 타입을 전송하도록,

developer.mozilla.org

 

이번에는 MIME 타입을 'application/json'으로 하여 JSON 데이터를 전송해보겠습니다.

 

서버 코드를 다음과 같이 수정한 뒤, Postman에서는 데이터를 JSON 형태로 전송해주었습니다.

 

HttpControllerTest
Postman

 

즉, 위의 결과로 알 수 있는 것은 스프링은 데이터가 전송되면 해당 데이터를 받아 자동적으로 그것을 해석하여 객체화하여 준다는 것입니다. 여기서 데이터를 해석하는 기능은 MessageConverter가 수행합니다. 위에서 테스트하였던 get 요청에서 쿼리 스트링으로 받아온 데이터를 매핑해주는 것 또한 MessageConverter가 수행한 것입니다.

 

위와 마찬가지로 put과 delete 요청 역시 동일한 방법으로 수행할 수 있을 것입니다.