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주차] ForgetMeNot 미션 제출합니다. #12

Open
wants to merge 92 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
6cec7e8
feat : next.js 세팅
JeeeunOh Nov 7, 2022
240f742
feat : readMe 수정
JeeeunOh Nov 7, 2022
6ab37a5
feat : nextJS로 app 세팅
JeeeunOh Nov 7, 2022
c921076
fix : 쓸데없는 코드 다 지우기
JeeeunOh Nov 7, 2022
010591d
feat : 라우터 구성
JeeeunOh Nov 7, 2022
903c49a
(chaeyeon) style: change global.css
chaeyeonan Nov 7, 2022
1c4d617
(chaeyeon) style: change container/main css
chaeyeonan Nov 7, 2022
9a6ea9a
feat : 네비게이터 png 추가
JeeeunOh Nov 7, 2022
530be51
feat : styled-components 세팅
JeeeunOh Nov 7, 2022
4ae25d3
Merge remote-tracking branch 'origin/chaeyeon' into 0909oje
JeeeunOh Nov 7, 2022
8a26c58
fix : 네비게이터 작업중
JeeeunOh Nov 7, 2022
2c8cb9b
feat: detail page 초안
chaeyeonan Nov 7, 2022
90e4fc5
feat : 네비게이션 바 추가
JeeeunOh Nov 7, 2022
c31c476
fix : 라우터 링크 리스트 삭제
JeeeunOh Nov 7, 2022
70becae
영화 카테고리 컴포넌트 생성
JeeeunOh Nov 7, 2022
d4d0251
feat : 메인영화 밑 버튼 세팅
JeeeunOh Nov 7, 2022
4ba5335
feat: search page 초안
chaeyeonan Nov 8, 2022
aeec980
ongoing: png -> svg
chaeyeonan Nov 8, 2022
2b1e0a9
ongoing: import svg
chaeyeonan Nov 8, 2022
8ae3560
fix : svg 적용
JeeeunOh Nov 8, 2022
e0830e1
fix : 이미지 svg로 변경
JeeeunOh Nov 8, 2022
88ae9e3
feat : 애니메이션 2초 보여주고 home 진입
JeeeunOh Nov 8, 2022
b6bc589
fix : 애니메이션 지속 시간 수정
JeeeunOh Nov 8, 2022
6e69797
svg 이미지 경로 변경
chaeyeonan Nov 9, 2022
355fa26
fix: icon 확장자 svg로 변환
chaeyeonan Nov 9, 2022
87fc34e
fix : 커밍쑨, 다운로드 작동 안하게 수정
JeeeunOh Nov 9, 2022
e41ddb2
feat : preview 이미지 서버에서 가져옴
JeeeunOh Nov 9, 2022
55227de
feat : info 안에 영화 데이터 배열 담기
JeeeunOh Nov 9, 2022
7cc63a5
feat : 카테고리별로 다른 사진 뜨게 설정
JeeeunOh Nov 9, 2022
9196de5
feat : home -> detail 연결
JeeeunOh Nov 9, 2022
e7f9557
fix : 네비게이터에서 detail 페이지 삭제
JeeeunOh Nov 9, 2022
14c2bd2
chore : 쓸데없는 주석 삭제
JeeeunOh Nov 9, 2022
7644abd
Merge branch 'chaeyeon' into 0909oje
JeeeunOh Nov 9, 2022
bb9c0f7
fix : 로고 수정
JeeeunOh Nov 9, 2022
158e4a1
feat: search page api 연결
chaeyeonan Nov 9, 2022
6ed3655
fix : 영화 이미지 비율 수정
JeeeunOh Nov 9, 2022
ac163a8
fix : 이미지 파일들 asset/img/로 이동
JeeeunOh Nov 9, 2022
6ad82f8
feat: 검색 기능 완료
chaeyeonan Nov 9, 2022
bdd7edb
fix : 글씨 css 수정
JeeeunOh Nov 9, 2022
a2b0fb3
Merge branch 'chaeyeon' into 0909oje
JeeeunOh Nov 9, 2022
12f05dd
fix : 폴더구조 바꾼것 반영
JeeeunOh Nov 9, 2022
471e5fc
feat: search 리스트에서 detail 연결
chaeyeonan Nov 9, 2022
0055d72
fix: 필요없는 이미지 삭제
chaeyeonan Nov 9, 2022
4f84a71
우당탕탕
JeeeunOh Nov 9, 2022
d722164
feat : pageProps
JeeeunOh Nov 9, 2022
434f1db
for pull
chaeyeonan Nov 9, 2022
75d5d02
Merge branch '0909oje' of https://github.com/ForgetMeNot-FE/next-netf…
chaeyeonan Nov 9, 2022
acc385f
feat: search page getServerSideProps
chaeyeonan Nov 9, 2022
390ea6e
fix: change search api path
chaeyeonan Nov 9, 2022
75d0321
feat : api 연결 완료
JeeeunOh Nov 9, 2022
38b13d2
Merge branch 'chaeyeon' into 0909oje
JeeeunOh Nov 9, 2022
4cdb9d5
feat : merge
JeeeunOh Nov 9, 2022
3ce4ccc
fix : roundImg 이미지 깨짐 수정
JeeeunOh Nov 9, 2022
1465197
feat : detail 페이지 SSR 적용
JeeeunOh Nov 10, 2022
fd61a58
fix : 쓸데없는 코드 삭제
JeeeunOh Nov 10, 2022
d5ddeeb
fix : 라운드 이미지 깨짐 수정
JeeeunOh Nov 10, 2022
b958cf6
fix : title 폰트사이즈 수정
JeeeunOh Nov 10, 2022
e1c4601
Update README.md
JeeeunOh Nov 10, 2022
00317a1
Update README.md
JeeeunOh Nov 10, 2022
afe699f
feat: for pull
chaeyeonan Nov 11, 2022
921b60c
fix: image 파일 경로 변경 & naviagtion 수정
chaeyeonan Nov 11, 2022
ebc0a5a
feat: 서치페이지 부분 스크롤 추가
chaeyeonan Nov 11, 2022
e821fed
fix: 전체적인 디자인 수정
chaeyeonan Nov 11, 2022
b96b93c
fix: 쓸데없는 코드 수정
chaeyeonan Nov 11, 2022
9cfd602
Merge pull request #1 from ForgetMeNot-FE/chaeyeon
chaeyeonan Nov 11, 2022
3100f69
fix: key 오류 수정
chaeyeonan Nov 11, 2022
003f91a
fix: key 오류 수정
chaeyeonan Nov 11, 2022
b070641
Merge pull request #2 from ForgetMeNot-FE/chaeyeon
chaeyeonan Nov 11, 2022
9d2e7f4
fix: 마지막 key 수정이길..
chaeyeonan Nov 11, 2022
13ed30a
Merge pull request #3 from ForgetMeNot-FE/chaeyeon
chaeyeonan Nov 11, 2022
635c68b
fix: 진짜진짜 마지막 key 오류 수정
chaeyeonan Nov 11, 2022
4d99757
Merge pull request #4 from ForgetMeNot-FE/chaeyeon
chaeyeonan Nov 11, 2022
d1610a1
fix: 진짜 최종
chaeyeonan Nov 11, 2022
74ade68
Merge pull request #5 from ForgetMeNot-FE/chaeyeon
chaeyeonan Nov 11, 2022
d5015f5
fix : api 관련 변수들 api-info에 모아놓기
JeeeunOh Nov 12, 2022
92cd03c
:bug: 되나?
JeeeunOh Nov 13, 2022
926c064
feat : 메인화면 랜덤이미지 + 상세화면 연결
JeeeunOh Nov 15, 2022
da9e1ad
feat : search 페이지 api 연결
JeeeunOh Nov 15, 2022
02e5f4f
feat : 실시간 연결
JeeeunOh Nov 16, 2022
ec726dd
feat: ongoing dynamic routing
chaeyeonan Nov 16, 2022
9519be6
Merge branch 'master' of https://github.com/ForgetMeNot-FE/next-netfl…
chaeyeonan Nov 16, 2022
59edb85
feat : 동적라우팅
JeeeunOh Nov 16, 2022
a4a8576
for pull
chaeyeonan Nov 16, 2022
845a29e
Update README.md
chaeyeonan Nov 17, 2022
1edea0b
feat : 진짜 실시간
JeeeunOh Nov 17, 2022
d04bf9a
fix : search 페이지 들어가면 popular 기본으로 뜨게 수정
JeeeunOh Nov 17, 2022
7cb424a
정리 push
chaeyeonan Nov 17, 2022
63b988c
fix: 쓸데없는 코드 삭제 & merge 해결
chaeyeonan Nov 17, 2022
2cd79e0
Merge branch 'master' into chaeyeon
chaeyeonan Nov 17, 2022
a7921c3
Merge pull request #6 from ForgetMeNot-FE/chaeyeon
chaeyeonan Nov 17, 2022
51ba36e
Update README.md
chaeyeonan Nov 18, 2022
4d79c6c
Update README.md
chaeyeonan Nov 18, 2022
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
4 changes: 4 additions & 0 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"presets": ["next/babel"],
"plugins": [["styled-components", { "ssr": true }]]
}
55 changes: 55 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,58 @@
### 실행방법
npm run dev

