JavaScript 이벤트 루프 설명: 예제가 포함된 호출 스택, 마이크로태스크 및 타이머

  1. 홈
  2. 블로그
  3. 소프트웨어 개발

소프트웨어 개발

JavaScript 이벤트 루프 설명: 예제가 포함된 호출 스택, 마이크로태스크 및 타이머

0의 setTimeout이 여전히 마지막으로 실행되는 이유는 무엇입니까? 하나의 스레드가 어떻게 한 번에 그렇게 많은 양을 처리할 수 있습니까? 이벤트 루프가 실제로 어떻게 작동하는지 알아보고, 실행한 코드로 테스트하고, 전형적인 인터뷰 질문을 해결하세요.

읽는 시간 9분
JavaScript 이벤트 루프 설명: 호출 스택, 마이크로태스크 및 타이머(예제 포함)

핵심 요약

  • JavaScript는 한 번에 한 조각씩 단일 스레드에서 코드를 실행합니다.
  • 호출 스택이 비어 있으면 모든 마이크로 작업이 먼저 실행되고 그 다음 하나의 작업이 실행됩니다.
  • setTimeout(fn, 0)은 “지금”이 아니라 “최소 지연 후 가능한 한 빨리”를 의미합니다.
  • 긴 동기 작업은 모든 것을 차단하므로 분할하거나 작업자로 이동하세요.

setTimeout과 Promise를 사용하여 몇 줄을 실행하면 출력 순서가 놀라울 수 있습니다. 자바스크립트 이벤트 루프가 그 이유를 설명합니다. 이는 단일 스레드 언어가 정지 없이 타이머, 네트워크 호출 및 클릭을 처리할 수 있도록 하는 메커니즘입니다.

일단 이해하고 나면 혼란스러운 버그 전체가 이해되기 시작합니다. 우리는 Node.js 24에서 각 예제를 실행했고 그 실행에서 출력이 나왔습니다. 핵심 순서 규칙은 브라우저에도 적용되며 Node.js의 차이점을 지적합니다. JavaScript promise의 기본 사항을 이미 알고 있다면 이로부터 더 많은 것을 얻을 수 있습니다.

이벤트 루프가 존재하는 이유

JavaScript는 하나의 메인 스레드에서 코드를 실행하므로 한 번에 한 부분만 실행됩니다. 단순히 네트워크 요청을 기다린 경우 응답이 돌아올 때까지 페이지가 정지됩니다.

따라서 JavaScript는 기다리지 않습니다. 느린 작업은 호스트 환경, 즉 백그라운드에서 이를 처리할 수 있는 브라우저나 Node.js로 전달됩니다. 해당 작업이 완료되면 콜백이 대기열에 배치됩니다. 이벤트 루프의 임무는 대기 중인 콜백이 비어 있을 때 스택으로 이동하는 것입니다.

혼자 일하는 요리사를 생각해 보세요. 요리사는 그것을 쳐다보는 대신 오븐에 접시를 넣고 타이머를 맞춘다. 타이머가 울리면 작업이 목록에 올라가고 요리사는 현재 손에 있는 작업을 마친 후 작업을 가져옵니다.

움직이는 부분

부품 기능 예
호출 스택 현재 실행 중인 기능을 추적합니다. 동기 코드
호스트 API 코드 외부에서 작업하세요 타이머, fetch, 파일 읽기
작업 대기열 실행할 준비가 된 콜백을 보유합니다. setTimeout, 클릭, I/O
마이크로태스크 대기열 우선순위가 더 높은 콜백을 보유합니다. .then, await, queueMicrotask
이벤트 루프 다음에 실행할 내용을 결정합니다. 지속적으로 실행

작업을 매크로태스크라고도 합니다. 엄밀히 말하면 여러 작업 소스가 있을 수 있으며 정확한 세부 사항은 환경에 따라 다릅니다.

