분류 전체보기 13

쿼리 모니터링 구축기

배경최근 운영중인 서비스에서 데이터베이스 성능 문제로 요청 지연이 발생하는 문제가 있었습니다. 해당 서비스에서는 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

[자동화] 슬랙으로 업무 자동화하기

배경일을 하다보면 어떠한 지표가 필요한 상황이 종종 발생합니다.가령, 마케팅이나 이벤트에 적절한 대상자를 선별해야 한다거나, 정산이나 통계처럼 현황을 확인하기 위한 경우가 있습니다. 이러한 기능이 시스템적으로 존재하는게 가장 좋은 상황이지만 아직 저희 회사에서는 이러한 시스템적인 기능이 완벽하게 구성되지 않아 요청이 오면 수작업으로 진행하는 건들이 더러 존재하고 있습니다. 하지만, 이 말은 사람이 하는 만큼 실수가 발생할 수 있고, 업무의 우선순위로 곧바로 전달되지 못하는 경우도 존재하는 말과도 동일합니다. 심지어 더 중요한 업무를 진행할 시간이나 에너지도 저하 시키는 요인이 되기도 합니다. 이 문제를 조금이나마 해결해보고자 슬랙을 활용해 자동화한 경험을 공유해보고자 합니다. 기획 배경최근 파트너쉽을 ..

카테고리 없음 2025.01.15

JPA와 엔티티 패턴

배경어제 링크드인을 보다가 ORM (JPA)을 써야하는 이유에 대한 콘텐츠를 보게 되었는데 핵심적인 내용은 다음과 같았습니다.대부분의 애플리케이션의 로직(비즈니스 로직)을 애플리케이션에서 구현해야 한다.그래야 더 유연하고, 확장 가능한 시스템을 만들 수 있다. 저 역시 이 관점에 동의하는데요 그랬을 때, 제가 생각하는 JPA가 다른 영속성 기술에 비해 가지는 장점은 무엇이고, 어떻게 활용해서 구현해가고 있는지를 이야기해보려고 합니다. 영속성 매핑과 엔티티 패턴. 그리고 단일 책임 원칙JPA를 사용할 때 가장 기본적인 작업 중 하나는 엔티티 클래스(jakarta.persistence.Entity)를 SQL 테이블과 매핑하는 과정입니다. 이는 JPA뿐만 아니라 MyBatis, Spring Data JDB..

카테고리 없음 2024.12.01

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

신입 개발자, 1년 회고

서론덥디 더웠던 작년 여름 첫 발을 내딛은지 어느덧 1주년이 되었습니다. 1년 동안 회사 외부에서는 다른 개발자들의 이야기를 많이 듣고, 내부적으로도 열심히 지내왔습니다. 단순히 시간이 흘렀다고 넘기기에는 바뀌고 성장한 것들이 많아서 지금까지 어떤 삽질(?)하는 경험들이 있었고, 앞으로 어떤 방향으로 나아가고 싶은지에 대해 이야기해보고자 합니다. 현재의 상황처음 최종 오퍼가 결정되고 입사 당시에 백엔드 팀은 저를 포함해 총 3명이었습니다. 하지만, 현재는 다른 팀원들이 모두 퇴사하고 4월부터 새로운 파트 리더님이 합류하시게 되면서 현재는 파트 리더님과 둘이서 백엔드 업무를 진행하고 있습니다. 기존 팀원 두 분이 비슷한 시기에 퇴사했을 때는 걱정과 우려가 많았었습니다. 그런데 역설적이게도 전체 기간으로 ..

카테고리 없음 2024.09.18

NoSQL(Firestore)에서 RDBMS(MySQL)로 데이터베이스 동기화

배경최근 진행한 프로젝트의 MVP(Minimum Viable Product) 개발 과정에서 Firestore를 주요 데이터 저장소로 활용해왔습니다. 초기에는 Firestore의 저렴한 비용과 NoSQL의 유연성이 큰 장점이었지만, Firestore가 검색 기능을 제공하고는 있지만 프로젝트가 고도화되면서 복잡한 쿼리와 검색 기능에 한계를 느꼈습니다. (대안으로 SaaS 검색 엔진인 Algolia를 적용해서 사용해봤지만 필요한 조회 요구사항을 전부 충족하지는 못했답니다 🥲) 제가 재직 중인 회사의 도메인은 에듀테크로 주로 교육 및 학습 정보를 가공하고, 이를 바탕으로 통계 및 리포트를 제공하는 업무를 주로 수행하고 있습니다. 이번 프로젝트에서도 학습 데이터를 기반으로 학습 현황 분석, AI 기반 개인화 피드..

카테고리 없음 2024.07.24

블로킹과 논블로킹, 동기와 비동기 그리고 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)

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

카테고리 없음 2024.07.06