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

[6주차] Team 포토그라운드 강다혜 & 이희원 미션 제출합니다. #12

Open
wants to merge 67 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
76e0a2e
Initial commit from Create Next App
psst54 Nov 6, 2024
dad518b
🚚 move: 필요 없는 파일 제거
psst54 Nov 7, 2024
f1c65b0
🛠️ build: styled-component 세팅
psst54 Nov 7, 2024
f3ff15f
💄 ui: screen 구성
psst54 Nov 7, 2024
33c26c7
💄 ui: normalize css
psst54 Nov 7, 2024
996a04a
✨ feat: 랜딩 구현
psst54 Nov 7, 2024
2d5ba28
📝 docs: add movie jpg
hiwon-lee Nov 7, 2024
c20ebf2
💄 ui: 전역 Container 스타일 추가
hiwon-lee Nov 7, 2024
7d0da88
✨ feat: RoundCard 컴퍼넌트 구현
hiwon-lee Nov 7, 2024
cf3525e
📝 docs: movie 이미지 변경
hiwon-lee Nov 8, 2024
3c5b0a1
💄 ui: fix 가운데 정렬
hiwon-lee Nov 8, 2024
ae53528
✨ feat: add card컴퍼넌트
hiwon-lee Nov 8, 2024
ebf281d
✅ test: 임시로 /home에서 Card컴퍼넌트 테스트
hiwon-lee Nov 8, 2024
07daf49
💄 ui: margin 삭제
hiwon-lee Nov 8, 2024
2d6f6c0
♻️ refactor: Card공통요소 모듈화
hiwon-lee Nov 8, 2024
5a767f2
♻️ refactor: 최상위 컨테이너 ScreenWrapper로 수정
hiwon-lee Nov 8, 2024
7eb85cb
💄 ui:tnb ui 구성
psst54 Nov 8, 2024
5d082dc
✨ feat: TNB 및 BNB 구현
psst54 Nov 8, 2024
401c5f6
🐛 fix: 스플래시 화면에서 bnb 숨기기
psst54 Nov 8, 2024
87c43f8
📝 docs: 아이콘 추가
hiwon-lee Nov 8, 2024
57783a6
✨ feat: 버튼 추가
hiwon-lee Nov 8, 2024
df97aa1
✨ feat: playNav추가
hiwon-lee Nov 8, 2024
21ea440
✨ feat: LargeGradientCard추가
hiwon-lee Nov 8, 2024
bc2f69f
✨ feat: 메인 화면 구현
hiwon-lee Nov 8, 2024
bfc1869
💡comment: 주석 삭제
hiwon-lee Nov 9, 2024
e32a2c3
💄 ui: 높이 고정 및 scroll
hiwon-lee Nov 9, 2024
4204ced
✨ feat: 버튼 추가
hiwon-lee Nov 8, 2024
00c844b
💡comment: 주석 삭제
hiwon-lee Nov 9, 2024
fd11b1c
✨ feat: main에 TNB반영
hiwon-lee Nov 9, 2024
9df0fff
💄 ui: BNB 고정
hiwon-lee Nov 9, 2024
b5f616a
💄 ui: TNX z-index앞으로
hiwon-lee Nov 9, 2024
14892ab
✨ feat: moviedbAPI 적용
hiwon-lee Nov 9, 2024
313e732
📝 docs: 사용할 env키 추가
hiwon-lee Nov 9, 2024
9e0c32b
✅ test: 테스트 하는 페이지 추가
hiwon-lee Nov 9, 2024
006198e
🚚 move: button타입 전역으로 이동
hiwon-lee Nov 9, 2024
82041ed
✨ feat: MovieProps 추가 적용
hiwon-lee Nov 9, 2024
69c5794
♻️ refactor: buttonProps추가
hiwon-lee Nov 9, 2024
a64a4cf
🎨 style: 절대경로로 수정
hiwon-lee Nov 9, 2024
665c390
🐛 fix: text-decoration none 으로 수정
hiwon-lee Nov 9, 2024
64d445f
♻️ refactor: 영화 데이터를 객체형으로 전달
hiwon-lee Nov 9, 2024
78052aa
✨ feat: topten 구현
hiwon-lee Nov 9, 2024
6306dc3
📝 docs: build.sh for vercel
hiwon-lee Nov 9, 2024
4bafa33
🔧 chore: 배포 설정파일
hiwon-lee Nov 9, 2024
a80f82a
🐛 fix: gem error 수정
hiwon-lee Nov 9, 2024
651e373
🐛 fix: secret key 이름수정
hiwon-lee Nov 9, 2024
f17680d
🐛 fix: eslinet안쓰는 변수 수정
hiwon-lee Nov 9, 2024
ac23f5f
💡comment: env api 주석삭제
hiwon-lee Nov 9, 2024
75c3bd3
✅ test: 테스트폴더 삭제
hiwon-lee Nov 9, 2024
91f8d48
📝 docs: readme 작성
psst54 Nov 9, 2024
e36559c
🚑 hotfix: 컴파일 에러 수정
psst54 Nov 12, 2024
cdc64be
🔧 chore(gitignore): .env 추가
psst54 Nov 12, 2024
0fa294a
🚚 move: 파일 이름 변경
psst54 Nov 12, 2024
35e7323
🎨 style: 파일 스타일 통일
psst54 Nov 12, 2024
fa7ec90
🎨 style: import 순서 정리
psst54 Nov 12, 2024
41e0530
✨ feat: ssr 적용
psst54 Nov 12, 2024
890d583
✨ feat: 영화 순서 섞기
psst54 Nov 12, 2024
8c0ecd1
💄 ui: bnb 높이 반영
psst54 Nov 12, 2024
e1f28b5
🚑 hotfix: type 에러 수정
psst54 Nov 12, 2024
ab26d9d
✨ feat: search param으로 데이터 받아오기
psst54 Nov 12, 2024
b3af8f1
💄 ui: tnb 설정 변경
psst54 Nov 13, 2024
06d0b0b
✨ feat: 검색 기능
psst54 Nov 13, 2024
7b11418
💄 ui: 검색 결과 표시
psst54 Nov 13, 2024
012648c
[fix] 필요 없는 코드 제거
psst54 Nov 13, 2024
8d50e90
✨ feat: detail page
psst54 Nov 13, 2024
45c7b12
Merge pull request #4 from psst54/main
psst54 Nov 16, 2024
b9bca77
Update README.md
hiwon-lee Nov 16, 2024
30dca8b
Update README.md
hiwon-lee Nov 16, 2024
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
3 changes: 3 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": ["next/core-web-vitals", "next/typescript"]
}
38 changes: 38 additions & 0 deletions .github/workflows/github-actions.yml

