Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
66dff0c
프로젝트 구성
dev-junehee Apr 21, 2023
1fa3173
DOCS: README.md 초안 작성
dev-junehee Apr 21, 2023
f249996
DOCS: Header, About, Search, Footer 섹션 구현 및 CSS 적용
dev-junehee Apr 23, 2023
4186829
DOCS: README.md 오타 수정
dev-junehee Apr 23, 2023
f0105a0
DOCS: README.md 오타 수정
dev-junehee Apr 23, 2023
7fc944e
DOCS: README.md 오타 수정
dev-junehee Apr 23, 2023
06752df
DOCS: README.md 오타 수정
dev-junehee Apr 23, 2023
3bf5d7d
DOCS: 검색 옵션창 추가
dev-junehee Apr 24, 2023
8ee93dd
DOCS: README.md 타이틀 수정
dev-junehee Apr 24, 2023
fd5f80a
FEAT: OMDb API 연결, 영화 검색 기능 추가
dev-junehee Apr 24, 2023
aadbf9c
DOCS: README.md 구현 내용 수정
dev-junehee Apr 24, 2023
e82e8e5
FEAT: Footer 날짜 카운트 기능 추가
dev-junehee Apr 24, 2023
7a7848d
DOCS: CSS hover 효과 추가 및 오타 수정
dev-junehee Apr 24, 2023
3d0c2f2
STYLE: 영화 검색 목록 중앙 정렬 및 애니메이션 효과 추가
dev-junehee Apr 26, 2023
d968d33
DOCS: About 삭제, Account 섹션 추가 및 CSS 적용
dev-junehee Apr 26, 2023
d1e396a
FEAT: NavLink 사용한 컴포넌트 이동 기능 추가
dev-junehee Apr 26, 2023
405765e
FEAT: 영화 포스터 클릭 시 모달창 오픈 기능 추가
dev-junehee Apr 28, 2023
29d01b3
DOCS: 영화 검색 코드 수정
dev-junehee Apr 28, 2023
298742c
DOCS: 영화 검색 Types 옵션 추가
dev-junehee Apr 28, 2023
58f0ba5
Update README.md
dev-junehee Apr 28, 2023
3a2d474
Update README.md
dev-junehee May 5, 2023
a8681ab
Update README.md
dev-junehee May 5, 2023
99c636f
Update README.md
dev-junehee May 5, 2023
837b69d
DOCS: open graph protocol 수정
dev-junehee May 5, 2023
5fccddf
DOCS: 로딩 애니메이션 요소 추가
dev-junehee May 5, 2023
bc22251
Update README.md
dev-junehee May 5, 2023
0109f6e
Update README.md
dev-junehee May 5, 2023
bae9626
Update README.md
dev-junehee May 5, 2023
abee225
Update README.md
dev-junehee May 5, 2023
45677b5
Update README.md
dev-junehee May 7, 2023
cc02eb4
Update README.md
dev-junehee May 7, 2023
2865241
Update README.md
dev-junehee May 10, 2023
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
15 changes: 15 additions & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module.exports = {
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:react-hooks/recommended',
],
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
settings: { react: { version: '18.2' } },
plugins: ['react-refresh'],
rules: {
'react-refresh/only-export-components': 'warn',
},
}
11 changes: 11 additions & 0 deletions .eslintrc.json
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"
]
}
24 changes: 24 additions & 0 deletions .gitignore
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?
9 changes: 9 additions & 0 deletions .prettierrc
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"
}
244 changes: 48 additions & 196 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,37 +1,55 @@
# 🎬 영화 검색
# 🎬 OMDb API 영화 검색 사이트

