## 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의 모습은 결과적으로 어떘나요?

- 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)