본문 바로가기

분류 전체보기121

Logback 로깅과 MDCFilter로 로깅 식별자 적용하기 로깅 로깅은 프로그램 동작 시 발생하는 모든 일(서비스 동작 상태 및 장애)을 기록하는 행위를 말한다. 이를 통해 개발, 테스트, 운영 등 다양한 환경에서 애플리케이션의 동작을 이해하고 모니터링하는 데 도움이 된다. 서비스 동작 상태: 시스템 로딩, HTTP 통신, 트랜잭션, DB 요청, 의도를 가진 Exception, ... 장애(exception, error): I/O Exception, NullPointerException, 의도하지 않은 Exception, ... 로깅은 언제할까? 정답이 없다. 프로젝트의 성격에 맞게 팀에 맞게 정의하면 된다. 그리고 로깅 시점은 때에 따라 다르다. 언제 기록할지를 정했다면 어떻게 기록할지도 중요한 부분이다. 우리가 아는 가장 로깅하기 쉬운 방법에는 System... 2023. 11. 18.
슬로우 쿼리 로그(Slow Query Log) 슬로우 쿼리 로그(Slow Query Log) 슬로우 쿼리 로그는 데이터베이스 시스템에서 실행 속도가 느린 쿼리를 식별하고 기록하는 로그 시스템을 말한다. 슬로우 쿼리 로그는 다음과 같은 상황에서 사용된다. 성능 튜닝: 데이터베이스의 성능을 향상시키기 위해 느린 쿼리를 식별하고 최적화할 때 사용된다. 문제 진단: 어떤 쿼리가 성능 이슈를 일으키는지 파악하여 해결하는데 도움이 된다. 시스템 감지: 데이터베이스 시스템을 지속적으로 감시하여 성능 저하를 미리 감지할 수 있다. 보통 DBMS의 설정에서 이를 활성화하고 관련된 옵션을 구성할 수 있다. 설정 slow_query_log 시스템 변수를 통해서 on/off할 수 있고, slow_query_log_file 시스템 변수는 슬로우 쿼리 로그 파일 경로를 나타.. 2023. 11. 14.
옵티마이저와 힌트 (2/2) 쿼리 힌트 MySQL 서버는 우리가 서비스하는 비즈니스를 100% 이해하지 못하기 때문에 서비스 개발자나 DBA보다 MySQL 서버가 부족한 실행 계획을 수립할 때가 있을 수 있다. 이런 경우 옵티마이저에게 쿼리의 실행 계획을 어떻게 수립해야 할지 알려줄 수 있는 방법이 필요하기 때문에 이런 목적으로 옵티마이저 힌트가 제공된다. MySQL 서버에서 사용 가능한 쿼리 힌트는 다음과 같이 2가지로 구분할 수 있다. 인덱스 힌트 "STRAIGHT_JOIN"과 "USE INDEX" 등을 포함한 인덱스 힌트들은 SELECT 명령과 UPDATE 명령에서만 사용할 수 있다. 옵티마이저 힌트 STRAIGHT JOIN STRAIGHT_JOIN은 옵티마이저 힌트인 동시에 조인 키워드이기도 하다. STRAIGHT_JOIN은.. 2023. 11. 13.
상품 구매 트랜잭션으로 보는 부정합 문제 트랜잭션 이상 현상에 따른 정합성 문제 트랜잭션과 잠금 트랜잭션과 잠금 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이 oneny.tistory.com 위 트랜잭션과 잠금에 대한 이론을 공부하고 프로젝트에 이 트랜잭션과 잠금을 어떻게 적용할 수 있을지 테스트해보려고 한다. 상품 구매 상황에서 발생 가능한 문제 두 명의 사용자가 동시에 하나의 상품을 구매했다고 가정해보면 다음과 같은 로직의 순서가 이루어진다. 구매하려는 상품 조회해서 재고가 있는지 확인 사용자의 주문 데이터 생성 구매하려는 상품 재고 차감 물론 결제 로직도 추가해야하지만 그것보다는 사용자가 상품 구매하는 상황에서 발생.. 2023. 11. 13.
옵티마이저와 힌트 (1/2) 옵티마이저와 힌트 어떤 DBMS든지 쿼리의 실행 계획을 수립하는 옵티마이저는 가장 복잡한 부분으로 알려져 있으며, 옵티마이저가 만들어 내는 실행 계획을 이해하는 것 또한 상당히 어려운 부분이다. 하지만 실행 계획을 이해할 수 있어야만 실행 계획의 불합리한 부분을 찾아내고, 더 최적화된 방법으로 실행 계획을 수립하도록 유도할 수 있다. 실행 계획을 살펴보기 전에 먼저 알고 있어야 할 몇 가지 사항을 살펴보자. 쿼리 실행 절차 MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나눌 수 있다. 사용자로부터 요청된 SQL 문장을 자게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다. SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 .. 2023. 11. 10.
인덱스 인덱스 인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분이다. MySQL 8.0 버전까지 업그레이드되어 오면서 다른 상용 RDBMS에서 제공하느 많은 기능을 지원하게 됐으며, 기존의 MyISAM 스토리지 엔진에서만 제공하던 전문 검색이나 위치 기반 검색 기능도 모두 InnoDB 스토리지 엔진에서 사용할 수 있게 개선되었다. 아무리 MySQL의 옵티마이저가 발전하고 성능이 개선됐다고 해도 여전히 관리자의 역할은 매우 중요하다. 디스크 읽기 방식 컴퓨터의 CPU나 메모리처럼 전기적 특성을 띤 장치의 성능은 짧은 시간 동안 매우 빠른 속도로 발전했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했다. 여전히 데이터 저장 매체는 컴퓨터에서 가장 느린 부분이기 때문에 데이터베이스나 .. 2023. 11. 6.
트랜잭션과 잠금 트랜잭션과 잠금 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 아무것도 적용되지 않아야(ROLLBACK 또는 트랜잭션을 ROLLBACK시키는 오류가 발생했을 때)함을 보장해 주는 것이다. MyISAM이나 MEMORY 스토리지 엔진처럼 부분 업데이트 현상이 발생하면 실패한 쿼리로 인해 남은 레코드를 다시 삭제하는 재처리 작업이 필요할 수 있다. 따라서 InnoDB 스토리지 엔진이 지원하는 트랜잭션 기능은 애플리케이션 개발에서 고민해야 할 문제를 줄여주는 아주 필수적인 DBMS의 기능이라.. 2023. 11. 4.
DTO <-> Entity 어디서 변환해야 할까? DTO Entity 어디서 변환해야 할까? 프로젝트를 진행하면서 DTO와 Enity를 어디서 변환하면 좋을지 생각했고, 이 주제는 개발에 있어 다들 많이 하는 고민 중 하나인 것 같다. 데이터베이스 Entity와 클라이언트 또는 API에서 사용하는 DTO(Data Transfer Object) 변환 과정은 데이터 구조 및 비즈니스 로직 차이를 해결하는 데 도움이 된다. 따라서 변환 과정은 개발에 중요한 요소 중 하나라고 생각한다. 그러면 먼저 DTO는 무엇이고, Entity가 무엇인지부터 간단히 살펴보자. Entity Entity는 데이터 모델링에서 레코드 또는 데이터베이스 테이블에서 식별 가능한 하나의 항목을 나타내는 개념이다. Entity는 특정 도메인에서 중요한 정보 단위를 나타내며 데이터베이스에서.. 2023. 11. 3.
InnoDB 스토리지 엔진 아키텍처 InnoDB 스토리지 엔진 아키텍처 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. InnoDB의 간단한 아키텍처는 위 그림과 같다. 프라이머리 키에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다. 즉, 프라이머리 키 값의 순서대로 디스크에 저장된다는 뜻이며, 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다. 프라이머리 키가 클러스터링 인덱스이기 때문에 프라이머리 키를 이용한 레인지 스캔은 상당히 빨리 처리될 수 있다. 결과적으로 쿼리의 실행 계획에 프라이머리 키는 기본적으로 다른.. 2023. 11. 2.