Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kdt5 ju ha rim #63

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
213 changes: 13 additions & 200 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,219 +1,32 @@
# 🎬 μ˜ν™” 검색

주어진 APIλ₯Ό ν™œμš©ν•΄ '[μ™„μ„± μ˜ˆμ‹œ](https://stupefied-hodgkin-d9d350.netlify.app/)' 처럼 자유둭게 μ˜ν™” 검색 κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ³΄μ„Έμš”!
과제 μˆ˜ν–‰ 및 리뷰 기간은 별도 곡지λ₯Ό μ°Έκ³ ν•˜μ„Έμš”!
배포링크: https://roaring-dolphin-d6dd06.netlify.app

## 과제 μˆ˜ν–‰ 및 제좜 방법

```
KDT기수번호_이름 | E.g, KDT0_ParkYoungWoong
```

1. ν˜„μž¬ μ €μž₯μ†Œλ₯Ό λ‘œμ»¬μ— 클둠(Clone)ν•©λ‹ˆλ‹€.
1. μžμ‹ μ˜ λ³Έλͺ…μœΌλ‘œ 브랜치λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.(ꡬ뢄 κ°€λŠ₯ν•˜λ„λ‘ λ³Έλͺ…을 κΌ­ νŒŒμŠ€μΉΌμΌ€μ΄μŠ€λ‘œ ν‘œμ‹œν•˜μ„Έμš”, `git branch KDT0_ParkYoungWoong`)
1. μžμ‹ μ˜ λ³Έλͺ… λΈŒλžœμΉ˜μ—μ„œ 과제λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
1. 과제 μˆ˜ν–‰μ΄ μ™„λ£Œλ˜λ©΄, μžμ‹ μ˜ λ³Έλͺ… 브랜치λ₯Ό 원격 μ €μž₯μ†Œμ— ν‘Έμ‹œ(Push)ν•©λ‹ˆλ‹€.(`main` λΈŒλžœμΉ˜μ— ν‘Έμ‹œν•˜μ§€ μ•Šλ„λ‘ κΌ­ μ£Όμ˜ν•˜μ„Έμš”, `git push origin KDT0_ParkYoungWoong`)
1. μ €μž₯μ†Œμ—μ„œ `main` 브랜치λ₯Ό λŒ€μƒμœΌλ‘œ Pull Request μƒμ„±ν•˜λ©΄, 과제 제좜이 μ™„λ£Œλ©λ‹ˆλ‹€!(E.g, `main` <== `KDT0_ParkYoungWoong`)

- `main` ν˜Ήμ€ λ‹€λ₯Έ μ‚¬λžŒμ˜ 브랜치둜 μ ˆλŒ€ λ³‘ν•©ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ„Έμš”!
- Pull Requestμ—μ„œ λ³΄μ΄λŠ” μ„€λͺ…을 λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ μ΄ν•΄ν•˜κΈ° 쉽도둝 κΌΌκΌΌν•˜κ²Œ μž‘μ„±ν•˜μ„Έμš”!
- Pull Requestμ—μ„œ 과제 제좜 ν›„ μ ˆλŒ€ 병합(Merge)ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ„Έμš”!
- 과제 μˆ˜ν–‰ 및 제좜 κ³Όμ •μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•œ 경우, λ°”λ‘œ λ‹΄λ‹Ή λ©˜ν† λ‚˜ κ°•μ‚¬μ—μ„œ μ–˜κΈ°ν•˜μ„Έμš”!

## μš”κ΅¬μ‚¬ν•­

ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­μ€ κΌ­ 달성해야 ν•˜λŠ” λͺ©ν‘œλ‘œ, μˆ˜μ •/μ‚­μ œλŠ” λΆˆκ°€ν•˜κ³  μΆ”κ°€λŠ” κ°€λŠ₯ν•©λ‹ˆλ‹€.
선택 μš”κ΅¬μ‚¬ν•­μ€ λ‹¨μˆœ μ˜ˆμ‹œλ‘œ, 자유둭게 μΆ”κ°€/μˆ˜μ •/μ‚­μ œν•΄μ„œ κ΅¬ν˜„ν•΄λ³΄μ„Έμš”.
각 μš”κ΅¬μ‚¬ν•­μ€ 달성 ν›„ λ§ˆν¬λ‹€μš΄μ—μ„œ `- [x]`둜 ν‘œμ‹œν•˜μ„Έμš”.
βœ… HTML, JS μ‚¬μš©

