React 기반의 웹 프레임워크로, 서버 사이드 렌더링(SSR), 정적 사이트 생성(SSG), API 라우트, 이미지 최적화 등 다양한 기능을 제공하여 React 애플리케이션 개발을 더 쉽고 효율적으로 만들어준다.
그럼, Next.js와 React.js의 차이점은 ?
우리가 쉽게 알고 있는 건 React.js는 라이브러리, Next.js는 프레임워크 이다.
프레임워크 : 프레임워크는 애플리케이션의 기본 구조를 제공하는 소프트웨어 플랫폼이다. 개발자는 프레임워크의 규칙과 구조를 따르며, 프레임워크가 제공하는 기능을 사용하여 애플리케이션을 개발하게 된다.
라이브러리 : 특정 기능이나 작업을 수행하기 위한 코드 집합이다. 라이브러리는 애플리케이션에서 필요한 기능을 모듈화하여 제공하게 된다.
---> 개발자는 라이브러리를 필요에 따라 호출하여 특정 작업을 수행하게 된다.
요약
프레임워크:
제어의 역전 (Inversion of Control, IoC)은 소프트웨어 디자인에서 중요한 개념으로, 프로그램의 제어 흐름을 개발자가 아닌 프레임워크나 컨테이너가 관리하도록 하는 원칙이다. 이 원칙은 개발자가 직접 애플리케이션의 흐름을 제어하는 대신, 프레임워크나 컨테이너가 그 흐름을 제어하고 개발자가 필요한 기능을 제공하는 방식으로 작동한다.
라이브러리:
파일을 하나 생성한 뒤, vscode에서 열어본 뒤, 터미널에
npm install react@latest next@latest react-dom@latest를 입력하면 된다!
그럼 이렇게 설치가 된 것을 확인할 수 있고, Next.js의 개발 서버를 시작하기 위해 npm dev를 정의해주면 된다.
Next.js는 npm run dev를 실행하는 순간, app/page.tsx 파일을 찾아서 렌더링한다. (자동으로 Next.js는 프레임워크로써 app 폴더를 참조하게 된다)

app 폴더에 page.tsx를 간단하게 만들어 본 뒤, npm run dev를 실행해본 결과,
"너 타입스크립트 사용하려고 하는구나?" 하면서 타입스크립트에 관한 모듈을 설치해주었다..!
(Next.js는 TypeScript와 관련된 패키지들이 설치되어 있지 않다는 것을 인식하고, 필요한 패키지를 자동으로 설치해준다. )

그와 동시에 layout.tsx를 자동 설치가 되었다.
layout.tsx의 역할 :
레이아웃 정의: layout.tsx 파일은 애플리케이션의 기본 HTML 구조를 정의한다. 이 파일에 정의된 HTML 구조는 모든 페이지에서 공유하게 된다.
그럼 왜 자동생성이 된걸까? :
Next.js는 개발자에게 기본적인 설정을 제공하고, 개발자가 애플리케이션을 효율적으로 구성할 수 있도록 돕기 위해 layout.tsx 파일을 자동으로 생성을 도와준다.
바로 폴더 생성 -> 폴더 안에 page.tsx 파일 존재
한다면, router가 자동 생성되고, 해당 router에 page.tsx를 보여주게 된다.
이게 무슨 말이냐..?
리액트에서는 react-router-dom로 '/home'에는 <Home/>컴포넌트 렌더링할거야 라고 지정해서 알려줬다면 <Route path="/home" element={<Home />} /> , Next.js에서는 정말 단순하게 폴더를 생성하고, 해당 폴더에서 렌더링 해야 될 페이지가 있다면, page.tsx를 만들면 된다..!
예를 들어, app/home/page.tsx 파일을 생성하면, http://localhost:3000/home URL에서 이 페이지를 렌더링한다.
app/about/page.tsx 파일을 생성하면, http://localhost:3000/about URL에서 이 page.tsx를 렌더링한다.

우리는 지금 http://localhost:3000/about-us 를 생성했다 그럼,
http://localhost:3000/about-us/company/sales를 렌더링하려면 어떻게 해야하냐!

