-
Notifications
You must be signed in to change notification settings - Fork 0
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_김동해 #60
Open
THEEASTSEA
wants to merge
3
commits into
main
Choose a base branch
from
KDT5_KimDongHae
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
KDT5_김동해 #60
Changes from all commits
Commits
Show all changes
3 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
{ | ||
"extends": [ | ||
"eslint:recommended", | ||
"plugin:react/recommended", | ||
"plugin:prettier/recommended" | ||
], | ||
"plugins": [ | ||
"react", | ||
"prettier" | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# Logs | ||
logs | ||
*.log | ||
npm-debug.log* | ||
yarn-debug.log* | ||
yarn-error.log* | ||
pnpm-debug.log* | ||
lerna-debug.log* | ||
|
||
node_modules | ||
dist | ||
dist-ssr | ||
*.local | ||
|
||
# Editor directories and files | ||
.vscode/* | ||
!.vscode/extensions.json | ||
.idea | ||
.DS_Store | ||
*.suo | ||
*.ntvs* | ||
*.njsproj | ||
*.sln | ||
*.sw? |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
{ | ||
"semi": false, | ||
"singleQuote": true, | ||
"endOfLine": "lf", | ||
"singleAttributePerLine": true, | ||
"bracketSameLine": true, | ||
"trailingComma": "none", | ||
"arrowParens": "avoid" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,219 +1,70 @@ | ||
# 🎬 영화 검색 | ||
|
||
주어진 API를 활용해 '[완성 예시](https://stupefied-hodgkin-d9d350.netlify.app/)' 처럼 자유롭게 영화 검색 기능을 구현해보세요! | ||
과제 수행 및 리뷰 기간은 별도 공지를 참고하세요! | ||
# 🎬 OMDb API를 활용한 영화 검색 사이트 'MovieMatrix' | ||
|
||
## 과제 수행 및 제출 방법 | ||
## 배포 | ||
|
||
``` | ||
KDT기수번호_이름 | E.g, KDT0_ParkYoungWoong | ||
``` | ||
[MovieMatrix](https://stalwart-nougat-119b80.netlify.app/#/) | ||
|
||
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]`로 표시하세요. | ||
|
||
### ❗ 필수 | ||
[![Vite](https://camo.githubusercontent.com/39a7c00c73ce5a0060e988dbf9721dc0bc2a9032e631656da6582e7519018c48/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f564954452d3634364346463f7374796c653d666c61742d737175617265266c6f676f3d76697465266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/39a7c00c73ce5a0060e988dbf9721dc0bc2a9032e631656da6582e7519018c48/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f564954452d3634364346463f7374796c653d666c61742d737175617265266c6f676f3d76697465266c6f676f436f6c6f723d7768697465) [![Npm](https://camo.githubusercontent.com/afd3a4b22ff275fad5bfb52a091d5933fe213425e4bff924e88ae45f11f794b1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e504d2d4342333833373f7374796c653d666c61742d737175617265266c6f676f3d6e706d266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/afd3a4b22ff275fad5bfb52a091d5933fe213425e4bff924e88ae45f11f794b1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e504d2d4342333833373f7374796c653d666c61742d737175617265266c6f676f3d6e706d266c6f676f436f6c6f723d7768697465) | ||
|
||
|
||
[![HTML5](https://camo.githubusercontent.com/78dc5835c254ff7423aabdd3a0fb6592c334072417a09e6556f446029395bae8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f48544d4c352d4533344632363f7374796c653d666c61742d737175617265266c6f676f3d68746d6c35266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/78dc5835c254ff7423aabdd3a0fb6592c334072417a09e6556f446029395bae8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f48544d4c352d4533344632363f7374796c653d666c61742d737175617265266c6f676f3d68746d6c35266c6f676f436f6c6f723d7768697465) [![JAVASCRIPT](https://camo.githubusercontent.com/400bc66d72448f5f1fa3ab036333af9578794af175639242723d7f5eac25c1f9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a4156415343524950542d4637444631453f7374796c653d666c61742d737175617265266c6f676f3d6a617661736372697074266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/400bc66d72448f5f1fa3ab036333af9578794af175639242723d7f5eac25c1f9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a4156415343524950542d4637444631453f7374796c653d666c61742d737175617265266c6f676f3d6a617661736372697074266c6f676f436f6c6f723d7768697465) | ||
|
||
[![](https://camo.githubusercontent.com/69139a1fb652b0445950106929ffd6322b3299b73b82d629e720babb9cef1988/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e45544c4946592d3030433742373f7374796c653d666c61742d737175617265266c6f676f3d6e65746c696679266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/69139a1fb652b0445950106929ffd6322b3299b73b82d629e720babb9cef1988/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e45544c4946592d3030433742373f7374796c653d666c61742d737175617265266c6f676f3d6e65746c696679266c6f676f436f6c6f723d7768697465) | ||
|
||
- [ ] 영화 제목으로 검색이 가능해야 합니다! | ||
- [ ] 검색된 결과의 영화 목록이 출력돼야 합니다! | ||
- [ ] 단일 영화의 상세정보(제목, 개봉연도, 평점, 장르, 감독, 배우, 줄거리, 포스터 등)를 볼 수 있어야 합니다! | ||
- [ ] 실제 서비스로 배포하고 접근 가능한 링크를 추가해야 합니다. | ||
---------- | ||
|
||
## 요구사항 | ||
|
||
### ❗ 필수 | ||
- [X] 영화 제목으로 검색이 가능해야 합니다! | ||
- [x] 검색된 결과의 영화 목록이 출력돼야 합니다! | ||
- [x] 단일 영화의 상세정보(제목, 개봉연도, 평점, 장르, 감독, 배우, 줄거리, 포스터 등)를 볼 수 있어야 합니다! | ||
- [x] 실제 서비스로 배포하고 접근 가능한 링크를 추가해야 합니다. | ||
|
||
### ❔ 선택 | ||
|
||
- [ ] 한 번의 검색으로 영화 목록이 20개 이상 검색되도록 만들어보세요. | ||
- [ ] 영화 개봉연도로 검색할 수 있도록 만들어보세요. | ||
- [ ] 영화 목록을 검색하는 동안 로딩 애니메이션이 보이도록 만들어보세요. | ||
- [ ] 무한 스크롤 기능을 추가해서 추가 영화 목록을 볼 수 있도록 만들어보세요. | ||
- [ ] 영화 포스터가 없을 경우 대체 이미지를 출력하도록 만들어보세요. | ||
- [ ] 영화 상세정보가 출력되기 전에 로딩 애니메이션이 보이도록 만들어보세요. | ||
- [ ] 영화 상세정보 포스터를 고해상도로 출력해보세요. (실시간 이미지 리사이징) | ||
- [ ] 차별화가 가능하도록 프로젝트를 최대한 예쁘게 만들어보세요. | ||
- [ ] 영화와 관련된 기타 기능도 고려해보세요. | ||
|
||
## 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 | ||
} | ||
``` | ||
|
||
응답 데이터 타입 및 예시: | ||
|
||
```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" | ||
} | ||
``` | ||
- [X] 한 번의 검색으로 영화 목록이 20개 이상 검색되도록 만들어보세요. | ||
- [x] 영화 개봉연도로 검색할 수 있도록 만들어보세요. | ||
- [x] 영화 목록을 검색하는 동안 로딩 애니메이션이 보이도록 만들어보세요. | ||
- [x] 무한 스크롤 기능을 추가해서 추가 영화 목록을 볼 수 있도록 만들어보세요. | ||
- [x] 영화 포스터가 없을 경우 대체 이미지를 출력하도록 만들어보세요. | ||
- [x] 영화 상세정보가 출력되기 전에 로딩 애니메이션이 보이도록 만들어보세요. | ||
- [x] 영화 상세정보 포스터를 고해상도로 출력해보세요. (실시간 이미지 리사이징) | ||
- [x] 차별화가 가능하도록 프로젝트를 최대한 예쁘게 만들어보세요. | ||
- [x] 영화와 관련된 **기타기능**도 고려해보세요. | ||
|
||
---------- | ||
|
||
## 기타기능 | ||
|
||
### My Movie (마이 무비) | ||
|
||
- 영화를 검색 후 마음에 드는 영화의 상세 페이지에서 하트 버튼을 클릭할 경우 LocalStorage에 해당 영화의 정보가 저장되어 이후 'My Movie' 페이지에서 저장된 영화 리스트를 확인할 수 있도록 구현하였습니다. | ||
|
||
---------- | ||
|
||
## 프로젝트 리뷰 | ||
|
||
### 인사이트 | ||
|
||
- 자바스크립트를 활용하여 각각의 개별 컴포넌트를 나누고 UI와 기능에 따라 필요한 컴포넌트를 임포트하여 사용하는 방법을 배울 수 있었습니다. | ||
|
||
- API를 활용하여 서버로부터 필요한 데이터를 요청하고 불러온 데이터를 쓰임에 따라 자바스크립트로 가공 및 활용하는 방법을 배울 수 있었습니다. | ||
|
||
- 라우터를 활용하여 URL에 따라 페이지를 나누고 예외 처리를 통해 404 페이지를 구현하는 방법을 배웠습니다. | ||
|
||
- 스토어 기능을 통해 필요한 데이터를 공통으로 관리하고 각각의 컴포넌트에서 활용하는 방법을 배웠습니다. | ||
|
||
|
||
### 문제점 | ||
|
||
- 미디어 쿼리 적용 : PC 비율에 맞게 제작된 CSS를 미디어 쿼리를 통해 모바일 레이아웃을 구성하는 과정에서 일부 항목이 제대로 적용되지 않는 문제가 있었습니다. 향후 프로젝트에 미디어 쿼리를 적용할 경우 모바일 레이아웃을 먼저 구현하는 순서로 진행해야 할 것 같습니다! | ||
|
||
- 뒤로가기 버튼 구현 : 영화 상세 페이지에서 이전 화면(검색 페이지)으로 이동하기 위해 '뒤로가기' 버튼을 구현하였으나, 브라우저의 뒤로가기와 같은 기본 방식으로, 이전 페이지가 검색 페이지가 아닐 경우 기능이 제대로 작동하지 않는 문제가 있습니다. (이전 페이지와는 상관 없이 현재 검색 내역 페이지로 이동할 수 있는 방법이 있을까요?) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
export function setupCounter(element) { | ||
let counter = 0 | ||
const setCounter = (count) => { | ||
counter = count | ||
element.innerHTML = `count is ${counter}` | ||
} | ||
element.addEventListener('click', () => setCounter(counter + 1)) | ||
setCounter(0) | ||
} | ||
Large diffs are not rendered by default.
Oops, something went wrong.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
import './style.css' | ||
import javascriptLogo from './javascript.svg' | ||
import viteLogo from '/vite.svg' | ||
import { setupCounter } from './counter.js' | ||
|
||
document.querySelector('#app').innerHTML = ` | ||
<div> | ||
<a href="https://vitejs.dev" target="_blank"> | ||
<img src="${viteLogo}" class="logo" alt="Vite logo" /> | ||
</a> | ||
<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" target="_blank"> | ||
<img src="${javascriptLogo}" class="logo vanilla" alt="JavaScript logo" /> | ||
</a> | ||
<h1>Hello Vite!</h1> | ||
<div class="card"> | ||
<button id="counter" type="button"></button> | ||
</div> | ||
<p class="read-the-docs"> | ||
Click on the Vite logo to learn more | ||
</p> | ||
</div> | ||
` | ||
|
||
setupCounter(document.querySelector('#counter')) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. counter는 주제랑 맞지 않는데 파일로 남겨두신 이유가 있을까요? |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이건 왜만드신걸까요?