src , width , height , alt 는 필수 속성이다.import Image from 'next/image'
export default function Page() {
return (
<div>
<Image
src="/profile.png"
width={500}
height={500}
alt="Picture of the author"
/>
</div>
)
}
이미지 컴포넌트는 비용이랑 관련이 있기 때문에 보안이 필요하다.
버셀에 배포시, 이미지 컴포넌트 사용은 비싼 서비스이다.
Image 컴포넌트만 사용시 외부 이미지 사용에 대한 error 가 발생한다.
remotePatterns 적용하기
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
remotePatterns: [
{
protocol: "https",
hostname: "picsum.photos",
pathname: "/50/50",
},
],
},
};
export default nextConfig;

domains 로 지정해줘도 되긴하는데, 콘솔에 경고창이 뜨더라!! 웬만해선 remotePatterns 를 쓰는걸로!priority 경고창이 생겼다.
: Next.js 에서 제공하는 이미지 최적화 관련 기능중 하나.
import Image from 'next/image'
export default function MyComponent() {
return (
<div>
<Image
src="/path/to/image.jpg"
alt="설명"
width={500}
height={500}
priority
/>
</div>
)
}
: Next.js에서의 Lazy Loading은 페이지 로딩 시 모든 콘텐츠를 한 번에 로드하지 않고, 사용자가 실제로 필요로 할 때 콘텐츠를 로드하는 기술.
-> 이를 통해 초기 로딩 시간을 단축하고 사용자 경험을 개선할 수 있다.
import Image from 'next/image'
export default function MyComponent() {
return (
<div>
<Image
src="/path/to/image.jpg"
alt="설명"
width={500}
height={500}
loading="lazy"
/>
</div>
)
}
// .env DB_HOST=https://db-host.com
NEXT_PUBLIC_ 을 붙여준다.NEXT_PUBLIC_MY_HOST=http://localhost:3000
const response = await axios.get( `${process.env.NEXT_PUBLIC_MY_HOST}/api/pokemons/${id}` );

Redeploy 실행

탭에서 Logs 로 로그도 확인할 수 있는 점 알아두기!

-> 컴포넌트가 다시 렌더링될 때마다 new QueryClient()가 호출되어 새로운 queryClient 객체가 생성된다.
-> QueryClient 인스턴스가 컴포넌트가 리렌더링 될때마다 새로 생성되지 않도록 할 수 있다.
-> 또한, 참조 동일성을 유지하며, React Query와 React가 예상하는 상태 관리를 조절하고, 컴포넌트 렌더링과 상태 업데이트를 조절하기 위함이다.
초기 렌더링 중 설정 :
React Query는 초기 렌더링 동안에 QueryClient를 설정하고 사용하기 위한 상태를 필요로 한다.
초기 렌더링 동안에만 실행되는 함수를 제공하면 Lazy 초기 상태(Lazy initial state)를 활용해 초기 렌더링 동안에만 QueryClient를 생성하고, 이후에는 참조 동일성을 유지한다. 이것은 초기 설정을 효율적으로 관리하는 방법 중 하나다.
동적 설정 관리 :
QueryClientProvider의 설정을 동적으로 변경해야 할 때, useState를 활용해 QueryClient를 상태로 관리하는 것이 유용하다.
동적으로 설정을 변경하려면 상태를 업데이트하고 그 변경을 QueryClientProvider에 적용하면 된다.
컴포넌트 렌더링과 분리 :
QueryClientProvider의 설정을 컴포넌트 수명주기와 연관해서 관리하고자 할 때 useState를 사용할 수 있다.
이렇게 하면 컴포넌트가 마운트되거나 언마운트될 때 설정을 업데이트하고 관리할 수 있다.

useState의 초기값으로 함수 (() => new QueryClient()) 를 전달하여 초기화 시점에만 QueryClient 인스턴스를 생성하도록 한다.
이 함수는 한번만 호출된다.
이후에는 참조 동일성을 유지하게 된다.
defaultOptions를 통해 기본 설정을 지정
staleTime: 1000 * 60 * 5는 쿼리 데이터가 5분 동안 신선하게 유지된다는 것을 의미한다.
즉, 5분 동안 동일한 데이터를 재사용하고, 그 이후에만 다시 fetch를 시도
function MyApp({ Component, pageProps }) {
const [queryClient] = React.useMemo(() => new QueryClient(),[]);
return (
<QueryClientProvider client={queryClient}>
-> useMemo를 사용해도 똑같은 효과를 가져오지만 useMemo는 그 목적이 좀 다르다.
useMemo에 대한 공식문서의 일부분을 살펴보자.
"만들기" 함수와 종속성 배열을 전달합니다. useMemo종속성 중 하나가 변경된 경우에만 메모된 값을 다시 계산합니다. 이 최적화는 모든 렌더링에서 비용이 많이 드는 계산을 피하는 데 도움이 됩니다.
useMemo 의미론적 보증이 아닌 성능 최적화 \에 의존할 수 있습니다. 미래에 React는 이전에 메모한 일부 값을 "잊고" 다음 렌더링에서 다시 계산하도록 선택할 수 있습니다(예: 오프스크린 구성 요소를 위한 메모리 확보). useMemo 없이도 계속 작동하도록 코드를 작성한 다음, 추가하여 성능을 최적화하십시오.
- 오프스크린 구성 요소란?
오프스크린 구성 요소는 화면에 렌더링되지 않지만, 나중에 필요할 수 있는 구성 요소를 의미한다. ex) 탭으로 숨겨진 내용이나, 사용자가 특정 조건에서만 볼 수 있는 내용