
트랜잭션은 작업의 안정성을 보장해주는 것이다. 즉, 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않게 만들어주는 기능이다. 잠금(Lock)과 트랜잭션은 서로 비슷한 개념 같지만 사실 잠금은 동시성을 제어하기 위한 기능이고, 트랜잭션은 데이터의 정합성을 보장하기 위한 기능이다. 하나의 회원 정보 레코드를 여러 커넥션에서 동시에 변경하려고 하는데 만약 잠금이 없다면 하나의 데이터를 여러 커넥션에서 동시에 변경할 수 있게 되고, 결국 해당 레코드의 값은 예측할 수 없는 상태가 된다. 트랜잭션 지금은 많이 달라졌지만 여전히 MySQL 서버에서는 MyISAM이나 MEMORY 스토리지 엔진이 더 빠르다고..

비합리적이거나 애매한 가정에 기반해서 코드가 작성되거나 다른 개발자가 잘못된 일을 하는 것을 막지 못할 때 코드는 오용되기 쉽다. 코드를 잘못 사용할 수 있는 몇 가지 일반적인 경우는 다음과 같다. 호출하는 쪽에서 잘못된 입력을 제공 다른 코드의 부수 효과(입력 매개변수 수정 등) 정확한 시간이나 순서에 따라 함수를 호출하지 않음 관련 코드에서 가정과 맞지 않게 수정이 이루어짐 위와 같은 상황을 막기 위해선 코드를 오용하기 어렵게 설계하고 작성하는 것이 중요하다. 아래에서 코드를 쉽게 오용할 수 있는 경우를 살펴보고, 오용하기 어렵게 만드는 기법을 알아보자. 불변 객체로 만드는 것을 고려하라 객체를 불변으로 만드는 것이 항상 가능하지도 않고, 또 항상 적절한 것도 아니다. 하지만 가변적인 객체는 코드의 ..

InnoDB 스토리지 엔진 아키텍처 1 InnoDB 스토리지 엔진 아키텍처 2 InnoDB 스토리지 엔진 아키텍처 3 MyISAM 스토리지 엔진 아키텍처 이번에는 MyISAM 스토리지 엔진의 성능에 영향을 미치는 요소인 키 캐시와 운영체제의 캐시/버퍼에 대해 살펴보자. 아래는 MyISAM의 간략한 구조이다. 키 캐시 InnoDB의 버퍼 풀과 비슷한 역할을 하는 것이 MyISAM의 키 캐시(Key cache, 키 버퍼라고도 불림)다. 하지만 이름 그대로 MyISAM 키 캐시는 인덱스만을 대상으로 작동하며, 또한 인덱스의 디스크 쓰기 작업에 대해서만 부분적으로 버퍼링 역할을 한다. key_reads는 인덱스를 디스크에서 읽어 들인 횟수를 저장하는 상태 변수이며, key_read_requests는 키 캐시로부..

InnoDB 스토리지 엔진 아키텍처 1과 InnoDB 스토리지 엔진 아키텍처 2는 여기에서 살펴보실 수 있습니다. Double Write Buffer InnoDB 스토리지 엔진에서는 더티 페이지를 디스크 파일로 플러시할 때, 일부만 기록되는 문제를 막기 위해 Double-Write 기법을 이용한다. 아래 그림은 InnoDB에서 "A" ~ "E"까지의 더티 페이지를 디스크로 플러시하는 상황이다. InnoDB의 스토리지 엔진은 실제 데이터 파일에 변경 내용을 기록하기 전에 "A" ~ "E"까지의 더티 페이지를 우선 묶어서 한 번의 디스크 쓰기로 시스템 테이블스페이스의 DoubleWrite 버퍼에 기록하고, 각 더티 페이지를 파일의 적당한 위치에 하나씩 랜덤으로 쓰기를 실행한다. InnoDB 스토리지 엔진은 ..

InnoDB 버퍼 풀 InnoDB 스토리지 엔진에서 가장 핵심적인 부분으로, 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간이며, 쓰기 작업을 지연시켜 일괄 작업으로 처리할 수 있게 해주는 버퍼 역할도 같이 수행한다. INSERT, UPDATE, DELETE처럼 데이터를 변경하는 쿼리는 데이터 파일의 이곳저곳에 위치한 레코드를 변경하기 때문에 랜덤한 디스크 작업을 발생시키게 되는데, 버퍼 풀이 이러한 변경된 데이터를 모아서 처리하면 랜덤한 디스크 작업의 횟수를 줄일 수 있게 된다. 버퍼 풀의 크기 설정 MySQL 5.7 버전부터는 InnoDB 버퍼 풀의 크기를 동적으로 조절할 수 있게 개선됐다. 때문에 가능하면 InnoDB 버퍼 풀의 크기를 적절히 작은 값으로 설정해서 조금씩 상황을 봐..

InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. InnoDB의 개략적인 구조는 아래와 같다. 위 그림은 InnoDB의 아키텍처를 간단하게 보여주는데, 각 부분에 관하여 자세히 살펴보자! 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 즉, 프라이머리 키 값의 순서대로 디스크에 저장된다는 뜻이며, 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 프라이머리 키가 클러스터링 인덱스이기 때문에 프라이머리 키를 이용한 레인지 스캔은 상당히 빨리 처리될 수 있다. 결과적으로..

MySQL 엔진 아키텍처 MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있다. MySQL 엔진 MySQL 엔진은 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 또한, MySQL은 표준 SQL(ANSI SQL) 문법을 지원하므로 표준 문법에 따라 작성된 쿼리는 타 DBMS와 호환되어 실행될 수 있다. 스토리지 엔진 요청된 SQL 문장을 분석하거나 최적화하는 등 DBMS의 두뇌에 해당하는 처리를 수행하고, 실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어온다. MySQL 서버에서 MySQL 엔진은 하나지만 스토리지 엔진은 여러 개를 동시에 사용할 수 있다...

서술형 명칭 사용 가독성은 본질적으로 주관적인 것이며, 그것이 정확히 무엇을 의미하는지 확실하게 정의하기는 어렵다. 가독성의 핵심은 개발자가 코드의 기능을 빠르고 정확하게 이해할 수 있도록 하는 것이다. 서술적이지 않은 이름은 코드를 읽기 어렵게 만든다 아래 예는 서술적인 이름을 사용하지 않은 예이다. 만약 아래 코드가 무엇을 하는지 설명하라고 요청을 받는다면 어떻게 답해야 할까? class T { Set pns = new Set(); Int s = 0; Boolean f(Strinf n) { return pns.contains(n); } Int getS() { return s; } } Int? s(List ts, String n) { for (T t in ts){ if(t.f(n)) { return t..

복구 가능성 소프트웨어에 대해 생각할 때, 특정 오류가 발생한 경우, 복구할 수 있는 현실적인 방법이 있는지 생각해야 하는 경우가 많다. 복구할 수 있는 오류와 복구할 수 없는 오류를 상황에 따라 어떻게 달라지는지 살펴보자. 즉, 오류가 발생했을 때 무엇을 할 것인지 결정하기 위해서는 자신의 코드가 어떻게 사용될지 신증하게 생각해야 한다. 복구 가능한 오류 많은 소프트웨어 오류는 치명적이지 않으며, 오류가 발생하더라도 사용자는 알아채지 못하도록 적절하게 처리한다면 작동을 계속할 수 있는 합리적인 방법이 있다. 네트워크 오류: 자신의 코드가 의존하는 서비스에 연결할 수 없는 경우, 몇 초 동안 기다렸다가 다시 시도하거나, 그 코드가 사용자의 장치에서 실행되는 경우라면 사용자에게 네트워크 연결을 확인하도록 ..

자신의 코드와 다른 개발자의 코드 다른 개발자들이 활발하게 코드를 변경하더라도 코드의 품질이 유지되려면 코드가 튼튼하고 사용하기 쉬워야 한다. 고품질 코드를 작성할 때 가장 중요한 고려 사항 중 하나는 다른 개발자가 변경하거나 코드와 상호작용할 때 발생할 수 있는 문제는 없는지, 또 발생한다면 그 문제를 어떻게 완화할 수 있을지를 이해하고 선제적으로 조치하는 것이다. 우리는 혼자 일하지 않는 이상 다른 개발자들을 고려하지 않고는 고품질의 코드를 작성할 수 없다. 코드를 작성할 때 다음 세 가지를 고려하는 것이 유용하다. 자신에게 명백하다고 해서 다른 사람에게도 명백한 것은 아니다. 다른 개발자는 무의식중에 내 코드를 망가뜨릴 수 있다. 시간이 지남에 따라 자신의 코드를 기억하지 못한다. 자신에게 분명하다..
- Total
- Today
- Yesterday
- 김영한
- webflux
- 구현
- 코테
- 스프링부트
- 알고리즘
- 그리디
- 스프링
- 노마드
- spring boot
- Spring
- 노마드코더
- 북클럽
- 스프링 부트
- 릿코드
- 인프런
- 리팩토링
- MySQL
- 자료구조
- 정렬
- 백준
- Real MySQL
- 문자열
- 코틀린
- Algorithm
- mysql 8.0
- 파이썬
- 데이터베이스
- kotlin
- leetcode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |