반응형 전체 글346 B-TREE 인덱스 1편 2023.10.11 복습 리팩토링 시작 B-Tree 인덱스 B-Tree는 제일 범용적인 인덱스 알고리즘이다. 여기서 B는 Binary가 아니라 Balanced라는 의미를 지닌다. B-Tree 칼럼의 원래 값을 변형시키지 않고 (물론 값의 앞부분만 잘라서 관리하기는 하지만) 인덱스 구조체 내에서는 항상 정렬된 상태를 유지한다. 전문 검색과 같은 특수한 요건이 아닌 경우, 대부분의 인덱스는 B-Tree를 사용할 정도로 일반적인 용도에 적합한 알고리즘이다. 구조 및 특성 B-Tree는 트리 구조의 최상위에 하나의 루트 노드가 존재하고 그 하위에 자식 노드가 붙어 있는 형태다. 트리 구조의 가장 하위에 있는 노드를 리프 노드라 하고, 트리구조에서 루트 노드도 아니고 리프노드도 아닌 중간의 노드를 브랜치 노드라고.. Database/MySQL 2022. 12. 1. MySQL 인덱스 기초 2023.10.10 복습 리팩토링 시작 디스크 읽기 이번에 인덱스에서 자주 나올 랜덤 I/O와 순차 I/O에 대한 개념을 정리하고 넘어가겠습니다. 하드 디스크 드라이브 (HDD)와 솔리드 스테이트 드라이브(SSD) 컴퓨터에서 CPU나 메모리 같은 주요 장치는 대부분 전자식 장치지만 하드 디스크 드라이브는 기계식 장치다. 그래서 데이터베이스 서버에서는 항상 디스크 장치가 병목이 된다. 이러한 HDD를 대체하기 위해 전자식 저장 매체인 SSD가 많이 출시되고 있다. SSD도 기존 하드디스크 드라이브에서 데이터 저장용 플래터(원판)을 제거하고 그 대신 플래시 메모리를 장착하고 있다. 그래서 원판을 기계적으로 회전시킬 필요가 없으므로 아주 빨리 데이터를 읽고 쓸 수 있다. 플래시 메모리는 전원이 공급되지 않아도.. Database/MySQL 2022. 11. 30. 트랜잭션과 잠금 2023.10.9 복습 리팩토링 시작 트랜잭션 트랜잭션은 작업의 완전성을 보장해 준다. 즉, 정합성을 보장하기 위한 기능이다. 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어준다. MyISAM과 MEMORY 스토리지 엔진은 트랜잭션을 지원하지 않는다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계 없이 논리적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 아무것도 적용되지 않아야 (ROLLBACK 또는 트랜잭션을 ROLLBACK 시키는 오류 발생) 함을 보장해 주는 것이다. InnoDB : 트랜잭션 지원, 부분 업데이트 현상 발생 X MyISAM, M.. Database/MySQL 2022. 11. 29. MyISAM 스토리지 엔진 아키텍처 MyISAM 스토리지 엔진 아키텍처 MyISAM 스토리지 엔진의 성능에 영향을 미치는 요소인 키 캐시와 운영체제의 캐시/버퍼에 대해 살펴보자. 키 캐시 InnoDB 버퍼 풀과 비슷한 역할을 하는 것이 MyISAM의 키 캐시다. 하지만 이름 그대로 키 캐시는 인덱스만을 대상으로 작동하며, 또한 인덱스의 디스크 쓰기 작업에 대해서만 부분적으로 버퍼링 역할을 한다. 키 캐시가 얼마나 효율적으로 작동하는지는 다음 수식으로 확인할 수 있다. 키 캐시 히트율 (Hit rate) = 100 - (Key_reads / Key_read_requests * 100) Key_reads는 인덱스를 디스크에서 읽어 들인 횟수를 저장하는 상태 변수이며, Key_read_requests는 키 캐시로부터 인덱스를 읽은 횟수를 저장하.. Database/MySQL 2022. 11. 27. InnoDB 스토리지 아키텍처 2023.10.10 복습 리팩토링 시작 InnoDB 스토리지 아키텍처 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 이제 InnoDB 스토리지 엔진의 주요 특징들과 함께 아키텍처를 살펴보자. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링 되어 저장된다. 즉 프라이머리 키 값의 순서대로 디스크에 저장된다는 뜻이며, 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 프라이머리 키가 클러스터링 인덱스이기 때문에 프라이머리 키를 이용한 레인지 스캔은 상당히 빨리 처리될 수 있다. 결.. Database/MySQL 2022. 11. 26. MySQL 엔진 아키텍처 2023.10.9 복습 리팩토링 시작 Real MySQL을 읽기 시작했는데, 이에 관한 공부 기록을 남겨보려고 합니다. 4장 아키텍처파트의 MySQL 엔진 아키텍처부터 시작하겠습니다. MySQL 엔진 아키텍처 MySQL 전체 구조 이미지 MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있다. 이 둘을 모두 합쳐서 MySQL 또는 MySQL 서버라고 부른다. MySQL 엔진 MySQL엔진은 커넥션 핸들러, SQL 인터페이스, SQL 파서, SQL 옵티마이저, 캐시와 버퍼로 이루어진다. 표준 SQL인 ANSI SQL 문법을 지원하므로 타 DBMS에서 사용할 수 있다. 커넥션 핸들러를 사용해 접속 및 쿼리 요청을 처리하고 옵티마이저로 쿼리를 최적화한다. 스토리지 엔진 MySQL 엔진은 요.. Database/MySQL 2022. 11. 25. SLF4J, Logback 개념 이번에는 맨날 단순히 사용하기만 한 SLF4J와 Logback 개념을 정리해보려고한다. SLF4J SLF4J란 The Simple Logging Facade for Java의 약어다. 쉽게 말하면 SLF4J 자바 진영의 로깅 프레임워크 인터페이스이며 개발자가 배포 시 원하는 로깅 프레임워크를 연결할 수 있도록 도와준다. 즉 다양한 로깅 프레임워크 구현체들 (java.util.logging, logback 및 reload4j)을 쉽게 갈아끼워서 사용할 수 있게 도와준다. 그럼 이제 공식 문서에서 소개하는 SLF4J 내용에 대해 정리해보겠다. 레거시 로깅 API 사용 시 SLF4J 사용 만약 프로젝트에서 사용하는 로깅 프레임워크가 SLF4J 이외의 로깅 API에 의존한다고 생각해보자. 기존의 로깅 프레임워크.. 개발/Spring Boot 2022. 10. 10. Authentication of controller parameters is null using Spring security 제목이 너무 길어져서 영어로 한 번(?) 써봤습니다. 번역하면 스프링 시큐리티를 사용할 때 스프링 MVC 컨트롤러에 파라미터로 Authentication이 null로 들어온다! 바로 시작하겠습니다. 스프링 시큐리티와 스프링 MVC를 사용하면 다음과 같이 Authentication을 파라미터로 받을 수 있다는 내용이 굉장히 많다. 그러나 필자의 디버깅을 통해서는 authentication은 계속 null 값만 들어온다. 이번에는 이를 해결한 과정을 적어보려고 한다. 굉장히 간단하다. 일단 아래와 같이 검색을 해보았다. (어설픈 영어 실력은 덤) 그랬더니 아래와 같은 클래스가 눈에 띄였다. AuthenticationPrincipalArgumentResolver!!!! 바로 인텔리제이에 들어가서 검색을 해보았.. 개발/Spring Security 2022. 9. 21. Spring Boot에서 build.gradle은 의존성 관리를 어떻게 하는걸까? 먼저 이전에 우아한 스프링 부트에 대한 공부 기록을 남기면서 의문점이 한 가지 남아있었다. 이전 우아한 스프링 부트에 대한 공부 기록이 남아있는 게시글은 아래와 같다. https://devdebin.tistory.com/229?category=1039778 우아한 스프링 부트 공부 기록 스프링 부트 스프링 부트는 스프링을 쉽게 제공하기 위해 제공되는 툴이다. 참고로 스프링이란 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크다. 스프링 devdebin.tistory.com 우리 개발자들은 스프링 부트를 사용하면서 직접적인 의존성의 버전을 적지 않아도 구체적인 의존성의 버전을 가져온다. maven의 경우는 pom.xml 파일에서 parent가 버전을 이미 다 알고 있기 때문이었.. 개발/Spring Boot 2022. 9. 15. 우아한 객체지향 정리 이번에는 유튜브에서 조영호님이 발표하신 강의 우아한 객체지향을 정리해보려고 합니다. 객체지향과 해당 예제에 관심이 많아서..ㅎㅎ 영상 링크와 발표 깃허브 링크는 포스팅 맨 아래에 있습니다. 1. 의존성 1.1 설계란 코드를 어떻게 배치할 것인가. 즉 어떤 클래스에 어떤 코드가 들어가고, 어떤 패키지에 어떤 클래스가 들어갈 것인지, 프로젝트에 어떤 코드를 작성할 것인가에 대한 내용이 설계다. 설계의 핵심은 바로 변경에 초점을 맞추는 것이다. 같이 변경되는 것들을 같이 넣어야 한다. 같이 변경되지 않는 것들은 따로 넣어야 한다. 1.2 의존성이란 의존성이 있다는 것은 B가 변경되면 A도 같이 변경될 수 있다는 의미다. 중요한 부분은 변경될 수 있다는 점이다. 위 그림의 예시처럼 A가 B에 의존하고 B가 변경.. 기록 및 회고 2022. 9. 14. RabbitMQ 공부 이번에는 동아리 프로젝트에서 메시지 브로커인 RabbitMQ를 도입하기로 했다. 이에 대해 알아보자. RabbitMQ란? RabbitMQ는 가장 널리 배포된 오픈 소스 메시지 브로커다. RabbitMQ는 가볍고 구내 및 클라우드에 배포하기 쉽다. 여러 메시징 프로토콜을 지원한다. RabbitMQ는 분산형 및 연합형 구성으로 구현되어 대규모 고가용성 요구사항을 쉽게 충족할 수 있다. 이렇게 공식 사이트에서 소개하고 있다. 다른 설명보다 제일 눈에 띄는 것은 메시지 브로커다. 메시지 브로커란 무엇인가?. 메시지 브로커는 애플리케이션, 시스템 및 서비스가 서로 간에 통신하고 정보를 교환할 수 있도록 해주는 소프트웨어다. 메시지 브로커는 정규 메시징 프로토콜 간에 메시지를 변환함으로써 이를 수행한다. 이를 통해.. 기록 및 회고 2022. 9. 13. Spring Rest Docs 트러블 슈팅 스프링 진영에서는 API 명세서로 사용하는 대표적인 두 가지가 있다. 바로 Swagger와 Spring Rest Docs다. 간단하게 설명하면 Swagger는 도입이 매우 편리하지만 운영 코드가 지저분해지고 기능적인 보장을 할 수 없다. Spring Rest Docs는 테스트를 기반으로 작성되므로 운영 코드가 지저분해지지 않고 기능적인 보장을 한다. 다만 적용하는데 꽤 많은 시간이 소요된다. 저번 동아리 프로젝트는 빠르게 개발을 해야하므로 Swagger을 도입했었다. 이번에는 졸업 프로젝트를 하면서 새로운 기술을 도입해보고 싶었기에 Spring Rest Docs를 도입하기로 결정했다. 이번 포스팅에서는 구체적인 도입 방법보다는 트러블 슈팅과 해결 과정을 기록하려고 한다. Spring Rest Docs를 .. 기록 및 회고 2022. 9. 1. 이전 1 ··· 7 8 9 10 11 12 13 ··· 29 다음 반응형