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

  1. 홈
  2. 블로그
  3. 데이터베이스 및 SQL

데이터베이스 및 SQL

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

두 계좌 간 자금 이동 도중 서버에 장애가 발생하면 어떻게 되나요? 거래가 답입니다. 실제 사례에서 어떻게 작동하는지, ACID가 무엇을 의미하는지, 격리 수준을 선택하는 방법을 알아보세요.

읽는 시간 9분
SQL 트랜잭션 및 ACID 설명: COMMIT, ROLLBACK 및 격리 수준

핵심 요약

  • 트랜잭션은 명령문을 그룹화하여 모두 함께 성공하거나 모두 실패하도록 합니다.
  • COMMIT은 변경 사항을 영구적으로 적용하고 ROLLBACK는 취소합니다.
  • ACID는 원자성, 일관성, 격리성, 내구성을 나타냅니다.
  • 격리를 강화하면 더 많은 이상 현상을 방지할 수 있지만 동시성이 줄어들 수 있으므로 신중하게 선택하세요.

Asha에서 Ben으로 300루피를 이동하려면 두 가지 업데이트가 필요합니다. 한 계정에서 빼고 다른 계정에 추가하는 것입니다. 그들 사이에 시스템이 실패하면 돈은 사라진다. SQL 트랜잭션은 두 단계를 단일 단위로 처리하여 이를 불가능하게 만들기 위해 존재합니다.

이 가이드에서는 작은 계정 테이블에서 커밋, 롤백 및 실패를 실행합니다. 우리는 SQLite에서 해당 예제를 실행했으며 표시된 잔액은 해당 실행에서 나온 것입니다. 기본 명령은 데이터베이스 전체에서 유사하지만 잠금 및 격리 동작은 많이 다르므로 데이터베이스 설명서를 확인할 수 있는 위치를 알려드립니다.

거래란 무엇입니까?

트랜잭션은 데이터베이스가 단일 논리 작업으로 처리하는 하나 이상의 SQL 문의 시퀀스입니다. 우리 테이블은 다음과 같습니다.

CREATE TABLE accounts (
  id INT PRIMARY KEY,
  owner TEXT,
  balance INT CHECK (balance >= 0)
);

INSERT INTO accounts VALUES (1, 'Asha', 1000), (2, 'Ben', 200);

CHECK 제약 조건은 잔액이 0 아래로 내려갈 수 없다는 규칙이며 나중에 사용하겠습니다. 트랜잭션을 시작하는 구문은 다양합니다. SQLite와 PostgreSQL은 BEGIN를 허용하고, MySQL에도 START TRANSACTION이 있으며, SQL Server는 BEGIN TRANSACTION를 사용합니다.

명시적 트랜잭션 외부에서 대부분의 데이터베이스는 각 문이 완료되자마자 저장되는 autocommit을 사용합니다. Oracle은 커밋할 때까지 세션이 트랜잭션에 유지되므로 주목할만한 예외입니다.

COMMIT: 영구적으로 설정

BEGIN;
UPDATE accounts SET balance = balance - 300 WHERE id = 1;
UPDATE accounts SET balance = balance + 300 WHERE id = 2;
COMMIT;

-- Asha | 700
-- Ben  | 500

COMMIT이 실행될 때까지 변경 사항은 잠정적입니다. 성공적으로 반환되면 데이터베이스는 해당 내용이 저장되었음을 보장합니다. 두 계정의 합계는 1200으로 유지되었으며, 이것이 연습의 전체 요점입니다.

ROLLBACK: 모두 취소

ROLLBACK은 트랜잭션이 시작된 이후 모든 것을 취소합니다.

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SELECT owner, balance FROM accounts;
-- Asha | 600   (visible inside this transaction)
-- Ben  | 500

ROLLBACK;
SELECT owner, balance FROM accounts;
-- Asha | 700   (back to where it was)
-- Ben  | 500

커밋하기 전에 연결이 끊어지거나 서버가 충돌하는 경우 롤백도 자동으로 발생하므로 반쯤 완료된 트랜잭션은 유지되지 않습니다.

명령문이 실패할 때

여기에 좀 더 현실적인 사례가 있습니다. Asha는 계정에 보유되지 않은 5000을 보내려고 합니다. Ben에 대한 대변이 먼저 실행된 다음 차변이 CHECK 규칙을 위반합니다.

BEGIN;
UPDATE accounts SET balance = balance + 5000 WHERE id = 2;
UPDATE accounts SET balance = balance - 5000 WHERE id = 1;
-- error: CHECK constraint failed: balance >= 0

ROLLBACK;

-- Asha | 700
-- Ben  | 500

거래가 없었다면 Ben은 5000을 보관했을 것이고 장부는 틀렸을 것입니다. 한 가지 중요한 세부 사항에 유의하세요. 실패하는 문이 항상 거래 자체를 취소하는 것은 아닙니다. 예를 들어 SQLite 및 MySQL에서는 이전 문이 보류 상태로 남아 있을 수 있으므로 코드에서 롤백을 실행해야 합니다. 대신 PostgreSQL은 전체 트랜잭션을 중단된 것으로 표시하고 롤백할 때까지 추가 명령문을 거부합니다.