Choose a reason for hiding this comment

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

github action 저도 써보고 싶었는데 다음엔 시도해봐야겠어요👍👍

Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Push to another repo to deploy to Vercel

on:
push:
branches: [main, feature/moviedbapi]

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout the repository
uses: actions/checkout@v2

- name: Install dependencies (if needed for build script)
run: |
sudo apt-get update
sudo apt-get install -y ruby
sudo gem install mustache

- name: Run build script
run: sh ./build.sh

- name: Push output to another repository
uses: cpina/github-action-push-to-another-repository@main
env:
API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
with:
source-directory: 'output'
destination-github-username: 'hiwon-lee' # <- 여기에 대상 사용자 이름
destination-repository-name: 'next-netflix-20th' # <- 여기에 대상 리포지토리 이름
user-email: ${{ secrets.GIT_EMAIL }}
user-name: ${{ secrets.GIT_USERNAME }}
commit-message: ${{ github.event.commits[0].message }}
target-branch: main

- name: Test the output directory variable
run: echo $DESTINATION_CLONED_DIRECTORY
38 changes: 38 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js
.yarn/install-state.gz

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# local env files
.env*.local

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts

.env
8 changes: 8 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"singleQuote": true,
"semi": true,
"useTabs": false,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 80
}
158 changes: 99 additions & 59 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,101 @@
# 6주차 미션: Next-Netflix

## 서론

안녕하세요, 프론트 운영진 **김승완**입니다 🐶🍮

이번주는 저번주 과제를 이어 Netflix를 완성해봅시다. 이번주 과제의 목표는 지난주에 이어 figma로 주어지는 디자인을 사용해 스타일링을 하는 방법과 SSR에 익숙해지는 것입니다. 추가적으로 성능 최적화 방법에 대해서도 생각해보는 것도 좋을 것 같습니다.

이번주도 화이팅입니다~!!💪

## 미션

### 미션 목표

- Next.js 사용법을 공부해봅니다.
- Figma로 주어지는 디자인으로 스타일링 하는 방식에 익숙해집니다.
- Git을 이용한 협업 방식에 익숙해집니다.
- 프론트엔드와 백엔드 시스템에 대한 흐름을 이해합니다.

### 기한

- 2024년 11월 09일 토요일(기한 엄수)

### 필수 요건

