개발자의 길 57

[대용량 처리] K6를 활용한 대용량 REST API 요청에 대한 부하 테스트

부하 테스트란? 일반적으로 REST API 서버의 특정 기능을 개발하여 상용 서비스에 올릴 때에는 기본 기능들은 잘 동작 하는지, 여러 테스트케이스에서 예외 상황은 발생하지 않는지, 엣지 케이스에서의 버그로인한 서버 다운의 가능성은 없는지 등을 테스트 한다.  위 테스트들은 개발자의 유닛/통합 테스트, QA 팀에서의 기능 테스트 등으로 충분히 잡을 수 있으나, 서버가 많은 요청을 받을 때에도 잘 동작하는지는 위 방법으로는 테스트하기 어렵다. 서버가 많은 요청에 대해 잘 버티는지를 테스트 하는 방법을 "부하 테스트" 라고 한다. 물론 이런 부하 테스트를 간편하게 실행하게 해줄 여러 도구들은 이미 잘 개발되어 있고, 이 포스팅에서는 여러 툴중 간단하게 사용이 가능한 K6 를 사용하여 테스트를 해보고자 한다..

개발자의 길 2025.02.28

[MSA] 분산 환경에서의 트랜잭션 처리 - 분산 트랜잭션과 보상 트랜잭션

서론 단일 서버와 DB 로 구성되는 Monolithic 서버에서는 하나의 API 로직 내부에서 특정 부분에서 실패가 발생 한다면, DB 의 rollback 을 이용해서 commit 전에 작업하던 모든 데이터를 처리하기 전 상태로 돌려놓을수가 있다.   하지만 서비스의 규모가 커지다 보면 성능이나 관리적 이슈로 인해 MSA(Micro Service Achitecture)로 넘어가게 되는데, MSA 에서는 API 서버와 DB가 서비스별로 나누어져 있다. 서버와 DB 가 나누어져 있기 때문에 Monolithic 에서처럼 DB rollback 만으로는 실패한 트랜잭션의 원복이 어렵게 된다. 이렇게 여러 리소스가 나누어져 있을 때의 트랜잭션을 "분산 트랜잭션" 이라고 하고, 분산 트랜잭션에서 실패가 발생했을 때 ..

개발자의 길 2025.02.13

[Database] MySQL 에서 Index 를 설계하고 추가하는 방법

이전에 올렸던 미니 e-commerce 프로젝트에서 제공하는 API 의 조회성능을 올려서 서비스를 좀더 향상시키고자 한다. 바로 이전 포스트에서 Redis 를 활용한 원격 캐싱 서버를 활용해 조회 성능을 높였는데, DB 인덱스를 추가하는 방법으로도 조회 성능을 높일 수 있다.  현재 서비스를 상용으로 올려서 운영중인 프로젝트가 아니기 때문에, 어떤 쿼리가 가장 많이 수행되고 있는지는 정확한 파악이 어렵다. 하지만 비즈니스적으로 자주 조회될 쿼리가 무엇인지는 추측이 가능하고, 테스트 코드를 실행시켰을 때 어떤 쿼리가 수행되는지 정도는 파악이 가능하다.  현재 제공하는 기능에서 사용하는 쿼리와 적용해볼 인덱스, 그리고 성능 향상점은 아래에 적어 놓았다.  테스트 데이터랜덤 값으로 생성한 100만개의 데이터..

개발자의 길 2025.02.12

[Cache] 백엔드 서버 입장에서의 캐싱 전략과 활용 방안에 대해

캐시 캐시는 데이터를 임시로 저장해 두는 임시 저장 장소를 의미한다. 모든 저장 장치는 각자 저장 속도나 읽기 속도가 다른데, 주로 좀더 빠른 저장이나 읽기 속도를 가졌지만 좀더 용량이 적거나 저장 시간이 적은 저장 장치를 캐시 역할로 둔다. 임시적으로 데이터를 저장해 두고 빠르게 읽기/쓰기를 하기 위해 캐시를 이용한다.  간단하게 예를 들자면 우리 컴퓨터의 SSD 와 RAM 메모리가 있다. 같은 가격대비 읽기쓰기 속도는 RAM 메모리가 더 빠르지만, 용량은 SSD 가 더 크고, RAM 메모리는 컴퓨터를 재부팅 시에 데이터가 휘발된다는 점이 있다.컴퓨터에서 엑셀을 실행시키고 스프레드시트를 작성하고, 읽는 과정에서 실시간으로 작업중인 데이터가 있다고 치자. 이 상황에서 데이터를 하나씩 읽고 작성할 때 마다..

개발자의 길 2025.02.04

[항해플러스] 미니 e-commerce 프로젝트에서 발생가능한 동시성 문제와 그 해결법

서론 및 개요인터넷에서 상품을 결제하고 배송을 해주는 e-commerce 서비스는 여러 기능들을 제공한다. 내 계정에 포인트를 충전하거나, 상품을 구매하기 위해 어떤 상품을 얼마나 넣는지 등을 결정하여 결제를 진행하기도 하고, 이벤트성으로 쿠폰을 발급하거나 특별 할인 등을 진행하여 매우 값싼 상품을 일시적으로 판매하기도 한다.이런 기능들은 대개 사람들이 몰려서 API 요청들이 많이 몰리기 마련인데, 이때 동시에 같은 작업을 진행하다 보면 데이터의 정합성이 맞지 않거나 오류가 나는 등의 '동시성 문제' 가 생길 수 있다.항해플러스를 진행하면서 미니 e-commerce 프로젝트를 진행하고 있는데, 이번에 내가 구현한 서비스에서 제공하는 유스케이스에서 어떤 동시성 문제가 있을지 알아보고 이것들을 어떻게 해결할..

