분류 전체보기 44

[Real MySQL 8.0] MySQL에서 정렬 처리 방식과 드라이빙 테이블 선택 전략

DB 설계 시 테이블 간의 관계를 정의할 때, 흔히 부모-자식 테이블 구조에 집중하게 된다. 하지만 쿼리 성능 최적화 관점에서 보면, 정렬 컬럼이 어느 테이블에 위치하는지가 드라이빙 테이블 선택의 핵심 기준이 된다. MySQL의 세 가지 정렬 처리 방식MySQL은 ORDER BY 절을 처리할 때 다음 세 가지 방식 중 하나를 선택한다. 성능은 위에서 아래로 갈수록 저하된다.인덱스 기반 정렬: 별도의 정렬 작업 없이 인덱스 순서대로 데이터를 읽는다.드라이빙 테이블만 정렬 (Using filesort): 조인 전에 드라이빙 테이블만 먼저 정렬한다.조인 후 전체 정렬 (Using temporary; Using filesort): 조인 결과 전체를 임시 테이블에 저장한 뒤 정렬한다.만약 실행 계획을 출력했는데 ..

[Spring AI] Spring AI 버전 불일치와 설정 타이밍 문제

최근 오랜만에 Spring AI를 사용해 작업을 하면서, 이전과는 다르게 빌드 단계부터 다양한 시행착오를 겪게 되었다. 특히 프록시 서버를 통한 연동이 필요해 예상보다 많은 어려움이 있었고, 이를 정리해 두려 한다. Spring AI를 활용해 ChatModel을 각각의 모델에 맞는 클래스로 구성하고 애플리케이션에 통합하려는 작업을 진행했다.빠르게 변화하는 모델 분야만큼이나, Spring AI는 비교적 신생 프로젝트이며 업데이트 주기가 매우 빠른 편이다. 그로 인해 버전 간 API 변경, AutoConfiguration 구조 변경, 아티팩트 분리 등이 빈번하게 발생하고 있으며,나 역시 초기 설정 단계에서 여러 가지 문제를 경험하게 되었다. 문제상황1. Spring AI 버전 불일치로 인한 의존성 로딩 실패..

[CS/Database] DBMS에서의 B-Tree 인덱스

