데이터 가져오기, 캐싱, 그리고 환경 변수
서버에서 데이터를 효율적으로 가져오고 저장(캐싱)하는 방법과 민감한 보안 키를 다루는 환경 변수에 대해 배웁니다.
프론트엔드 화면의 진짜 가치는 외부에서 유용한 데이터를 가져와서 보여줄 때 비로소 완성됩니다. 뉴스 기사를 불러오거나, 날씨 정보를 외부 서버에서 받아올 때 우리는 '데이터 패칭(Data Fetching)'이라는 과정을 거칩니다. 이번 시간에는 이 데이터를 빠르고 안정적으로 가져오는 방법, 그리고 가져온 데이터를 영리하게 보관하는 캐싱 기술과 비밀 키를 안전하게 다루는 법을 배웁니다.
서버에서 데이터 가져오기 (Data Fetching)
웹 서비스는 다른 서버의 API(데이터베이스나 외부 서비스와 소통하는 창구)로부터 데이터를 가져와 화면에 그리는 것이 주된 역할입니다. Next.js에서는 이러한 작업을 아주 직관적으로 수행할 수 있습니다.
기본 Fetch 함수 사용하기
자바스크립트에 내장된 `fetch` 함수를 사용하면 외부 서버에 데이터를 요청할 수 있습니다. 우리가 앞서 배웠던 `async/await` 비동기 문법을 활용하여 데이터가 도착할 때까지 기다렸다가 화면에 렌더링하는 것이 일반적인 패턴입니다.
Next.js의 서버 컴포넌트에서는 브라우저의 제약 없이 이 작업을 서버 측에서 직접 수행할 수 있습니다. 덕분에 브라우저의 성능에 구애받지 않고 서버 대 서버로 훨씬 빠르고 안정적으로 데이터를 받아올 수 있습니다.
서버 컴포넌트에서 데이터 패칭하기
영화 목록을 가져오는 페이지를 상상해 보세요. 별도의 복잡한 상태 관리 없이, 함수 안에서 데이터를 기다린 후 바로 그릴 수 있습니다.
export default async function MoviePage() {
// 서버에서 데이터 가져오기를 기다립니다
const response = await fetch('https://api.example.com/movies');
const movies = await response.json();
return (
<ul>
{movies.map((movie) => (
<li key={movie.id}>{movie.title}</li>
))}
</ul>
);
}한 번 가져온 데이터 재사용하기: 캐싱 (Caching)
만약 쇼핑몰 메인 페이지에 들어오는 수만 명의 사용자에게 똑같은 상품 목록을 보여줘야 한다고 가정해 보겠습니다. 매번 사용자가 접속할 때마다 데이터베이스에 상품 목록을 새로 요청한다면 서버는 엄청난 과부하에 시달리게 됩니다.
캐싱이 필요한 이유와 원리
캐싱(Caching) 은 한 번 가져온 데이터를 임시 저장소(캐시)에 기억해 두고, 다음 번에 똑같은 요청이 들어오면 서버나 데이터베이스를 괴롭히지 않고 기억해둔 데이터를 즉시 꺼내 보여주는 기술입니다. 이를 통해 웹 페이지의 로딩 속도를 드라마틱하게 끌어올리고 서버 비용을 절약할 수 있습니다.
Next.js의 자동 캐싱 시스템
Next.js의 기본 `fetch` 함수는 이 캐싱 기능이 내장되어 있습니다. 기본적으로 한 번 외부 API를 호출하면, Next.js는 그 결과를 스스로 기억해두고 재사용합니다.
데이터 성격에 따른 캐싱 전략
| 전략 | 특징 | 사용하기 좋은 곳 |
|---|---|---|
| 강력한 캐시 (기본) | 데이터를 무기한 저장하여 가장 빠르게 응답함 | 블로그 글, 변하지 않는 회사 소개 페이지 |
| 주기적 갱신 | 일정 시간(예: 60초)마다 한 번씩만 새 데이터를 가져옴 | 뉴스 피드, 일일 주식 시세 목록 |
| 캐시 안 함 | 항상 최신의 데이터를 실시간으로 가져옴 | 실시간 채팅, 결제 현황, 관리자 대시보드 |
만약 AI가 작성해 준 코드가 데이터를 불러오는데, 데이터베이스를 수정해도 화면이 계속 과거의 데이터를 보여준다면 십중팔구 이 '캐싱'이 너무 강력하게 걸려 있기 때문입니다. 이때는 AI에게 "데이터를 캐시하지 말고 항상 실시간으로 가져오도록 fetch 옵션을 수정해줘"라고 요청하면 됩니다.
민감한 정보 보호하기: 환경 변수 (Environment Variables)
외부에서 데이터를 가져오거나 결제 시스템을 연동할 때, 보통 우리는 서비스 제공자로부터 부여받은 '비밀 키(API Key)'를 사용해야 합니다.
환경 변수란 무엇인가
만약 코드 안에 이 비밀 키를 적어두면 소스 코드가 유출되었을 때 누구나 여러분의 이름으로 유료 서비스를 마음대로 사용할 수 있게 됩니다. 이런 사고를 막기 위해, 소스 코드에는 절대 비밀 키를 적지 않고 별도의 안전한 파일(`.env`)에 숨겨두고 꺼내 쓰는 방식을 사용하는데, 이를 환경 변수라고 부릅니다.
NEXT_PUBLIC의 의미와 주의점
Next.js에서 환경 변수를 다룰 때는 아주 엄격한 보안 규칙이 존재합니다.
Next.js 환경 변수 보안 규칙
- 1기본적으로 모든 환경 변수는 '서버 컴포넌트'에서만 안전하게 읽을 수 있으며, 클라이언트 브라우저로는 절대 전송되지 않습니다.
- 2만약 클라이언트 컴포넌트(브라우저)에서 반드시 읽어야 하는 키가 있다면, 변수 이름 앞에 반드시 'NEXT_PUBLIC_'을 붙여야만 합니다.
- 3따라서 결제 암호나 데이터베이스 관리자 비밀번호 등 절대로 노출되면 안 되는 정보에는 절대로 'NEXT_PUBLIC_'을 붙이면 안 됩니다.
AI와 작업할 때 종종 "환경 변수가 undefined로 나옵니다"라는 오류가 발생한다면, 브라우저 환경에서 보안상 숨겨진 키에 접근하려고 했기 때문일 가능성이 큽니다. 이럴 때는 로직을 서버 컴포넌트로 옮기거나, 공개해도 안전한 키인지 점검해야 합니다.
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.다음 중 데이터베이스 비밀번호를 Next.js 환경 변수로 설정할 때 올바른 변수명 규칙은 무엇인가요?
3줄 요약
- 1Next.js 서버 컴포넌트에서는 fetch를 사용해 외부 데이터를 빠르고 안정적으로 가져옵니다.
- 2불필요한 중복 요청을 줄이고 성능을 높이기 위해 Next.js의 내장 캐싱 전략을 적절히 활용해야 합니다.
- 3비밀 키와 같은 민감한 정보는 환경 변수(.env)로 관리하며, 노출되어선 안 되는 정보는 NEXT_PUBLIC 접두사를 피해야 합니다.