- [결과화면](https://next-netflix-18th-2.vercel.app/)의 상세 페이지와 검색 페이지를 구현합니다.
- 상세 페이지는 동적 라우팅을 이용해 구현합니다.
- 검색 페이지는 실시간 키워드 검색으로 구현합니다.
- [Figma](https://www.figma.com/file/UqdXDovIczt1Gl0IjknHQf/Netflix?node-id=0%3A1)의 디자인을 그대로 구현합니다.
- **SSR**을 적용해서 구현합니다.
- Open api를 사용해서 데이터 패칭을 진행합니다. (ex. [themoviedb API](https://developers.themoviedb.org/3/getting-started/introduction))

### 선택 사항

- 검색 페이지 무한스크롤을 구현합니다.
- 검색 페이지 스켈레톤 컴포넌트를 구현합니다.
- 성능 최적화를 위한 방법을 적용해봅니다.

## **Key Question**

- React 18 버전의 변경점에 대해 설명해주세요.(+ 19 버전에 대한 추가 설명도 좋습니다)
- 서버 컴포넌트와 클라이언트 컴포넌트
- lazy loading과 Suspense 컴포넌트
- automatic batching, 동시성 모드 등 추가적으로 더 설명해주셔도 됩니다!
- nextJS 13 이후의 app routing 방식의 특징과 기능에 대해 설명해주세요.
- 13 이전의 페이지 라우팅과의 디렉터리 구성 변화
- nextJS가 백엔드 시스템을 녹여내는 방법
- 패러랠, 인터셉팅 라우트란 무엇인가?
- nextJS에서 SSR, SSG를 구현하는 방법
- vercel, netlify 같은 호스팅 플랫폼의 특징과 내부 구현 원리에 대해 설명해주세요(+ aws의 스토리지와 인스턴스 등 생태계에 대해서도 알려주세요)

## 링크 및 참고자료

- [useCallback과 React.Memo를 이용한 렌더링 최적화](https://velog.io/@yejinh/useCallback%EA%B3%BC-React.Memo%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%B5%9C%EC%A0%81%ED%99%94)
- [성능 최적화](https://ui.toast.com/fe-guide/ko_PERFORMANCE)
- [더 나은 UX를 위한 스켈레톤 UI 만들기](https://ui.toast.com/weekly-pick/ko_20201110)
- [React에서 무한 스크롤 구현하기](https://tech.kakaoenterprise.com/149)
- [React 18의 새로운 기능](https://www.youtube.com/watch?v=7mkQi0TlJQo)
- [react 서버 컴포넌트가 해결하는 문제들 in kakao 기술 블로그](https://tech.kakaopay.com/post/react-server-components/)
- [vercel의 배포 방식](https://www.youtube.com/watch?v=8q-jCvLWwKc&t=11s)
- [클라우드 전반의 이해](https://www.youtube.com/watch?v=YSudWlx0o9I)
# 결과물

- [베포 링크](https://next-netflix-20th-five.vercel.app/)

# Key Questions

### 무한 스크롤과 `Intersection Observer API`의 특징에 대해 알아봅시다.

무한 스크롤
무한 스크롤은 스크롤을 무한으로 할 수 있는 기능이다.
페이지 최하단에 도달했을 때 신규 콘텐츠를 로드하는 식으로 무한 스크롤이 구성된다.
이 전에는 페이지네이션을 활용해 콘텐츠를 확인하는 방식을 사용했다.

무한스크롤의 장점 : 별도의 추가 동작이 필요하지 않음.
무한스크롤의 단점 : 한 페이지 내에 많은 콘텐츠가 로드 되므로, 페이지 성능이 느려진다. 많은 컨텐츠 로드 후, 눈여겨봤던 콘텐츠로 다시 돌아가기 어렵다.

Intersection Oberserver API
해당 API는 무한 스크롤을 구현할 수 있도록 돕는다.
Intersection Oberserver(교차 관찰자)는 요소(Element)가 뷰포트(ViewPort)와 교차하고 있는 지 감지한다. 즉, 관찰 중인 요소가 사용자가 보는 화면 영역 내에 들어왔는 지 알려준다.

객체 생성
```js
new Intersection Observer(callback, options)
```
객체 생성 시 root(관찰 대상이 화면에 들어왔음을 감지하는 영역), rootMargin(감지 영역을 바깥 범위까지 확장), threshold(관찰 대상이 화면 내 얼마나 들어왔을 때 콜백 함수를 콜백할 지) 등의 값을 작성하면 된다.

### `tanstack query`의 사용 이유(기존의 상태 관리 라이브러리와는 어떻게 다른지)와 사용 방법(reactJS와 nextJS에서)을 알아봅시다.

tanstack query(이전 이름 : React Query)
웹 애플리케이션에서 데이터 가져오기, 캐싱 동기화 및 서버 상태 업데이트를 간편하게 만들어주는 리액트 라이브러리다.
즉, React에서 API 요청과 상태 관리를 쉽게 해주는 도구다.
React나 Next.js와 함께 사용하는 경우 서버에서 데이터를 효율적으로 가져오고 캐싱 및 동기화를 관리할 수 있게 해준다.


| 특징 | TanStackQuery | 상태관리 라이브러리 |
| ---------------- | -------------------------- | ------------------------------- |
| **사용 목적** | 서버 상태 관리 (API 데이터 패칭, 캐싱) | 클라이언트 상태 관리 |
| **주요 기능** | 데이터 패칭, 캐싱, 무효화, 동기화, 리트라이 | 애플리케이션의 전역 상태 관리 |
| **복잡성** | 간단 (비동기 로직 추상화) | 상태 및 비동기 로직 직접 구현 필요 |
| **리덕스 미들웨어 필요성** | 불필요 | 필요 (예: Redux-Thunk, Redux-Saga) |
| **캐싱 지원**<br> | 지원<br> | 직접 구현 필요<br> |

[ReactJS, Next.js에서의 사용]

ReactJS :
- CSR을 기본으로 동작하며, 데이터는 클라이언트에서 fetching

Next.js :
- SSR이나 SSG(Static-Site Generation)을 활용해 초기 상태를 서버에서 준비할 수 있다.
- Hydrate로 서버에서 패칭한 데이터를 클라이언트에 주입한다.

[사용 방법]

- 데이터 캐싱
- 항상 쿼리 키를 지정해 데이터를 가져온다. 이 쿼리 키를 통해 캐시된 데이터를 사용할 지, 새로운 데이터를 가져올 지를 판단한다.
- 데이터의 신선도
- 캐시한 데이터를 fresh | stale 상태로 구분해 관리한다.
- fresh -> 데이터 사용
- stale -> 서버에 다시 요청해 신선한 데이터를 가져온다.
- staleTime : 데이터가 상하는 데까지 걸리는 시간
- isStale : fresh | stale 판단
```tsx
import { useQuery } from '@tanstack/react-query'
export default function DelayedData() {
const { data, isStale } = useQuery({
queryKey: ['delay'],
queryFn: async () => (await fetch('https://api.heropy.dev/v0/delay?t=1000')).json(),
staleTime: 1000 * 10 // 10초 후 상함. 즉, 10초 동안 신선함.
})
return ( <>
<div>데이터가 {isStale ? '상했어요..' : '신선해요!'}</div>
<div>{JSON.stringify(data)}</div>
</> )
}
```
### 기본적인 git add, commit, push, pull, merge, rebase 등의 명령어에 대해 알아봅시다(+ git branch 전략이나 다른 git 명령어도 좋습니다!)


**Git에서의 흐름**을 기준으로 git 명령어에 대해 설명한다.
1. **작업 디렉토리 (Working Directory)**:
- 실제로 코드 작업을 하는 디렉토리다.
- 파일을 생성하거나 수정하면, 변경 사항은 "Tracked" 상태(추적 중) 또는 "Untracked" 상태(추적되지 않음)가 된다.
2. **스테이징 영역 (Staging Area)**:
- 변경된 파일을 `git add` 명령어로 스테이징 영역에 올립니다.
- 스테이징된 파일만이 commit 대상이 됩니다.
3. **로컬 리포지토리 (Local Repository)**:
- 스테이징 영역의 변경 사항을 `git commit` 명령어로 로컬 리포지토리에 저장
4. **원격 리포지토리 (Remote Repository)**:
- 로컬 리포지토리에서 커밋된 내용을 `git push`로 원격 리포지토리에 업로드

**Merge와 Rebase**
특히 협업 할 때 중요하 쓰인다.

|**특징**|**Merge**|**Rebase**|
|---|---|---|
|**히스토리**|병합 커밋 생성, 브랜치 구조 유지|히스토리가 직선으로 재배치됨|
|**커밋 내역 확인**|브랜치별 작업 흐름이 명확히 보임|히스토리가 깔끔하고 간단해짐|
|**협업 안전성**|충돌 관리가 비교적 쉬움|충돌 발생 시 작업 복잡도가 증가|
|**사용 사례**|협업 중 공유된 브랜치에서 병합 시 사용|개인 작업 정리 또는 feature 브랜치 정리 시 사용|
4 changes: 4 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
cd ./
mkdir output
cp -R ./next-netflix-20th/* ./output
cp -R ./output ./next-netflix-20th/
16 changes: 16 additions & 0 deletions next.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
compiler: {
styledComponents: true,
},
images: {
domains: ['image.tmdb.org'], // 여기에 도메인 추가
},
env: {
API_KEY: process.env.API_KEY,
API_URL: process.env.API_URL,
IMAGE_BASE_URL: process.env.IMAGE_BASE_URL,
},
};

export default nextConfig;
Loading