규칙

  1. 호출 스택이 빌 때까지 모든 동기 코드를 실행합니다.
  2. 도중에 추가된 새로운 작업을 포함하여 모든개의 마이크로 작업을 실행하세요.
  3. 브라우저에서 업데이트가 예정된 경우 업데이트를 렌더링합니다.
  4. 대기열에서 작업 하나개를 가져와 실행합니다.
  5. 2단계로 돌아갑니다.

가장 중요한 세부 사항은 모든개의 마이크로 작업과 하나의개의 작업입니다. 대부분의 이벤트 루프 퍼즐은 해당 단일 규칙을 적용하여 해결됩니다.

주문 보기

console.log("1 sync");
setTimeout(() => console.log("5 timeout"), 0);
Promise.resolve().then(() => console.log("3 promise"));
queueMicrotask(() => console.log("4 microtask"));
console.log("2 sync");

// 1 sync
// 2 sync
// 3 promise
// 4 microtask
// 5 timeout

일어난 일은 다음과 같습니다. 두 개의 console.log 라인은 동기식이므로 먼저 실행되었습니다. Promise 콜백과 queueMicrotask는 마이크로태스크 대기열로 들어가 스택이 비자마자 추가된 순서대로 실행되었습니다. 타이머 콜백은 지연 시간이 0이더라도 작업 차례를 기다려야 했습니다.

마이크로태스크는 타이머 사이에서 실행됩니다.

모든 단일 작업 후에 마이크로태스크 대기열은 다시 비워집니다. 이 예는 이를 증명합니다:

setTimeout(() => {
  console.log("timer 1");
  Promise.resolve().then(() => console.log("promise inside timer 1"));
}, 0);
setTimeout(() => console.log("timer 2"), 0);

// timer 1
// promise inside timer 1
// timer 2

첫 번째 타이머 중에 생성된 Promise는 두 번째 타이머 전에 실행되었습니다. 최신 브라우저와 Node.js 11 이상은 이런 방식으로 동작합니다.

기다림이 맞는 곳

await 기능을 두 개로 나눕니다. 동기식으로 실행되기 전의 모든 작업과 이후의 모든 작업은 마이크로태스크로 예약됩니다. 이는 많은 사람들을 놀라게 합니다.

async function task() {
  console.log("A before await");
  await null;
  console.log("C after await");
}

task();
console.log("B after calling task");

// A before await
// B after calling task
// C after await

async 기능은 백그라운드에서 시작되지 않습니다. 첫 번째 await에 도달할 때까지 동일한 스레드에서 실행됩니다. 이는 null과 같이 실제 약속이 아닌 것을 기다리는 경우에도 적용됩니다. 이 구문에 대한 자세한 내용은 JavaScript async/await 가이드를 참조하세요.

루프 차단

동기 코드가 실행되는 동안에는 다른 어떤 것도 실행할 수 없습니다. 이를 보여주기 위해 타이머를 0ms로 설정한 다음 스레드를 0.5초 동안 사용 중으로 유지합니다.

const start = Date.now();
setTimeout(() => console.log("timer ran after", Date.now() - start, "ms"), 0);
while (Date.now() - start < 500) {}

// timer ran after about 500 ms

타이머의 지연은 최소이며 보장되지는 않습니다. 스택이 해제된 경우에만 실행되었습니다. 웹페이지에서 이와 같은 긴 루프는 클릭이 응답하지 않고 애니메이션이 중지됨을 의미합니다. 서버에서는 다른 모든 요청이 기다려야 하기 때문에 느린 동기 호출 하나가 Node.js 프로세스의 모든 사용자에게 피해를 줄 수 있습니다.

차단의 일반적인 원인에는 거대한 루프, 매우 큰 JSON 구문 분석, 요청 처리기의 readFileSync과 같은 동기 파일 함수 및 치명적인 정규 표현식이 포함됩니다.

팁: Chrome DevTools에서 성능 패널은 50ms보다 긴 작업을 긴 작업으로 표시합니다. 페이지를 느리게 만드는 원인을 찾는 빠른 방법입니다.

