본문 바로가기

개발 이야기/ETC

(6)
성능 테스트, 부하 테스트, 스트레스 테스트란? 얼마 전 회사에서 만든 gRPC 서비스의 성능 테스트를 진행했다. 이유는 현재 시스템 상태에서 특정 조건의 DB 데이터를 count 하는 기능이 있었는데, count 쿼리 특성 상 DB 데이터가 많아지면 많아질수록 쿼리 속도가 선형적으로 증가하기 때문이다. (이런 경우는 Index로 해결되지 않는다.) 이런 경우에는 Workaround로 현재 DB 환경에서 count 의 쿼리가 데이터 양이 어느 정도의 수준까지 먼저 허용될지 확인하는 것이 중요하다. 그리고 해당 데이터가 적재되기 전까지 적절한 방법을 고민해서 시스템 업데이트를 해야한다. 아무튼 성능 테스트를 진행하면서 테스트 관련된 용어가 조금 헷갈렸는데, 그 이유는 평소 성능 테스트와 부하 테스트 용어를 별 생각없이 비슷한 개념으로 섞어서 사용했기 때..
Gradle Wrapper란? Gradle 빌드에 권장되는 사용 방법은 Gradle Wrapper를 사용하는 것이다. Wrapper는 미리 선언된 버전의 Gradle을 호출하고, 필요한 경우 미리 다운로드한다. Java 프로젝트를 CI 환경에서 빌드할 때 CI 환경을 프로젝트 빌드 환경과 매번 맞춰줄 필요가 없는 이유가 바로 Gradle Wrapper를 사용하기 때문이다. 즉, 환경에 종속되지 않고 프로젝트를 빌드할 수 있는데 이런 점이 Gradle이 가진 강력한 특징중 하나이다. gradle wrapper 명령어를 실행하면 아래처럼 파일들이 생성된다. $ gradle wrapper BUILD SUCCESSFUL in 545ms 1 actionable task: 1 executed $ tree . ├── gradle │ └── wra..
임의(Arbitrary)값과 무작위(Random)값은 어떻게 다를까? 각각 Arbitrary는 '임의의'라는 Random은 '무작위'라는 사전적인 의미를 지니고 있다. 일상생활에서 두 단어는 보통 구별없이 사용해도 큰 무리가 되지 않는다. 하지만 컴퓨터과학이나 수학 영역에서는 이 두 단어의 미묘한 차이는 결코 작지 않다. 임의(Arbitrary) Arbitrary는 any의 의미를 가진다. 대상이 되는 것들 중에서 무엇을 선택해도 아무런 상관이 없다는 뜻이다. 무엇을 선택하더라도 선택에 따른 비용은 동일하다. 예를 들어 1부터 100까지의 숫자 중에서 1개를 선택하는 경우, 그냥 선택하는 행위 자체가 중요하다. 즉, 무엇을 선택해도 상관없으며 실제 선택의 행위로 인한 비용도 동일하다. 보통 여러 가지 경우의 수를 통해서 무언가를 테스트하는 경우 임의 값을 통해서 검증하는 ..
[기타] 병행(Concurrency)과 병렬(Parallelism)의 차이에 대해서 흔히 병행(Concurrency)과 병렬(Parallel)에 대해서 이야기를 할 때 헷갈리는 경우가 많다. 심지어 단어 자체도 비슷한데 의미도 비슷하니 더 헷갈리는 것 같다. 병행과 병렬은 흔히 하나의 물리적인 공간(컴퓨터, 서버)에서 여러 가지 일을 동시간대에 함께 처리하기 위한 기법을 이야기할 때 사용한다. 일단 하나씩 의미를 정리해보자. 병행(Concurrency) 병행이란 소프트웨어적인 의미를 가지고 있다. 모든 소프트웨어 프로그램은 컴퓨터에서 동작하면서 작업을 수행할 때 결국은 CPU 연산 과정을 거치게 되는데, 만약 CPU를 하나의 프로세스가 점유하고 있다면 다른 프로세스들은 작업을 수행할 수 없다. 따라서 이런 물리적인 상황을 극복하기 위해서 소프트웨어적으로 작업을 번갈아가며 수행하게 함으로..
[기타] Retry 전략에 대해서(Exponential Backoff, Jitter) 최근 각광받는 MSA 구조, 분산 시스템 구조에서 서버간 네트워크 통신은 매우 중요하다. 특히 네트워크를 통한 API 호출은 언제 어떻게 실패할지 예측하기 어렵기 때문에 이를 감시할 수 있는 모니터링 기술도 매우 중요하게 평가받고 있다. Datadog 같은 기업의 클라우드 환경 솔루션도 이런 분산 시스템 모니터링과 실시간 오류, 성능 분석을 위한 사용자의 니즈를 기반으로 급속하게 성장하고 있는 중이다. Retry는 똑똑해야 한다. 이런 분산 시스템에서 서버와 서버간 API 호출 실패에 대한 재시도는 매우 중요한 행위이다. 1번의 네트워크 호출 실패로 서비스의 비지니스 로직을 모두 실패처리하거나 fallback 처리하는 것은 몇 번 다시 호출하는 것보다 큰 리소스 낭비가 될 수 있기 때문이다. 따라서 보통..
[기타] 개발 환경(Phase)이란 무엇일까? 개발 환경(Phase)란? 개발 환경(Phase)은 Application이 동작하는 환경을 의미한다. 따라서 대부분의 Framework는 각각의 개발 환경마다 설정 값을 다르게 셋팅할 수 있는 기능이 있다. 대표적으로 Spring Boot의 경우는 Profile 기능이다. 개발 환경(Phase)을 분리하는 이유? 제품을 개발할 때는 Application을 바로 운영 환경에 배포하지 않는다. 아마도 먼저 개발하고 있는 local에서 Application을 실행해보면서 디버깅이나 테스트를 진행하고, 실제 운영 환경과 비슷한 시스템이 갖춰진 Develop 환경이나 Beta, RC 환경에 순차적으로 배포하면서 테스트 과정을 거칠 것이다. 사실 개발 환경(Phase)은 회사나 팀에 따라 레벨이 조금씩 달라질 수 ..