우리가 데이터를 찾을 때에는 인덱스가 필요하다. 인덱스는 특정 열 값을 가진 행을 빠르게 찾는 데에 사용되는 자료구조이다. 인덱스가 없다면 테이블 전체를 순차적으로 스캔해야하므로, O(N)의 시간복잡도가 발생하며, 이에 대하여 인덱스를 통해 O(logN)으로 개선할 수 있다. 그렇다면 대표적인 RDBMS에서 채택하는 인덱스에 대하여 알아보자. B-Tree 인덱스 B-Tree(Balaced Tree)는 이진 탐색 트리를 확장한 자기 균형 트리 자료구조로, 다음과 같은 특징을 가진다. 차수(Order)인 m의 정의 : m차 B-Tree, 이는 한 노드가 가질 수 있는 최대 자식의 수가 m개라는 의미이다키의 개수: 각 노드는 최소 ⌈m/2⌉-1개 (위는 반올림), 최대 m-1개의 키를 가진다 (키에 대해선 ..

백엔드/Database 2025.11.21

[MyBatis] SpringBoot에서 MyBatis와 Enum 클래스를 매핑하기

최근 MyBatis를 기반으로 ORM을 사용하는 계기가 생겨서 작업하게 됐는데, 삽질을 많이 해서 트러블 슈팅에 대하여 기록해보도록 하겠다!MyBatis란?SQL 기반의 Persistence Framework다. Entity에 대하여 직접 DB의 컬럼과 매핑하는 JPA와 다르게, MyBatis에서는 Java 클래스가 DB의 정보를 담는 DTO 역할을 하며, SQL을 직접 작성하여 매핑한다.( 직접 구현하는 쿼리문이 있기 때문에 N+1에 대하여 자동으로막아준다는 장점이 존재하지만개인적으로는 JPA가 좋다...)사용한 스택은 다음과 같다.MyBatisDB Flyway : DB 스키마를 작성하고 구성해야 하므로 미리 작성하기로 하였다. 개인적으로는 MyBatis에서 매우 편리하게 사용생긴오류나의 경우 Java..

카테고리 없음 2025.11.20

[SpringBoot] 통합 테스트(Integeration Test) 알아보기

통합테스트란?애플리케이션의 여러 모듈(레이어)를 실제 환경에 가깝게 "통합" 한 상태에서 동작을 검증하는 테스트이다.Unit Test가 "메서드 하나" 또는 "클래스 하나"에 집중했다면,통합테스트는 Controller → Service → Repository → Database와 같은 여러 레이어 간의 협력과 데이터 흐름과 애플리케이션의 조합을 테스트하는 것을 의미한다.즉, 단위테스트가 최소한의 기능 조각들을 검증하는 작은 단위들에 대한 것이라면,통합테스트란 여러 컴포넌트가 함께 동작할 때 문제없음을 검증하는 것이다. 과거에는?과거에는 통합테스트라고 하면"시스템 전체를 한 번에 돌려보는 형태"에 가까웠다.SQL 스크립트를 직접 수동으로 돌리고 화면에서 클릭해보며 테스트화면을 클릭하면서 테스트해보기테스트..

[자료구조] B-Tree

B-Tree는 I/O에 효율적인 자료구조로 가장 많이 사용된다.왜 효율적인 자료구조인지 알아보자. B-Tree 계열을 알기 위해서는 (B+Tree, B*-Tree, ...)우선적으로 B-Tree의 기원인 BST를 알아야한다 BST(Binary Search Tree)이진 탐색 트리로이진트리의 특성은 자식을 0, 1, 2개 중 하나를 가진다는 것이다 하지만 이것의 최악의 구조에는 다음과 같은 경우가 존재한다위와같이 잇다고했을 때가장 밑단의 자식 노드에 접근하려고 하면,최악의 경우로 취급된다. ( O(N)만큼의 시간 복잡도 요구됨 ) 최악의 경우에는 위와 같이 접근을 해야한다. 내부적으로 BST를 스스로 정렬한 구조인 AVL이나 red black tree 등이 존재하는데,이것들 보다 더 많은 데이터를 포함하..

[CS/운영체제] 뮤텍스와 세마포어

하나의 CPU에서 여러 프로세스나 스레드가 동시 실행되는 환경에서는 공유 자원에 대한 동기 접근이 발생한다. 이러한 상황에서는 Race Condition과 같은 동시성 문제가 쉽게 발생하며, 시스템 오동작이나 데이터 불일치를 초래할 수 있다. 따라서 Critical Section(임계영역)에 대한 적절한 접근 제어는 필수적이며, 이를 위한 대표적인 기법이 바로 뮤텍스와 세마포어이다.뮤텍스(Mutext)Mutual Exclusiond -> Mutex 뮤텍스는 말 그대로 상호 배제(Mutual Exclusion)를 위한 동기화 원시(primitive)다. 공유 자원에 접근하려는 스레드는 반드시 락(lock)을 획득해야 하며, 락을 얻은 스레드만이 임계영역에 진입할 수 있다.락은 boolean 상태(locke..

CS/운영체제 2025.10.28

GitHub Actions로 정적 문서 사이트 배포 자동화

우리가 어떤 웹사이트에 접속하기 위해서는 웹 호스팅 서비스가 필요하다. Github Pages는 Github에서 제공하는 무료 정적 웹사이트 호스팅 서비스로,개인 레포지토리가 정적 파일로만 구성되어있다면, 사이트를 배포하기에 적합하다.범용성 높은 GitHub Pages 어떤 저장소든 정적 웹사이트로 호스팅할 수 있으며, GitHub Actions를 결합하면 코드 푸시만으로 배포가 자동화가 가능하다.그래서 이번 글에서는 이러한 자동 배포 파이프라인을 단계별로 구축해보았다. 설계 나는 document 폴더에 있는 작성 md 파일들을 github pages를 이용하여 하나의 게시글로 정리하는 작업을 하고자 다음과 같은 프로세스를 설계했다.┌─────────────────────────────────────┐..

카테고리 없음 2025.10.23

[CS/운영체제] CPU 스케줄링 알고리즘

일전에도 정리했었지만 우리의 CPU(중앙처리장치)는 프로세스를 하나씩 처리한다.동시에 처리하는 것 같아보이지만,실제로는 아주 빠른 속도로 특정 속도 별로 작업을 하기 때문에 동시에 일어나는 것처럼 보이는 것이다.그러면 이런 실행 순서에 대한 할당은 어떻게 결정하는 것인지 알아보자.CPU 스케줄링이란?CPU 스케줄링은 운영체제(OS) 의 핵심 기능 중 하나로,한정된 CPU 자원을 시스템 내의 여러 프로세스(또는 스레드) 들에게 공정하고 효율적으로 할당하는 정책 및 과정이다.이때 CPU 스케줄링은 실행 대기 중인 프로세스(준비 큐, Ready Queue) 중에서 다음에 어떤 프로세스에게 CPU를 할당할지를 결정한다. 목적앞서 언급했듯이 여러 프로세스들이 돌아가기 위해선 공정하고 효율적으로 할당하는 과정이 C..

CS/운영체제 2025.10.22

[CS/운영체제] 프로세스 관리와 통신

PCB(Process Control Block)우리의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다.하지만 사용자 입장에서는 CPU가 매우 많은 데이터를 동시에 빠르게 처리하는 것처럼 보인다.이는 CPU가 매우 빠른 속도로 여러 프로세스를 번갈아가며 실행하기 때문이다.즉, CPU가 짧은 시간 단위로 프로세스를 전환하면서 처리하기 때문에, 결과적으로 동시에 여러 작업이 수행되는 것처럼 보이는 것이다. 그렇다면 이러한 CPU에서 프로세스의 우선순위나 자원 배분 등을 어떻게 관리할 수 있을까?이를 위해 필요한 것이 바로 PCB(Process Control Block) 이다.운영체제는 빠르게 번갈아 수행되는 프로세스들의 실행 순서를 관리하고, 각 프로세스에 CPU 및 기타 자원을 효율적으로 배분한다.이때 ..

CS/운영체제 2025.10.14