대응력 유지

무거운 작업의 경우 이벤트 루프에 숨을 쉴 수 있는 기회를 제공하십시오. 한 가지 방법은 때때로 타이머를 일시 중지하여 다른 작업을 실행하는 것입니다.

const items = [0, 1, 2, 3, 4];

async function processAll() {
  for (const item of items) {
    if (item === 2) await new Promise((r) => setTimeout(r, 0));
    console.log("item", item);
  }
}

setTimeout(() => console.log("other work gets a turn"), 0);
processAll();

// item 0
// item 1
// other work gets a turn
// item 2
// item 3
// item 4

우리가 실제 작업을 양보했기 때문에 다른 타이머가 중간에 실행되었습니다. 실제 코드는 너무 많은 항목 또는 밀리초마다 생성됩니다. 이미지 처리와 같이 CPU를 많이 사용하는 작업의 경우 브라우저의 Web Worker나 별도의 스레드에서 실행되는 Node.js의 작업자 스레드를 사용하세요.

마이크로태스크 기아

루프는 계속 진행하기 전에 마이크로 작업 대기열을 완전히 비우기 때문에 더 많은 일정을 계속 예약하는 마이크로 작업은 다른 모든 작업을 중지할 수 있습니다. 우리는 100,000개의 연결된 마이크로태스크를 사용하여 이를 테스트했습니다.

let count = 0;
let timerFired = false;
setTimeout(() => { timerFired = true; }, 0);

function spin() {
  count++;
  if (count < 100000) queueMicrotask(spin);
  else console.log("timer fired during microtasks?", timerFired);
}
queueMicrotask(spin);

// timer fired during microtasks? false

모든 작업이 완료될 때까지 타이머를 실행할 수 없습니다. 해당 체인이 종료되지 않으면 타이머가 실행되지 않으며 브라우저에서 페이지가 다시 그려지지 않습니다. 해결된 Promise에 대해 await을 사용하면 여기서는 도움이 되지 않습니다. 왜냐하면 이는 단지 또 다른 마이크로 작업을 추가하기 때문입니다. 다른 사람에게 차례를 주기 위해서는 타이머와 같은 실제 작업이 필요합니다.

브라우저에서 렌더링

브라우저는 일반적으로 작업 사이에 그림을 그릴 기회를 얻습니다. 이는 일반적인 버그를 설명합니다.

spinner.hidden = false;
doHeavyWork();              // blocks the thread
spinner.hidden = true;

브라우저가 해당 줄 사이를 렌더링할 기회가 없었기 때문에 스피너는 나타나지 않습니다. 이를 수정하려면 무거운 작업이 시작되기 전에 프레임을 통과시키거나 해당 작업을 작업자에게 옮기십시오. 시각적 요소를 변경하는 코드의 경우 requestAnimationFrame은 다음 페인트 직전에 실행되므로 애니메이션에 적합한 도구입니다.

Node.js 차이점

Node.js에는 타이머, I/O 폴링 및 setImmediate을 포함한 여러 단계로 구성된 자체 이벤트 루프가 있습니다. 또한 자체 대기열에서 실행되는 process.nextTick도 있습니다. 비동기 함수 내부에서 이를 실행할 때 본 내용은 다음과 같습니다.

setTimeout(() => console.log("timeout"), 0);
setImmediate(() => console.log("immediate"));
process.nextTick(() => console.log("nextTick"));
Promise.resolve().then(() => console.log("promise"));

// promise
// nextTick
// immediate
// timeout

많은 기사에서는 nextTick이 항상 약속보다 뛰어나고 타이머가 setImmediate보다 낫다고 말합니다. 우리의 결과는 그것이 그렇게 간단하지 않다는 것을 보여줍니다. 우리 코드는 이미 마이크로태스크 내에서 실행 중이었으므로 약속 대기열이 먼저 실행되었습니다. 그리고 setTimeout과 setImmediate의 순서는 어디서 호출되는지에 따라 달라지는 것으로 알려져 있다. 따라서 이들의 정확한 순서에 의존하는 코드를 작성하지 마십시오. 한 가지 일이 계속해서 발생해야 한다면 명시적으로 연결하세요.

