직접적인 page.tsx 파일이 없는 폴더는 실제 페이지 없이 그저 경로의 일부분이 될 뿐! , company라는 경로가 실제로 보이게 만들려면, 해당 폴더 안에서 page.tsx를 꼭 생성해야 한다.
매번 Nextjs에게 어떤 경로에서 어떤 컴포넌트를 불러오라고 말 해줄 필요가 없다. (react-router와 달리) 우리는 그저 폴더를 만들고 그 폴더를 보여주고 싶다면 그 폴더안에 Page 파일을 만든다.
사용자가 Url로부터 보게 될 요소는 page.tsx라는 것만 이해하자, 이 파일이 사용자가 해당 url에 접근했을 때 모든 걸 보여주는 요소이다.
nextjs가 application을 render하는 방식을 이해해야 하는데
=> 여기서 렌더링이란 nextjs가 우리의 react component를 가져와서 브라우저가 이해할 수 있는 Html로 변환하는 작업.
데이터가 잘 안되거나, 데이터가 잘 안터지는 곳에 있다면 모든 자바스크립트 파일을 다운로드받기 위해 오래 걸리고 아무 UI없는 빈 화면을 훨씬 더 오래볼것임.
SEO 최적화
구글은 페이지의 html을 보기 때문에 빈 페이지를 보여주지않는 것이 좋다. 가끔 구글이 페이지의 자바스크립트를 실행시키기도 하지만 위험감수하는 것보단 html에 실제 데이터가 들어가는게 낫겟지?
그리고 아마 다른 검색 엔진들은 페이지에서 자바스크립트를 실행시키지 않을것임 .모두 클라이언트 측에서. 자바스크립트를 로드하고 그 후에 자바스크립트가 UI를 빌드해
nextjs로 웹 사이트를 빌드할때는 자동적으로 기본값으로 서버사이드렌더링이 된다. 자바스크립가 활성화되어있지 않아도 사용자가 HTML을 볼수 있게된다는 것. 자바스크립트가 비활성화 되어있어도 잘 작동한다. 이 HTML을 보여주는데에는 자바스크립트가 필요 없기때문.
기억 해야할것은,
1. nextjs application의 모든 페이지 안의 모든 컴포넌트들은 nextjs가 그것들을 우선 서버에서 렌더한다는 것 . UI는 이미 빌드되어 있고 HTML도 이미 존재한다. 자바스크립트를 기다릴 필요가 없어 !!!
2. 모든 컴포넌트에 대해 발생한다는 것, 클라이언트 컴포넌트 서버컴포넌트 모두, useClient를 갖고 있는 컴포넌트이든 모든 컴포넌트는 우선 서버사이드렌더링. "use client"는 별로라고 생각한다.. 왜냐? => 사람들이 혼란스러워함. 이 컴포넌트는 서버 측에서가 아니라 클라인트 단에서만 렌더되는 것이라고 생각한다. 이보다 잘못된건 있을 수 없다? => 보다시피 컴포넌트가 백엔드 서버에서 렌더된다는 것을 알 수 있음 (자바스크립트 비활성화하니까 서버쪽 터미널에서 콘솔로그가 찍힘).
모든 컴포넌트와 페이지들은 먼저 백엔드에서 렌더되고 HTML로 변환될거, 그 HTML이 브라우저에 넘겨질것이다. 이건 좋다. 사용자들이 페이지에 접근해서 바로 UI를 볼 수 있으므로 .. !
자바스크립트 함수를 가져와서 브라우저가 이해할 수 있는 HTML로 변환하는 작업이다. 브라우저는 코드를 이해하지 못하기 때문에 이 코드를 가져다가 HTML로 변환해야 함. 그게바로 nextjs가 우리의 어플리케이션의 모든 컴포넌트와 페이지들에 대해 서버 측에서 먼저 하는 일이다. 그 HTML결과물이 브라우저에게 주어지는 거고, 그게 자바스크립트를 활성화하든 말든 상관이 없다.
= interactive 하게 된다는 것.
평범한 a태그는 없다.
click이 발생하게 되면 Link component가 처리하게 된다.
이 Link component는 clien side only navigation을 수행하고 있음.

