[SQL] 여러 개의 UPDATE 문을 실행한 후, 최종적으로 영향을 받은 전체 행의 개수를 세고 싶다
@@ROWCOUNT는 직전에 실행된 SQL 문이 영향을 준 행의 개수를 반환하는 전역 변수예요. 여러 개의 UPDATE 문을 실행할 경우, 각 UPDATE 문 직후에 이 값을 변수에 누적해서 더하면 최종 결과를 얻을 수 있어요.
-- 총 업데이트된 행 수를 저장할 변수 선언
DECLARE @TotalRowCount INT = 0;
-- 첫 번째 UPDATE 문 실행
UPDATE dbo.Customers
SET CustomerStatus = 'VIP'
WHERE TotalPurchases >= 100000;
-- 첫 번째 UPDATE의 영향을 받은 행 수를 변수에 더하기
SET @TotalRowCount = @TotalRowCount + @@ROWCOUNT;
-- 두 번째 UPDATE 문 실행
UPDATE dbo.Customers
SET CustomerStatus = 'Gold'
WHERE TotalPurchases >= 50000 AND TotalPurchases < 100000;
-- 두 번째 UPDATE의 영향을 받은 행 수를 변수에 더하기
SET @TotalRowCount = @TotalRowCount + @@ROWCOUNT;
-- 최종적으로 업데이트된 총 행 수 출력
PRINT '총 ' + CAST(@TotalRowCount AS NVARCHAR(10)) + '개의 행이 업데이트되었습니다.';
그림을 본다는 건 꿈을 꾼다는 것 그림을 본다는 건 사랑을 한다는 것 세상살이 모든 고달픔과 시름과 걱정 내려놓고 어디론가 잠시 샛길로 빠져 걸어본다는 것 여럿이서도 좋겠지만 혼자라면 더욱 홀가분하고 좋은 것 (나태주의 시 중에서)
- 김두엽의《그림 그리는 할머니 김두엽 입니다 》중에서 -
* 그림을 보는 것만으로도 꿈을 꾸고 사랑도 할 수 있는데 그림을 직접 그리면 어떨까요? 아마도 더 많은 꿈, 더 아름다운 사랑을 하지 않을까요? 글을 쓰고 시(詩)도 쓰고 그림을 그리는 것은 무에서 유를 만드는 창조 행위입니다. 전율과 흥분과 희열이 춤을 추는 무릉도원입니다.
foreign key는... not valid후validate constraint방식 사용
Range 쿼리
겹치지 않는 범위:
단순 조건p >= start and p <= end는 비효율적 (복합 인덱스 있어도)
효율적 방식:
select *
from (select ... from ranges where start <= p order by start desc limit 1)
where end >= p
(start 컬럼 인덱스만 필요)
겹칠 수 있는 범위:
일반 B-tree 인덱스로는 비효율적
MySQL은 spatial index, PostgreSQL은 GiST 사용 권장
Concurrency and Parallelism
volatile
volatile은 lock을 대체할 수 없으며 atomicity 제공 안 함
lock으로 보호된 데이터는volatile필요 없음 (lock이 memory order 보장)
C/C++:volatile은 일부 최적화만 방지, memory barrier 추가 안 됨
Java:volatile접근은sequentially-consistent ordering제공 (필요 시 JVM이 memory barrier 삽입)
C#:volatile접근은release-acquire ordering제공 (필요 시 CLR이 memory barrier 삽입)
메모리 읽기/쓰기 재정렬 관련 잘못된 최적화 방지 가능
TOCTOU (Time-of-check to time-of-use) 문제
SQL DB에서 응용 계층 제약 조건 처리
단순 unique index로 표현 불가한 제약(예: 두 테이블 간 유니크, 조건부 유니크, 기간 내 유니크)을 애플리케이션에서 강제하는 경우:
MySQL(InnoDB): repeatable read 레벨에서select ... for update후 insert, 그리고 유니크 컬럼에 인덱스가 있으면 gap lock 덕분에 유효 (단, gap lock은 고부하 시 deadlock 유발 가능 → deadlock detection 및 retry 필요)
PostgreSQL: repeatable read 레벨에서 동일 로직은 동시성 상황에서 불충분 (write skew 문제)
해결책:
serializable isolation level 사용
애플리케이션 대신 DB 제약 사용
조건부 유니크 → partial unique index
두 테이블 간 유니크 → 별도 테이블에 중복 데이터 삽입 후 unique index
기간 배타성 → range type + exclude constraint
Atomic reference counting
Arc,shared_ptr와 같이 많은 스레드가 동일 카운터를 자주 변경하면 성능 저하
Read-write lock
일부 구현은 read lock에서 write lock으로 업그레이드 지원하지 않음
read lock 보유 상태에서 write lock 시도 시 deadlock 발생 가능
Common in many languages
Null/None/nil 체크 누락이 흔한 오류 원인
반복문 중 컨테이너 수정 시단일 스레드 데이터 경쟁발생 가능
가변 데이터 공유 실수: 예) Python에서[[0] * 10] * 10은 올바른 2D 배열 생성 아님
(low + high) / 2는 overflow 가능 → 안전한 방식은low + (high - low) / 2
단락 평가(short circuit):a() || b()는 a가 true면 b 실행 안 됨,a() && b()는 a가 false면 b 실행 안 됨
프로파일러 기본값은CPU time만 포함→ DB 대기 등은 flamegraph에 나타나지 않아 오해 유발
정규 표현식 dialect가 언어마다 다름 → JS에서 동작하는 정규식이 Java에서 동작 안 할 수 있음
Linux and bash
디렉터리 이동 후pwd는 원래 경로, 실제 경로는pwd -P
cmd > file 2>&1→ stdout+stderr 모두 파일,cmd 2>&1 > file→ stdout만 파일, stderr는 그대로
파일 이름은대소문자 구분(Windows와 다름)
실행 파일은capability 시스템존재 (getcap으로 확인)
Unset 변수 위험:DIRunset이면rm -rf $DIR/→rm -rf /실행 위험 →set -u로 방지 가능
환경 적용: 스크립트를 현재 shell에 적용하려면source script.sh사용 → 영구 적용하려면~/.bashrc에 추가
Bash는명령어 캐싱:$PATH내 파일 이동 시ENOENT발생 →hash -r로 캐시 갱신
변수 미인용 사용 시 줄바꿈이 공백으로 처리
set -e: 스크립트 오류 시 즉시 종료하지만, 조건문 내부(||,&&,if)에서는 동작 안 함
K8s livenessProbe와 디버거 충돌: 브레이크포인트 디버거는 앱 전체를 멈추게 하여 health check 응답 실패 → Pod가 종료될 수 있음
React
렌더링 코드에서state 직접 수정
Hook을 if/loop 안에서 사용→ 규칙 위반
useEffectdependency array에 필요한 값 누락
useEffect에서정리(clean up) 코드 누락
Closure trap: 오래된 state 캡처로 인해 버그 발생
잘못된 위치에서 데이터 변경 →불순한 컴포넌트
useCallback사용 누락 → 불필요한 리렌더링 발생
메모된 컴포넌트에비메모 값 전달시 memo 최적화 무효화
Git
Rebase는 히스토리 재작성
rebase 후 일반 push는 충돌 → 반드시 force push 필요
remote branch 히스토리 변경 시 pull도--rebase사용
--force-with-lease는 일부 경우 다른 개발자 commit 덮어쓰기 방지 가능, 단 fetch만 하고 pull 안 하면 보호 안 됨
Merge revert 문제
Merge revert는 효과 불완전 → 동일 브랜치 다시 merge 시 아무 변화 없음
해결책: revert의 revert 실행 또는 깨끗한 방법(backup → reset → cherry-pick → force push)
GitHub 관련 주의사항
API 키 같은 secret을 commit 후 force push로 덮어도GitHub에는 기록이 남음
private repo A를 fork한 B가 private이라도, A가 public이 되면 B의 내용도 공개됨 (삭제 후에도 접근 가능)
git stash pop: conflict 발생 시 stash가 drop되지 않음
.DS_Store는 macOS가 자동 생성 →.gitignore에**/.DS_Store추가 권장
Networking
일부라우터·방화벽은 유휴 TCP 연결을 조용히 끊음→ HTTP 클라이언트·DB 클라이언트의 커넥션 풀 무효화 가능 → 해결:TCP keepalive 설정
traceroute결과는신뢰성 낮음→ 경우에 따라tcptraceroute가 더 유용
TCP slow start는 대기시간 증가 원인 →tcp_slow_start_after_idle비활성화로 해결 가능
TCP sticky packet 문제: Nagle 알고리즘은 패킷 전송 지연 →TCP_NODELAY활성화로 해결 가능
Nginx 뒤에 백엔드 배치 시커넥션 재사용 설정 필요 → 미설정 시 고부하 환경에서 내부 포트 부족으로 연결 실패
Nginx는 기본적으로패킷 버퍼링→SSE(EventSource)지연 발생
HTTP 표준은GET·DELETE 요청 body를 금지하지 않음→ 일부는 body 사용하지만 많은 라이브러리·서버가 지원하지 않음
하나의 IP에 여러 웹사이트 호스팅 가능 → 구분은 HTTPHost헤더와 TLS의SNI가 담당 → 단순 IP 접속 불가 사이트 존재
CORS: 다른 origin 요청 시 브라우저는 응답 접근 차단 → 서버에서Access-Control-Allow-Origin헤더 설정 필요
쿠키 전달 포함 시 추가 설정 필요
프론트엔드와 백엔드가동일 도메인·포트라면 CORS 문제 없음
Other
YAML 주의사항
YAML은공백 민감→key:value는 오류,key: value가 올바름
국가 코드NO는 따옴표 없이 쓰면false로 해석되는 문제 발생
Git commit hash를 따옴표 없이 쓰면 숫자로 변환될 수 있음
Excel CSV 문제
Excel은 CSV 열 때자동 변환수행
날짜 변환:1/2,1-2→2-Jan
대형 숫자 부정확 변환:12345678901234567890→12345678901234500000