전체 글 8

쿼리 모니터링 구축기

배경최근 운영중인 서비스에서 데이터베이스 성능 문제로 요청 지연이 발생하는 문제가 있었습니다. 해당 서비스에서는 Aurora Serverless v2를 사용하고 있는데요,데이터베이스의 최대 ACU(Aurora Capacity Unit)에 도달하고 CPU 사용률 또한 100%가 되면서 요청이 지연되거나 커넥션 타임아웃이 발생하고 있던 상황이었습니다. 알람으로 문제를 파악하여 최대 ACU를 늘려 문제는 금세 해결되었지만 재발할 가능성이 존재했습니다. 문제 원인사용률, 레이턴시, 쓰로우풋과 같은 메트릭에 대한 내부 비정상 지표가 존재하지 않기도 했었고 처리량이 많아 문제가 발생한건지, 아니면 병목 구간(슬로우 쿼리나 N+1 문제와 같은)이 있어서 발생한건지 알기 어려웠습니다. 따라서, 우아한형제들 RDS 모..

카테고리 없음 2025.02.02

병목을 해결하는 사이클

개요최근 회사에서 성능 관련된 이슈가 꽤 발생했었습니다. 이슈를 확인하고 대응하면서 '어떻게 미리 방지할 수 있을까'하는 생각에 부하 테스트를 알아보게 되었고, 학습하면서 배운 부하테스트를 통해 병목이 되는 구간을 파악하고 해결해가는 과정을 정리하려고 합니다. 이 강의를 보고 참고하여 작성한 글입니다.https://inf.run/sND28 대규모 트래픽 처리를 위한 부하테스트 입문/실전 강의 | JSCODE 박재성 - 인프런JSCODE 박재성 | 비전공자 입장에서도 쉽게 이해할 수 있고, 실전에서 바로 적용 가능한 '대규모 트래픽 처리를 위한 부하테스트 입문/실전' 강의를 만들어봤습니다!, 🤬 에라이, 못 해먹겠네!비전www.inflearn.com 지연시간과 처리량지연시간은 실제 요청을 보낸 시간..

카테고리 없음 2025.01.19

AWS API Gateway 권한 부여자 인증 활용해보기 (Authorizer)

배경외부로 제공되는 API의 인증을 위해 기존에는 AWS Cognito와 API Gateway를 사용해왔습니다. AWS Cognito는 유저 관리와 인증에 필요한 다양한 기능들을 제공하는데요, 저희가 필요한 기능은 그 중 일부에 불과해서 전체 기능을 충분히 활용하고 못하는 아쉬움이 있었습니다. 그래서 우리에게 더 알맞은 인증 구조를 고민하게 되었고, 그 결과 Lambda를 활용해 Custom Authorizer를 구현하기로 했습니다. 최종적으로 완성된 구조를 다이어그램으로 나타내면 다음과 같습니다. API Gateway가 클라이언트의 요청을 받으면 페이로드(token or request)를 찾아서 권한 부여자(Authorizer, auth function)를 실행하고, auth function은 검증 ..

카테고리 없음 2024.11.10

IP 주소, 서브넷 그리고 CIDR

개요요즘 인프라와 네트워크에도 관심을 가지게 되면서 기본적인 네트워크 개념들도 다시 공부하고 있는데요, 애플리케이션 개발을 넘어서 시스템 전반을 이해하는게 중요하다는 생각이 들었기 때문입니다.이번 포스팅에서는 IP 주소의 기본 개념부터 서브넷팅과 CIDR까지 네트워크의 기초 개념을 정리해보겠습니다.  IP 주소IP 주소는 네트워크 상에서 장치를 구분하고 통신하기 위해 사용되는 고유한 번호로 인터넷은 IPv4와 IPv6라는 두 가지 IP 주소 체계를 사용하고 있습니다. IPv4 IPv4는 32비트로 8비트씩 4개의 옥텟으로 나누어 표현하고, 총 42억 개(2^32)의 주소를 제공할 수 있습니다.예를 들어, 192.168.1.1처럼 숫자 4개가 '.'으로 구분된 형식입니다.  IPv6IPv6는 128비트로 ..