애플리케이션 코드에서는 항상 트랜잭션과 오류 처리를 쌍으로 연결하십시오. Python의 아이디어는 다음과 같습니다. Python 예외 처리에 대한 가이드에서는 구문을 설명합니다.

try:
    conn.execute("BEGIN")
    conn.execute(debit_sql, values)
    conn.execute(credit_sql, values)
    conn.execute("COMMIT")
except Exception:
    conn.execute("ROLLBACK")
    raise

세이브포인트

저장점은 트랜잭션 내부의 위치를 표시하므로 작업의 일부만 취소할 수 있습니다.

BEGIN;
UPDATE accounts SET balance = balance - 50 WHERE id = 1;
SAVEPOINT bonus;
UPDATE accounts SET balance = balance + 999 WHERE id = 2;
ROLLBACK TO bonus;
UPDATE accounts SET balance = balance + 50 WHERE id = 2;
COMMIT;

-- Asha | 650
-- Ben  | 550

999 보너스는 취소되었으며 나머지 거래는 계속 진행되었습니다. 이는 긴 프로세스의 선택적 단계에 유용합니다.

ACID 속성 설명

재산 약속 우리의 전송에서
원자성 전부 아니면 전무 두 업데이트가 모두 발생하거나 둘 다 발생하지 않습니다.
일관성 이후에도 규칙은 유지됩니다. 어떤 잔고도 CHECK 규칙을 깨뜨릴 수 없습니다
격리 동시 작업이 방해되지 않음 다른 사람들은 절반만 완료된 전송을 볼 수 없습니다.
내구성 커밋된 데이터는 장애 후에도 유지됩니다. COMMIT 이후의 정전은 아무것도 잃지 않습니다.

일관성은 흔히 오해됩니다. 데이터베이스는 제약 조건 및 외부 키와 같이 선언한 규칙만 적용합니다. 코드가 잘못된 금액을 이체하는 것을 막지는 못합니다. 내구성은 일반적으로 미리 쓰기 로그를 통해 달성됩니다. 여기서 변경 사항은 커밋이 확인되기 전에 디스크에 안전하게 기록됩니다.

동시 트랜잭션에서는 어떻게 되나요?

하나의 SQLite 파일에 대해 두 개의 연결을 열었습니다. 첫 번째는 아직 커밋하지 않고 트랜잭션을 시작하고 행을 1에서 2로 업데이트했습니다. 두 번째 연결에서 본 내용은 다음과 같습니다.

Connection B reads:   1                     -- no uncommitted data
Connection B writes:  database is locked    -- it has to wait
(A commits)
Connection B reads:   2                     -- now it sees the change

SQLite는 한 번에 하나의 기록기만 허용합니다. 이는 많은 트랜잭션이 동시에 서로 다른 행을 쓸 수 있는 서버 데이터베이스보다 간단합니다. 그러나 원칙은 동일합니다. 다른 세션은 일반 설정에서 커밋되지 않은 변경 사항을 볼 수 없으며 충돌하는 쓰기는 기다려야 합니다. 저희 테스트에서는 두 번째 연결을 기다리지 않고 바로 포기하도록 설정했기 때문에 오류가 단번에 나타났습니다.

이상 징후 읽기

거래가 중복되면 특정 문제가 발생할 수 있습니다. SQL 표준은 트랜잭션이 관찰할 수 있는 항목을 다음과 같이 정의합니다.

이상 무슨 일이 일어나는가
더러운 읽기 다른 트랜잭션이 커밋하지 않은 변경 사항을 읽었으며 나중에 롤백될 수 있습니다.
반복 불가능한 읽기 한 트랜잭션에서 행을 두 번 읽고 다른 값을 얻습니다. 그 사이에 누군가 커밋했기 때문입니다.
팬텀 읽기 동일한 쿼리를 두 번 실행하면 누군가가 일부 행을 삽입하거나 삭제했기 때문에 추가 또는 누락된 행이 표시됩니다.

또 다른 문제는 업데이트 손실입니다. 두 세션은 잔액 100을 읽고, 각각 10을 더하고, 각각 110을 씁니다. 답이 120이어야 할 때 한 번의 업데이트는 사실상 사라졌습니다.

SQL 격리 수준

격리 수준을 사용하면 동시성을 위해 엄격함을 교환할 수 있습니다. SQL 표준이 각 수준에서 허용하는 내용은 다음과 같습니다.

레벨 더러운 읽기 반복 불가능한 읽기 팬텀 읽기
커밋되지 않은 읽기 가능 가능 가능
커밋된 읽기 방지됨 가능 가능
반복 읽기 방지됨 방지됨 가능
직렬화 가능 방지됨 방지됨 방지됨
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