이렇게
app > about-us > company > sales > page.tsx 파일을 생성하면 된다.
그럼 이렇게 sales 폴더에 작성한 page.tsx가 화면에 렌더링 되는 것을 확인할 수 있다.
Next.js에서는 파일 기반 라우팅을 통해 폴더와 파일 구조를 사용하여 라우트를 정의하게 된다.
Wow... 진짜 놀랍다
설명 요약
그럼, company도 폴더로 설정했으면, 화면에 나오나?
아니다. 404 오류 화면이 뜨는 것을 확인할 수 있다.
폴더만 생성이 되고, page.tsx 파일이 없다면, 단순히 경로로만 설정이 된다.
폴더 생성: : 폴더를 생성하는 것만으로도 해당 경로를 정의할 수 있다.
app/about-us/company 폴더를 생성하면, http://localhost:3000/about-us/company URL 경로가 자동으로 정의된다.
page.tsx 파일이 없는 경우: 해당 폴더 안에 page.tsx 파일이 없으면, Next.js는 빈 페이지를 렌더링한다.
사용자는 이 URL로 접근할 때, 페이지의 내용이 없거나, 페이지를 찾을 수 없다는 메시지가 표시된다.
만약, 잘못된 주소를 입력한다면 ?
--> 기존의 Next.js에서는
404라는 오류 페이지를 보여준다.
그럼 내가 Not Found!라는 파일을 만들어서 주소를 잘 못 입력했을 때, 보여줄 수 있을 까?
--> 가능하다!
app 파일 안에, not-found라는 폴더를 생성하고, 간단하게 "Not Found!" 라는 문구를 간단하게 보여주고 서버를 재시작 하면,
잘못 입력한 주소는 내가 작성한 not-found 폴더를 보여주게 된다.
이제 화면 상단에 navigation 바를 만들어볼 예정이다
(모든 화면에 공통적으로 추가되는 navigation 바를 의미한다. )
그럼 가장 가능은하지만, 권장되지 않는 방법을 사용해서 먼저 시도해보도록 하겠다

components > navigation.tsx 파일을 생성 후, navigation바를 만들어보자
navigation.tsx
import Link from 'next/link';
export default function Navigation () {
return (
<>
<nav>
<ul>
<li>
<Link href="/">Home</Link>
</li>
<li>
<Link href="/about-us">About Us</Link>
</li>
</ul>
</nav>
</>
);
}
next에서 제공하는 Link태그를 사용해서, 페이지 간의 클라이언트 사이드 네비게이션을 구현해 보았다.
그리고 이<Navigation/>태그를 모든 폴더의 page.tsx에 불러와준다
요렇게! 하고 서버를 재시작 해보면,
요렇게 nav바가 생성된 것을 확인할 수 있다.
그럼, Home을 눌렀을 때-> 🏠 이모지를 옆에 붙여주고, About-Us를 눌렀을 때-> ⭐️ 이모지를 옆에 붙여주고 싶다 (즉, 어디로 이동했는지 알고 싶을 때!)
--> usePathname() 을 사용하면 된다!
Next.js에서 사용하는 훅 중 하나로, 현재 페이지의 경로명을 가져오는 데 사용된다. Next.js의 새로운 라우팅 시스템인 App Router(Next.js 13 이상)에서 사용할 수 있는 훅이다.

