💡 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하며 정리한 내용입니다. 목차 배경최근 넥스트 스탭의 TDD, 클린 코드 with Kotlin 8기 강의를 수강하고 있다. 아직 1주차 밖에 지나지 않았지만, 1주차 과제 중 테스트 코드 작성과 관련되어 리뷰어분께 좋은 내용을 전달받았고, 덕분에 많은 생각을 할 수 있게 되었다. 먼저, 당시 나는 콘솔 출력을 포함하는 로직은 테스트 코드로 어떻게 검증할 수 있을지, 테스트 코드 작성을 어떻게 해야할지 헤맸고 리뷰어분에게 도움을 요청했다. 리뷰어분은 해결 방법을 알려주기에 앞서 '왜 테스트 코드를 작성해야하는가?'에 대한 애기를 해주었다. 테스트 코드가 무엇을 확인하기 위함이고, 그게 테스트 코드로 확인이 필요할만큼 복잡하..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차SELECT FOR UPDATE읽기 작업(Read) 중 조회하는 레코드(Row)에 잠금(Lock)을 걸기 위해서 이 구문을 사용할 수 있다. 이 SELECT FOR UPDATE 구문을 사용하면 다른 트랜잭션에서 Lock을 건 Row에 대한 변경(Exclusive Lock)과 FOR UPDATE 조회를 방지할 수 있다. 하지만 변경과 조회에 대해 Lock을 걸기 때문에 함부로 사용하면 DeadLock이 발생할 수 있다. 반면 동시성 이슈가 발생하는 상황에서 유용하게 사용될 수 있다. 예를 들어 티켓팅을 하면 사용자가 동시에 접근한다. 이때 티켓 판매 상태에 대해 유용하게 샤..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차배경데이터베이스를 다루는데 가장 중요하고 핵심 개념인 Lock과 DeadLock에 대해서 알아본다. Lock은 데이터 정합성을 보장하고 동시성 이슈를 해결할 수 있는 방식 중 하나이며 서버 개발에서 가장 중요한 부분이다. 또한 Lock을 다루면서 DeadLock이 발생하는 케이스와 이를 예방하는 방법을 알아본다. MySQL Lock일반적으로 하나의 DB 서버에는 여러대의 애플리케이션이 붙어서 동작하게 된다. 이러한 상황에서는 Race Condition(경합상태)와 같은 동시성 이슈가 발생할 수 있는데, MySQL을 비롯한 관계형 데이터베이스는 이러한 상황에서 애플리케이션의..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차배경Offset과 이를 사용하지 않는 NoOffset 쿼리 튜닝에 대해서 알아본다. 동일한 결과를 반환하는 쿼리에 대해 성능을 개선할 수 있다.OffsetPaginatation을 구현할 때 사용하는 쿼리, 데이터를 어디서부터 가져올지 지정한다. Offset을 사용할 때는 쿼리가 지정된 Offset 값만큼의 레코드를 모두 읽어들인 후에 필요한 데이터를 반환한다. 이 때문에 Offset 값이 커질수록 MySQL이 불필요하게 많은 레코드를 스캔하여 성능 저하를 일으킬 수 있다. 예를 들어 아래 예시에서 데이터베이스는 처음 25개의 row를 조회한다. 이후 6번째부터 25번째 r..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차Index Dive잘못된 인덱스 설정이나 비효율적으로 작성된 쿼리로 인해 MySQL 옵티마이저(Optimizer)가 쿼리 수행 전략을 수립할 때 많은 시간이 소요되는 현상을 말한다. 일종의 잘못된 로직으로 인해 발생하는 버그이며, Index Dive가 발생하면 쿼리 속도가 현저히 느려진다.Optimizer와 실행 계획쿼리가 MySQL 서버로 전달되면 옵티마이저(Optimizer)가 동작하여 쿼리의 실행 계획을 수립한다. DBMS에 따라 PostgreSQL은 캐시성으로 실행 계획 수립 단계를 스킵하기도 한다. MySQL도 하나의 Connection 내에서는 실행 계획 수립을..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차배경실무에서 개발을 하다보면 배치 작업을 비롯해서 대량의 데이터에 대해 일괄로 INSERT 작업이나 UPDATE 작업을 수행하게 된다. 이 또한 데이터가 많아지면 DB에 부하가 발생하고 배치가 실패하기도 한다. 결국 DB Connection이 들어가는 모든 데이터베이스 관련 작업은 고민을 하고 주의깊게 사용할 필요가 있는데, 이번에는 INSERT 쿼리를 사용할 때 DB 부하를 줄일 수 있는 최적화 방법을 알아본다.서버 부하본문에 들어가기에 앞서 서버 개발자는 항상 DB와 서버 부하에 대해서 고려해야한다. 일반적으로 서버에서 발생하는 부하는 데이터베이스에 이전하기 보다는 서..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차Order By이번에는 실무에서 큰 데이터를 다루는데 Order By를 사용하는 전략에 대해서 알아본다. 대용량 데이터를 다루는 경우 Order By는 골칫덩어리 같은 존재가 된다. 그 이유는 Order By는 데이터를 정렬하면서 추가적인 리소스가 요구되기 때문이다.따라서 이 경우 인덱스 설정에 유의해야한다. 또한 쿼리에 Order By 절이 포함되거나 정렬해야하는 필드에 대해 IN, OR 연산을 사용하는 것은 지양한다. 정렬하는 필드에 대해 OR 연산을 사용하는 경우 연산이 2배로 들고, IN 연산을 사용하는 경우 추가된 필드만큼 연산이 n배 더 든다고 생각하면 된다.S..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차Covering IndexPK 아닌 컬럼에 대해 인덱스를 설정(Non-Clustered Index)하면 컬럼 값들은 디스크의 별도에 B-Tree 구조에 저장된다. 즉 인덱스를 구성하는 B-Tree의 노드에는 인덱싱된 컬럼 값의 복사본과 Clusterd Index 행에 대한 포인터가 포함된다.이때 실제 테이블에서 데이터를 조회하지 않고 인덱스에 있는 컬럼 값들만 사용하여 쿼리의 결과 데이터를 가져올 수 있는 인덱스를 커버링 인덱스(Covering Index)라고 한다. Covering Index로 데이터를 조회하면 실제 테이블에 접근하지 않으므로 I/O가 줄어들고 탐색 성능..
💡 July님의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법 강의를 듣고 정리한 내용입니다. 목차 배경지난 글에서는 Index를 비롯한 관련 기본 개념들을 알아보았다. 이번에는 여러 컬럼으로 인덱스를 구성하는 Multi Column Index와 그에 대한 특징을 알아본다. Multi Column Index(복합 인덱스)여러 개의 컬럼 조합으로 인덱스를 설정하는 방식, 실무에서 가장 많이 설정하는 인덱스 유형 중 하나이다. 다음과 같이 설정한 idx_col1_col2 인덱스가 복합 인덱스인데, 이때 컬럼을 명시한 순서대로 인덱스가 정렬된다. 즉 one_field 값들에 대해서 먼저 정렬하여 B-tree 구조를 만드는데, one_field에 동일한 값이 있다면 two_fi..
목차배경이전부터 RDB와 관련된 문제와 문제 해결 방안에 대한 궁금증이 있었고, 인프런에서 흥미로워 보이는 강의 200억건의 데이터를 MySQL로 마이그레이션 할 때 고려했던 개념과 튜닝 방법를 발견하여 수강하였다. 하지만 RDB와 쿼리를 서비스 로직을 구현하는데 사용해보기만 했지 실제 동작 원리를 이해해본적은 없어 강의를 수강하는데 어려움이 있었고, 따로 시간을 내어 추가적인 기본 지식을 찾아보았다. 강의 내용에 대해 정리해보기에 앞서 데이터베이스 성능 최적화와 관련된 가장 기본적인 지식인 인덱스(Index)에 대해서 알아본다.데이터베이스 인덱스MySQL을 포함한 대부분의 RDBMS는 테이블 검색 속도를 향상하기 위해 Index를 제공하고, 이러한 Index는 성능 최적화에서 중요한 역할을 한다. 데이..
목차배경지난 9월 3일 MongoDB.local Seoul에 당첨되어 세미나를 다녀왔다. 적어도 국내에서 가장 널리쓰이는 NoSQL인 MongoDB에서 주최하는 세미나인 만큼 방향성과 활용 사례를 가장 가까이 느낄 수 있다는 생각에 신청했고, 운이 좋게 당첨되어 다녀올 수 있었다. 내용 뿐만아니라 모든 개발자가 열정적으로 세션에 참여하여, 질문을 주고받으며 공유하는 환경 속에서 동기부여와 열정 또한 얻어갈 수 있었다. 세션은 AWS, 구글을 비롯한 국내 기업의 활용 사례와 Mongo DB의 제품 소개로 이루어져 있었는데, 국내 기업 사례를 제외하고는 대부분 영어로 진행되었다. 물론 동시 통역을 제공하고 있어 이해하는데 큰 어려움은 없었다. 참여 상품으로는 AWS 티셔츠, 구글 클라우드 후드티, Mong..
💡 최상용님의 실습으로 배우는 선착순 이벤트 시스템 강의를 듣고 정리한 내용입니다. 목차 글 목록[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (1/3) - 동시성 이슈와 Redis로 해결하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (2/3) - Kafka로 시스템 안정성 향상하기[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (3/3) - 요구사항 변경과 쿠폰 발급 실패 예외처리[시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (번외) - DLT(DeadLetterTopic)을 이용한 메시지 Consume 재처리 배경지난 [시스템 디자인] 실습으로 배우는 선착순 이벤트 시스템 (3/3) - 요구사항 변경과 쿠폰 발급 실패 예외처리에서 쿠폰 발급 Consumer에서 ..