카테고리 없음 2024.10.13

블로킹과 논블로킹, 동기와 비동기 그리고 I/O 모델 이해하기

개요블로킹(blocking), 논블로킹(non-blocking), 동기(synchronous), 비동기(asynchronous)와 같은 용어는 I/O 작업과 태스크 실행 맥락에서 자주 사용되지만, 이들을 정확히 이해하고 구분하는 것은 쉽지 않습니다. 이러한 개념을 이해하는 것은 애플리케이션 성능과 응답성을 최적화하는 데 매우 중요한데요, 이번 포스팅에서는 이러한 주요 개념들을 코드와 함께 공유해보고자 합니다. 예시에 사용된 코드 예시들은 해당 리포지토리에서 확인 가능합니다. https://github.com/own-playground/io-model GitHub - own-playground/io-model: [practice] Implement the most prevalent I/O models[pr..

카테고리 없음 2024.07.10

[DB] 가상 컬럼 (Virtual Columns - Generated Column)

개요가상 컬럼은 기존의 컬럼을 기반으로 특정 조건식에 의해 생성된 결과를 저장하는 컬럼을 의미합니다.이번 포스팅에서는 MySQL에서의 가상 컬럼(Generated Column)에 대해 알아보겠습니다. MySQL Generated ColumnMySQL에서 저장 방식에 따라 VIRTUAL과 STORED 타입으로 나눌 수 있습니다.VIRTUAL (기본값): VIRTUAL 타입은 값을 실제 저장 공간에 저장하지 않고, 행을 읽을 때 계산STORED: STORED 타입은 행이 추가되거나 변경될 때 계산된 값이 실제로 저장col_name data_type [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] [NOT NULL | NULL] [UNIQUE [KEY]] [[PRIM..

카테고리 없음 2024.07.06

[DB] 조건에 맞는 값 그룹 형태로 출력 (GROUP_CONCAT)

개요특정 컬럼의 목록을 하나의 그룹으로 조회해야 하는 상황이 종종 발생합니다. 아래는 가상의 테이블 스키마 구조로, 납품 업체와 제휴를 맺고 있는 파트너사의 가맹점들이 상품 발주 요청을 관리하는 테이블입니다.CREATE TABLE `order_form` ( `order_form_id` int NOT NULL AUTO_INCREMENT, `partner_name` varchar(50) NOT NULL, `partner_code` varchar(20) NOT NULL, `product_name` varchar(50) NOT NULL, `request_dt` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`order_form_id`) ) ENGINE=InnoDB; 동일..

카테고리 없음 2024.06.21

스프링 엑추에이터와 커스터마이징 (1)

서론애플리케이션을 프로덕션 환경에서 운영하기 위해서는 기능적인 것들 뿐만 아니라 비 기능적인 요소들도 구성되어 있어야 합니다. 이러한 비 기능적인 요소들은 서비스를 안정적이게 운영하고, 애플리케이션을 보호하고, 장애 상황에 문제를 탐지하고 분석하는데 용이한데요. 오늘은 이 중에서도 애플리케이션의 운영과 관리에 용이하게 하는 스프링 부트에서 제공하는 엑추에이터를 소개하려고 합니다. Spring Actuator엑추에이터는 애플리케이션이나 데이터베이스의 상태, 메트릭, 로그, 스레드 상태 등에 대한 애플리케이션을 관리하는데 도움이 되는 여러 기능들을 HTTP 엔드포인트나 JMX 형태로 제공합니다. 엑츄에이터가 제공해주는 기능을 사용하려면 두 가지 설정이 선행되어야 합니다.엔드포인트 활성화엔드포인트 노출엑추에이..

카테고리 없음 2024.03.17