이렇게 usePathname() 을 path로 불러온 뒤, path가 / 일 경우, 🏠 이모지를, 아니면 null을, path가 /about-us일 경우, ⭐️이모지를 아니면 null을 반환한다.
를 명시해주고, 서버를 재시작해보면,
샬롸샬롸~~ 하다가
usePathname은 client component에서만 작동한다.
이로써, "use client"를 추가해야 한다는 문구를 띄우며 에러가 발생했다.
"use client"를 추가해서 다시 렌더링해보니,
이모지가 제대로 나타나는 것을 확인할 수 있다.
components 폴더에 navigation.tsx파일을 생성해 nav바를 만들었더니
--> 모든 page.tsx에 navigation.tsx 파일을 불러와야 한다
--> "use client"를 추가해야 했다. 왜?
--> next.js는 우리의 react components를 가져와서 브라우저가 이해할 수 있는 html 코드로 변환하는 작업을 의미한다.
만약, next.js의 프레임워크를 사용하지 않고, create-react-app만을 사용해서 어플리케이션을 렌더링한다면 ?
--> client side rendering을 의미한다.
클라이언트 사이드 렌더링(Client-Side Rendering, CSR) 은 웹 애플리케이션의 렌더링 방식 중 하나로, 클라이언트(브라우저)에서 HTML을 동적으로 생성하고 렌더링하는 방법이다.
--> CSR은 웹 애플리케이션의 동적인 사용자 경험을 제공하는 데 유용하며, 주로 자바스크립트 프레임워크와 라이브러리를 통해 구현된다
클라이언트 사이드 렌더링의 주요 특징
자바스크립트의 역할:
초기 로딩 시간:
동적 사용자 경험:
SEO와 접근성:
결론: 클라이언트 사이드 렌더링에서는 자바스크립트가 HTML 구조를 동적으로 생성한다.
초기 로딩 시에는 빈 HTML 페이지가 서버에서 클라이언트로 전달되며, 자바스크립트가 다운로드되고 실행된 후에 브라우저에서 페이지의 콘텐츠가 동적으로 렌더링 된다.
--> 이로 인해 초기 로딩 시 빈 화면이 잠깐 표시될 수 있게 된다!
next.js로 웹사이트에서 빌드할 때, 자동적으로 server side rendering이 된다.
서버 사이드 렌더링(Server-Side Rendering, SSR) 은 웹 애플리케이션의 렌더링 방식 중 하나로, 웹 페이지의 HTML 콘텐츠를 서버에서 생성하고 클라이언트에게 전달하는 방법이다.
SSR은 페이지가 서버에서 미리 렌더링되기 때문에 클라이언트는 완성된 HTML을 즉시 받아볼 수 있다.
서버 사이드 렌더링의 주요 특징
초기 로딩 속도:
SEO 최적화:
서버 자원 소모:
간단하게 요약하자면, 서버에서 페이지를 이미 렌더링하기 때문에, 클라이언트는 로딩 없이 페이지를 받아볼 수 있다.
(next.js는 서버 사이드 렌더링에 속한다)
페이지 소스코드를 살펴보면, 자바스크립트를 비롯한 페이지에 대한 모든 것들이 렌더링 되는 것을 확인할 수 있다!
자, 만약
이렇게 버튼을 추가했다.
처음 화면에 로딩이 되면, 단순히

<button>0</button> 버튼만 로딩이 된다. 이 버튼은 onClick이벤트 리스너가 붙지 않은 단순한 버튼을 나탄내다.
클라이언트는 단순히 이 버튼을 HTML로써 보게 된다.
이후,클라이언트가 이 버튼을 본 후, 이후에 여기에 우리의 프레임워크를 로딩하고, onClick이벤트가 붙게 되면서, 버튼이 1씩 증가하게 된다. 이러한 과정이 hydration이다.
서버에서 렌더링: 서버는 초기 HTML 페이지를 렌더링하여 클라이언트에 전달한다.
이 경우, <button>0</button>과 같은 HTML이 포함된다.
서버는 이 버튼의 초기 상태를 생성하여 클라이언트에게 제공한다.
클라이언트의 초기 렌더링: 클라이언트는 서버에서 받은 HTML을 사용하여 페이지를 렌더링한다. 이 단계에서 버튼은 클릭 이벤트 리스너가 붙지 않은 상태로 화면에 표시된다
프레임워크 로딩 및 Hydration : 클라이언트 측에서 자바스크립트 프레임워크(예: React)가 로딩되면, 자바스크립트가 페이지의 요소와 상호작용을 설정한다.
이 과정에서 프레임워크는 HTML의 상태를 기반으로 이벤트 리스너를 붙이고, 페이지의 상태를 동기화한다.
이 단계에서 버튼에 onClick 이벤트 리스너가 추가되고, 버튼 클릭 시 상태가 업데이트되도록 동작이 설정됩니다.
상호작용 가능: 이후, 클라이언트는 버튼 클릭 시 상태가 업데이트되고, 버튼이 1씩 증가하는 등의 동적 상호작용이 가능해진다.
Hydration의 핵심
서버사이드 렌더링(SSR)을 통해 만들어 진 인터랙티브 하지 않는 HTML을 클라이언트 측 자바스크립트를 사용하여 인터랙티브한 리액트 컴포넌트로 변환하는 과정을 말한다.
(서버 환경에서 이미 렌더링된 HTML에 React를 붙이는 것)
간단하게 설명하면
이 과정 전체가 hydration이라 불리며, HTML 페이지가 처음에는 정적 상태로 로딩되지만 자바스크립트가 활성화되면서 동적 기능을 가지게 되는 것을 나타낸다.