August 2, 2025 • ☕️☕️☕️☕️ 19 min read
자바스크립트에서 **로컬 시간(Local time)**과 UTC(GMT) 간의 시간차를 분(minute) 단위로 반환하는 메서드 이 메서드는 특히 시간대(time zone)를 고려한 날짜·시간 계산이나 표준화된 타임스탬프를 만들 때 유용하다.
서버-클라이언트 간 시간 동기화
표준화된 시간 처리
new Date()
로 생성한 값에 getTimezoneOffset()
을 반영하여 UTC로 변환.타임존 보정
getTimezoneOffset()
은 이를 자동 반영하여 오차값을 반환함.옵션 | 설명 |
---|---|
git diff <commit1> <commit2> |
두 커밋 사이의 변경 사항 비교 |
git diff <branch1>..<branch2> |
브랜치 간 차이 비교 (.. 와 ... 는 의미가 다름) |
git diff HEAD |
현재 작업 디렉토리와 최신 커밋(HEAD) 비교 |
git diff --cached 또는 --staged |
staging area(인덱스)와 최신 커밋(HEAD) 비교 |
git diff <파일명> |
특정 파일만 비교 |
boolean 연산을 수행할 때 필요 이상의 계산을 하지 않고 결과를 바로 결정하는 최적화 기법을 말한다.
주로 AND
(&&
)나 OR
(||
) 연산에서 사용되며, 조건문에서 자주 등장한다.
AND (&&)
연산자
false
이면, 전체 결과는 무조건 false
이다.false
를 반환한다.if (isLoggedIn && user.hasPermission()) {
// isLoggedIn이 false이면, user.hasPermission()은 실행되지 않음
}
OR (||)
연산자
true
이면, 전체 결과는 무조건 true
이다.true
반환한다.if (isAdmin || user.hasAccess()) {
// isAdmin이 true이면, user.hasAccess()는 실행되지 않음
}
⚠️ 왜 중요한가요?
if (obj != null && obj.property == 'value') {
// obj가 null이면, property 접근 시 에러 발생하는 것을 방지
}
409 에러는 HTTP 상태 코드 중 하나로, 요청이 서버의 현재 상태와 충돌하여 처리될 수 없을 때 발생한다. 주로 PUT 요청이나 데이터베이스 업데이트 시 중복된 값을 저장하려고 할 때 나타난다.
useEffect
내 비동기 함수를 안전하게 처리하기 위한 함수 (커스텀)
export function useAsyncEffect(
effect: () => Promise<void | (() => void)>,
deps?: DependencyList
) {
useEffect(() => {
let cleanup: (() => void) | void;
effect().then(result => {
cleanup = result;
});
return () => {
cleanup?.();
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, deps);
}
사용자의 동의를 받아 위치정보를 표시한다.
navigator.geolocation
을 통해 접근한다.
Ref https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API
캡티브 마켓이 존재한다는 건 특정 시장에서 독점이나 과점이 형성되어 있다는 의미로 받아들여진다. 우리나라에서는 주로 계열사 간 내부시장을 뜻하는 말로 사용된다.
Ref https://www.moef.go.kr/sisa/dictionary/detail?idx=2543
ky.post()
)Ref https://www.npmjs.com/package/ky/v/0.9.0
mutate
onSuccess
, onError
, onSettled
등의 옵션이나 인라인 콜백을 사용.Promise
를 반환하지 않음: await
를 사용할 수 없음.const mutation = useMutation({
mutationFn: (data) => postUser(data),
onSuccess: () => {
console.log('성공!');
}
});
mutation.mutate({ name: '지은' });
또는 콜백을 인라인으로 제공한다:
mutation.mutate({ name: '지은' }, {
onSuccess: () => console.log('요청 성공'),
});
mutateAsync
Promise
를 반환: await
또는 .then().catch()
로 처리 가능.const mutation = useMutation((data) => postUser(data));
const handleSubmit = async () => {
try {
const response = await mutation.mutateAsync({ name: '지은' });
console.log('성공:', response);
} catch (error) {
console.error('에러:', error);
}
};
일반적으로 단언(또는 불변)이라고 불리며, 변수가 예상한 것과 일치하지 않을 때 초기에 에러를 발생시키는 기능이다.
assert(someValue === 42);
위 예제에서 someValue
가 42
가 아니라면 AssertionError
가 발생한다.
적절하지 않은 타입을 넘기는 것을 방지한다.
function multiply(x, y) {
assert(typeof x === "number");
assert(typeof y === "number");
return x * y;
}
Ref https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/#assertion-functions
사용자의 브라우저가 동작하는 환경을 명시한다.
예) "MacIntel"
, "Win32"
, "Linux x86_64"
, "Linux armv81"
.
Ref https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform
HTML과 CSS를 SVG로 변환하는 라이브러리
다음 JSX 코드를
import satori from 'satori'
const svg = await satori(
<div style={{ color: 'black' }}>hello, world</div>,
{
width: 600,
height: 400,
fonts: [
{
name: 'Roboto',
// Use `fs` (Node.js only) or `fetch` to read the font as Buffer/ArrayBuffer and provide `data` here.
data: robotoArrayBuffer,
weight: 400,
style: 'normal',
},
],
},
)
다음과 같은 svg로 바꿔준다.
'<svg ...><path d="..." fill="black"></path></svg>'
Ref https://github.com/vercel/satori
Connection Timeout
Read Timeout
JSON object 형태로 모듈 정의자를 지정할 수 있다.
<script type="importmap">
{
"imports": {
"shapes": "./shapes/square.js",
"shapes/square": "./modules/shapes/square.js",
"https://example.com/shapes/square.js": "./shapes/square.js",
"https://example.com/shapes/": "/shapes/square/",
"../shapes/square": "./shapes/square.js"
}
}
</script>
절대 또는 상대 경로에 매핑하여, 빌드 과정을 거치지 않고도 모듈 해석을 제어할 수 있다.
여러 개의 데이터를 그룹화하고 통계를 낸 결과를 반환해주는 API이다.
예를 들어, 2024년에 팔린 상품 중 카테고리별 총 매출이 얼마인지 보고 싶을 때, 여러 데이터를 집계(Aggregation) 할 수 있다.
💡 실제 예시 (마케팅 플랫폼 API 예시)
데이터:
[
{ "campaign": "A", "clicks": 10 },
{ "campaign": "A", "clicks": 20 },
{ "campaign": "B", "clicks": 5 }
]
Aggregation API 호출 결과 (캠페인별 클릭 수 합계):
[
{ "campaign": "A", "clicks_sum": 30 },
{ "campaign": "B", "clicks_sum": 5 }
]
🤔 이벤트 핸들러에서 Promise 함수를 호출할 때, async
~await
을 붙여야 할까?
const myPromiseFunction = async () => {
await axios.get(...)
}
return (
<>
<button onClick={myPromiseFunction}>클릭!</button> // 1️⃣
<button onClick={async () => await myPromiseFunction()}>클릭!</button> // 2️⃣
</>
)
두 방법은 대부분의 경우 동일하게 작동한다.
첫 번째 방식은 myPromiseFunction
이 반환하는 Promise를 await로 기다리며, Promise가 완전히 완료된 후 함수가 끝난다.
두 번째 방식은 myPromiseFunction
이 반환하는 Promise를 기다리지 않으며, 함수는 즉시 종료되고 Promise는 백그라운드에서 실행된다.
일반적인 경우 async
~await
으로 감싸는 것은 불필요하지만, 다음처럼 이벤트 핸들러에서 에러 처리 등 여러 작업을 할 때는 필요할 수 있다.
<button
onClick={async () => {
try {
await myPromiseFunction();
alert('완료!');
} catch (e) {
alert('실패');
}
}}
>
클릭!
</button>
개인이 만든 별 거 아닌 것 같은 프로그램이 이렇게 전국민이 다방면으로 활용하는 서비스가 되다니 흥미롭다.
티켓팅 연습게임, 포도알 만들기, 어워즈 등의 기능까지 있었다니 체험해봐야겠다. 😆
Ref https://yozm.wishket.com/magazine/detail/3214/
Ref https://www.philschmid.de/context-engineering
‘현실적인’ 기대치는 사실 ‘현실적’이지 않을 수도 있다!
“속도를 높여라(Up the tempo)”, 그리고 “야망이 현실을 만든다(Ambition shapes reality)”
Ref https://blogbyash.com/translation/optimism-shapes-reality/
단순히 Voice Over용 label을 잘 붙이거나 텍스트 크기를 키우는 것이 아닌,
유저의 디지털 숙련도에 따라 UI를 커스텀하고 있던 여러 서비스의 노력들.
Ref https://slashpage.com/grit-han-94/grit-han-article?post=943zqpmqr4n3q2wnvy87
글만 읽으면 완전히 디스토피아 같다…⚔️
Ref
소셜 미디어 생태계의 근본적 변화 - 소셜미디어는 더 이상 ‘소셜하지 않다’
전통적인 소셜 네트워크 서비스들은 이제 점차 디지털 콘텐츠 소비 플랫폼으로 전환되고 있다.
Ref https://yozm.wishket.com/magazine/detail/3243/
시간(duration) 기반의 CSS를 대체할, 물리학을 적용한 “Spring” 모델!
뉴턴 법칙, 운동방정식, 오일러 방법… 🤯
최근 본 변태 중에 가장 호기심 가는 변태
Ref https://yozm.wishket.com/magazine/detail/3245/
웹 프레임에 따라 실제 화면이 갱신되어 표시되는 주기에 따라 함수를 호출하는 requestAnimateFrame
에 대한 구체적인 가이드
반드시 1초에 60번 호출하는 것은 아니며, 디스플레이의 주사율을 따른다! (ex. 60hz)
Ref https://inpa.tistory.com/entry/🌐-requestAnimationFrame-가이드
Node.js, Python, Java 상관없이 사용할 수 있는, 표준화된 방식의 런타임 매니저!
mise.toml 설정 파일을 통해 같은 프로젝트의 팀원들과 패키지 버전을 통일할 수 있다.
Ref https://www.daleseo.com/mise/
Apple 공식 Figma/Sketch용 UI 키트로, iPhone 및 iPad 인터페이스를 매우 정밀하게 재현했다.
Ref https://developer.apple.com/design/resources/#ios-apps
Ref https://www.jonoalderson.com/conjecture/its-time-for-modern-css-to-kill-the-spa/
‘말귀 점수’와 ‘다재다능 점수’ 등의 현실적인 지표로 분석한 재밌는 글
Ref https://yozm.wishket.com/magazine/detail/3266/
항상 주장하고 싶었던, handleClick
과 onClick
를 구별해서 사용하는 것
하지만 느낌으로만 설명 가능할 뿐, 논리적으로 근거를 붙이기가 어려웠는데
답답했던 내 맘을 속 시원히 설명해준, 영어박사의 글
핵심 HTML의 기본 이벤트를 생각해보자
<button onClick={handleClick}>클릭</button>
여기서 onClick
은 “클릭이 발생했음” 을 브라우저가 알려주는 이벤트
handleClick
은 그 이벤트를 받아서 실행되는 함수
즉, 브라우저는 “클릭이 일어났어!”라고 알려주고, 개발자는 “그럼 이 함수를 실행할게”라고 응답하는 구조다.
이벤트는 “알림” - on + 실제 발생한 일 함수는 “실행” - 동사 원형 + 실제 수행할 작업 HTML처럼 생각 - 기본 태그의 이벤트 패턴 참고 재사용 고려 - 특정 컨텍스트에 종속되지 않는 이름 의미의 일치 - 이름과 실제 동작이 일치해야 함
Ref https://junilhwang.github.io/TIL/clean-code/조각모음/이벤트와_함수는_다르다/#_3-headless-ui의-장점들
이메일 서비스를 만들어 볼까… 🙄
Ref https://github.com/Mail-0/Zero
사용자 의도를 예측한다니! 진짜 별 게 다 나온다. 요즘 관심 있는 뇌과학과 연결됐을지도?
상당히 직관적으로 체험 가능한 홈페이지 구경 추천 👇👇
좋았어 빠르게 달려보는 거야 🏃♀️
빠름, 그리고 단순함
Ref https://www.catherinejue.com/fast
와! 진짜 너무 덥다. 말이 안 되는 폭염과 열대야의 연속 🥵
팀이 건물을 옮긴 후 더 쩌는 디모. 거리가 멀어진 만큼 끝없이 올라가는 한낮 최고기온과 스트레스
하지만 이 속에서도 내 길을 찾아야지.