[ํ๋ก์ ํธ] ํฌ์คํธ๋งจ(Postman)์ผ๋ก REST API ์ค๊ณํ๊ธฐ
API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์, API์์ ๋์ ์์ฒญ๋๋ก ์ ๋๋ก ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋์ง ๋จผ์ ํ์ธ์ ํด๋ณผ ํ์๊ฐ ์๋ค. ์ค๋์ ์ด ๊ณผ์ ์ ์์ฃผ ์ ์ฉํ Postman์ด๋ผ๋ ํ๋ซํผ์ ๋ํด ์์๋ณธ๋ค.
์ฉ์ด์ ๊ฐ๋
ํฌ์คํธ๋งจ์ด๋?
Postman (www.postman.com)
Postman API Platform | Sign Up for Free
Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.
www.postman.com
ํฌ์คํธ๋งจ(Postman)์ ํธ๋ฆฌํ REST API ์ค๊ณ, ๊ฐ๋ฐ, ํ ์คํ ๊ธฐ๋ฅ์ ํด(Tool)๋ก ์ ๊ณตํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์ ํ์ฌ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋์ฌ์ฃผ๋ ํ๋ซํผ์ด๋ค. API ํ ์คํธ๋ฟ๋ง ์๋๋ผ Collection Sync, API Monitoring ๋ฑ ํ์๋ค์ด ํ์ ํ๋๋ฐ ๋์์ ์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ํด์ด ์๋ ํ๋ซํผ์ด๋ค.
* Postman์ ๊ฐ์ธ ์ฌ์ฉ ๋ชฉ์ ์ธ ๊ฒฝ์ฐ๋ ๋ฌด๋ฃ, ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ จ Collection Sync, API ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ๋ค์ ์ ๋ฃ ์๋น์คโ
RESP API๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ ์๋ฒ์์ API ์ธ์ฆ๊ณผ ๋์์ ๋จผ์ ํ์ธ ํ ํ์ด์ฌ(Python), ์๋ฐ(Java), NodeJS, PHP ๋ฑ์ ์ธ์ด๋ก ์์ค ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด๋ฌํ ๋ชฉ์ ์ผ๋ก ์ ํต์ ์ธ curl์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ต์ ์ผ๋ก API๋ฅผ ํ ์คํธํ ์ ์์ง๋ง, ์ปค๋ฉ๋ ๋ผ์ธ(Command Line) ๊ธฐ๋ฐ์ ํด์ด๊ธฐ ๋๋ฌธ์ ๋ง์ 'ํ์ดํ'์ด ํ์ํ๋ค๋ ๊ฒ์ด ๋จ์ ์ด๋ค. ๊ทธ๋ ์ง๋ง Postman์ ์ด์ฉํ๋ฉด ํธํ๊ฒ API๋ฅผ ํ ์คํธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ง์ด ์ฌ์ฉ๋๋ค.
CURL
Client URL
ํด๋ผ์ด์ธํธ์์ ์ปค๋งจ๋ ๋ผ์ธ์ด๋ ์์ค์ฝ๋๋ก ์ ์ฝ๊ฒ ์น ๋ธ๋ผ์ฐ์ ์ฒ๋ผ ํ๋ํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ์ (์ปค๋งจ๋๋ผ์ธ Tool ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ด๋ค. ์๋ฒ์ ํต์ ํ ์ ์๋ ์ปค๋งจ๋ ๋ช ๋ น์ด ํด๋ก, ์น๊ฐ๋ฐ์ ๋งค์ฐ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ ๋ฌด๋ฃ ์คํ์์ค์ด๋ค.
ํน์ง
- ์ ๋ง์ ํ๋กํ ์ฝ์ ์ง์ํ๋ค๋ ์ฅ์ ์ด ์๋ค. (DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet, TFTP)
- SSL ์ธ์ฆ ๋ฐฉ์์ด ๊ฐ๋ฅํ๋ค.
์ฌ์ฉ๋ฒ
- curl [-option] https://minjin-sw.tistory.com ํ๊ฒ๋๋ฉด ์์ค๊ฐ ํ๋ฉด์ผ๋ก ์ถ๋ ฅ๋๋ค.
- ์ด์ธ์ ์ต์ ์ ์ด์ฉํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
-k | --insecure | https ์ฌ์ดํธ๋ฅผ SSL certificate ๊ฒ์ฆ์์ด ์ฐ๊ฒฐํ๋ค. | wget ์ --no-check-certificate ๊ณผ ๋น์ทํ ์ญํ ์ํ |
-l | --head | HTTP header ๋ง ๋ณด์ฌ์ฃผ๊ณ content ๋ ํ์ํ์ง ์๋๋ค | |
-D | --dump-header <file> |
<file> ์ HTTP header ๋ฅผ ๊ธฐ๋กํ๋ค. | |
-L | --location | ์๋ฒ์์ HTTP 301 ์ด๋ HTTP 302 ์๋ต์ด ์์ ๊ฒฝ์ฐ redirection URL ๋ก ๋ฐ๋ผ๊ฐ๋ค. --max-redirs ๋ค์ ์ซ์๋ก redirection ์ ๋ช ๋ฒ ๋ฐ๋ผ๊ฐ์ง ์ง์ ํ ์ ์๋ค. ๊ธฐ๋ณธ ๊ฐ์ 50์ด๋ค |
curl -v daum.net ์ ์คํํ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด HTTP 302 ๊ฐ ๋ฆฌํด๋๋ค. < HTTP/1.1 302 Object Moved < Location: http://www.daum.net/ -L ์ต์ ์ ์ถ๊ฐํ๋ฉด www.daum.net ์ผ๋ก ์ฌ์ ์ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ค๊ฒ ๋๋ค. |
-d | --data | HTTP Post data | FORM ์ POST ํ๋ HTTP๋ JSON ์ผ๋ก ๋ฐ์ดํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ REST ๊ธฐ๋ฐ์ ์น์๋น์ค ๋๋ฒ๊น ์ ์ ์ฉํ ์ต์ ์ด๋ค |
-v | --verbose | ๋์ํ๋ฉด์ ์์ธํ ์ต์ ์ ์ถ๋ ฅํ๋ค. | |
-J | --remote-header-name | ์ด๋ค ์น์๋น์ค๋ ํ์ผ ๋ค์ด๋ก๋์ Content-Disposition Header ๋ฅผ ํ์ฑํด์ผ ์ ํํ ํ์ผ์ด๋ฆ์ ์ ์ ์์ ๊ฒฝ์ฐ๊ฐ ์๋ค. -J ์ต์ ์ ์ฃผ๋ฉด ํค๋์ ์๋ ํ์ผ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ค. | curl 7.20 ์ด์๋ถํฐ ์ถ๊ฐ๋ ์ต์ |
-o | --output FILE | curl ์ remote ์์ ๋ฐ์์จ ๋ฐ์ดํ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ฝ์์ ์ถ๋ ฅํ๋ค. -o ์ต์ ๋ค์ FILE ์ ์ ์ด์ฃผ๋ฉด ํด๋น FILE ๋ก ์ ์ฅํ๋ค. (download ์ ์ ์ฉ) | |
-O | --remote-name | file ์ ์ฅ์ remote ์ file ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ค. -o ์ต์ ๋ณด๋ค ํธ๋ฆฌํ๋ค. | |
-s | --silent | ์ ์ ๋ชจ๋. ์งํ ๋ด์ญ์ด๋ ๋ฉ์์ง๋ฑ์ ์ถ๋ ฅํ์ง ์๋๋ค. -o ์ต์ ์ผ๋ก remote data ๋ /dev/null ๋ก ๋ณด๋ด๋ฉด ๊ฒฐ๊ณผ๋ฌผ๋ ์ถ๋ ฅ๋์ง ์๋๋ค | HTTP response code ๋ง ๊ฐ์ ธ์ค๊ฑฐ๋ ํ ๊ฒฝ์ฐ ์ ๋ฆฌ |
ํฌ์คํธ๋งจ ์ฌ์ฉํ๊ธฐ
์์ ์ค๋ช ํ๋ฏ์ด ํฌ์คํธ๋งจ์ ํ์ฉํ์ฌ REST API๋ฅผ ์ค๊ณ, ๊ฐ๋ฐ, ํ ์คํ ํด๋ณผ ์ ์๋ค.
API ์ค๊ณํ๊ธฐ
์ผ์ชฝ ํญ์์๋ Collections, APIs ๋ฑ ๋ค์
ํ ํญ์ด ์๋๋ฐ, ์ฐ์ Collections์์ ํด๋์ ๊ฐ์ ๊ฐ๋ ์ collection์ ์์ฑ/๊ด๋ฆฌํ ์ ์๋ค.
API ํญ์์ API์ ๋ฒ์ ์ ์ค์ ํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค. ์ผ์ชฝ + ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฐฝ์์ API ์ ๋ณด๋ฅผ ์ ๋ ฅํ ์ ์๋ค.
๋ณธ๊ฒฉ์ ์ผ๋ก API๋ฅผ ๋ง๋ค์ด๋ณด์. My Workspace ์์ New ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฐฝ์ด ๋จ๋ฉฐ, ์ฌ๊ธฐ์ API๋ฅผ ์ค๊ณํด๋ณผ ์ ์๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ด ์ฐ์ด๋ ํ๋กํ ์ฝ์ธ HTTP Request๋ฅผ ๋๋ฅด๋ฉด ์์ฝ๊ฒ API๋ฅผ ๋ง๋ค ์ ์๋ค.
์ด๋ฌํ ์ฐฝ์์ GET / POST ๋ฑ์ ๋ฉ์๋๋ฅผ ์ ํํ ์ ์๊ณ , API์ด๋ฆ, URL ์ ๋ ฅ ๋ฑ์ ํด๋ณผ ์ ์๋ค.
API ํ ์คํธํ๊ธฐ
์์ ๊ฐ์ด ๋ง๋ API์์ URL์ ์ ๋ ฅํ๊ณ Send๋ฒํผ์ ๋๋ฌ ์ด Request๋ฅผ ์ ์กํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด Body๋ฅผ ํ์ธํ ์ ์๋ค.
์ฐธ๊ณ ๋ก ์ด ๊ฒฐ๊ณผ๊ฐ์ ์ด๋ค ํ์์ผ๋ก ํ ๊ฒ์ธ์ง๋ ๊ฒฐ์ ํ ์ ์๋ค.
ํ ์คํธ ์คํฌ๋ฆฝํธ ์์ฑํ๊ธฐ
request์ test ํญ์์ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์๋ค. ์ฝ๋๋ JavaScript๋ก ์์ฑ์ ํ๋ฉด ๋๋ฉฐ, ํ ์คํธ ๊ฒฐ๊ณผ๋ ํ๋จ์ Test Results์์ ํ์ธํ ์ ์๋ค.
์คํฌ๋ฆฝํธ ์์
tests["responseBody = " + responseBody] = true;
pm.test("Status code is 200", function(){
pm.response.to.have.statusCode("200")
pm.response.to.have.jsonBody("headers.host")
});
ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์๋๋ฐ tests["test name"]= (true/false logic) ๋๋ pm.test๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์คํธ์ ์ ๋ชฉ๊ณผ validation ์ฒดํฌ ๋ก์ง ์์ฑ์ ํ ์ ์๋ค.
ํ๋์ ์ ํจ์ฑ ์ฒดํฌ๋ง ํ๋ ค๋ฉด tests๋ฅผ, ์ฌ๋ฌ ๊ฐ์ ์ฒดํฌ๋ฅผ ํ๊ธฐ ์ํด์๋ pm.test ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฐธ๊ณ ์ฌ์ดํธ
- ํ๊ด์ฝ๋ฉ๋ ๋ธ๋ก๊ทธ (https://shutcoding.tistory.com/23)
- https://blog.naver.com/PostView.naver?blogId=dktmrorl&logNo=222392840317&parentCategoryNo=&categoryNo=19&viewDate=&isShowPopularPosts=false&from=postView
- https://nhj12311.tistory.com/393
- https://goateedev.tistory.com/63