면접퀴즈

답을 읽기 전에 순서를 맞춰보세요.

console.log("a");
setTimeout(() => console.log("b"), 0);
Promise.resolve().then(() => {
  console.log("c");
  setTimeout(() => console.log("d"), 0);
  Promise.resolve().then(() => console.log("e"));
});
console.log("f");

우리의 실행은 a, f, c, e, b, d를 인쇄했습니다. 이유는 다음과 같습니다.

  1. a과 f는 동기식이므로 먼저 실행됩니다.
  2. 스택이 비어 있으므로 마이크로 태스크가 실행됩니다: c, 그런 다음 새로운 마이크로 태스크 e가 동일한 라운드에서 실행됩니다.
  3. 이제 하나의 작업: 타이머 b이(가) 먼저 대기열에 추가되었습니다.
  4. 그런 다음 다음 작업: 타이머 d은 마이크로 작업 중에 대기열에 추가되었습니다.

일반적인 실수

  • 생각setTimeout이 정확합니다. 지연은 최소한입니다.
  • 생각 async는 또 다른 스레드를 의미합니다. 비동기 코드는 여전히 대기 사이의 기본 스레드에서 실행됩니다.
  • 수면을 사용하여 순서를 수정합니다. 실제 조건을 기다리는 것이 훨씬 더 안정적이며 이는 불안정한 테스트에도 적용됩니다.
  • await과 함께 forEach를 사용합니다. 항목 사이를 기다리지 않습니다. JavaScript 배열 방법을 참조하세요.
  • 서버 핸들러에서 과도한 동기 작업을 수행합니다. 하나의 요청이 다른 모든 요청을 지연시킬 수 있습니다.

마무리

핵심 규칙을 기억하세요. 스택이 빌 때까지 스택을 실행하고 모든 마이크로태스크를 실행한 다음 하나의 태스크를 실행하고 반복하세요. 그 밖의 모든 것은 그것으로부터 따릅니다. 잘 이해하려면 위의 퀴즈를 직접 작성하고 종이에 결과를 예측한 다음 실행해 보세요. 하나의 오류를 파악하고 그 이유를 이해하면 어떤 다이어그램보다 더 많은 것을 배울 수 있습니다.

자주 묻는 질문

JavaScript의 이벤트 루프란 무엇입니까?

콜 스택이 비어 있을 때 대기 중인 콜백을 실행하는 메커니즘입니다. 이를 통해 단일 스레드 JavaScript가 차단 없이 타이머, 입력 및 네트워크 응답을 처리할 수 있습니다.

마이크로태스크와 태스크의 차이점은 무엇인가요?

Promise 콜백과 같은 마이크로태스크는 스택이 비워지는 즉시 모두 실행됩니다. 타이머와 같은 작업은 한 번에 하나씩 실행되며 각 작업 후에는 마이크로 작업이 소모됩니다.

0인 setTimeout이 즉시 실행되지 않는 이유는 무엇입니까?

콜백은 작업 차례를 기다려야 합니다. 모든 동기 코드와 마이크로태스크가 먼저 실행되며 지연 시간은 정확한 시간이 아닌 최소 수준입니다.

JavaScript는 단일 스레드인가요?

기본 JavaScript 코드는 하나의 스레드에서 실행됩니다. 브라우저와 Node.js는 일부 백그라운드 작업에 다른 스레드를 사용하고 작업자는 코드를 병렬로 실행할 수 있습니다.

대기가 이벤트 루프를 차단합니까?

아니요. wait는 해당 비동기 기능만 일시 중지하고 그 동안 다른 코드를 실행할 수 있습니다. 하지만 이전이나 이후의 긴 동기 코드는 여전히 루프를 차단할 수 있습니다.