-> about us가 있고 0이 쓰여진 버튼이 사용자에게 주어지고, 이게 현재 사용자가 볼 수 있는 유일하고, 기뻐하고, 즉시 뒤쪽에서 프레임워크를 로드하고 프레임워크가 initialize되는 때에 비로소 그 버튼은 우리가 만든 onClick eventListner가 연결된 버튼이 되는 것이다.
그리고 페이지는 interactive하게 될 것이고, 이게 바로 hydration process이다.
hydration은 단순 HTML을 React application로 초기화하는 작업이다.
먼저 0이쓰인것 외에 아무것도 없는 버튼을 받고 리액트를 초기화하여 온클릭을 부착해 여기 작성한 기능을 수행할 수 있도록한다 (상태나,, 클릭 등)
server side render된 지루한 초기 HTML들이 있고 사용자가 그 HTML을 얻으면 그 HTML위에 React application과 next.js application을 생성한다. 그 지루한 HTML을 interactive하게 하기 위해서이다.
이 hydration과정이 모든 컴포넌트에 대해 발생하지 않는다. 다시 말하면 server side render는 모든 컴포넌트에서 발생한다. 모든 컴포넌트들이 서버사이드에서 먼저 렌더된다.
client에서 hydrate되는 componentes는 , client에서 interactive 하게 만들어질 componentes는 오직 use client 지시어를 맨 위에 갖고있는 컴포넌트들 뿐이다.
그저 app을 프로그래밍하고 components를 만들면돼. 그러면 에러를 보게 될것이다.
=> 예를 들어 무언가에 useState를 하려고 하는데 use client를 쓰는 것을 잊어버렸다고 해보자.
그러면 오류가 발생해서 프레임워크가 '이봐 너 지금 useState사용하고 있어'라고 말해줄 것이다. 즉 이 컴포넌트가 interactive하다는 것이다.
=> 따라서 use client는 오직 client에서만 렌더된다는 것을 의미하지 않는다. 백엔드에서 렌더되고 프론트에서 htdrate 됨을 의미한다.
만약 프레임워크에게 어떤 컴포넌트가 인터랙티브 해지고 어떤 컴포넌트가 그저 멍청하고 지루한 HTML이 될지 말해주면 그건 사용자가 다운로드 받을 자바스크립트의 양이 적어지는 것이다.
사용자는 use client를 가진 컴포넌트의 자바스크립트 코드만 다운받게 되고 만약 use client가 없는 컴포넌트들은 서버 컴포넌트에 대한 자바스크립트 코드를 다시 다운로드 받을 필요가 없다.
이게 바로 SSR 과 hydration, 그리고 use client이론이다.
server component는 데이터 페칭을 할 때 엄청난 결과를 가져오기때문에 서버 컴포넌트를 사용하는 것은 매우좋다. . . 일반 리액트 .. .어플리케이션에서 비교하면 , useQuery, react query, swr, useState, useEffecty는 모두 끝난거라고 볼 수 있다. . .

레이아웃은 상쇄가 아닌 중첩. 서로 대체하지 않는다.
NextJS는 URL을 통해 폴더로 들어가서 그 폴더가 레이아웃이 있는지 확인하고 , 레이아웃이 있다면 그 레이아웃을 밖에 있는 다른 레이아웃 안에 렌더링해. 그래서 AboutUsLayout을 밖에 있는 레이아웃 (Layout)안에 렌더링 해준다.

위와 같이 괄호안에 쓴 폴더이름은, URL에 영향을 미치지 않는다. /home, /movies 또한 생성되지 않는다. (괄호가 감싸고 있는한, 프레임워크가 그것을 무시하고 URL이나 어떤 것도 수정하지 않을 것이다
metadata란, 꼭 내보내야 하는 object이고 메타데이터로 불린다.
- 페이지나 레이아웃만 메타데이터를 내보낼 수 있다!! , 컴포넌트에서는 metadata를 내보낼 수 없고 또 metadata는 서버 컴포넌트에만 있을 수 있고 클라이언트 컴포넌트에 있을 수 없다. **중요
=> 만약 메타데이터가 동적이면?
만약 페이지의 이름이 API에서 왔더라면?
/about-us는 dynamic routes가 아니다. 이건 동적이 아닌 정적 route이다. 정적 route는 항상 똑같이 보인다.
동적 라우트는 /movies/1231243 이런식으로 사용자가 입력한 숫자가 들어가거나 !
여기에 변수가 있다. 리액트 라우터를 써봤더라면 /movies/:id ---> Map으로 컴포넌트들을 보여줬다.
이 때 URL에 있는 ID를 가져오고 싶다면?

우리는 영화 상세 페이지에서 두 개의 종류 props을 얻을 수 있다. parameter와 searchParams.