정확한 구문과 동작은 데이터베이스에 따라 다릅니다. 기본값도 다릅니다. PostgreSQL과 SQL Server는 커밋된 읽기를 사용하는 반면 MySQL의 InnoDB는 반복 가능한 읽기를 사용합니다. 일부 데이터베이스는 표준에서 요구하는 것보다 더 강력한 보증을 제공하거나 한 수준을 다른 수준으로 취급합니다. 예를 들어 PostgreSQL에서 커밋되지 않은 읽기는 커밋된 읽기처럼 동작합니다. 특정 동작에 의존하기 전에 항상 데이터베이스 문서를 읽으십시오.

팁: 업데이트가 손실된 경우 UPDATE accounts SET balance = balance + 10와 같이 단일 문으로 변경하세요. 이전에 읽은 내용을 바탕으로 애플리케이션에서 계산을 수행하면 격차가 벌어집니다.

교착상태

교착 상태는 두 트랜잭션이 각각 다른 트랜잭션에 필요한 잠금을 보유할 때 발생합니다. 트랜잭션 A는 행 1을 잠그고 행 2를 원하는 반면, 트랜잭션 B는 행 2를 잠그고 행 1을 원합니다. 둘 다 계속할 수 없습니다.

PostgreSQL, MySQL 및 SQL Server와 같은 데이터베이스는 이를 감지하고 오류가 있는 트랜잭션 하나를 취소합니다. 이는 정상적인 동작이므로 애플리케이션은 이에 대비해야 합니다. 교착 상태를 줄이려면 항상 가장 낮은 계정 ID부터 먼저 행을 업데이트하고, 트랜잭션을 짧게 유지하고, 피해자로 선택되면 다시 시도하는 등 일관된 순서로 행을 업데이트하세요.

모범 사례

  • 거래를 짧게 유지하세요. 긴 거래는 잠금을 유지하고 다른 사용자를 차단합니다.
  • 트랜잭션 내에서 사용자나 느린 API를 기다리지 마십시오. 시작하기 전이나 후에 해당 작업을 수행하십시오.
  • 항상 실패를 처리합니다. 모든 경로는 커밋 또는 롤백으로 끝나야 합니다.
  • 제약조건을 추가합니다. 데이터베이스에 적용할 실제 규칙을 제공합니다. 좋은 테이블 디자인도 도움이 됩니다.
  • 좋은 색인을 사용하십시오. 조회가 빠르면 잠금이 유지되는 시간이 단축됩니다.
  • 재시도에 주의하세요. 교착 상태에서 재시도하되 작업이 두 번 적용되지 않도록 하세요.
  • 의도적으로 동시성을 테스트합니다. 이러한 버그 중 다수는 로드 시에만 나타나므로 기본적인 통합 테스트만으로는 이를 드러내지 못할 수도 있습니다.

마무리

거래는 여러 위험한 단계를 하나의 안전한 작업으로 바꾸고 ACID는 이를 신뢰할 수 있게 만드는 보장을 설명합니다. 비즈니스 작업이 두 개 이상의 행이나 테이블에 닿을 때마다 중간에 중지하면 어떤 일이 일어날지 자문해 보세요. 답변이 걱정된다면 거래로 마무리하세요. 연습하려면 로컬 데이터베이스에서 두 개의 세션을 열고 직접 이상 현상을 생성해 보십시오.

자주 묻는 질문

SQL에서 트랜잭션이란 무엇입니까?

트랜잭션은 하나의 단위로 처리되는 SQL 문 그룹입니다. COMMIT를 사용하여 모두 저장하거나 ROLLBACK을 사용하여 모두 취소합니다.

데이터베이스의 ACID 속성은 무엇입니까?

ACID는 원자성, 일관성, 격리성 및 내구성을 나타냅니다. 이들은 함께 트랜잭션이 전부 아니면 전무인지 확인하고, 규칙을 그대로 유지하며, 방해하지 않고 장애에서 살아남습니다.

COMMIT와 ROLLBACK의 차이점은 무엇입니까?

COMMIT는 트랜잭션의 모든 변경 사항을 영구적으로 저장합니다. ROLLBACK은 이를 취소하고 트랜잭션이 시작되기 전의 상태로 데이터를 반환합니다.

더티 리드(Dirty Read)란 무엇입니까?

더티 읽기(dirty read)는 한 트랜잭션이 다른 트랜잭션이 아직 커밋하지 않은 변경 사항을 읽는 경우입니다. 다른 트랜잭션이 롤백되면 읽은 데이터는 실제로 존재하지 않습니다.

어떤 격리 수준을 사용해야 합니까?

데이터베이스의 기본값으로 시작하세요. 일반적으로 괜찮습니다. 이상 현상이 허용되지 않는 중요한 논리에는 직렬화 기능을 사용하고 실패한 트랜잭션을 재시도할 준비를 하십시오.

계속 학습하세요

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와 흔한 실수, 성능 팁까지 정리했습니다.

기사 읽기 →