계속 학습하세요

Stack Quora와 작업

테스트, WordPress 또는 SEO에 도움이 필요하십니까?

우리는 팀이 더 나은 소프트웨어를 출시하고 사이트를 성장시킬 수 있도록 돕습니다. 현재 진행 중인 작업을 알려주시면 명확한 다음 단계를 제안해 드리겠습니다.

계속 읽으세요

추가 가이드 테스트, AI 및 최신 개발

이 기사가 마음에 드셨나요? 주제를 선택하고 최신 튜토리얼로 바로 이동하세요.

인공지능

AI 환각 설명: 언어 모델이 사물을 구성하는 이유와 이를 줄이는 방법

AI 환각은 그것이 무엇인지, 언어 모델이 환각을 생성하는 이유, 일반적인 유형, 접지 및 프롬프트를 통해 환각을 줄이는 방법, 그리고 우리가 실행한 간단한 점검에 대해 설명했습니다.

기사 읽기 →
DevOps

환경 변수 설명: .env 파일, 비밀 및 구성이 올바르게 완료되었습니다.

우리가 실행한 Python 예제를 통해 설명된 환경 변수: 읽기 및 설정, 모든 값이 문자열인 이유, .env 파일, 프로세스 상속, 비밀 및 유효성 검사.

기사 읽기 →
소프트웨어 개발

API 속도 제한 설명: 알고리즘, 헤더 및 429 오류 처리

우리가 실행한 시뮬레이션을 통해 설명된 API 속도 제한: 토큰 버킷, 고정 창, 슬라이딩 창, 429 응답, 속도 제한 헤더, 백오프를 사용한 재시도 및 테스트 제한.

기사 읽기 →
테스트 자동화

Python에서 조롱: unittest.mock, 패치 및 테스트를 거짓말로 만드는 실수

Unittest.mock을 사용하여 Python에서 모의, 테스트됨: 모의 및 return_value, 부작용, 이름이 사용되는 패치, 사양 및 자동 사양, 모의 날짜 및 일반적인 실수.

기사 읽기 →
소프트웨어 테스트

코드 커버리지 설명: 회선 커버리지와 분기 커버리지 및 100%의 실제 의미

실제 Coverage.py 실행을 통해 설명되는 코드 적용 범위: 라인, 분기 및 조건 적용 범위, 보고서 읽기, 100% 적용 범위가 여전히 버그를 놓칠 수 있는 이유 및 합리적인 대상.

기사 읽기 →
데이터베이스 및 SQL

SQL의 DELETE vs TRUNCATE vs DROP: 차이점, 롤백 및 사용 시기

테스트된 SQL을 통해 DELETE 대 TRUNCATE 대 DROP에 대해 설명합니다. 각각의 제거, 롤백, 트리거, ID 재설정, 속도 및 PostgreSQL, MySQL, SQL Server 및 SQLite의 차이점.

기사 읽기 →
데이터베이스 및 SQL

SQL 뷰 설명: 예제를 통해 함정 생성, 사용 및 방지

우리가 실행한 쿼리로 설명된 SQL 뷰: 뷰 생성, 실시간 결과, 열 숨기기, 성능, 업데이트 가능하고 구체화된 뷰, 손상된 종속성 및 모범 사례.

기사 읽기 →
소프트웨어 개발

TypeScript 인터페이스와 유형: 실제 차이점, 컴파일러로 테스트

TypeScript 인터페이스 대 유형, 실제 컴파일러로 확인: 둘 다 할 수 있는 것, 하나만 할 수 있는 것, 선언 병합, 확장 대 교차점 및 따라야 할 간단한 규칙.

기사 읽기 →
소프트웨어 개발

Python *args 및 **kwargs 설명: 명확한 예가 포함된 유연한 함수

