본문 바로가기

전체 글91

[우아한 티켓팅] 대기열 시스템 10,000명 부하 테스트하기 들어가기에 앞서본 게시글은 우아한 티켓팅 프로젝트의 대기열 시스템 성능 측정에 관한 이야기를 다룹니다. 이전 게시글 [우아한 티켓팅]대기열 시스템 설계하기의 내용을 바탕으로 저희 팀은 Java 자료 구조를 이용한 대기열, Redis를 이용한 대기열을 구현하였습니다. 팀의 목표 중 하나인 10,000명을 견딜 수 있는 대기열 시스템을 검증하기 위해테스트 환경은 어떻게 구성했는지테스트 결과는 어떗는지에 대해 기록을 남기려 합니다.부하 테스트 환경 구성테스트 시나리오테스트 대상 시스템은 대기열 시스템입니다. 다른 기능과 섞어서 성능을 측정하기 보다는 대기열 시스템 자체의 성능만을 측정하기 위해 시나리오는 다음과 같이 구성했습니다.사용자 인증 정보 획득을 위한 사용자 로그인 JWT 토큰 생성티켓팅의 시작점 인 .. 2024. 9. 29.
[우아한 티켓팅] 친절한 대기열 시스템 설계하기 들어가기에 앞서본 게시글은 제가 참여했던 팀 프로젝트 우아한 티켓팅에서 대기열 시스템을 설계했던 이야기를 다룹니다. 상세한 구현보다는 저희가 원하는 대기열을 만들기 위해 했던 다음과 같은 고민들을 남기려 합니다.어디서 아이디어를 얻었는지아이디어를 구현으로 옮기기 위해서 어떤 문제를 해결해야 했는지짝(페어) 프로그래밍을 진행하며 객체 간 협력 구조를 어떻게 설계했는지설계 목표우아한 티켓팅의 대기열 시스템은 새로 고침해도 사용자의 순서를 유지하는 친절한 대기열 시스템을 목표로 합니다.사용자의 실수, 지루함에 의한 새로고침 클릭 정도는 용인해주어 사용자 경험을 향상시킵니다.아이디어현실 세계에서 순서를 유지하는 대기열은 은행이나 식당 대기열에서 찾아볼 수 있었습니다. 예를 들어 은행의 대기 시스템은 다음과 같은.. 2024. 9. 24.
직접 구현한 스텁으로 이상적인 테스트 작성하기 들어가기에 앞서본 게시글은 이상적인 테스트를 작성하기 위해 했던 저의 고민과 결론을 공유하는 것에 목적을 두고 있습니다. Java, Spring 환경에서 테스트를 작성해본 경험이 있는 분들을 대상 독자로 하고 있으며 배경 지식을 위해 테스트 더블에 대해서 먼저 정리합니다. 다만, 저의 고민과 결론에 부족한 부분이 있을 수 있습니다. 부족한 부분은 지적해주시고 너그럽게 봐주시길 부탁드립니다.본 게시글은 우아한테크캠프에서 미니 세미나를 통해 동기 교육생들에게 공유한 내용을 블로그 게시글의 형태로 정리한 것입니다. 이전에 동일한 내용을 가지고 작성했던 게시글이 존재하나 우아한테크캠프의 특강 중 하나인 "테크니컬 라이팅"에서 배운 내용을 적용, 불필요한 내용을 제거하고 퇴고를 거쳐 다시 작성한 게시글입니다. 이.. 2024. 8. 5.
테스트 더블, 목과 스텁 이야기 얼마 전, 우아한테크캠프에 참여하며 미니 세미나를 통해 테스트 더블과 이상적인 단위 테스트를 작성하기 위해 했던 고민을 다른 사람들과 공유하였습니다. 본 게시글을 통해 당시 진행했던 세미나의 내용을 글로써 정리하고 다시 한 번, 이 글을 읽으실 분들과 저의 고민을 공유해보고자 합니다.테스트 더블스턴트 더블이 장면을 보신적이 있나요?이 장면은 미션 임파서블 폴아웃의 오프닝 시퀀스의 장면 일부를 따온 것으로, 톰 크루즈가 이륙하는 실제 비행기에 매달려서 스턴트를 소화하고 있는 모습입니다. 보시는 바와 같이 톰 크루즈는 이런 위험한 스턴트 장면도 대역 없이 직접 소화하는 것으로 유명한 배우입니다. 보통은 실제 배우 대신 스턴트 장면을 대신 촬영할 위한 전담 대역을 두는 것이 일반적입니다. 위 사진은 드웨인 .. 2024. 7. 8.
[MySQL] B-Tree 인덱스 디스크 읽기 방식랜덤 I/O와 순차 I/O랜덤 IO와 순차 IO 모두 하드 디스크 드라이브의 플래터를 돌려 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것은 동일합니다.그러나 순차 IO가 3개의 페이지를 디스크에 기록하기 위해 1번의 시스템 콜을 호출한다면, 랜덤 IO는 3번의 시스템 콜을 호출합니다. 즉, 디스크 헤드를 3번 움직이며 3배의 속도 차이가 발생합니다.쿼리를 튜닝해서 랜덤 IO를 순차 IO로 바꾸는 방법은 많지 않습니다. 쿼리 튜닝의 목적은 랜덤 IO 자체를 줄이는 것이며 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미합니다.인덱스란인덱스란 컬럼의 값과 해당 레코드가 저장된 주소를 키-값 쌍으로 만들어 둔 것을 의미합니다. 컬럼의 값을 기준으로 정렬해서 보관하기 .. 2024. 6. 18.
스프링 @Retry를 이용한 재시도 처리하기 Spring RetrySpring Retry 프로젝트는 스프링 애플리케이션에 대해 명령형 또는 선언적 재시도 처리를 지원합니다. 의존성이를 사용하기 위해서는 다음의 의존성을 추가해주어야 합니다. Spring Retry는 스프링 AOP를 이용하여 선언적 방식을 제공합니다. 따라서 AOP 의존성이 필요하며 다른 스타터 의존성에 AOP 의존성도 포함되어있다면 생략해도 됩니다.implementation 'org.springframework.boot:spring-boot-starter-aop'implementation 'org.springframework.retry:spring-retry'Retryable사용 방식은 간단합니다. 별도의 configuration에 @EnableRetry를 추가한 뒤, 재시도 처리를.. 2024. 6. 12.