목록분류 전체보기 (116)
기술 블로그
// fs 모듈을 이용해 파일 전체를 읽어와 문자열로 저장하기let fs = require('fs');let input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');// 첫째 줄의 데이터를 공백 기준으로 나누기data = input[0].split(' ');// data = ['1', '2']a = Number(data[0]);b = Number(data[1]);console.log(a * b);
React로 개발한 Single Page Application(SPA)의 빌드파일을 테스트할 때 문제 중 하나가 404 오류다. 특히 브라우저에서 URL을 직접 입력하거나 새로고침했을 때 이 문제가 발생할 가능성이 크다. 이 글에서는 그 원인과 이를 해결하는 방법을 다루며, serve를 활용한 간단한 해결책을 소개한다.404 오류의 원인SPA는 클라이언트 측 라우팅을 기반으로 동작한다. 예를 들어 http://localhost:3000/disks/list 경로로 이동하면 브라우저는 이를 서버에 요청한다. 하지만 서버는 해당 경로에 대응하는 파일을 찾으려고 하며, 결과적으로 404 Not Found 오류를 반환한다. 이는 정적 파일 서버가 동적 라우팅을 처리하지 못하기 때문이다.해결 방법: serve를 활..
리액트 프로젝트에서 SVG 파일을 사용할 때, svgr 플러그인을 사용해 SVG 파일을 리액트 컴포넌트로 변환하는 경우가 많다. 그러나 특정 SVG 파일은 크기가 커서 컴포넌트로 변환하면 번들 용량이 불필요하게 커지는 문제가 생길 수 있다. 이번 글에서는 esbuild와 svgr 설정에서 특정 SVG 파일만 외부 파일로 처리하는 방법을 다뤄보겠다.문제 상황esbuild와 esbuild-plugin-svgr를 사용하여 대부분의 SVG 파일을 리액트 컴포넌트로 변환해 사용했다. 하지만 일부 SVG 파일이 번들에 포함되어 용량이 크게 증가하는 문제가 발생했다. 예를 들어, assets/analysisfail.svg 파일이 번들 용량의 상당 부분을 차지하고 있었는데, 이 파일만 예외적으로 외부 파일로 처리하고 ..
현대 웹 개발에서 성능 최적화는 사용자 경험을 좌우하는 핵심 요소이다. 특히 폰트 파일은 웹 애플리케이션에서 상당한 용량을 차지하는 경우가 많아, 이들의 경량화는 빌드 파일 크기를 줄이는 데 큰 기여를 할 수 있다. 폰트를 경량화하는 방법으로는 사용하지 않는 글리프(glyph)를 제거하거나 필요한 문자 집합만을 포함하는 방법이 있으며, 이를 통해 프로젝트의 전체 파일 크기를 상당히 줄일 수 있다.폰트 경량화의 필요성폰트는 시각적 완성도를 높이는 데 중요한 역할을 하지만, 크기가 커지면 로딩 속도에 부정적 영향을 미친다. 특히 웹사이트나 애플리케이션이 여러 폰트를 사용하거나 다양한 스타일을 포함할 경우, 로딩에 소모되는 시간과 자원이 크게 늘어난다. 따라서 폰트를 경량화하면 불필요한 리소스를 줄이고, 최적..
문제 상황: Type Guard와 every 메서드의 한계TypeScript는 코드의 타입 안전성을 보장하기 위해 컴파일 시점에 타입을 검사한다. 이 과정에서 타입 가드와 타입 단언을 활용해 컴파일러가 타입을 정확하게 추론하도록 돕는다. 하지만 때로는 타입 가드를 사용했음에도 TypeScript가 배열의 타입을 확신하지 못하는 경우가 생긴다.예시 코드다음 예제에서 result 배열이 FileSystemFileEntry 또는 FileSystemDirectoryEntry로만 구성되어 있는지를 every 메서드를 통해 확인하고자 한다.if ( result.length > 0 && result.every(entry => isFileSystemFileEntry(entry) || isFileSystemD..
타입스크립트에서 배열 요소 타입 가드: 왜 작동하지 않는가?타입스크립트는 정적 타입 기반의 언어로, 타입을 명확히 정의하고 코드의 안정성을 높이는 데 중요한 역할을 한다. 그중에서도 타입 가드(Type Guard)는 변수가 특정 조건을 만족할 때 해당 변수의 타입을 좁히는 기능을 담당한다. 하지만 배열 요소에 타입 가드를 적용할 때는 예상치 못한 오류가 발생할 수 있다. 이번 글에서는 배열 요소에 타입 가드가 제대로 작동하지 않는 이유와 이를 해결하는 방법을 살펴보겠다.타입 가드란?타입 가드는 변수의 타입을 안전하게 좁히기 위해 사용하는 조건문이다. 대표적인 예로 typeof, instanceof, in 연산자가 있다. 이들은 특정 조건을 만족할 때 타입스크립트가 변수를 더욱 구체적인 타입으로 추론하도록..
작성중
왜 하는가? 정확히는 자동화된 테스트를 왜하는가 개발자가 변경한 어떤 요소가 웹 어플리케이션에 손상을 유발할 수 있다고 이를 뒤늦게 발견하여 비용을 발생시킬 수 있다. 수동 테스팅이 중요하지 않다는 것이 아니다. 추후 발생할 문제를 발생하기 위해 테스트 코드를 작성하여 자동적으로 손상을 감지하고 해결할 수 있다. 즉 더 나은 코드 품질을 보장하는 것이다. 이중에서도 단위 테스트를 이해하고 수행해보고자 한다. 종류 단위 테스트 함수나 컴포넌트등 개별적 대상으로 테스트한다. 가장 일반적이며 중요하다. 통합테스트 e2e 테스트 전구간 테스트 애플리케이션 전체의 워크플로우, 전체 시나리오를 테스트한다. 본 글은 기본적인 환경 설정 세팅 이후라고 가정하고 작성되어있다. ㅡ screen.getAllByRoll() ..
정확한 알람 예약은 기본적으로 거부됨 https://developer.android.com/about/versions/14/behavior-changes-all?hl=ko 안드로이드 14부터 정확한 알람 권한이 비활성화 되어 사용자로 부터 권한을 받아야 한다. 사내에서 운영 중인 어플리케이션은 rn 서드파티 라이브러리를 통해 권한을 요청하고 관리해왔지만 현 시점 대응한 라이브러리가 없어 직접 네이티브 모듈을 구축해야했다. SCHEDULE_EXACT_ALARM은 선택적 권한이 아니기 때문에 알림상자로 권한 승인은 불가능하고 해당 앱의 설정으로 이동시켜주는것이 최선이다. // android/app/src/main/AndroidManifest.xml . . // android/app/src/main/java/..
axios와 fetch모두 데이터 패칭을 위한 도구이다. 가장 큰 차이점은 axios는 외부 라이브러이인 반면 fetch는 자바스크립트에서 기본으로 제공한다. fetch fetch('https://cataas.com/cat') .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.blob(); }) .then(blob => { document.getElementById('catImage').src = URL.createObjectURL(blob); }) .catch(error => { console.error('There was a problem with the fetc..