Python *args 및 **kwargs는 우리가 실행한 코드(패킹 및 언패킹, 매개변수 순서, 키워드 전용 및 위치 전용 인수, 데코레이터 및 일반적인 오류)를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Python Lambda 함수: 구문, 실제 사용 및 사용하지 말아야 할 경우

Python 람다 함수는 구문, 키를 사용한 정렬, 맵 및 필터, 클로저, 후기 바인딩 트랩, 일반 def가 더 나은 선택인 경우 등 우리가 실행한 코드로 설명되었습니다.

기사 읽기 →
인공지능

AI 에이전트란 ​​무엇입니까? 작동 방식, 간단한 에이전트 루프를 사용하여 실행할 수 있음

AI 에이전트란 무엇입니까? 우리가 실행한 작은 Python 루프, 실제 위험 및 간단한 챗봇이 더 나은 선택일 때 에이전트 루프, 도구, 메모리 및 가드레일에 대한 일반 가이드입니다.

기사 읽기 →
DevOps

모니터링과 관찰 가능성: 로그, 지표, 추적을 통한 실제 차이점

모니터링과 관찰 가능성 설명: 알려진 오류와 알려지지 않은 오류, 로그, 지표 및 추적, 결제 사건 안내, 골든 신호, OpenTelemetry 및 유용한 경고.

기사 읽기 →
DevOps

Docker 볼륨과 바인딩 마운트: 컨테이너 데이터를 올바른 방식으로 유지

Docker 볼륨과 바인드 마운트 설명: 컨테이너 데이터가 사라지는 이유, 명명된 볼륨, 바인드 마운트, tmpfs, Compose 예제, 백업, 권한 및 각 사용 시기.

기사 읽기 →
테스트 자동화

TDD와 BDD: 주요 차이점, 두 가지 방식으로 구축된 하나의 기능 및 각 사용 시기

TDD와 BDD는 두 가지 방식으로 구축된 하나의 할인 기능, 즉 우리가 실행한 코드를 사용한 적록 리팩토링, 주어진 시점 시나리오, 도구, 장단점 및 각 사용 시기를 설명합니다.

기사 읽기 →
소프트웨어 테스트

UAT(사용자 승인 테스트): 프로세스, 체크리스트 및 실제 사례

사용자 승인 테스트는 누가 실행하는지, QA와 어떻게 다른지, 7단계 프로세스, UAT 테스트 사례 템플릿, 체크리스트, 승인 기준 및 일반적인 실수에 대해 설명했습니다.

기사 읽기 →
데이터베이스 및 SQL

SQL NULL 값 설명: IS NULL, COALESCE, NULLIF 및 피해야 할 함정

우리가 실행한 쿼리를 통해 설명된 SQL NULL 값: 3개 값 논리, IS NULL, COALESCE, NULLIF, 집계, 조인 및 정렬이 NULL을 처리하는 방법 및 조용히 발생하는 버그.

기사 읽기 →
데이터베이스 및 SQL

SQL CASE WHEN 문: 구문, 실제 예 및 일반적인 실수

우리가 실행한 쿼리로 설명된 SQL CASE: 단순 및 검색 양식, 조건 순서, SUM이 있는 피벗, COUNT 트릭, 사용자 정의 정렬, 업데이트 및 피해야 할 NULL 트랩.

기사 읽기 →
소프트웨어 개발

JWT란 무엇입니까? 실제 예제로 설명되는 JSON 웹 토큰

JWT란 무엇입니까? JSON 웹 토큰은 세 부분, 즉 우리가 실행한 코드에서 구축 및 변조된 토큰, JWT 대 세션, 저장소, 새로 고침 토큰 및 보안 실수를 설명했습니다.

기사 읽기 →
소프트웨어 개발

JavaScript 이벤트 루프 설명: 예제가 포함된 호출 스택, 마이크로태스크 및 타이머

