개발 공부 기록하기 108

내맘대로 정리하는 Real MySQL #6장) 실행계획 - 실행계획 읽기 편

시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? DBMS에서는 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장돼 있는지 통계 정보를 참조하며, 그러한 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업이 필요하다. DBMS에서는 옵티마이저가 이러한 기능을 담당한다. MySQL에서는 EXPLAIN이라는 명령으로 쿼리의 실행 계획을 확인할 수 있다. 옵티마이저 MySQL 서버에서 쿼리가 실행되는 과정은 크게 3가지로 나눌 수 있다. 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다. SQL의 파싱 정보(파싱 트리)..

내맘대로 정리하는 Real MySQL #5장) 인덱스

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 인덱스는 DB 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분이다. 이번 장에서는 MySQL 쿼리의 개발이나 튜닝을 설명하기 전에 MySQL에서 사용 가능한 인덱스의 종류 및 특성을 간단히 살펴보겠다. 각 인덱스의 특성과 차이는 상당히 중요하며, 물리 수준의 모델링을 할 때도 중요한 요소가 될 것이다. 5.1 디스크 읽기 방식 DB의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건인 것들이 상당히 많다. 모든 저장 매체는 내부적으로 1개 이상의 디스크 드라이브를 장착하고 있다. 대부분의 저장 매체는 디스크 드라이브의 플래터(디스크 ..

내맘대로 정리하는 Real MySQL #4장) 트랜잭션과 잠금 - 잠금 편

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 잠금 동시성을 제어하기 위한 기능 여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할을 수행 MySQL 엔진 레벨 잠금과 스토리지 엔진 레벨 잠금 두 가지 종류가 있다. MySQL 엔진의 잠금 글로벌 락 FLUSH TABLES WITH RAED LOCK 명령으로만 획득할 수 있으며, 한 세션에서 글로벌 락을 획득하면 MySQL 서버 전체에 락이 걸린다. 다른 세션은 SELECT을 제외한 대부분의 DDL 문장이나 DML 문장 실행을 대기하게 된다. 테이블 락 개별 테이블 ..

내맘대로 정리하는 Real MySQL #4장) 트랜잭션과 잠금 - 트랜잭션 편

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 트랜잭션이란 작업의 완전성을 보장해주는 것 논리적인 작업 모음을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다 MEMORY 스토리지 엔진 혹은 MyISAM 스토리지 엔진은 트랜잭션 기능이 없다. 트랜잭션 기능이 없다면 애플리케이션에서 일부의 쿼리만 실행된것에 대한 후처리를 정말 끔찍하게 해야하지만 트랜잭션을 활용하면 try - catch 로 깔끔하게 처리된다. try { START TRANSACTION; INSERT INTO tab_a ...; I..

내맘대로 정리하는 Real MySQL #3장) 아키텍처 - 스토리지 및 MySQL 로그 편

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? InnoDB 전체 구조 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중에서 거의 유일하게 레코드 기반의 잠금을 제공하고 있으며, 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 엔진의 특성 PK에 의한 클러스터링 : PK 값의 순서대로 디스크에 저장된다는 뜻이며, 이로 인해 PK에 의한 range scan은 상당히 빨리 처리된다 잠금이 필요 없는 일관된 읽기 : MVCC(Multi Version Concurrency Control)이라는 기술을 이용해 락을 걸지 않고 읽기 작업을 수행한다. FK 지원 :..

내맘대로 정리하는 Real MySQL #3장) 아키텍처 - MySQL 아키텍처 편

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? MySQL 전체 구조 MySQL 엔진 커넥션 핸들러 : 클라이언트로부터의 접속 및 쿼리 요청 처리 SQL 파서 및 전처리기 옵티마이저 : 쿼리의 최적화된 실행에 도움 성능 향상을 위한 MyISAM의 키 캐시나 InnoDB같은 보조 저장소 기능 스토리지 엔진 : 실제 데이터를 디스크에 저장하거나 디스크로부터 데이터를 읽어오는 부분 핸들러 요청 : MySQL 엔진 → 스토리지 엔진에 보내는 요청 핸들러 API : 핸들러 요청에서 사용되는 API, SHOW GLOBAL STATUS LIKE 'Handler%'로 확인 가능하다. 스레드 구조..

내맘대로 정리하는 Real MySQL #2장) 설치와 설정

시리즈는, 책을 읽으며 몰랐던 내용을 위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^ 원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요?? 설치에 대해서는 정리하지 않는다. MySQL 서버는 단 하나의 설정 파일만 사용한다. 유닉스 계열에서는 my.cnf 라는 이름을 사용하고 윈도우 계열에서는 my.ini라는 이름을 쓴다. MySQL 서버는 시작될 때만 이 설정 파일을 참조하며, 처음 발견된 my.cnf 파일을 사용하게 된다. mysqld --verbose --help 혹은 mysql --help를 통해 설정 파일을 읽어들이는 경로 순서를 알 수 있다. mysqld : 서버 프로그램 mysql : 클라이언트 프로그램 MySQL 서버는 가동하면서 설정 파일의 내용을 읽어 ..

Spring Boot Interceptor에서 권한 관리하기 I (HttpServletRequest getInputStream 여러번)

백엔드를 리딩하며 개발하고 있는 사이드 프로젝트에서 권한을 꽤나 복잡하게 관리해야 하는 요구사항이 있었다. 사이드 프로젝트에서는 원격 근무 협업툴을 만들고 있는데, 협업툴 답게 Team이라는 개념이 있으며 여러 유저가 각기 다른 여러 Team에 가입할 수 있다. Team에 가입한 사용자들은 팀 내부에서 역할(ex 관리자, 일반 멤버)이 정해지며 각 역할에 따라 사용할 수 있는 기능이 달라진다. 또한, Team 내부에는 여러 Part가 있고 Part에서만 사용할 수 있는 기능들이 존재한다. 사용자와 팀, 파트 외에도 팀이 사용하고 있는 Plan에 따라서 (Free Plan, Premium Plan 등) 사용할 수 있는 기능도 달라져야 한다. 에헴... 서버는 어쨌거나 특정 API 호출 권한을 확인해야할 책..

Spring Boot SQL 보기 옵션 총 정리

Spring Boot에서 query DSL을 사용하건 spring boot JPA를 사용하건, 쿼리를 튜닝할 때 SQL을 봐야할 때가 있다. 그럴 때 사용할 수 있는 몇 가지 옵션을 조사해 보았다. 환경 : Spring boot 2.* + hibernate 5.3.10 이상 sql 보기 Hibernate이 DB에 날리는 모든 쿼리(DDL, DML)를 보여준다 application.yml을 사용한다면, spring: jpa: properties: hibernate: show_sql: true application.properties를 사용한다면, spring.jpa.properties.hibernate.show_sql=true 추가된 로그 Hibernate: select user0_.id as id1_0_..

DSL이란?

DSL : domain specific language DSL이란, 특정 영역을 타겟하고 있는 언어를 말한다 예를 들어 SQL! DB의 데이터를 참조하기 위해 날리는 query는 말 그대로 "DB에 데이터를 참조하기 위한 목적"으로만 사용되며 SQL로 웹 애플리케이션 서버를 만드는 것은 절대 불가능 하다. 반면 JAVA는 SQL을 만들어 낼 수도 있고 (사실상 SQL은 특정한 문법을 가진 문자열이기 때문이다) 웹 애플리케이션 서버를 만들 수도 있고, 그 외 원하는 모든 것을 만들어 낼 수 있다. 단지 다른 분야에선 다른 언어가 더 좋을 뿐이지 가능은 할 것이다. 이렇게 SQL처럼 어떤 목적이 있고 그 목적만 달성할 수 있는 언어를 DSL이라고 한다.