10장 11장 작성은 건너뛰었는데, 이 쪽은 세부적으로 포스팅하려고 한다. (DDD, CQRS등)

 

성능 테스트

부하 테스트 (load)

목적: 예상되는 부하에서 시스템이 요구 성능을 만족하는지 확인하기 위한 테스트

  • TPS/RPS
  • p95/p99 latency
  • 에러율

스트레스 테스트 (stress)

목적: 시스템을 한계 이상으로 내몰아 최대 성능을 확인하기 위한 테스트

  • 최대 수용량 확인
  • 붕괴 지점 이후에 어떻게 동작하는가?

지속 부하 테스트 (soak)

목적: 일정 부하를 장시간 유지했을 때 버틸 수 있는지 확인하기 위한 테스트

  • 커넥션/메모리 누수 확인
  • 성능 저하 확인

스파이크 테스트 (spike)

목적: 갑작스런 트래픽 급증에 대해 시스템의 반응성과 안정성 확인하기 위한 테스트

  • 회복력 확인
  • 오토스케일링/레이트 리밋 등 설계 점검

용어

  • 포화점(saturation point): 자원 사용량이 100%에 가까워져, 부하를 증가시켜도 처리량(throughput)이 의미 있게 증가하지 않는 지점 → 성능 한계 지점
  • 버클존(buckle zone): 시스템이 한계를 초과했을 때 급격하게 성능이 악화되는 지점

성능 테스트 설계 시 고려 사항

  • 시스템 트래픽 패턴
  • 동시 요청 사용자 수와 트래픽 규모
  • 기능별 요청 비율
  • 데이터 크기
  • 워밍업(캐시, JVM 등)
  • 적절한 목표치 설정

성능 테스트 도구

  • nGrinder (Groovy/Jython)
  • k6
    • Go로 개발됨 → 고루틴 사용
    • JavaScript로 테스트 스크립트 작성
  • JMeter
  • Locust
  • Gatling

성능 테스트 시 주의 사항

  • 테스트 대상 시스템과 부하기 서버는 분리하기
  • 서버 설정에 제한을 걸고 부하 테스트 실행 (예: Nginx의 limit_req_zone 설정으로 IP당 초당 요청 개수 제한)
  • 스레드 풀 / DB 커넥션 풀 크기 설정
  • 실제 운영 시스템과 테스트 대상 시스템의 네트워크 영역 고려
  • 외부 서비스와 연동된 기능 테스트 시 주의 → 외부 서비스 모킹하기
  • 최대한 실제 운영 환경과 동일하게 구성하기

NoSQL

사용 목적

  • 수평 확장 / 분산 처리
  • 유연한 스키마 / 비정형 데이터 처리
  • 빠른 읽기/쓰기 성능

종류

  • Key-Value DB
    • 단순한 구조로 읽기/쓰기가 매우 빠름
    • DynamoDB
    • Redis
  • Document DB
    • JSON/BSON 같은 문서 단위 저장 ⇒ 복잡하고 중첩 구조의 모델 표현 용이
    • 어플리케이션 객체와 매핑 쉽다
    • MongoDB
    • Couchbase
  • Column-Family DB
    • 하나의 Row 키를 기준으로 여러 개의 Column을 저장할 수 있다. ⇒ 여러 컬럼들을 그룹으로 묶어서 관리한다.
    • Cassandra
    • HBase
  • Graph DB
    • 그래프 형태(Node, Edge)로 관리
    • 연결 / 추천 / 경로 탐색 등에 용이
    • Neo4j

도입 시 고려 사항

  • 트랜잭션 지원 여부
  • 적합한 데이터 모델인지 확인
  • 확장성과 성능

CAP Theorem

  • 일관성(Consistency): 모든 클라이언트가 어떤 노드에 접속하든 항상 동일한 데이터를 본다.
  • 가용성(Availability): 모든 요청은 성공 또는 실패 결과 응답을 받는다.
  • 분할내성(Partition tolerance): 네트워크 장애가 발생해도 시스템은 계속 동작해야 한다.

NoSQL은 분산 시스템을 기반으로 하고 있어 네트워크 분할이 발생한다. ⇒ 분할내성을 기본으로 가져감

따라서 CP나 AP를 우선하는 설계를 한다.

  • AP → 장애/분할 시 일관성을 포기하고 기능을 계속한다. 최종 일관성 허용
  • CP → 장애/분할 시 일부(혹은 전체) 요청을 거부하고 데이터 정합성을 우선한다.