## 6주차 Key Questions

### 1. Static Routing / Dynamic Routing

#### (1) Static Routing (정적 라우팅)
Router(라우터)에게 필요한 정보들을 수동으로 사전 입력해야 한다.
고정된 페이지로 라우팅되기 때문에 누가 언제 접속하더라도 같은 페이지로 라우팅된다.

#### (2) Dynamic Routing (동적 라우팅)
Routing Table(라우팅 테이블)에서 현재 상태에 따라 경로를 자동 조정하는 것이다.
가변적인 페이지로 라우팅되기 때문에 실제 소스코드는 한 페이지지만 글 번호나 글의 id에 따라서 주소가 변경된다.
Next.js에서 동적 라우팅 시, 대괄호 안에 들어있는 문구는 변수의 기능을 한다.
라우터 객체를 이용해 이 변수의 값을 지정해줄 수 있으며, 이 변수는 문서 내에서 자유롭게 활용이 가능하다.

### 2. 성능최적화를 위해 사용한 방법

1. 내부 스타일시트 사용 : styled-component 를 이용한 내부 스타일링
2. 중복 코드 제거 : 중복되는 값은 props를 이용 & 외부 컴포넌트로 분리하여 재사용
3. 필요한 함수만 가져오기 : 실행하지 않는 함수 정리
4. ssr 렌더링 : 사용자가 js이 렌더링 하기 전 볼 수 있게함


