1. 개요JPA를 사용할 때, 지연 로딩과 같은 기능을 무분별하게 사용하다보면 의도 하지 않은 수많은 쿼리가 나가는 경우가 많다. 흔히 이런 문제를 N+1 문제라고 한다. 이렇듯 ORM을 사용하다보면 예상치 못한 개수의 쿼리가 발생하기도 하는데, 이를 한눈에 파악하기는 쉽지 않다. 로그에 쿼리가 출력되긴 하지만 하나하나 세고 있자니 생산성이 너무 떨어진다. 방법이 없을까 찾아보다 쿼리 카운터에 대해 알게됐다. 대표적인, 또 쉽게 구현할 수 있는 방법은 Hibernate에서 쿼리문을 가로챌 수 있는 StatementInspector를 사용하는 것이다. 다른 방법으론 Spring AOP를 활용하는 것이다. 두 가지 방법을 하나하나 알아보려 한다. 결론부터 얘기하자면 나는 Spring AOP를 활용한 ..
1. 개요여러 리펙토링을 거치면서 성능 개선을 해나가던 중, 성능을 수치화할 필요성을 느꼈다. 성능 테스트, 부하 테스트, 스트레스 테스트는 시스템의 성능과 안정성을 평가하는 중요한 도구들이다. 각 테스트의 정의와 목적, 그리고 이를 통해 얻을 수 있는 이점에 대해 알아보고자 한다. 2. 성능 테스트 (Performance Test)성능 테스트는 특정 상황에서 시스템의 구성 요소가 어떻게 수행되는지 확인하기 위해 수행되는 테스트이다. 성능 테스트를 통해 시스템의 자원의 사용량, 확장성, 신뢰성 등을 검증할 수 있다. 일반적으로 개발을 하면서 부하 테스트와 스트레스 테스트 등의 키워드를 많이 접해봤을 것이다. 아래의 사진을 보면 해당 테스트들은 모두 성능 테스트 하위에 있는 것을 알 수 있다. 그만..
1. 개요로그 수집을 하기 위한 솔루션이라고 하면 당연히 ELK(Elasticsearch, Logstash, Kibana)를 떠올릴 수 있다. 하지만 무거운 ELK를 감당하기엔 서버 스펙이 낮았고, 비교적 가볍게 실행할 수 있는 PromTail, Loki, Grafana를 도입하게 되었다. 또한 메트릭 수집은 Prometheus, Grafana로 이미 진행하고 있었기 때문에 도입의 근거는 더욱 명확했다. 어쩌다보니 로그 수집 환경 구축만 3번째이다. Cloud Watch, ELK, Loki.. 2. Grafana & Promtail & Loki 설치 Grafana는 오픈 소스로 제공되는 대시보드 및 시각화 플랫폼이다. 그라파나는 다양한 데이터소스로부터 데이터를 가져와서 대시보드와 그래프 ..
1. Lambda 도입 이유만약 50X50 사이즈의 이미지를 로딩하는데 10MB 짜리 400X400 사이즈의 이미지를 이용한다면 리소스 낭비가 심하다. 위와 같은 경우가 한 개가 아니라 여러 개일 경우 사용자가 체감하는 응답 시간은 꽤 클 것이다. 이를 해결하기 위해 리사이징(RTesizing)기술을 사용하여 이미지 용량을 줄임으로써 속도를 빠르게하는 방법론은 이미 많은 사람들이 사용하고있다. 하지만 이미지 리사이징 작업 같은 경우 CPU와 메모리를 많이 사용하기 때문에 로컬 서버에서 작업을 돌려버리면 다른 사용자의 요청을 못받는 현상이 생길수 있다. 그렇다고 따로 이미지 리사이징 전용 로컬 서버를 만들어 올린다 해도, 모든 사용자가 항상 이미지 리사이징 작업 기능을 이용하는 것도 아니기에 서버를 계..
1. 개요진행중인 프로젝트에서 현재 사용자가 보고 있는 지도 화면에 일자리를 띄워주는 기능을 개발하게됐다. 에어비엔비 같은 숙박 업소, 네이버 부동산같은 부동산 플랫폼에서도 쉽게 볼 수 있는 기능이다. 우리 서비스에도 이와 비슷한 기능이 있고, 아래는 개발 중인 서비스의 초안 디자인이다. 각 일자리 모집 공고에는 이미 위도, 경도 데이터를 함께 갖고 있다.따라서 현재 클라이언트가 보고 있는 지도의 북동쪽, 남서쪽 위도, 경도를 파라미터로 받은 후 쿼리를 날려 조회해 올 생각이다. 사실 학습이 꽤나 필요하거나, 정리할 게 있는 경우에만 포스터를 작성하는 편인데 이번엔 구글링 했을 때 자료가 너무 없어서 처음 하시는 분들이게 조금이나마 도움이 되고자 쓰고있다. 2. 카카오 Map Key 발..
Repeat스프링 배치는 특정 조건이 충족될 때까지 Job 또는 Step을 반복하도록 배치 애플리케이션을 구성할 수 있다. 스프링 배치에선 Step과 Chunk의 반복을 RepeateOperation을 사용해 처리하고 있다.기본 구현체론 RepeatTemplate을 제공한다. Step은 RepeatTemplate을 사용해 Tasklet을 반복적으로 실행한다. ChunkOrientedTasklet은 내부적으로 ChunkProvider를 통해 ItemReader로 데이터를 읽어올 것을 지시한다. ChunkProvider는 내부적으로 RepeatTemplate을 갖고 있고 이를 이용해 반복적으로 ItemReader에게 반복적으로 데이터를 읽어오도록 처리한다. FaultTolerant스프링 배치는 Jo..