목록분류 전체보기 (150)
forDevLife
혼자 진행하는 마지막 프로젝트 코드스쿼드 마지막 프로젝트는 혼자서 진행해 보기로 결정했다..! 그 간 좋은 페어 분들을 만나 협업하는데 큰 충돌 없이 진행되었고, 배우게 된 부분도 많았다. 문제 해결을 위한 소통 과정에서 혼자였으면 전혀 고려하지 못했을 키워드를 떠올려 함께 학습하고 이후 과제에도 더 개선된 방식으로 적용해 볼 수도 있었고, 분업을 통해 담당한 도메인에 더 애정을 가지고 집중할 수 있었고, 막연했던 코드 conflict에 대한 두려움도 사라지게 되었다. 단 개인적인 슬럼프로 컨디션이 좋지 않은 시간이 자주 있었는데 하루의 core time을 계속 함께해야 한다는 부분이 약간은 벅찼던 것 같다. 페어 분들이 배려해 주신 덕에 여러모로 너무 감사했지만 한편으로는 죄송스러운 마음이 커서, 그러..
인덱스를 알아보기에 앞서, 랜덤 I/O와 순차 I/O에 대해 살펴보자. 랜덤 I/O 하드 디스크 드라이브의 플래터(원판)를 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 수 데이터를 읽는 것을 의미한다. 데이터를 R/W하기 위해 페이지의 수 만큼 시스템 콜을 요청하며, 그 횟수만큼 디스크의 헤더 이동이 발생하게 된다. 인덱스 레인지 스캔에 해당한다. 순차 I/O 한 번의 시스템 콜을 통해 여러 페이지 데이터를 R/W한다. 디스크의 헤더 이동이 줄어들어 랜덤 I/O에 비해 더 빠르다. 일반적으로 쿼리를 튜닝하는 것은 랜덤 I/O 자체를 줄이는 게 목적이며, 이 의미는 쿼리를 처리하는 데 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미한다. 풀 테이블 스캔에 해당한다. 1. 인덱스의 ..
1. MySQL에서의 트랜잭션 트랜잭션은 하나의 논리적인 작업 셋 자체가 100% 적용되거나(Commit 실행) 아무것도 적용되지 않아야(Rollback 실행) 함으로 보장해준다. 이러한 트랜잭션 기능은 InnoDB 테이블에서만 제공되는 기능이며, 이를 통해 쿼리 실행 중 일부라도 오류가 발생하면 전체를 원 상태로 만든다는 트랜잭션의 원칙을 따르게 된다. 잠금(Lock)과 트랜잭션 기능을 헷갈릴 수 있지만, 기능의 사용 목적을 간단히 정리하면 다음과 같다. 잠금(Lock) : 동시성 제어하기 위한 기능이다. 여러 커넥션에서 동시에 동일한 자원을 변경할 수 없도록 한다. 트랜잭션 : 데이터의 정합성을 보장하기 위한 기능이다. 2. MySQL 엔진의 잠금 MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레..
해당 글은 WAS의 커넥션, 스레드 풀에 대해서 정리하였습니다. 1. 커넥션 풀? 스레드 풀? MySQL에서 사용자 요청을 처리하는 포그라운드(foreground) 스레드에 대해서 학습하다가, 커뮤니티 버전과 엔터프라이즈 버전에서 MySQL 서버의 스레드가 사용자 요청 connection을 다르게 처리한다는 것을 알게 되었습니다. 그 과정에서 커넥션 풀, 스레드 풀의 용어가 나오는데 이게 우리가 개발하는 애플리케이션에 포함되는건지 MySQL 서버에 포함되는건지 헷갈려서 정리하게 되었습니다. 결론부터 얘기하면 다음과 같습니다. 커넥션 풀 : WAS에서 관리(Hikari CP) 스레드(풀) : 각각 관리 WAS : ExecutorService를 사용한 스레드 관리 MySQL : 스레드 캐시(커뮤니티 ver)..
다음 내용에 이어서 작성된다. InnoDB 스토리지 엔진 아키텍처 1 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반 잠금을 제공하며, 그로 인해 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 주요 기능들을 알아보자. new-age-jh.tistory.com 5. 언두 로그(Undo Log) InnoDB는 트랜잭션과 격리 수준을 보장하기 위해 DML로 변경되기 이전 버전의 데이터를 별도로 백업한다. 이렇게 백업된 데이터를 언두 로그라고 하며 이를 아래와 같은 방식으로 활용할 수 있다. 트랜잭션 보장 : 롤백 시 언두 로그에 백업된 데이터로 복구한다. 격리 수준 보장 : 트랜잭션 격리 수준에 맞게 언두 로그에 백업한 데이터를 읽어서 반환한다. 기존 버전(..
InnoDB 스토리지 엔진에서 가장 핵심적인 부분이며, 크게 아래의 기능을 하게 된다. 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해둔다. 쓰기 작업을 지연시켜 일괄 처리가 가능하도록 해주는 버퍼 역할도 한다. 버퍼 풀의 구조 InnoDB 스토리지 엔진은 버퍼 풀이라는 거대한 메모리 공간을 페이지 크기의 조각(기본 16KB)으로 쪼개어, 필요할 때 해당 데이터 페이지를 디스크로부터 읽어서 각 조각에 저장한다. 이러한 페이지 조각들을 관리하기 위해 크게 3가지의 자료구조를 사용한다. 프리 리스트 : InnoDB 버퍼 풀에서 실제 사용자 데이터로 채워지지 않은 비어 있는 페이지의 목록이다. LRU 리스트 : 디스크로부터 한 번 읽어온 페이지를 최대한 오랫동안 InnoDB 버퍼 풀의 메모리에 유지하기..
JPA는 Entity로 사용할 객체에 반드시 기본 생성자가 있어야 한다. 왜냐하면 java Reflection이 가져올 수 없는 정보 중 하나가 바로 생성자의 인자 정보들이기 때문이라고 한다. 하이버네이트에서 내부적으로 constructor.newInstance()라는 리플렉션을 통해 해당 Entity의 기본 생성자를 호출하여 객체를 생성하는데, 이는 구체적인 생성자의 매개변수를 알 수 없기 때문에(객체마다 매개변수는 모두 다를 것이기 때문에) 반드시 기본 생성자를 지정해둬야 한다. ※ 당연히 개발자가 작성한 생성자가 없다면, 자바에서 자동으로 기본 생성자를 만들어주기 때문에 작성해주지 않아도 된다. 이건 JPA 학습하면서 기본적으로 배우는 내용이지만, 다음 내용이 궁금해졌다. 1. 말로만 듣던 리플렉션..
InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반 잠금을 제공하며, 그로 인해 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 주요 기능들을 알아보자. 1. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 즉, 프라이머리 키 값의 순서대로 디스크에 저장된다. 모든 세컨더리 인덱스는 물리적인 레코드의 주소(ROWID) 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 결과적으로 쿼리 실행 계획에서 프라이머리 키는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정된다. 반면 MyISAM 스토리지 엔진에서는 클러스터링 키를 지원하지 않아, 프라이머리 키와 세컨더리 인덱스는 구조적으로..
1. 스레드 캐시(MySQL community Version) MySQL 서버에서는 연결 스레드 할당으로 인한 리소스 낭비 및 성능 저하를 막기 위해 특정 개수의 스레드를 메모리에 캐싱해서 사용한다. 이를 통해 연결로 발생하는 오버헤드를 줄일 수 있으며, 클라이언트 커넥션 요청과 (포그라운드)스레드가 1:1로 매핑된다. 즉, 커넥션을 맺은 스레드가 하나의 커넥션 처리만 담당하는게 핵심이다. 2. Connection Pool The MySQL Connection Pool operates on the client side to ensure that a MySQL client does not constantly connect to and disconnect from the MySQL server. It is ..
MySQL의 전체 구조 MySQL 서버는 크게 MySQL엔진과 스토리지 엔진으로 구분할 수 있다. 쿼리 & 파서 & 옵티마이저 등과 같은 기능을 스토리지 엔진과 구분해서 이해하고자 다음과 같이 구분하였으며, 이 둘을 모두 합쳐서 MySQL(서버)라고 호칭한다. 1. MySQL 엔진 MySQL엔진은 클라이언트로부터 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와, SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 즉 DBMS의 두뇌에 해당하는 처리를 수행한다. 2. 스토리지 엔진 실제 데이터를 디스크 스토리지에 WRITE & READ하는 과정은 스토리지 엔진에서 전담하게 된다. 스토리지 엔진은 여러 개를 동시에 사용할 수 있으며, 테이블 정의 시 지정해서 사용할 수 있다. ..