## 5주차 Key Questions

### 1. Server Side Rendering과 Client Side Rendering의 차이

#### Server Side Rendering
SSR은 클라이언트가 웹 페이지를 렌더링하는 것이 아니라 서버에서 웹 페이지를 생성해서 클라이언트는 이를 가져와서 띄우는 방법이다.
서버에서 웹 페이지 정보를 모두 가지고 있기 떄문에 서버가 무거워지고 서버 비용이 증가한다는 단점이 있으나
서버가 가지고 있는 웹 페이지 정보를 검색엔진이 인식할 수 있기 때문에 SEO를 통해 네이버, 구글 등에 웹 페이지가 쉽게 노출될 수 있다는 장점이 있다.

#### Client Side Rendering
서버는 클라이언트에게 HTML, JS 정보만 보내주고 클라이언트가 이를 받아 브라우저에서 직접 페이지를 렌더링하는 방법이다.
서버가 가벼워지고 서버의 성능에 신경쓰지 않고 페이지를 개발할 수 있다는 장점이 있으나
클라이언트가 직접 페이지를 렌더링하기 때문에 페이지의 초기 로딩 시간이 길고 SEO가 잘 되지 않는다는 단점이 있다.

### 2. SEO란
SEO란 검색 엔진 최적화를
이 SEO를 위해 개발자는 구글, 네이버 등에 자신의 페이지가 상위에 노출되기 위해
태그, 링크 구조를 개선하여 검색 엔진이 자신의 페이지를 잘 검색할 수 있도록 해야한다.

#### SEO를 위한 작업들
1. <title> 태그 안에 너무 긴 텍스트를 넣지 않고 모든 웹페이지의 title에 단일한 제목을 사용하지 않아야 한다.
2. <description> 태그 안의 요소는 자신의 웹페이지가 노출되었을 때 제목 바로 밑에 뜨는 한 두줄 정도의 요약 문장을 의미한다.
가독성을 고려해서 작성하자.
3. Open Graph 태그 안의 요소는 웹 페이지가 공유될 때 어떻게 노출될지를 알려준다.
이 요소를 잘 정의해놓아야 트래픽이 증가하고 이런 트래픽 증가는 검색 상위 노출을 위한 평가에 영향을 준다.

### 3. 전반적인 협업 과정
이번 협업에서는 깃허브에서 organization을 생성한 후 레포 안에서 각자 브랜치를 생성해 각자 맡은 부분을 개발한 후 주기적으로 머지하는 방식으로 진행하였다.


# 5주차 미션: Next-Netflix

## 서론
Expand Down
3 changes: 3 additions & 0 deletions app/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "next/core-web-vitals"
}
36 changes: 36 additions & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

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

# local env files
.env*.local

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
34 changes: 34 additions & 0 deletions app/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).

## Getting Started

First, run the development server:

```bash
npm run dev
# or
yarn dev
```

Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.

