빈 폴더만 준비돼 있는 환경에서 가장 각광받는 라이브러리인 리액트와 Next.js로 실무에서도 쓸 수 있는 웹서비스를 구축해보기
npm init을 실행하면 package.json을 만드는 CLI를 실행할 수 있다.

npm i react react-dom next

npm i typescript @types/react @types/react-dom @types/node eslint eslint-config-next
{
"$schema": "https://json.schemastore.org/tsconfig.json"
}
$schema란?{
"$schema": "https://json.schemastore.org/tsconfig.json",
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"baseUrl": "src",
"paths": {
"#pages/*": ["pages/*"],
"#hooks/*": ["hooks/*"],
"#types/*": ["types/*"],
"#components/*": ["components/*"],
"#utils/*": ["utils/*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}
/** @type {import('next').NextConfig} */
const nextConfig = {
// 리액트의 엄격모드를 활성화한다
reactStrictMode: true,
// 일반적으로 보안 취약점으로 취급되는 X-Powered-By 헤더를 제거한다
poweredByHeader: false,
// 빌드 시에 ESLint를 무시한다
eslint: {
ignoreDuringBuilds: true,
},
};
module.exports = nextConfig;
npm i @titicaca/eslint-config-triple --save-dev
const path = require("path");
const createConfig = require("@titicaca/eslint-config-triple/create-config");
const { extends: extendConfigs, overrides } = createConfig({
type: "frontend",
project: path.resolve(__dirname, "./tsconfig.json"),
});
module.exports = {
// next/core-web-vitals 를 추가하면 두 가지 설정이 모두 적용된다
extends: [...extendConfigs, "next/core-web-vitals"],
overrides,
};
npm i styled-components
styledComponents: true을 추가한다깃허브에서 제공하는 다양한 서비스를 활용하면 애플리케이션을 개발하는데 많은 도움을 얻을 수 있다
러너(runner)
파일로 작성된 깃허브 액션이 실행되는 서버를 의미한다. 특별히 지정하지 않으면 공용 깃허브 액션 서버를 이용하며, 별도의 러너를 구축해 자체적으로 운영할 수도 있다
액션(action)
러너에서 실행되는 하나의 작업 단위를 의미한다. yaml 파일로 작성된 내용을 하나의 액션으로 볼 수 있다
이벤트(event)
깃허브 액션이 일으키는 이벤트를 의미한다. 개발자의 필요에 따라 한 개 이상의 이벤트를 지정할 수 있다. 또한 특정 브랜치를 지정하는 이벤트도 가능하다.
잡(jobs)
하나의 러너에서 실행되는 여러 스텝의 모음을 의미한다. 하나의 액션에서 여러 잡을 생성할 수 있으며, 특별히 선언한 게 없다면 내부 가상머신에서 각 잡은 병렬로 실행된다
스텝(steps)
잡 내부에서 일어나는 하나하나의 작업을 의미한다. 셀 명령어나 다른 액션을 실행할 수도 있다. 이 작업은 병렬로 일어나지 않는다.
actions/checkout
깃허브 저장소를 체크아웃하는 액션이다. 저장소를 기반으로 작업을 해야 한다면 반드시 필요하다.
actions/setup-node
Node.js를 설치하는 액션이다. Node.js를 사용하는 프로젝트라면 반드시 필요하다. 설치할 Node.js 버전을 지정할 수도 있다.
actions/github-script
Github API가 제공하는 기능을 사용할 수 있도록 도와주는 액션이다. GitHub API를 이용하면 기서브에서 할 수 있는 대부분의 작업을 수행할 수 있으므로 한 번쯤 API 문서를 보는 것을 추천한다.
actions/stale
오래된 이슈나 PR을 자동으로 닫거나 더 이상 커뮤니케이션하지 못하도록 닫는다. 저장소가 오래되어 과거에 생성된 이슈나 풀 리퀘스트가 너무 많을 경우 정리하는 데 도움이 된다.
actions/dependency-review-action
의존성 그래프에 대한 변경, 즉 package.json, package-lock.json, pnpm-lock.yaml 등의 내용이 변경됐을 때 실행되는 액션으로, 의존성을 분석해 보안 또는 라이센스가 문제가 있다면 이를 알려준다.
github/codeql-action
깃허브의 코드 분석 솔루션이 code-ql을 활용해 저장소 내 코드의 취약점을 분석해 준다. languages에 javascript만 설정해 두면 자바스크립트와 타입스크립트를 모두 검사하므로 특정 스케줄을 맞춰서 실행하거나 CI로 활용할 수 있다.
먼저 package.json에서 빼놓을 수 없는 의존성과 버전에 대해서 이해해야 한다
버전
npm 버전 규칙
의존성
npm insatll 패키지명을 실행하면 package.json에 설치되는 의존성이다. 해당 프로젝트를 실행하는데 꼭 필요한 패키지가 선언된다 (예- react,react-dom, next)npm install 패키지명 --save-dev를 실행하면 package.json에 설치되는 의존성이다. 해당 프로젝트를 실행하는 데는 필요하지 않지만 개발 단계에서 필요한 패키지들을 여기에 선언한다. (예-eslint, jest, typescript)

개별 취약점 살펴보기

npm ls shell-quote 명령어를 입력하면 확인할 수 있다취약점 해결하기
리액트 애플리케이션을 빠르게 배포할 수 있게 도와주는 3가지 SaaS 서비스의 특징 비교해보기
| 항목 | Netlify | Vercel | DigitalOcean |
|---|---|---|---|
| 주요 용도 | 정적 웹사이트 및 JAMstack 프로젝트 배포 | Next.js와 프론트엔드 프레임워크를 중심으로 한 서버리스 배포 | 가상 서버(VPS)를 기반으로 한 애플리케이션 및 웹사이트 배포 |
| 배포 방식 | Git 연동(자동 배포), CLI 지원 | Git 연동(자동 배포), CLI 지원 | 수동 서버 설정 또는 Git 연동, Terraform 지원 |
| 사용자 친화성 | 직관적 대시보드, 간단한 설정 | Next.js 최적화, 서버리스 함수 및 빌드 간소화 | 사용자가 서버를 직접 설정해야 하므로 높은 학습 곡선 |
| 성능 최적화 | CDN 기반 정적 파일 최적화, 글로벌 Edge 네트워크 제공 | 글로벌 Edge 네트워크, Next.js 서버리스 함수 최적화 | 사용자가 원하는 네트워크 및 성능 구성 가능 |
| 확장성 | Jamstack 및 정적 웹사이트에 적합 | Next.js 기반 프로젝트에 특화, 서버리스 함수로 동적 확장 가능 | VM/VPS 기반으로 직접 스케일링 관리 가능 |
| 호환성 | 모든 정적 사이트 생성기(Gatsby, Hugo 등)에 적합 | Next.js 및 React 프로젝트에 최적화 | 모든 언어 및 프레임워크 지원 |
| 장점 | - 빠른 배포 - 간단한 설정 - 무료 CDN 포함 | - Next.js 및 React에 최적화 - 자동 빌드 및 서버리스 함수 - 글로벌 Edge 네트워크 | - 완전한 서버 제어 가능 - 다양한 언어/프레임워크 지원 - 비용 효율적 |
| 단점 | - 동적 콘텐츠 처리 한계 - 서버리스 함수가 기본적 | - 비Next.js 프로젝트에서 일부 기능 제한적 - 무료 플랜 제한 | - 높은 기술 요구 사항 - 설정 및 유지보수 시간 소요 |
| 추천 대상 | 정적 웹사이트, Jamstack 개발자 | Next.js 및 React 기반 프론트엔드 개발자 | 서버에 대한 직접 제어가 필요한 DevOps 및 풀스택 개발자 |