호출 스택, 작업 및 마이크로태스크 대기열, setTimeout 0이 즉시 실행되지 않는 이유, 차단, 기아 및 인터뷰 퀴즈 등 우리가 실행한 코드로 JavaScript 이벤트 루프를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Python 생성기 및 수율 설명: 실제 예제로 메모리 절약

Python 생성기와 항복은 우리가 실행한 코드로 설명됩니다. 일시 중지 및 재개 방법, 측정된 메모리 절약, 파이프라인, 무한 시퀀스, 항복, 전송 및 공통 트랩.

기사 읽기 →
인공지능

임베딩이란 무엇입니까? 벡터와 코사인 유사성을 간단하게 설명

임베딩이란 무엇입니까? 벡터, 코사인 유사성 및 의미론적 검색에 대한 일반 언어 가이드로, 우리가 실행한 작은 예, 일반적인 용도, 모델 선택 및 알려진 한계를 제공합니다.

기사 읽기 →
DevOps

블루-그린 배포와 카나리아 배포: 차이점, 장단점 및 선택 방법

블루-그린 배포와 카나리아 배포에 대한 설명: 각각의 작동 방식, 비용, 위험 및 롤백, 테스트한 안정적인 사용자 버킷팅, 데이터베이스 마이그레이션, 롤링 업데이트 및 선택 방법.

기사 읽기 →
테스트 자동화

불안정한 테스트: 원인과 해결 방법

우리가 실행한 데모를 통해 불안정한 테스트에 대해 설명했습니다. 주요 원인, 확인 및 진단 방법, 시기, 공유 상태 및 날짜, 격리 프로세스에 대한 적절한 수정 사항.

기사 읽기 →
소프트웨어 테스트

부하 테스트와 스트레스 테스트 비교: 차이점, 측정항목 및 k6 예

부하 테스트와 스트레스 테스트 비교 설명: 각각의 증명, 스파이크 및 흡수 테스트, 중요한 측정항목, 평균이 잘못된 이유, k6 예 및 테스트 계획 방법.

기사 읽기 →
소프트웨어 테스트

테스트 케이스와 테스트 시나리오: 주요 차이점, 예 및 각각의 사용 시기

테스트 케이스와 테스트 시나리오 설명: 명확한 정의, 병렬 테이블, 시나리오에서 케이스로 가져온 하나의 비밀번호 재설정 기능, 템플릿 및 각 사용 시기.

기사 읽기 →
데이터베이스 및 SQL

SQL 쿼리 최적화: 타이밍에 따라 실행 계획을 읽고 느린 쿼리를 수정합니다.

백만 개의 행에서 테스트된 SQL 쿼리 최적화: 실행 계획 읽기, 올바른 인덱스 추가, 분할할 수 없는 필터 수정, 복합 인덱스 및 키 세트 페이지 매김 사용.

기사 읽기 →
데이터베이스 및 SQL

SQL UNION 대 UNION ALL: 테스트된 차이점, 예 및 성능

SQL UNION과 UNION ALL은 우리가 실행한 쿼리(중복, 둘 다 따르는 규칙, 실제 데이터 버그, 측정된 성능, INTERSECT 및 EXCEPT, 각각의 사용 시기)를 설명합니다.

기사 읽기 →
소프트웨어 개발

JavaScript Fetch API 튜토리얼: GET, POST, 오류 처리 및 시간 초과

로컬 서버에 대해 테스트된 JavaScript Fetch API 튜토리얼: GET 및 POST, 404가 발생하지 않는 이유, 재사용 가능한 도우미, 쿼리 문자열, 시간 초과, CORS 및 일반적인 실수.

기사 읽기 →
소프트웨어 개발

Python 파일 처리: 읽기, 쓰기, CSV, JSON 및 pathlib 예제 포함

우리가 실행한 코드로 설명된 Python 파일 처리: 개방형 모드, 대용량 파일 읽기, CSV, JSON, pathlib, 바이너리 파일, 안전한 쓰기, 오류 처리 및 일반적인 실수.