주어진 API를 활용해 '[완성 예시](https://stupefied-hodgkin-d9d350.netlify.app/)' 처럼 자유롭게 영화 검색 기능을 구현해보세요!
과제 수행 및 리뷰 기간은 별도 공지를 참고하세요!
[OMDb API](https://www.omdbapi.com/)를 활용하여 영화 검색 페이지를 구현하였습니다.

## 과제 수행 및 제출 방법
<br />

```
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`)
> **패스트캠퍼스 프론트엔드 개발 부트캠프 5기**<br />
> **개발 기간** : 2023. 04. 20 ~ 2023. 05. 05<br />
> **배포 주소** : [DEMO](https://omdb-api-movie-search.netlify.app/)

- `main` 혹은 다른 사람의 브랜치로 절대 병합하지 않도록 주의하세요!
- Pull Request에서 보이는 설명을 다른 사람들이 이해하기 쉽도록 꼼꼼하게 작성하세요!
- Pull Request에서 과제 제출 후 절대 병합(Merge)하지 않도록 주의하세요!
- 과제 수행 및 제출 과정에서 문제가 발생한 경우, 바로 담당 멘토나 강사에서 얘기하세요!
<br />

## 요구사항
## 화면 구성

필수 요구사항은 꼭 달성해야 하는 목표로, 수정/삭제는 불가하고 추가는 가능합니다.
선택 요구사항은 단순 예시로, 자유롭게 추가/수정/삭제해서 구현해보세요.
각 요구사항은 달성 후 마크다운에서 `- [x]`로 표시하세요.
<img src="./src/assets/sample01.png" />
<img src="./src/assets/sample02.png" />
<img src="./src/assets/sample03.png" />

## 개발자 소개

| 김준희 |
| :-----------------------------------------------------------------------------: |
| <img width="200" src="https://avatars.githubusercontent.com/u/116873887?v=4" /> |
| [@dev-junehee](https://github.com/dev-junehee) |

<br />

## 사용기술 및 개발환경

<img src="https://img.shields.io/badge/React-61DAFB?style=flat&logo=React&logoColor=white"/></a>
<img src="https://img.shields.io/badge/React Router-CA4245?style=flat&logo=React Router&logoColor=white"/></a>
<img src="https://img.shields.io/badge/Vite-646CFF?style=flat&logo=Vite&logoColor=white"/></a>
<img src="https://img.shields.io/badge/JavaScript-F7DF1E?style=flat&logo=JavaScript&logoColor=white"/></a>
<img src="https://img.shields.io/badge/Sass-CC6699?style=flat&logo=Sass&logoColor=white"/></a>
<br />
<img src="https://img.shields.io/badge/MacOS-000000?style=flat&logo=Apple&logoColor=white"/></a>
<img src="https://img.shields.io/badge/Visual Studio Code-007ACC?style=flat&logo=Visual Studio Code&logoColor=white"/></a>
<img src="https://img.shields.io/badge/Git-F05032?style=flat&logo=Git&logoColor=white"/></a>
<img src="https://img.shields.io/badge/GitHub-181717?style=flat&logo=GitHub&logoColor=white"/></a>

<br /><br />

## 구현 내용 (과제 요구사항)

### ❗ 필수

- [ ] 영화 제목으로 검색이 가능해야 합니다!
- [ ] 검색된 결과의 영화 목록이 출력돼야 합니다!
- [x] 영화 제목으로 검색이 가능해야 합니다!
- [x] 검색된 결과의 영화 목록이 출력돼야 합니다!
- [ ] 단일 영화의 상세정보(제목, 개봉연도, 평점, 장르, 감독, 배우, 줄거리, 포스터 등)를 볼 수 있어야 합니다!
- [ ] 실제 서비스로 배포하고 접근 가능한 링크를 추가해야 합니다.
- [x] 실제 서비스로 배포하고 접근 가능한 링크를 추가해야 합니다.

### ❔ 선택

Expand All @@ -42,178 +60,12 @@ KDT기수번호_이름 | E.g, KDT0_ParkYoungWoong
- [ ] 영화 포스터가 없을 경우 대체 이미지를 출력하도록 만들어보세요.
- [ ] 영화 상세정보가 출력되기 전에 로딩 애니메이션이 보이도록 만들어보세요.
- [ ] 영화 상세정보 포스터를 고해상도로 출력해보세요. (실시간 이미지 리사이징)
- [ ] 차별화가 가능하도록 프로젝트를 최대한 예쁘게 만들어보세요.
- [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
}
```

응답 데이터 타입 및 예시:

```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"
}
```
### 아쉬운 점

- 영화 포스터 클릭 시 모달창과 해당 영화의 데이터를 연결하지 못함
- Sass(SCSS) 및 Styled-Components 제대로 활용하지 못함
- Components 분리 및 관리를 잘 하지 못함
- React를 제대로 이해하고 사용하지 못하여 다양한 기능을 구현하지 못함
31 changes: 31 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="./src/assets/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OMDb API 영화 검색</title>

<!-- OPEN GRAPH PROTOCOL -->
<meta property="og:type" content="website" />
<meta property="og:site_name" content="OMDb API 영화 검색" />
<meta property="og:title" content="OMDb API 영화 검색" />
<meta property="og:description" content="쉽고 간편하게 영화 정보를 찾아보세요!" />
<meta property="og:image" content="./src/assets/omdb.png" />
<meta property="og:url" content="https://zippy-sunflower-7a4e25.netlify.app/" />
<meta property="twitter:card" content="summary" />
<meta property="twitter:site" content="OMDb API 영화 검색" />
<meta property="twitter:title" content="OMDb API 영화 검색" />
<meta property="twitter:description" content="쉽고 간편하게 영화 정보를 찾아보세요!" />
<meta property="twitter:image" content="./src/assets/omdb.png" />
<meta property="twitter:url" content="https://zippy-sunflower-7a4e25.netlify.app/" />

<!-- Reset CSS CDN -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/reset.min.css">
<link rel="stylesheet" href="./src/index.scss">
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
4 changes: 4 additions & 0 deletions netlify.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
Loading