웹소켓 연결 후 N초에 한 번씩 유저의 위치 정보를 저장하면서 실시간으로 주변 사람들의 위치를 파악하는 서비스를 개발하였는데, N초마다 유저의 위치 정보를 저장하기 위해서 쿼리를 저장해야하는 상황으로 다양한 유저의 요청을 처리하기에는 힘들다고 생각하여 어떻게 하면 최적화를 할 수 있을지 고민해봤다.

위 코드를 설명하자면 N 초마다 클라이언트의 요청을 받고 location 이라는 객체를 생성해 위도,경도, 타임스탬프를 만든 후 locationRepository 에 저장하는 방식이다. 해당 방식으로 구현하니

위와 같은 쿼리문이 계속 날라가는 것을 볼 수 있다.
이렇게 날라간다면 서버가 버틸 수 있을지 의문이 들어 Jmeter 를 통해 부하테스트를 진행해봤다.


1명의 유저가 초당 10000번씩 호출을 10번 한다고 했을 때 모두 실행했을 때 무려 4분이란 시간이 나오는 것을 볼 수 있다.
실제 서비스에서 많은 유저들이 요청을 보낸다고 하면 코드가 제대로 작동하지 않을 것 같아 개선이 필요하다고 느꼈다.
위치 정보를 통신 없이 빠르게 저장하기 위해서는 In-Memory DB가 적당하다고 생각해
가장 접근이 쉬운 Redis 를 사용해 해당 기능을 개선하기로 했다.


우선 위치 데이터를 String format 으로 변환 후 Redis 에 저장한 후 만약 한 유저의 작업이 모두 끝나게 되면 여태까지 저장해왔던 유저의 위치 정보를 한 번에 BulkInsert 하는 식으로 구현하였다.
Jmeter 를 통해 성능을 측정해 보았더니

4.0/min 에서 10.1/sec 까지 성능을 개선한 것을 볼 수 있다.