### ❗ ν•„μˆ˜

- [ ] μ˜ν™” 제λͺ©μœΌλ‘œ 검색이 κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€!
- [ ] κ²€μƒ‰λœ 결과의 μ˜ν™” λͺ©λ‘μ΄ 좜λ ₯돼야 ν•©λ‹ˆλ‹€!
- [ ] 단일 μ˜ν™”μ˜ 상세정보(제λͺ©, κ°œλ΄‰μ—°λ„, 평점, μž₯λ₯΄, 감독, 배우, 쀄거리, ν¬μŠ€ν„° λ“±)λ₯Ό λ³Ό 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€!
- [ ] μ‹€μ œ μ„œλΉ„μŠ€λ‘œ λ°°ν¬ν•˜κ³  μ ‘κ·Ό κ°€λŠ₯ν•œ 링크λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.
- [x] μ˜ν™” 제λͺ©μœΌλ‘œ 검색이 κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€!
- [x] κ²€μƒ‰λœ 결과의 μ˜ν™” λͺ©λ‘μ΄ 좜λ ₯돼야 ν•©λ‹ˆλ‹€!
- [x] 단일 μ˜ν™”μ˜ 상세정보(제λͺ©, κ°œλ΄‰μ—°λ„, 평점, μž₯λ₯΄, 감독, 배우, 쀄거리, ν¬μŠ€ν„° λ“±)λ₯Ό λ³Ό 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€!
- [x] μ‹€μ œ μ„œλΉ„μŠ€λ‘œ λ°°ν¬ν•˜κ³  μ ‘κ·Ό κ°€λŠ₯ν•œ 링크λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

### ❔ 선택

- [ ] ν•œ 번의 κ²€μƒ‰μœΌλ‘œ μ˜ν™” λͺ©λ‘μ΄ 20개 이상 κ²€μƒ‰λ˜λ„λ‘ λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [ ] μ˜ν™” κ°œλ΄‰μ—°λ„λ‘œ 검색할 수 μžˆλ„λ‘ λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [ ] μ˜ν™” λͺ©λ‘μ„ κ²€μƒ‰ν•˜λŠ” λ™μ•ˆ λ‘œλ”© μ• λ‹ˆλ©”μ΄μ…˜μ΄ 보이도둝 λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [x] μ˜ν™” λͺ©λ‘μ„ κ²€μƒ‰ν•˜λŠ” λ™μ•ˆ λ‘œλ”© μ• λ‹ˆλ©”μ΄μ…˜μ΄ 보이도둝 λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [ ] λ¬΄ν•œ 슀크둀 κΈ°λŠ₯을 μΆ”κ°€ν•΄μ„œ μΆ”κ°€ μ˜ν™” λͺ©λ‘μ„ λ³Ό 수 μžˆλ„λ‘ λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [ ] μ˜ν™” ν¬μŠ€ν„°κ°€ 없을 경우 λŒ€μ²΄ 이미지λ₯Ό 좜λ ₯ν•˜λ„λ‘ λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [ ] μ˜ν™” 상세정보가 좜λ ₯되기 전에 λ‘œλ”© μ• λ‹ˆλ©”μ΄μ…˜μ΄ 보이도둝 λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [ ] μ˜ν™” 상세정보 ν¬μŠ€ν„°λ₯Ό κ³ ν•΄μƒλ„λ‘œ 좜λ ₯ν•΄λ³΄μ„Έμš”. (μ‹€μ‹œκ°„ 이미지 리사이징)
- [x] μ˜ν™” 상세정보가 좜λ ₯되기 전에 λ‘œλ”© μ• λ‹ˆλ©”μ΄μ…˜μ΄ 보이도둝 λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [x] μ˜ν™” 상세정보 ν¬μŠ€ν„°λ₯Ό κ³ ν•΄μƒλ„λ‘œ 좜λ ₯ν•΄λ³΄μ„Έμš”. (μ‹€μ‹œκ°„ 이미지 리사이징)
- [ ] 차별화가 κ°€λŠ₯ν•˜λ„λ‘ ν”„λ‘œμ νŠΈλ₯Ό μ΅œλŒ€ν•œ 예쁘게 λ§Œλ“€μ–΄λ³΄μ„Έμš”.
- [ ] μ˜ν™”μ™€ κ΄€λ ¨λœ 기타 κΈ°λŠ₯도 κ³ λ €ν•΄λ³΄μ„Έμš”.

