OMDb API를 활용해 VanillaJS 영화 검색 애플리케이션을 만들어봅니다.
이 프로젝트는 'JS' 버전과 'TS' 버전 그리고 'TS AI 챗봇' 버전으로 나누어져 있습니다.
기본 버전은 'TS AI 챗봇'입니다.
2024년 4월 10일
OpenAI API를 사용하기 위해 설치하는 모듈(openai
)의 내부 타입 에러가 발생하지 않도록, 다음과 같이 Vercel 패키지를 최신으로 업데이트해야 합니다.
$ npm i -D vercel@latest
새롭게 추가할 OpenAI API Key 환경변수와 구분하기 위해, 기존의 APIKEY
환경변수의 이름을 OMDB_API_KEY
로 변경했습니다.
node-fetch
패키지가 3버전으로 업데이트되면서, 타입스크립트를 내장하는 것으로 변경되었습니다.
따라서 강의에서 소개하는 @types/node-fetch
패키지는 설치하지 않아도 됩니다.
2023년 4월 27일
Vercel Serverless Functions가 정상적으로 동작하기 위해 package.json
파일의 type
옵션을 요구하게 되었습니다.
package.json
파일에 다음과 같이 "type": "module"
옵션을 추가하세요.
{
"type": "module",
}
2023년 4월 23일
영화 검색 후 'View More..' 버튼이 보일 때, 다른 영화를 새롭게 검색해서 결과를 출력할 수 없는 경우에 'View More..' 버튼이 사라지지 않는 버그가 있습니다.
이는 pageMax
상태를 초기화하지 않아서 발생하는 문제이기 때문에, 다음과 같이 src/store/movie.ts
파일의 searchMovies
함수 내용에서 해당 초기화 코드를 추가해야 합니다!
if (Response === 'True') { // 77번째 줄
store.state.movies = [
...store.state.movies,
...Search
]
store.state.pageMax = Math.ceil(Number(totalResults) / 10)
} else {
store.state.message = Error
store.state.pageMax = 1 // 85번째 줄, 버그 수정을 위해 새롭게 추가된 코드!
}
$ npm i
$ npm run vercel
브라우저의 기본 스타일을 초기화합니다.
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reset-css@5.0.1/reset.min.css" />
<link href="https://fonts.googleapis.com/css2?family=Oswald:wght@500&family=Roboto:wght@400;700&display=swap" rel="stylesheet" />
<h1>
<span>OMDb API</span><br />
THE OPEN<br />
MOVIES DATABASE
</h1>
<p>
The OMDb API is a RESTful web service to obtain movie information,
all content and images on the site are contributed and maintained by our users.<br />
If you find this service useful, please consider making a one-time donation or become a patron.
</p>
node-fetch
패키지는 꼭 2버전으로 설치해야 합니다!
$ npm i -D vercel dotenv
$ npm i node-fetch@2
/vercel.json
{
"devCommand": "npm run dev",
"buildCommand": "npm run build"
}
/package.json
{
"scripts": {
"vercel": "vercel dev"
}
}
Vercel 구성 이후에는 npm run dev
가 아닌 npm run vercel
로 개발 서버를 실행해야 합니다!
$ npm run vercel
프로젝트 루트 경로에 /api
폴더를 생성하고,
API Key 를 노출하지 않도록 서버리스 함수를 작성합니다.
/api/movie.ts
import { VercelRequest, VercelResponse } from '@vercel/node'
import fetch from 'node-fetch'
const { OMDB_API_KEY } = process.env
export default async function handler(request: VercelRequest, response: VercelResponse) {
const { title, page, id } = JSON.parse(request.body as string)
const url = id
? `https://www.omdbapi.com/?apikey=${OMDB_API_KEY}&i=${id}&plot=full`
: `https://www.omdbapi.com/?apikey=${OMDB_API_KEY}&s=${title}&page=${page}`
const res = await fetch(url)
const json = await res.json()
response
.status(200)
.json(json)
}
로컬의 개발용 서버에서 사용할 환경변수를 .env
파일에 지정합니다.
/.env
OMDB_API_KEY=<MY_OMDb_API_KEY>
제품 서버(Vercel 서비스)에서 사용할 환경변수를 지정합니다.
Vercel 서비스의 프로젝트 'Settings / Environment Variables' 옵션에서 다음과 같이 환경변수를 지정합니다.
타입스크립트 코어 패키지를 설치하고 tsconfig.json
파일에 기본적인 구성을 추가합니다.
$ npm i -D typescript
/tsconfig.json
{
"compilerOptions": {
"target": "ES2015",
"module": "ESNext",
"lib": ["ESNext", "DOM"],
"strict": true,
"moduleResolution": "node",
"esModuleInterop": true
},
"include": [
"src/**/*.ts",
"api/**/*.ts"
]
}
타입스크립트를 시작할 기존의 JS 프로젝트를 가지고 있지 않다면, 다음과 같이 진행하세요!
진행이 끝나면, 루트 경로에 .env
파일을 생성하고 OMDB_API_KEY
환경변수를 지정해야 합니다!
# 원하는 터미널 경로에서 완성된 프로젝트를 클론합니다.
$ git clone https://github.com/ParkYoungWoong/vanillajs-movie-app.git
# 클론한 프로젝트 폴더로 이동합니다.
$ cd vanillajs-movie-app
# 브랜치를 변경합니다.
$ git checkout typescript_starter
# Git 버전 관리 내역을 초기화합니다.
## macOS
$ rm -rf .git
## Windows
$ rmdir /s /q .git
# NPM 패키지를 설치합니다.
$ npm i
ChatGPT로 잘 알려진 OpenAI의 API를 사용해 영화 정보를 제공하는 쳇봇을 만들어봅니다.
OpenAI API를 사용하기 위해, openai
패키지를 설치합니다.
$ npm i openai
파인튜닝(Fine-tuning)은 결과 개선을 위해 모델을 특정 데이터셋에 맞게 조정하는 작업입니다. 영화 제목으로 빠른 검색이 가능하도록, 다음과 같이 답변 방식을 조정합니다.
const fineTunedMessage: OpenAI.ChatCompletionMessageParam[] = [
{ role: 'system', content: `너는 영화 정보를 알려주는 봇이야! 어떤 방식으로 답변하든, 포함하는 영화 제목은 항상 {{한글제목//소문자영어제목}}(출시년도) 처럼 {{}} 기호로 제목을 묶고 // 기호로 한글과 영어로 제목을 구분하고 () 기호로 영화의 출시년도를 표시해줘! 주의할 부분은 한글 영화 제목이 정확하지 않다면, 억지로 지어내지 말고 {{에이비씨 엑스와이지//abc xyz}}(1234) 처럼 단순히 영어 제목의 한글 발음을 표시해줘.` },
{ role: 'assistant', content: '영화 {{기생충//parasite}}(2019)은 국제적으로 큰 주목을 받은 봉준호 감독 작품이에요. 현실적이면서도 예술적인 연출과 뛰어난 연기력으로 많은 관객들의 호응을 얻은 작품이죠.' },
{ role: 'assistant', content: '{{씽//sing}} (2016)- 코믹하면서도 감동적인 이야기로 관객들을 웃음 속으로 이끄는 애니메이션 영화입니다.' },
{ role: 'assistant', content: '{{존 윅//john wick}}(2014) 시리즈를 추천해요! 액션 신에서 배우 키아누 리브스가 매혹적인 액션 연기를 펼치는 영화로, 스타일리시한 액션과 복수의 이야기가 잘 어우러져 있어요.' },
{ role: 'assistant', content: '물론이죠! 퓨리오사 역으로 출연한 샤를리즈 테론의 영화로는 {{몬스터//monster(2003)}}와 {{매드 맥스: 분노의 도로//mad max: fury road}}(2015) 등이 있어요.' },
{ role: 'assistant', content: '가벼운 분위기의 영화를 추천해드릴게요. {{비커밍 제인//becoming jane}}(2007)는 제인 오스트렌의 청춘 시절을 다룬 멜로 영화로, 사랑과 운명을 그려낸 로맨틱한 작품이에요.' },
{ role: 'assistant', content: '한국에서 제작된 공포 및 스릴러 장르의 작품으로, 봉준호 감독이 연출한 {{괴물//the host}}(2006) 영화를 추천합니다. 한강을 배경으로 한 괴물의 출현과 이로 인한 사건을 중심으로 가족의 사랑과 희생을 그려내고 있습니다.' },
{ role: 'assistant', content: '크리스토퍼 놀란 감독이 연출한 {{인터스텔라//interstellar}}(2014) 과학과 인간 정서를 균형 있게 결합한 공상 과학 장르의 대표작입니다.' },
{ role: 'assistant', content: '{{아마데우스//Amadeus}}(1984)를 추천해요. 밀로스 포먼 감독이 연출한 이 영화는 능력 있는 두 음악가, 볼프강 아마데우스 모차르트와 안토니오 살리에리의 관계를 중심으로 펼쳐지는 드라마입니다.' },
{ role: 'assistant', content: '{{반도//peninsula}}(2020)를 추천해드릴게요. 이 영화는 좀비로 인한 대재앙 이후를 그린 액션 스릴러 작품으로, 긴장감 넘치는 전투와 스릴을 즐길 수 있어요.' },
{ role: 'assistant', content: '매트릭스 시리즈는 현재까지 총 3편으로 이루어져 있어요. {{매트릭스//the matrix}}(1999)는 사이버 퓨처와 현실 사이의 모순에 관한 기발한 아이디어의 인상적인 작품이에요. {{매트릭스 리로디드//the matrix reloaded}}(2003)는 첫 번째 영화의 이야기를 이어받아 전개되는 작품이에요. {{매트릭스 레볼루션//the matrix revolutions}}(2003)은 매트릭스 시리즈의 마지막 작품으로, 복잡한 플롯과 화려한 시각 효과가 돋보이는 작품이에요.' }
]