기사 읽기 →
소프트웨어 개발

Python 클래스 및 객체: 실제 예제가 포함된 OOP 튜토리얼

우리가 실행한 코드로 설명된 Python 클래스와 객체: __init__, 메소드, 클래스 대 인스턴스 속성, 상속, 속성, 던더 메소드, 데이터 클래스 및 일반적인 실수.

기사 읽기 →
인공지능

대규모 언어 모델이란 무엇입니까? LLM의 작동 방식, 과대광고 없이 설명

대규모 언어 모델이란 무엇입니까? LLM은 토큰, 임베딩, 주의, 훈련, 온도 및 컨텍스트 창, 작은 다음 단어 데모 및 실제 한계 등 일반 언어로 설명됩니다.

기사 읽기 →
DevOps

초보자를 위한 Linux 명령: 예제가 포함된 필수 터미널 가이드

탐색, 파일, 로그 보기, grep, 파이프, 권한, 프로세스 및 아카이브 등 작업별로 그룹화된 초보자를 위한 Linux 명령과 실용적인 로그 분석 예제가 포함되어 있습니다.

기사 읽기 →
테스트 자동화

셀레늄 대 극작가: 주요 차이점, 코드 비교 및 선택할 항목

Selenium과 Playwright 비교: 아키텍처, 대기, 브라우저 및 언어 지원, 디버깅, 두 도구 모두에서 동일한 테스트, 마이그레이션 조언 및 선택 방법.

기사 읽기 →
소프트웨어 테스트

등가 분할: 실제 예제를 통해 설명되는 테스트 설계 기법

등가 분할 설명: 유효한 파티션과 유효하지 않은 파티션을 찾는 방법, 연령, 비밀번호 및 쿠폰에 대한 작업 예제, 실행한 테스트, 경계와 쌍을 이루는 이유.

기사 읽기 →
소프트웨어 테스트

소프트웨어 테스팅의 심각도와 우선순위: 차이점, 매트릭스 및 실제 사례

소프트웨어 테스팅의 심각도와 우선순위에 대한 설명: 명확한 정의, 예제가 포함된 4방향 매트릭스, 수준 척도, 각 항목을 설정하는 사람 및 버그 분류 실행 방법.

기사 읽기 →
데이터베이스 및 SQL

SQL 하위 쿼리 자습서: 유형, 상관 하위 쿼리 및 EXISTS(예제 포함)

스칼라, IN, FROM 및 SELECT 하위 쿼리, 상관 하위 쿼리, EXISTS, NOT IN NULL 트랩 및 하위 쿼리 대 JOIN 대 CTE 등 우리가 실행한 쿼리가 포함된 SQL 하위 쿼리 자습서입니다.

기사 읽기 →
데이터베이스 및 SQL

SQL 트랜잭션 및 ACID 설명: COMMIT, ROLLBACK 및 격리 수준

COMMIT, ROLLBACK, 저장점, 잠금, 격리 수준, 더티 읽기, 교착 상태 및 모범 사례 등 우리가 실행한 은행 이체를 통해 SQL 트랜잭션 및 ACID를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까

Git merge vs rebase를 실제 로그 출력, 비교표, rebase의 황금률, 안전한 팀 워크플로로 설명합니다.

기사 읽기 →
소프트웨어 개발

파이썬 리스트 컴프리헨션: 문법, 예제, 피해야 할 때

파이썬 리스트 컴프리헨션 설명: 문법, 필터링, if-else, 중첩 반복문, 실제 측정 시간, 그리고 일반 for 반복문이 더 나은 경우.

기사 읽기 →
데이터베이스 및 SQL

예제로 쉽게 배우는 SQL JOIN (Inner, Left, Right, Full)

샘플 테이블과 쿼리로 SQL JOIN을 단계별로 이해하세요. INNER, LEFT, RIGHT, FULL, CROSS, SELF와 흔한 실수, 성능 팁까지 정리했습니다.

기사 읽기 →