## API κΈ°λ³Έ μ‚¬μš©λ²•

```curl
curl https://omdbapi.com/?apikey=7035c60c
\ -X 'GET'
```

## μ˜ν™” λͺ©λ‘ 검색

μ˜ν™” λͺ©λ‘μ€ ν•œ λ²ˆμ— μ΅œλŒ€ 10κ°œκΉŒμ§€ 검색할 수 μžˆμŠ΅λ‹ˆλ‹€.

νŒŒλΌλ―Έν„° | μ„€λͺ… | κΈ°λ³Έκ°’
---|----------------------|---
`s` | 검색할 μ˜ν™” 제λͺ©(ν•„μˆ˜!) | -
`y` | 검색할 κ°œλ΄‰μ—°λ„, 빈 값은 전체 검색 | -
`page` | 검색할 νŽ˜μ΄μ§€ 번호 | `1`

μš”μ²­ μ½”λ“œ μ˜ˆμ‹œ:

```js
async function getMovies(title, year = '', page = 1) {
const s = `&s=${title}`
const y = `&y=${year}`
const p = `&page=${page}`
try {
const res = await fetch(`https://omdbapi.com/?apikey=7035c60c${s}${y}${p}`)
const json = await res.json()
if (json.Response === 'True') {
const { Search: movies, totalResults } = json
return {
movies,
totalResults
}
}
return json.Error
} catch (error) {
console.log(error)
}
}
```

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

```ts
interface ResponseValue {
Search: Movie[] // κ²€μƒ‰λœ μ˜ν™” λͺ©λ‘, μ΅œλŒ€ 10개
totalResults: string // κ²€μƒ‰λœ μ˜ν™” 개수
Response: 'True' | 'False' // μš”μ²­ 성곡 μ—¬λΆ€
}
interface Movie {
Title: string // μ˜ν™” 제λͺ©
Year: string // μ˜ν™” κ°œλ΄‰μ—°λ„
imdbID: string // μ˜ν™” 고유 ID
Type: string // μ˜ν™” νƒ€μž…
Poster: string // μ˜ν™” ν¬μŠ€ν„° 이미지 URL
}
```

```json
{
"Search": [
{
"Title": "Frozen",
"Year": "2013",
"imdbID": "tt2294629",
"Type": "movie",
"Poster": "https://m.media-amazon.com/images/M/MV5BMTQ1MjQwMTE5OF5BMl5BanBnXkFtZTgwNjk3MTcyMDE@._V1_SX300.jpg"
},
{
"Title": "Frozen II",
"Year": "2019",
"imdbID": "tt4520988",
"Type": "movie",
"Poster": "https://m.media-amazon.com/images/M/MV5BMjA0YjYyZGMtN2U0Ni00YmY4LWJkZTItYTMyMjY3NGYyMTJkXkEyXkFqcGdeQXVyNDg4NjY5OTQ@._V1_SX300.jpg"
}
],
"totalResults": "338",
"Response": "True"
}
```

## μ˜ν™” μƒμ œμ •λ³΄ 검색

단일 μ˜ν™”μ˜ μƒμ œμ •λ³΄λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„° | μ„€λͺ… | κΈ°λ³Έκ°’
---|---|---
`i` | 검색할 μ˜ν™” ID(ν•„μˆ˜!) |
`plot` | 쀄거리 길이 | `short`

μš”μ²­ μ½”λ“œ μ˜ˆμ‹œ:

```js
async function getMovie(id) {
const res = await fetch(`https://omdbapi.com/?apikey=7035c60c&i=${id}&plot=full`)
const json = await res.json()
if (json.Response === 'True') {
return json
}
return json.Error
}
```
### 배운점

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:
- Javascriptμ—μ„œ μ»΄ν¬λ„ŒνŠΈ, λΌμš°ν„° ꡬ성, μƒνƒœκ΄€λ¦¬μ˜ κ°œλ…μ— λŒ€ν•΄ 곡뢀할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

```ts
interface ResponseValue {
Title: string // μ˜ν™” 제λͺ©
Year: string // μ˜ν™” κ°œλ΄‰μ—°λ„
Rated: string // μ˜ν™” λ“±κΈ‰
Released: string // μ˜ν™” κ°œλ΄‰μΌ
Runtime: string // μ˜ν™” μƒμ˜μ‹œκ°„
Genre: string // μ˜ν™” μž₯λ₯΄
Director: string // μ˜ν™” 감독
Writer: string // μ˜ν™” μž‘κ°€
Actors: string // μ˜ν™” μΆœμ—°μ§„
Plot: string // μ˜ν™” 쀄거리
Language: string // μ˜ν™” μ–Έμ–΄
Country: string // μ˜ν™” μ œμž‘ κ΅­κ°€
Awards: string // μ˜ν™” μˆ˜μƒ λ‚΄μ—­
Poster: string // μ˜ν™” ν¬μŠ€ν„° 이미지 URL
Ratings: Rating[] // μ˜ν™” 평점 정보
Metascore: string // μ˜ν™” λ©”νƒ€μŠ€μ½”μ–΄
imdbRating: string // μ˜ν™” IMDB 평점
imdbVotes: string // μ˜ν™” IMDB νˆ¬ν‘œ 수
imdbID: string // μ˜ν™” 고유 ID
Type: string // μ˜ν™” νƒ€μž…
DVD: string // μ˜ν™” DVD μΆœμ‹œμΌ
BoxOffice: string // μ˜ν™” λ°•μŠ€μ˜€ν”ΌμŠ€
Production: string // μ˜ν™” μ œμž‘μ‚¬
Website: string // μ˜ν™” 곡식 μ›Ήμ‚¬μ΄νŠΈ
Response: string // μš”μ²­ 성곡 μ—¬λΆ€
}
interface Rating { // μ˜ν™” 평점 정보
Source: string // 평점 제곡 μ‚¬μ΄νŠΈ
Value: string // 평점
}
```
### μ•„μ‰¬μš΄μ 

```json
{
"Title": "Frozen",
"Year": "2013",
"Rated": "PG",
"Released": "27 Nov 2013",
"Runtime": "102 min",
"Genre": "Animation, Adventure, Comedy",
"Director": "Chris Buck, Jennifer Lee",
"Writer": "Jennifer Lee, Hans Christian Andersen, Chris Buck",
"Actors": "Kristen Bell, Idina Menzel, Jonathan Groff",
"Plot": "When the newly crowned Queen Elsa accidentally uses her power to turn things into ice to curse her home in infinite winter, her sister Anna teams up with a mountain man, his playful reindeer, and a snowman to change the weather co...",
"Language": "English, Norwegian",
"Country": "United States",
"Awards": "Won 2 Oscars. 82 wins & 60 nominations total",
"Poster": "https://m.media-amazon.com/images/M/MV5BMTQ1MjQwMTE5OF5BMl5BanBnXkFtZTgwNjk3MTcyMDE@._V1_SX300.jpg",
"Ratings": [
{ "Source": "Internet Movie Database", "Value": "7.4/10" },
{ "Source": "Rotten Tomatoes", "Value": "90%" },
{ "Source": "Metacritic", "Value": "75/100" }
],
"Metascore": "75",
"imdbRating": "7.4",
"imdbVotes": "620,489",
"imdbID": "tt2294629",
"Type": "movie",
"DVD": "18 Mar 2014",
"BoxOffice": "$400,953,009",
"Production": "N/A",
"Website": "N/A",
"Response": "True"
}
```
- μŠ€νƒ€μΌμ„ κ°œμ„±μžˆκ²Œ 바꿔보고 μ‹Άμ–΄μ„œ μΆ”ν›„ λ³€κ²½ν•΄λ³Ό μ˜ˆμ •μž…λ‹ˆλ‹€.
Binary file added favicon.ico
Binary file not shown.
19 changes: 19 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Movie App</title>
<link rel="icon" href="./favicon.ico">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/reset.min.css" />
<link rel="preconnect" href="https://fonts.googleapis.com">

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

preconnectλ₯Ό μ‚¬μš©ν•˜μ—¬ font νŒŒμΌμ„ λ“€κ³ μ˜€κ³  μžˆλ„€μš”:) ν•΄λ‹Ή 속성이 μ–΄λ– ν•œ 의미둜 μ‚¬μš©λ˜κ³  μžˆλŠ”μ§€ 또 μ–΄λ–€ νš¨κ³Όκ°€ μžˆμ–΄μ„œ μΆ”κ°€ν•œ 것인지 μ„€λͺ…ν•΄μ£Όμ‹€ 수 μžˆμ„κΉŒμš”?

<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Oswald:wght@500&family=Roboto:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="./src/main.css">
<script type="module" defer src="./src/main.js"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
Loading