[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.

The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.

## Learn More

To learn more about Next.js, take a look at the following resources:

- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.

You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!

## Deploy on Vercel

The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.

Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
3 changes: 3 additions & 0 deletions app/asset/api-info.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const api = "https://api.themoviedb.org/3";
export const apiKey = 'dfc5ce9cefd9cafb067049fffa0be4e3';
export const imgPath = "https://image.tmdb.org/t/p/w500";
17 changes: 17 additions & 0 deletions app/component/hooks/useInput.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import React, { useState } from "react";

function useInput(initialText: string) {
Copy link

@heeeesoo heeeesoo Nov 20, 2022

Choose a reason for hiding this comment

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

인풋 과정을 따로 custom 훅으로 만드는 거 좋네용 나중에 플젝할 때 적용해봐야겠어요!😤

const [text, setText] = useState(initialText);

const handleChange = (e: React.ChangeEvent<HTMLInputElement>): void => {
Copy link

Choose a reason for hiding this comment

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

changeEvent 타입은 처음 보는 것 같아요! 배워갑니다 ㅎㅎ

setText(e.target.value);
};

const resetText = (): void => {
setText("");
};

return { text, handleChange, resetText };
}

export default useInput;
81 changes: 81 additions & 0 deletions app/component/navigation/footer.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import styled from "styled-components";
import Link from "next/link";
import Image from "next/image";
import { useRouter } from "next/router";

const naviList = [
{ id: 0, src: "navi1", text: "Home", link: "/home" },
{ id: 1, src: "navi2", text: "Search", link: "/search" },
{ id: 2, src: "navi3", text: "Coming Soon", link: "" },
{ id: 3, src: "navi4", text: "Downloads", link: "" },
{ id: 4, src: "navi5", text: "More", link: "" },
];

const Navigator = () => {
const pathName = useRouter();

return (
<Container>
<>
{naviList.map((item, idx) => (
<NaviContainer>
<Link href={item.link} key={idx}>
{pathName.pathname === item.link ? (
<>
Copy link

Choose a reason for hiding this comment

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

빈 태그를 이용하신 이유가 따로 있으실까요 ?!

<Image
src={`/img/navigator/select_${item.src}.svg`}
Copy link

Choose a reason for hiding this comment

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

선택여부에 따라 아이콘 색이 바뀌는걸 이렇게 표현하는 방법도 있었군요 !

alt="navi"
width={20}
height={20}
key={idx}
/>
Comment on lines +25 to +31
Copy link

@heeeesoo heeeesoo Nov 20, 2022

Choose a reason for hiding this comment

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

이번 과제 때 그냥 img 태그 썼었는데 next/image 구글링해보니까 nextjs 쓸때는 Image가 이미지를 최적화해서 구글 검색엔진에 노출되기 유리하도록 만든다고 하네요 담부터 image 써봐야겠어요..!!!

<NaviText color="#fffff" key={idx}>
{" "}
{item.text}{" "}
</NaviText>
</>
) : (
<>
<Image
src={`/img/navigator/${item.src}.svg`}
alt="navi"
width={20}
height={20}
key={idx}
/>
<NaviText key={idx}> {item.text} </NaviText>
</>
)}
</Link>
</NaviContainer>
))}
</>
</Container>
);
};

export default Navigator;

const Container = styled.div`
display: flex;
justify-content: space-between;
width: 400px;
height: 4rem;
background-color: #121212;
position: fixed;
bottom: 0;
`;
const NaviContainer = styled.div`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
padding: 1rem;
`;

const NaviText = styled.div<{ color?: string }>`
font-size: 0.7rem;
margin-top: 0.2rem;
color: ${(props) => props.color || "#878787"};
`;
32 changes: 32 additions & 0 deletions app/component/navigation/header.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import styled from "styled-components";

const Header = () => {
return (
<HeaderWrap>
<Logo src="/img/home/logo.png" />
<HeaderText href="#"> TV shows </HeaderText>
<HeaderText href="#"> Movies </HeaderText>
<HeaderText href="#"> My List </HeaderText>
</HeaderWrap>
);
};

export default Header;

const HeaderWrap = styled.div`
display: flex;
justify-content: space-between;
align-items: center;
width: 380px;
height: 5rem;
z-index: 99;
padding: 1rem 1rem 0 0;
`;
const Logo = styled.img`
height: 3.5rem;
width: 3.5rem;
`;
const HeaderText = styled.a`
font-size: 1.1rem;
font-weight: 400;
`;
29 changes: 29 additions & 0 deletions app/component/playBtn.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import Image from "next/image";
import styled from "styled-components";

const PlayBtn = ({ width }: { width: number }) => {
Copy link

Choose a reason for hiding this comment

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

엇 Typescript를 프로젝트에 적용하면서 매번 PlayBtnProps 인터페이스를 만들었었는데 이런 간단한 방법이 있었다니.. 몰랐습니다

return (
<Play width={width}>
<PlayImg src="/img/icons/play.svg" alt="playbtn" width={18} height={21} />
<div>Play</div>
</Play>
);
};

export default PlayBtn;

const Play = styled.button<{ width?: number }>`
width: ${(props) => props.width || 320}px;
height: 45px;
border: none;
border-radius: 0.4rem;
background: rgb(196, 196, 196);
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
font-weight: 600;
`;
const PlayImg = styled(Image)`
margin-right: 0.7rem;
`;
31 changes: 31 additions & 0 deletions app/component/search/searchItem.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import styled from "styled-components";
import Image from "next/image";
import {imgPath} from "../../asset/api-info";

const SearchItem = ({ imgSrc, name }: { imgSrc: string; name: string }) => {
Copy link

Choose a reason for hiding this comment

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

props가 두개 이상일때는 interface를 선언하는 방법도 좋을 것 같습니다 !

return (
<ItemWrap>
<img src={`${imgPath}/${imgSrc}`} style={{ width: "146px" }} />
<ItemTitle>{name}</ItemTitle>
<Image src="/img/icons/play2.svg" alt="close" width={24} height={24} />
</ItemWrap>
);
};

export default SearchItem;

const ItemWrap = styled.div`
width: 400px;
height: 76px;
display: flex;
align-items: center;
overflow: hidden;
background: rgb(66, 66, 66);
margin: 2.5px 0;
`;

const ItemTitle = styled.div`
width: 215px;
padding-left: 20px;
font-size: 15px;
`;
7 changes: 7 additions & 0 deletions app/next.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
};

module.exports = nextConfig;
Loading