글을 작성하게 된 계기 회사에서 벌크 업데이트를 사용하며 새롭게 알게된 내용 과 벌크 업데이트를 할 때 주의할 점 에 대해 정리 하기 위해 글을 작성하게 되었습니다. 1. 무엇을 잘못 알고 있었을까? MySQL에서 하나의 트랜잭션으로 여러 Row를 업데이트 하면 쿼리가 한 번만 실행 되는 줄 알았는데, 실제로는 InnoDB가 각 Row...
MySQL 벌크 UPDATE에 대한 오해: Row-by-Row
대량 배치 작업 전, 백업의 중요성과 적절한 방법
글을 작성하게 된 계기 영중소 차액 정산 프로젝트를 하면서 작게는 몇만 건, 많게는 수천만 건의 데이터를 다루고 있습니다. 그러다 보니 배치 처리를 할 때, 어떻게 멱등성을 보장하고, 실패 시 롤백을 가능하게 하는 것에 대해 고민하게 되었고, 이 과정에서 알게 된 내용을 정리하기 위해 글을 작성하게 되었습니다. 1. 백업 데이터의 필요성과 ...
복합키 업데이와 중복 키 오류
글을 작성하게 된 계기 회사에서 복합키를 가진 테이블을 업데이트 하던 중, 아래와 같은 오류가 발생했습니다. 이 과정에서 알게 된 내용을 정리하기 위해 글을 작성하게 되었습니다. ERROR 1062 (23000): Duplicate entry '1-200' for key '{TABLE}' 1. 문제 상황 재현 예를 들어, 다음과 같...
글로벌 락이 없는 레디스의 노드 재분배: REBALANCING
글을 작성하게 된 계기 레디스 클러스터의 리밸런싱(REBALANCING) 에서 글로벌 락이 필요하지 않은 것을 알게 되었고, 이를 정리하기 위해 글을 작성하게 되었습니다. 1. 레디스 클러스터의 리밸런싱과 락 레디스 클러스터 환경에서는 리밸런싱 작업을 수행할 때, 글로벌 락이 필요하지 않습니다. 이는 레디스가 해시 슬롯 기반으로 데이터...
의존성을 가급적 단 방향으로
글을 작성하게 된 계기 회사에서 한 서비스 레이어가 너무 많은 다른 서비스 레이어에 의존 하게 되었습니다. 처음에는 큰 문제가 없었지만, 요구사항이 복잡해지며 순환 참조까지 발생하게 되었고, 이 과정에서 서비스 간 의존성을 줄이는 방법 을 고민하며 알게 된 내용을 정리하기 위해 글을 작성하게 되었습니다. 1. 문제 상황 서비스 레이어가...
인덱스에도 길이 제한이 있다?
글을 작성하게 된 계기 인덱스를 생성할 때, 길이 제한이 있다는 것을 알게 되었고, 이를 정리하기 위해 글을 작성하게 되었습니다. 1. 문제 상황 인덱스를 생성할 때, 다음과 같은 오류를 만났습니다. ERROR 1071 (42000): Specified key was too long; max key length is 3072 byte...
레디스의 키 분배 전략:CRC16
글을 작성하게 된 계기 레디스의 CRC16 알고리즘에 대해 알게 되었고, 이를 정리하기 위해 글을 작성하게 되었습니다. 1. CRC 알고리즘과 레디스 CRC(Cyclic Redundancy Check)는 데이터 전송 중 오류를 검출하기 위해 개발된 알고리즘입니다. 어떤 데이터를 네트워크로 전송/저장할 때, 데이터에 일정한 규칙으로 생성...
유연한 설계는 항상 필요한가?
글을 작성하게 된 계기 맡은 프로젝트에서 불필요한 추상화, 최적화를 해서 복잡도를 올리다가 야근 에 철야 까지 하게 되었습니다. 이 과정에서 든 생각을 정리하기 위해 글을 작성하게 되었습니다. 1. 왜 이런 생각이 들었을까? 프로젝트에서 불필요한 추상화와 최적화를 하다보니 구조가 복잡해졌고, 안그래도 빠듯한 일정에 야근에 철야까지 하게...
컴퓨터의 수 표현 방식과 Decimal을 사용하는 이유
글을 작성하게 된 계기 현재 회사의 정산 을 하며 돈을 다루다보니, BigDecimal을 자주 사용하고 있습니다. 그러다 보니 컴퓨터가 수를 표현하는 방식 과 Decimal에 대해 궁금해졌고, 알게 된 내용을 정리하기 위해 글을 작성하게 되었습니다. 1. 정수와 실수의 이진수 변환 및 표현 컴퓨터는 데이터를 이진수로 변환 하여 메모리에...
잘못 이해하고 있었던 단일 책임의 원칙
글을 작성하게 된 계기 SOLID 원칙 중, 단일 책임 원칙에 대해 잘못 이해하고 있던 내용 을 정리하기 위해 글을 작성하게 되었습니다. 1. 어떻게 잘못 이해하고 있었을까? 이때까지 단일 책임의 원칙을 클래스는 하나의 책임만 가져야 한다 라고 이해하고 있었습니다. 즉, 아래와 같은 코드는 단일 책임 원칙을 위반한 코드라고 생각했죠. ...