전체 글(411)
-
타입스크립트 as와 satisfies 비교
특징as 단언 (assertion)satisfies 연산자초과 프로퍼티 검사무시함검사함타입 강제성강제로 타입을 변경하며, 이는 개발자가 책임짐애초에 타입에 엄격하게 부합해야 함런타임 영향없음주요 용도임시적으로 타입 단언이 필요할 때정밀한 타입 체크 및 코드 안정성 확보 예를 들어, 아래 코드는 validPerson이라는 객체가 Person 타입을 만족하는지 검사하는 용도로 쓰인다.type Person = { name: string; age: number };const validPerson = { name: "철수", age: 30, job: "Developer",} satisfies Person; // 에러 - 'job'은 타입에 정의되지 않은 속성 satisfies가 없었다면(4.9버전 미만), ..
2024.11.20 -
디자인 패턴의 필요성
소프트웨어 개발에서 디자인 패턴은 단순한 코딩 기법을 넘어, 문제 해결의 프레임워크를 제공한다. 즉 코드의 품질을 높이고 유지보수를 쉽게 하기 위해 사용되며, 선배 개발자들이 맞닥뜨렸던 반복적인 문제들을 해결하기 위한 모범 답안을 모아놓은 것이다. 디자인 패턴을 적용하면 다음과 같은 이점이 있다. 코드의 가독성 향상 코드 또한 하나의 문서이기 때문에, 다른 사람이 읽기 쉽도록 작성되어야 한다. 디자인 패턴은 널리 알려진 구조와 이름을 제공하여 코드의 의도를 더 쉽게 이해할 수 있게 한다. 예를 들면,싱글톤(Singleton) 패턴을 사용하면 "이 객체는 시스템 전체에서 하나만 존재해야 한다"는 의도를 바로 파악할 수 있다.옵저버(Observer) 패턴은 "이벤트 기반 시스템에서 데이터를 업데이트한다"는..
2024.11.19 -
React로 타이머 hooks 간단히 개발하기
import React, { useRef, useState } from 'react';export const useTimer = () => { const [time, setTime] = useState(0); const [isRunning, setIsRunning] = useState(false); const intervalRef = useRef(); const startTimer = () => { if (!isRunning) { setIsRunning(true); intervalRef.current = setInterval(() => { setTime(prevTime => prevTime + 1); }, 1000); } }; const..
2024.11.18 -
AWS CloudFront
AWS CloudFront는 CDN 서비스로, 전세계에 분산된 서버 네트워크를 통해 콘텐츠(웹페이지, 이미지, 동영상 등)를 사용자에게 빠르고 안전하게 전달한다. 주요 기능 1. 콘텐츠 캐싱 및 빠른 전송전 세계에 위치한 엣지 로케이션(Edge Location)을 통해 사용자와 가장 가까운 서버에서 콘텐츠를 제공하여 지연 시간을 줄이고 속도를 높인다. 2. 보안 강화AWS Shield와 통합되어 DDoS(분산 서비스 거부) 공격을 방어한다.HTTPS를 지원하여 데이터를 안전하게 전송한다.WAF(Web Application Firewall)와 통합 가능하여 애플리케이션 보안을 강화한다. 3. 탄력적인 스케일링트래픽이 갑자기 증가하더라도 탄력적으로 확장하여 안정적인 콘텐츠 제공이 가능하다. 4. 비용 효..
2024.11.17 -
placeholder-shown이 안먹는 경우
css에서는 placeholder-shown을 통해 자바스크립트 없이도 스타일을 분기처리 할 수 있다. 하지만 그게 안된다면 placeholder props가 input에 전달 안된 것은 아닌지 점검해보자
2024.11.16 -
Webpack 사용 이유
하나의 HTML 문서를 구성하는 콘텐츠는 다양합니다.단순한 마크업 텍스트 뿐만 아니라, css와 폰트 그리고 이미지가 가득합니다.그런데 현대 웹은 더이상 단순한 “페이지”가 아닙니다.콘텐츠가 많은 만큼 사용자 경험을 개선하기 위해 비동기 처리를 하고, 상태를 빠르게 업데이트를 해야 하기 때문입니다.코드가 점점 복잡해지는 문제를 해결하기 위해, 프론트엔드는 공통되는 로직을 추상화하고 분리하는 사고를 코드에 적용하게 되었습니다.즉 모듈화한 것이죠.이는 재사용성을 추구하는 개발자의 입장에서 매우 편리한 해결 방법입니다.하지만 이렇게 많아진 파일을 HTML의 나 를 작성해서 일일이 받아오기에는 문제가 많습니다.css나 js 파일 간 의존성(import)이 있다면 로드 순서를 보장하기 어렵습니다.브라우저는 각 파..
2024.11.15 -
디바운스와 쓰로틀링
디바운스(Debounce)와 쓰로틀링(Throttling)은 웹 개발에서 이벤트 처리를 최적화하기 위해 사용되는 두 가지 기법이다. 이들은 연속적으로 발생하는 이벤트를 효율적으로 관리하여 성능을 향상시키는 데 도움을 준다. 디바운스(Debounce) 디바운스는 연속적으로 발생하는 이벤트 중 마지막 이벤트만을 처리하는 기법이다. 즉, 일정 시간 동안 이벤트가 발생하지 않을 때까지 대기한 후, 마지막에 발생한 이벤트를 실행한다. 이는 사용자가 입력을 멈춘 후에만 처리를 수행하므로, 불필요한 연산을 줄일 수 있다. 사용 사례검색 자동완성 : 사용자가 입력을 멈춘 후에만 서버에 요청을 보내어 검색 결과를 가져온다.창 크기 조절 : 사용자가 창 크기 조절을 멈춘 후에 레이아웃을 재계산한다. 쓰로틀링(Throttl..
2024.11.14 -
pnpm 모노레포 구성하기
Next.js 15와 TypeScript를 사용하고, 패키지 매니저로 pnpm을 활용하여 모노레포를 구성해보자. 보통 이러한 설정은 여러 사이트를 포함하는 apps 폴더와 디자인 시스템 등을 담는 packages 폴더로 구성한다. 1. 프로젝트 초기화 및 pnpm 설치 먼저, 프로젝트 루트를 생성하고 pnpm을 설치한다.mkdir my-monorepocd my-monoreponpm install -g pnpmpnpm init 2. pnpm 워크스페이스 설정 루트에 pnpm-workspace.yaml 파일을 만들고, apps와 packages 폴더를 워크스페이스로 지정한다.packages: - 'apps/**' - 'packages/**' 3. 디렉토리 구조 설정 apps와 packages 폴더..
2024.11.13 -
자바스크립트변수 var! 값을 재사용하기 위해 저장해두는 메모리 공간 변수호이스팅?
변수 = 메모리 공간 자체 변수는 값이 아닙니다. 그 값을 담고 있는 공간입니다. 그리고 그 변수의 이름은 공간을 가리키는 주소입니다. 프로그램은 인간이 문제를 해결하는 과정을 컴퓨터로 고대로 옮겨놓은 것 뿐이야. 기계이기 때문에 더 빠르게 반복할 수 있고 천문학적인 숫자를 쉽게 다룰 수 있다는 장점이 있지! 하지만 컴퓨터는 사람의 두뇌 연산과 살짝 차이가 있어. 사람 컴퓨터 두뇌라는 하나의 시스템에서 연산과 기억을 모두 수행 (물론 뇌 안에서도 영역이 있다만 여기서 그것까지 다루지 말자) [연산을 위한 CPU]와 [기억을 위한 메모리]로 나뉨 프로그램이 동작하는 원리는 매우 단순해. 매번 발생하는 새로운 정보를 기존 정보와 융합하는 거야. 사람이랑 똑같지 않아? 우리도 원래 알던 거에 새로운 정보를 추..
2021.07.18 -
node js 백만불짜리 꾸울팁 zip 파일 생성 및 다운로드 구현하기
오늘은 제가 5일간 전전긍긍해서 얻은 쾌거를 나누고자 합니다. 그것은 바로 node.js에서 zip 파일을 다운로드하는 로직을 구현하는 알고리즘인데요. node.js가 자바스크립트 기반이라고 해서 만만하게 볼 것은 또 아니잖아요..ㅎ python과 flask를 이용할 때는 아주 편합니다. flask 모듈에 내장된 send_file을 이용하면 zip이든 csv든, responseType을 크게 신경쓰지 않아도 클라이언트에 알아서 뿌려 주니까요. 하지만 node.js는 모듈 생태계가 아주 많기에, 딱 '이거다!'라고 정형화된 방법이 없어서 로직의 가짓수가 넘쳐납니다. 이 말은 즉 경우의 수가 많기에 구글링해도 내 상황에 맞는 전례를 찾기 어렵다는 말과 같습니다. 저만의 꿀팁을 공개합니다. node.js로 z..
2021.07.18 -
Expressions with $project
db.movies.aggregate([ { $match: { cast: { $elemMatch: { $exists: true } }, directors: { $elemMatch: { $exists: true } }, writers: { $elemMatch: { $exists: true } } } }, { $project: { _id: 0, cast: 1, directors: 1, writers: { $map: { input: "$writers", as: "writer", in: { $arrayElemAt: [ { $split: ["$$writer", " ("] }, 0 ] } } } } }, { $project: { labor_of_love: { $gt: [ { $size: { $setIntersecti..
2021.02.04 -
[아적전반생] 쉐도잉 공부 - 210203
https://youtu.be/I6OxmXAUhqM 1.就送到地铁站吧,否则回去晚了,你老婆不高兴的 지하철까지만 데려다 주세요, 그렇지 않고 집에 늦게 돌아가면 아내가 화낼 거예요 2.不用上班,不用为了挣钱发愁,孩子有保姆带,这都是我们这些觉不够睡的人想都不敢想的事 출근할 필요 없고, 돈 벌려고 걱정할 필요 없고, 애는 보모가 봐주고, 이런 건 우리 같이 잠도 충분이 못자는 사람들이 감히 상상할 수 조차 없는 일이죠 3.如果,我是说如果,陈俊生要是有了外遇,你准备怎么办? 만약에 내 말은 만약에 말이야, 남편이 진짜 바람피면 너 어떻게 할거야? 4.他发过誓的,如果有的话,遭天打雷劈 그는 만약에 바람피면 하늘에서 날 벼락 떨어져 맞을 거라고 맹세했어 5.你算过你一年会花多少钱吗? 너는 네가 1년에 얼마나 쓰는지 계산해 봤니?..
2021.02.03 -
[아적전반생] 쉐도잉 공부 - 210202
https://youtu.be/U1YXUENQktw 1.我们唯一应该感兴趣的就是他们的钱包 2.用最少的时间赚最多的钱这就是高效啊 3.至于事实真相是警察的工作 4.她老公又不是马云了,还不是替别人打工吗? 5.既然你父亲把你委托给我,从今天起我就是你的监护人 6.我对你一切要负责任 7.如果你另有高就,我也不拦着你 8.但是你要在这儿一天,我必须就得管着你一天 9.她那边是每天吃饱饭没事找事的主妇太太 10.你每天管她那么多闲事干吗? 11.对主妇太太来说,老公出轨等于天要塌了 12.我要第一时间知道那个桑卓懂是个什么货色 13.没准人家真的在加班呢 14.贺函如果白天送你一条项链,晚上还有心思加班? 15.懒得理你 16.他们不敢在工作时间这么明目张胆出去买东西 17.十五分钟,我送你回去 1.우리가 유일하게 관심 갖아야 할 것은 그들의 지갑이야 2.가장 적은 시간으..
2021.02.03 -
[아적전반생] 쉐도잉 공부 - 210201
https://youtu.be/d8G-jFs7JSA 1.你要什么,如果我能达到的,我都会给你 2.越是千难万险,老天越是要落井下石 3.我现在开会走不开 4.你要换个别人也就算了,还是这种不可理喻的女人 5.麻烦你不要把我的家当成你的办公室 6.我没必要跟这样一个楚楚可怜,前途渺茫,没有任何生存能力的温室花朵讲人生道理 7.你懂个屁 8.只要你跟她划清界限,我怎么做都可以啊 9.我还心存一丝侥幸 10.臆想着陈俊生会在最后十分幡然醒悟
2021.02.03 -
Chapter 1: Basic Aggregation - $match and $project
Shaping documents with $project The correct answers are the following: Once we specify a field to retain or perform some computation in a $project stage, we must specify all fields we wish to retain. The only exception to this is the _id field. $project implicitly removes all other fields once we have retained, reshaped, or computed a new field. The exception to this is the _id field, which we m..
2021.02.03