## API 호출해보기 - 한국영화진흥위원회의 오픈 API(https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do)를 활용합니다. Postman 앱(https://www.postman.com)을 통해 영화목록 API를 호출하여 결과를 확인해봅니다 (GET 메서드 활용) > Request URL: http://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=f5eef3421c602c6cb7ea224104795888&directorNm=봉준호 - API 문서에 표시된 다양한 매개변수를 적용하여 호출 결과를 확인해봅니다 ```json { "movieListResult": { "totCnt": 15, "source": "영화진흥위원회", "movieList": [ { "movieCd": "20038957", "movieNm": "싱크 & 라이즈", "movieNmEn": "Sink & Rise", "prdtYear": "2003", "openDt": "", "typeNm": "단편", "prdtStatNm": "기타", "nationAlt": "한국", "genreAlt": "드라마", "repNationNm": "한국", "repGenreNm": "드라마", "directors": [ { "peopleNm": "봉준호" } ], "companys": [] }, { "movieCd": "20126732", "movieNm": "프레임 속의 기억들", "movieNmEn": "The Memories In My frame", "prdtYear": "1994", "openDt": "", "typeNm": "단편", "prdtStatNm": "기타", "nationAlt": "한국", "genreAlt": "드라마", "repNationNm": "한국", "repGenreNm": "드라마", "directors": [ { "peopleNm": "봉준호" } ], "companys": [ { "companyCd": "20100572", "companyNm": "한국영화아카데미" } ] }, { "movieCd": "20100457", "movieNm": "지리멸렬", "movieNmEn": "Incoherence", "prdtYear": "1994", "openDt": "", "typeNm": "단편", "prdtStatNm": "기타", "nationAlt": "한국", "genreAlt": "코미디", "repNationNm": "한국", "repGenreNm": "코미디", "directors": [ { "peopleNm": "봉준호" } ], "companys": [ { "companyCd": "20100572", "companyNm": "한국영화아카데미" } ] }, { "movieCd": "20030046", "movieNm": "살인의 추억", "movieNmEn": "Memories of Murder", "prdtYear": "2003", "openDt": "20030425", "typeNm": "장편", "prdtStatNm": "개봉", "nationAlt": "한국", "genreAlt": "스릴러", "repNationNm": "한국", "repGenreNm": "스릴러", "directors": [ { "peopleNm": "봉준호" } ], "companys": [ { "companyCd": "20100123", "companyNm": "(주)싸이더스" } ] }, { "movieCd": "20126674", "movieNm": "설국열차", "movieNmEn": "Snowpiercer", "prdtYear": "2013", "openDt": "20130801", "typeNm": "장편", "prdtStatNm": "개봉", "nationAlt": "한국,체코", "genreAlt": "SF,액션", "repNationNm": "한국", "repGenreNm": "SF", "directors": [ { "peopleNm": "봉준호" } ], "companys": [ { "companyCd": "20100357", "companyNm": "모호필름" }, { "companyCd": "20100410", "companyNm": "오퍼스픽쳐스(유)" } ] }, { "movieCd": "20072091", "movieNm": "인플루엔자", "movieNmEn": "Influenza", "prdtYear": "2004", "openDt": "", "typeNm": "단편", "prdtStatNm": "기타", "nationAlt": "한국", "genreAlt": "드라마", "repNationNm": "한국", "repGenreNm": "드라마", "directors": [ { "peopleNm": "봉준호" } ], "companys": [] }, { "movieCd": "20149067", "movieNm": "백색인", "movieNmEn": "White Collar", "prdtYear": "1994", "openDt": "", "typeNm": "단편", "prdtStatNm": "기타", "nationAlt": "한국", "genreAlt": "기타", "repNationNm": "한국", "repGenreNm": "기타", "directors": [ { "peopleNm": "봉준호" } ], "companys": [] }, { "movieCd": "20183782", "movieNm": "기생충", "movieNmEn": "PARASITE", "prdtYear": "2019", "openDt": "20190530", "typeNm": "장편", "prdtStatNm": "개봉", "nationAlt": "한국", "genreAlt": "드라마", "repNationNm": "한국", "repGenreNm": "드라마", "directors": [ { "peopleNm": "봉준호" } ], "companys": [ { "companyCd": "20100558", "companyNm": "(주)바른손이앤에이" } ] }, { "movieCd": "20090248", "movieNm": "마더", "movieNmEn": "Mother", "prdtYear": "2009", "openDt": "20090528", "typeNm": "장편", "prdtStatNm": "개봉", "nationAlt": "한국", "genreAlt": "드라마", "repNationNm": "한국", "repGenreNm": "드라마", "directors": [ { "peopleNm": "봉준호" } ], "companys": [ { "companyCd": "20100558", "companyNm": "(주)바른손이앤에이" } ] }, { "movieCd": "20060151", "movieNm": "괴물", "movieNmEn": "The Host", "prdtYear": "2006", "openDt": "20060727", "typeNm": "장편", "prdtStatNm": "개봉", "nationAlt": "한국", "genreAlt": "SF,가족,드라마", "repNationNm": "한국", "repGenreNm": "SF", "directors": [ { "peopleNm": "봉준호" } ], "companys": [ { "companyCd": "20100202", "companyNm": "영화사청어람(주)" } ] } ] } } ``` - Postman이 우리를 대신해서 만들어준 URL의 모습은 결과적으로 어떘나요? ![https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/resources/usr/63e1b2d9324ce85b6f356d01/20230717/64b4dd16324ce85b6f35dcc7.png](https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/resources/usr/63e1b2d9324ce85b6f356d01/20230717/64b4dd16324ce85b6f35dcc7.png) - URL에서 매개변수는 어떻게 표현하나요? > {요청URL}?{key}={value} - `요청 URL` 뒤에 `?`로 매개변수 호출 시작 - `&`로 매개변수 구분 - `value`가 배열을 받을 수 있는 경우 `,`로 구분 ## Request - HTTP 요청의 핵심요소에 대해서 알아봅시다. ### method - `GET` 은 언제 어떻게 사용하나요? : `GET` 메서드는 특정 리소스의 표시를 요청합니다. `GET`을 사용하는 요청은 **오직 데이터를 받기만** 합니다. - `POST` 는 언제 어떻게 사용하나요? : `POST` 메서드는 **특정 리소스에 엔티티**를 제출할 때 쓰입니다. 이는 종종 서버의 상태의 변화나 부작용을 일으킵니다. - `PUT` 은 언제 어떻게 사용하나요? : `PUT` 메서드는 목적 리소스 모든 현재 표시를 요청 `payload`로 바꿉니다. - `PATCH` 는 언제 어떻게 사용하나요? : `PATCH` 메서드는 리소스의 부분만을 수정하는 데 쓰입니다. - `DELETE` 는 언제 어떻게 사용하나요? : `DELETE` 메서드는 특정 리소스를 삭제합니다. #### 🔗 참고링크 - [MDN - HTTP Methods](https://developer.mozilla.org/ko/docs/Web/HTTP/Mehods) 위의 질문들을 올바르게 살펴봤다면, 아래의 내용들이 무엇인지 설명할 수 있습니다. - request-query : `Request-Query`는 `HTTP` 요청에서 `URL`에 포함되는 매개변수(`parameters`)를 의미합니다. `URL` 끝에 ?를 붙이고 `key=value` 형태로 매개변수를 추가하여 서버에 특정 데이터를 요청할 수 있습니다. 여러 개의 매개변수를 전달할 때는 `&`를 사용하여 구분합니다. ```bash GET https://api.example.com/users?id=123&name=John ``` - request-body(payload) : `Request-Body`는 `HTTP` 요청에서 본문에 담겨져서 서버로 전송되는 데이터를 말합니다. 주로 `POST`, `PUT`, `PATCH`와 같은 메서드에서 사용되며, 클라이언트가 서버로 데이터를 전송할 때 이용됩니다. ```json { "name": "Alice", "email": "alice@example.com", "age": 30 } ``` - header : `HTTP` 요청과 응답에서 부가적인 정보를 담고 있는 메타데이터의 컬렉션입니다. `Header`는 이름-값의 쌍으로 이루어져 있으며, 요청 또는 응답에 대한 여러 가지 정보를 제공합니다. `Content-Type`은 `Header`의 하나로, 특히 요청 또는 응답의 본문(Content)의 타입을 명시합니다. - Content-Type 은 무엇인가요? : Content-Type은 HTTP 요청이나 응답에서 본문 데이터의 타입을 나타냅니다. 주로 POST나 PUT 등의 요청에서 Request-Body의 데이터 타입을 명시하는 데 사용됩니다. - 파일을 전송할때 주로 사용하는 Content-Type 은 무엇인가요? : 파일을 전송할 때 주로 사용하는 Content-Type은 `multipart/form-data`입니다. 이 Content-Type은 폼 데이터를 서버로 전송할 때, 그 중에 파일이 포함되어 있을 때 사용됩니다. 파일과 텍스트 데이터를 함께 전송할 때 유용합니다. ## Response - HTTP 응답의 핵심요소에 대해서 알아봅시다. ### HTTP Status - `200`, `201`, `202`, `204` 상태 코드가 각각 무엇을 의미하는지 알아봅시다. : > Successful responses (200 – 299) `200 OK` The request succeeded. The result meaning of "success" depends on the HTTP method: - GET: The resource has been fetched and transmitted in the message body. - HEAD: The representation headers are included in the response without any message body. - PUT or POST: The resource describing the result of the action is transmitted in the message body. - TRACE: The message body contains the request message as received by the server. `201 Created` 요청이 성공적으로 처리되었고, 새로운 리소스가 생성되었습니다. 이는 일반적으로 POST 요청 또는 일부 PUT 요청 후에 보내지는 응답입니다. `202 Accepted` 이 요청은 수신되었지만 아직 처리되지 않았습니다. HTTP에서는 나중에 요청의 결과를 나타내는 비동기 응답을 보내는 방법이 없기 때문에, 이 응답은 확정적이지 않습니다. 이는 다른 프로세스나 서버가 요청을 처리하는 경우나 일괄 처리(batch processing)를 위해 사용됩니다. `204 No Content` 이 요청에는 전송할 내용이 없지만, 헤더는 유용할 수 있습니다. 사용자 에이전트(user agent)는 캐시된 헤더를 새로운 헤더로 업데이트할 수 있습니다. - `400`, `401`, `403`, `404`, `406` 상태 코드가 각각 무엇을 의미하는지 알아봅시다. : > Client error responses (400 – 499) `400 Bad Request` 서버가 클라이언트의 요청을 처리할 수 없거나 처리하지 않을 것이며, 클라이언트의 오류로 인식되는 상황(예: 잘못된 요청 구문, 잘못된 요청 메시지 구성 또는 잘못된 요청 라우팅 등)으로 인해 발생합니다. `401 Unauthorized` HTTP 표준은 "unauthorized"를 지정하지만 의미적으로 이 응답은 "unauthenticated"를 의미합니다. 즉, 클라이언트는 원하는 응답을 얻기 위해 스스로를 인증해야 합니다. `403 Forbidden` 클라이언트는 내용에 대한 접근 권한이 없습니다. 즉, 인증되지 않았기 때문에 서버는 요청된 리소스를 제공하지 않습니다. 401 Unauthorized와 달리, 서버는 클라이언트의 신원을 알고 있는 상태입니다. `404 Not Found` 서버가 요청한 리소스를 찾을 수 없습니다. 브라우저에서는 이는 URL이 인식되지 않는 것을 의미합니다. API에서도 이는 엔드포인트(경로)는 유효하지만 해당 리소스 자체가 존재하지 않는 것을 의미할 수 있습니다. 서버는 또한 인가되지 않은 클라이언트에게 리소스의 존재를 숨기기 위해 403 Forbidden 대신 이 응답을 보낼 수도 있습니다. 이 응답 코드는 웹에서 자주 발생하기 때문에 가장 잘 알려진 코드 중 하나입니다. - `500`, `502`, `504`상태 코드가 각각 무엇을 의미하는지 알아봅시다. : > Server error responses (500 – 599) `500 Internal Server Error` 서버가 처리 방법을 모르는 상황을 마주했습니다. `502 Bad Gateway` 이 오류 응답은 서버가 요청을 처리하기 위해 필요한 응답을 얻기 위해 게이트웨이 역할을 하는 도중 잘못된 응답을 받은 것을 의미합니다. `504 Gateway Timeout` 이 오류 응답은 서버가 게이트웨이 역할을 하고 있으며, 응답을 시간 내에 받을 수 없을 때 발생합니다. #### 🔗 참고링크 - [MDN - Http Status](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) 위의 질문들을 올바르게 살펴봤다면, 아래의 내용들이 무엇인지 설명할 수 있습니다. - 가장 기본적인 성공 요청 응답의 status 코드는 무엇일까요? : `200 OK` - 인증 또는 권한등의 오류에 대해서 주로 사용되는 status 코드는 무엇일까요? : `401 Unauthorized` - 잘못된 접근, 존재하지 않는 경로에 대한 접근에 주로사용되는 status 코드는 무엇일까요? : `404 Not Found` - 서버측 오류에 대해서 주로 사용되는 status 코드는 무엇일까요? : `500 Internal Server Error`, `502 Bad Gateway` - status 를 통해서 얻을수 있는 이점은 무엇일까요? : 클라이언트 개발자가 status 코드를 통해 적절한 사용자 화면을 노출시킬 수 있다. ## URL / URI ### URL - URL(Uniform Resource Locator)은 인터넷에서 웹 페이지, 이미지, 비디오 등 리소스의 위치를 가리키는 문자열입니다. - HTTP 맥락에서 URL은 "웹 주소" 또는 "링크"라고 불립니다. 브라우저는 https://developer.mozilla.org 등 URL을 주소창에 표시합니다. 일부 브라우저는 URL에서 "//" 뒤의 일부분, 즉 도메인 이름만 표시합니다. - URL은 파일 전송(FTP), 이메일(SMTP) 등 다른 응용 프로그램에서도 사용할 수 있습니다. ### URI - URI(Uniform Resource Identifier)는 하나의 리소스를 가리키는 문자열입니다. 가장 흔한 URI는 URL로, 웹 상에서의 위치로 리소스를 식별합니다. 반면, URN (en-US)은 주어진 이름공간 안의 이름으로 리소스를 식별합니다. 도서의 ISBN을 예시로 사용할 수 있습니다. #### 🔗 참고링크 - [MDN - URI](https://developer.mozilla.org/ko/docs/Glossary/URI) - [MDN - URL](https://developer.mozilla.org/ko/docs/Glossary/URL) - [블로그](https://www.elancer.co.kr/blog/view?seq=74)