개발자의 길 2025.01.19

[Infra] Docker (1) - Docker Engine

도커 도커 엔진 도커의 기본 단위는 '이미지'와 '컨테이너' 이다. 도커 이미지와 도커 컨테이너 도커 이미지는, 도커 컨테이너를 생성하기 위해 필요한 요소, 여러 계층으로 이루어진 바이너리 파일을 의미한다. 컨테이너를 실행시킬 때 해당 파일을 읽어서 실행시킨다. 이미지의 이름은.[저장소이름]:[이미지이름]:[태그] 로 구성된다. (alicek106/ubuntu:14.04) \ $ docker pull centos:7 # 이미지 받기 $ docker images # 받은 이미지 확인 도커 컨테이너는 실행중인 가상 환경이라고 생각하면 된다. 도커 컨테이너는 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다. 또한 개발 시점에서 컨테이너에 서버 배포를 한다던가 하는 작업을 한 뒤 운영에 배포하..

개발자의 길 2024.04.14

[Network] VPN 의 원리에 대해서

VPN 은 Virtual Private Network 로써, 말 그대로 가상으로 사설망과 같은 형태로 연결되는 네트워크를 의미한다. 사설망이라는 건 인터넷과는 차단된 독자적인 네트워크 체계를 의미한다. 특정 회사의 사설망이 서울에 하나 부산에 하나 있다고 하자, 회사 내부의 사람끼리는 두개의 사설망을 연결해서 같이 쓰고 싶다면 두 사설망을 연결해주는 전용 회선이 필요하다. 예전에는 이런 회선을 대여하거나 해서 비용을 내고 썻다고 하는데, 비용이 너무나 많이 들다 보니 회선을 따로 독점하지 않고 두 사설망을 연결하는 방법을 찾다가 나온게 VPN 이라고 한다. VPN 은 사설망과 다른 네트워크나 클라이언트와 인터넷으로 통신을 하기 위해서 서로 주고받는 메시지를 서로만 알고있는 암호키를 이용해서 캡슐화, 암호..

[Network][AWS] AWS 네트워크 구성요소 - 3. 네트워크 보안과 부가 서비스

이번장에서는 AWS 의 보안 구성 요소와 부가적인 서비스 들에 대해 알아보겠다. 보안 그룹(Security Group) 보안 그룹은 인스턴스(RDS, EC2) 단위로 인바운드와 아웃바운드를 정의하는 가상의 방화벽이다. 특정 인스턴스의 특정 Port(예: HTTP/HTTPS 등) 에 대한 요청을 할 수 있는 IP 리스트를 관리함으로써 인스턴스에 접근할 수 있는 범위를 규정한다. 보안 그룹은 상태를 유지하는(stateful) 정책으로 접근가능여부를 판단한다. 무슨 소리냐면, 이전에 들어온 요청의 상태정보를 기억해서 요청에 대한 응답을 할 때 같은 '상태' 라고 판단되면 보안정책으로 통신을 막거나 하지 않는다는 소리이다. 간단하게 예를 들어서 우리가 가장 흔하게 사용하는 HTTP 프로토콜 통신으로 예를 들어보..

[Network][AWS] AWS 네트워크 구성요소 - 2. 네트워킹 구성요소

AWS 환경에는 네트워크를 구성하고 보안이나 통신 설정들을 조절할 수 있도록 하는 구성요소들이 있다. 이 포스팅에서는 VPC, 서브넷, 인터넷 게이트웨이, NAT 게이트웨이에 대해 설명하고자 한다. Availability zone (AZ) AWS 는 1차적으로 리전이라는 그룹으로 나누어 지고, 리전 내에는 AZ 라는 영역으로 나누어 진다. 서울 리전을 예로 들어 보자면, 서울 리전 내에는 3개의 AZ 가 있는데, 이 AZ는 실제로 현실에 존재하는 데이터 센터 하나를 의미한다. AWS 가 인터넷 클라우드 서비스이긴 하나 실제로는 거대한 데이터 센터의 컴퓨팅 능력을 떼서 제공하는 것이기 때문에, 현실세계의 서버가 필요하다. 이 데이터 센터 하나가 하나의 AZ 에 대응하게 된다. 이렇게 AZ 를 나누는 이유는..

[Network][AWS] AWS 네트워크 구성요소 - 1. 인터넷 네트워크 기초와 IP 주소 체계

우리는 컴퓨터와 인터넷을 통해 다른 컴퓨터와 채팅이나 게임도 할 수 있고, 여러 기업의 사이트를 접속하기도 하며, 날씨도 본다. 내가 특정 사이트나 다른사람과 연결되고 싶을 때 어디로 연결되어야 되는지 알아야 하는데, 그 '어디'를 나타내는 것이 IP Address 이다. 게임 서버에 접속하려면 그 서버의 IP 주소를 알아야 하고, 다른 사람과 직접 연결되어 파일을 주고받으려고 해도 IP 주소가 필요하다. 채팅을 하기 위해 중간에서 매개 역할을 해주는 서버에 접속하기 위해서도 IP 주소는 필요하다. 이번 챕터에서는 IP 주소가 어떻게 생겨먹었는지, 어떤 종류가 있는지, 어떤 방식으로 이용되는지 알아보도록 하자. IP Address 인터넷에서 기기를 식별하는 IP 주소는 처음에는 32비트로 이루어진 숫자로..

반응형