목록HI's Dev Log (68)
현인
API fetch 중 문제가 발생했을 때, 에러 창을 띄우는 것이 아닌 이전 데이터를 유지 해야 한다는 요구사항이 있어서 다음과 같이 구현했다. 프레임워크는 Next.js 이며, 별도의 API 관련 라이브러리를 사용하지 않고 fetch로 가져온다.const fetchData = useCallback(async () => { const response = await fetch('API URL'); if (response.ok) { const fetchedData = await response.json(); setData(fetchedData); // 데이터를 LocalStorage에 저장, 오류 발생 시 캐시된 데이터 사용하기 위함 localSt..
현재 회사에서 Monorepo 구조로 프로젝트를 관리하고 있는데, Release Tag를 수동으로 찍고 있어서 불편하다고 느꼈다.Release Tag를 찍으려면 package.json 버전을 올리고, 컨벤션에 맞춰서 tag를 생성한 뒤 올려야 하는데 매번 수동으로 작업하면 실수할 수도 있고 귀찮기도 하니 스크립트로 구현했다.내가 원한 기능은 ‘release ’ 명령어를 입력하여 release tag를 작성하는 것이었다.먼저 스크립트는 아래 처럼 구현했다.#!/bin/bash# 명령어 입력 확인if [ $# -eq 0 ]; then echo "❌ Usage: release " exit 1fi# 프로젝트 이름project_name=$1# 프로젝트 경로 설정, 모노레포라서 apps 디렉토리 하위로 프로젝트..
robots.txt 파일은 검색엔진 크롤러가 사이트에서 접근할 수 있는 URL을 지정하는 파일이다. 주로 크롤러 요청으로 인해 사이트에 과부하가 발생하는 것을 방지하기 위해 사용한다. 다만, 이 파일은 웹페이지가 Google 검색결과에 표시되지 않도록 차단하는 수단으로 사용해서는 안 된다. 검색결과에서 페이지를 숨기려면 noindex 태그를 사용하거나 비밀번호로 보호해야 한다.robots.txt 파일의 주요 용도크롤러 트래픽 관리크롤러가 특정 URL이나 리소스에 접근하지 못하도록 제한한다.리소스 크롤링 차단단, 이러한 리소스가 페이지 이해에 중요한 역할을 한다면 차단해서는 안 된다.중요하지 않은 이미지, 스크립트, 스타일 파일 등을 차단하여 크롤러가 불필요한 리소스를 크롤링하지 않도록 한다.미디어 파일 ..
echarts 사용 중에 yAxis 라벨 width 설정이 잘 안되어 애를 먹었다. 기본적으로 axisLabel 속성 내부에 width 속성이 있는데, 해당 속성으로는 동작하지 않아서 찾아보게 되었고 아래와 같이 rich 속성 내부에 커스텀 스타일을 정의하고 사용해야 반영되었다.... yAxis: { axisLabel: { padding: [0, 22, 0, 0], fontSize: 30, lineHeight: 35.8, fontWeight: 400, align: 'right', color: '#6E758F', // width: 80 // width 옵션이 axisLabel에 있긴 하지만 어째서인지 넣어도 동작 안한다. ..
Next.js를 사용하면 서버에서 가변 값을 처리해 동적으로 페이지를 렌더링할 수 있다. 예를 들어, 아래와 같은 요구사항이 있다고 가정해보자.클라이언트에게 템플릿 변경이 가능한 페이지를 제공한다.클라이언트로부터 템플릿 변경 요청이 들어오면, admin 서버를 통해 템플릿 ID를 갱신한다.변경된 템플릿 ID를 기반으로 해당 템플릿으로 페이지를 렌더링한다.React로 개발했다면, 일반적으로 클라이언트에서 admin 서버의 API를 호출해 변경된 ID 값을 가져오고, 그 ID에 매핑된 컴포넌트를 렌더링했을 것이다. 하지만 이런 방식은 클라이언트가 모든 템플릿의 리소스를 로드해야 한다는 단점이 있다. 템플릿 종류가 많아질수록 리소스 크기가 비효율적으로 커지는 문제가 발생할 수 있다.Next.js를 사용하면 이..
@next/font 설치하려다 발생한 에러인데package.json 쪽에 문제가 있다고 해서 봤지만 이상이 없었다.{ "name": "****", "version": "0.1.0", "private": true, "scripts": { "dev": "next dev --turbopack", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { "next": "15.0.3", "react": "19.0.0-rc-66855b96-20241106", "react-dom": "19.0.0-rc-66855b96-20241106" }, "devDependencie..
이전 장에서 대시보드 레이아웃과 페이지들을 만들었다. 이제 사용자가 대시보드 경로 사이를 라우팅할 수 있도록 몇 가지 링크를 추가해보자5장에서 다룰 내용next/link 컴포넌트 사용법usePathname() 훅 사용하여 활성 링크 표기 방법Next.js에서 네비게이팅(Navigating)이 이뤄지는 방식왜 네비게이팅을 최적화 해야 할까?페이지 간에 링크를 구현하려면 HTML 엘리먼트를 사용한다. 현재 사이드바 링크는 엘리먼트를 사용하지만 브라우저에서 홈, invoice 및 customer 페이지 사이를 탐색할 때 어떤 일이 일어나는지 보자.각 페이지 이동 시 전체 페이지가 새로고침 된다. 컴포넌트Next.js에서는 컴포넌트를 사용하여 어플리케이션의 페이지간 링크를 구현할 수 있으며 JavaScri..
지금까지 만든 어플리케이션은 홈 화면 하나 뿐이다. 이제 레이아웃과 페이지들을 가지고 더 많은 라우팅 지점들을 만들 수 있는 방법을 알아보자.4장에서 다룰 내용파일시스템 라우팅을 활용하여 dashboard 경로 생성새로운 경로 세그먼트를 만들 때 폴더와 파일들의 역할 이해여러 대시보드 페이지에서 공유할 수 있는 중첩 레이아웃 만들기콜로케이션, 부분 렌더링 그리고 루트 레이아웃중첩 라우팅Next.js는 폴더가 중첩 경로를 만드는 데 사용되는 파일 시스템 라우팅을 사용한다. 각 폴더는 URL 세그먼트에 매핑되는 경로 세그먼트를 나타낸다.layout.tsx 및 page.tsx 파일들을 사용하여 각 경로에 대해 별도의 UI를 만들 수 있다.page.tsx는 React 컴포넌트를 내보내는 특수 Next.js 파일..
GraphQL 스키마가 지원하는 쿼리에 대한 정보를 요청하는 것은 매우 유용한 기능이다. GraphQL은 Introspection(이하 스키마 확인) 시스템을 통해 이를 효과적으로 수행할 수 있게 해준다.스타워즈 예제에서 사용된 starWarsIntrospection-test.ts 파일은 스키마 확인 시스템의 실용성을 잘 보여준다. 이 파일에는 다양한 스키마 확인 쿼리가 포함되어 있어, 참조 구현의 스키마 확인 시스템을 효과적으로 테스트할 수 있다.타입 시스템을 직접 설계했다면 사용 가능한 타입들을 알고 있겠지만, 그렇지 않은 경우에도 GraphQL의 강력한 기능을 활용할 수 있다. Query의 루트 타입에 항상 존재하는 __schema 필드를 쿼리하면, 필요한 모든 정보를 손쉽게 얻을 수 있다. 이제 ..
유효성 검증이 끝나면, GraphQL 쿼리는 GraphQL 서버에서 실행된다. 서버에서는 요청된 쿼리와 동일한 모습의 형식을 가진 결과를 리턴한다.GraphQL은 타입 시스템 없이는 쿼리를 실행할 수 없으므로, 쿼리 실행을 설명하기 위해 예시 타입 시스템을 사용해보겠다. 이는 이 글들의 예시들에서 사용된 동일한 타입 시스템의 일부이다.type Query { human(id: ID!): Human} type Human { name: String appearsIn: [Episode] starships: [Starship]} enum Episode { NEWHOPE EMPIRE JEDI} type Starship { name: String}쿼리가 실행될 때 어떤 일이 일어나는지 설명하기 위해, ..