2024년 회고https://mopil.tistory.com/entry/2024%EB%85%84-%ED%9A%8C%EA%B3%A0 2024년 회고2023년도 회고https://mopil.tistory.com/174 2023년 회고# 1월 친구들과 해커톤에 참여했다. https://mopil.tistory.com/132 SPARCS 2023 StartUp Hackathon 참여 후기 https://hackathon.sparcs.org/ SPARCS 2023 StartUp Hackathon 우리의 생mopil.tistory.com # 2025년도 목표 달성? 1. 책읽기 (7권) => 책은 몇 권 샀지만 다 읽지 못했다... 실패2. 해외여행 => 가족, 친구 일본여행 성공3. 더 프로답게 일하기 => 목표..
어느 날 어드민 서버에서 Major GC가 발생했다는 소식을 접했다. 그라파나를 확인해 보니 JVM old gen 영역이 끊임없이 우상향 하고 있었다. 서버의 max heap size는 2gb였고 rps 4~5정도 나오는 어드민 서버였는데 old gen이 이렇게 우상향 하고 있다는 것은 어딘가 메모리 누수가 있다는 것을 의미했다. Major GC가 발생해도 힙을 많이 확보하지 못 하고 있어서 바로 힙덤프를 떠봤다. # 힙덤프힙덤프를 뜨면 hprof 확장자 바이너리 파일이 만들어지는데 eclipse MAT나 intelliJ로 이를 열어볼 수 있다.인텔리제이를 사용하고 있어서 그냥 인텔리제이로 열어봤다. 중간에 배포를 해서 많이 차있는 상태에서 관찰하진 못 했지만, hibernate의 QueryPlanCa..
Redis에는 TTL (Time-To-Leave)을 expire 명령어를 통해 설정할 수 있다. 어떤 원리로 이를 가능케 하는지 궁금해서 좀 찾아봤다. 공식 홈페이지 (https://redis.io/docs/latest/commands/expire/#how-redis-expires-keys)에 의하면 Passive way, Active way 2가지 방식으로 동작한다고 한다. Passive Way키에 접근하는 순간 체크해서 만료 처리=> 근데 이러면 접근 안 하면 계속 남아있음. 그래서 추가 보완 방법을 사용 Active Way주기적으로 스케줄링하면서 만료된 키 제거=> 키를 full-scan 하면 메모리 부하가 올 수 있으니 그러지 않고 샘플링해서 제거함 즉, 접근 시 체크 후 삭제 (Lazy Del..
오늘은 내부 임직원이 사용하는 어드민 제품의 목록조회 기능을 평균 5~8초에서 100ms 미만 응답속도를 가지도록 성능 개선한 이야기를 공유해볼까 한다. 이야기에 앞서, 먼저 해당 제품으로 이뤄지는 업무 절차에 대해 간략히 소개해보겠다. 계좌를 만들기 위해서 고객의 정보를 확인해야 하는 절차가 있다. 그 절차 중 일부 고객은 어드민에서 승인을 해야 계좌를 개설할 수 있는 경우가 있다. 이번 개선기는 계좌개설 과정에서 승인이 필요한 대상들을 불러오는 목록 리스트 성능 개선 이야기이다. 이 업무를 앞으로 '검토 업무'라고 부르겠다. 검토업무는 고객의 계좌개설 대기 시간을 최소화하기 위해 빠르게 검토가 이뤄져야 한다. 검토가 필요하게 되면 검토건이 생성되고, 검토건은 검토대기, 검토 중, 검토완료 3가지 상..
2023년도 회고https://mopil.tistory.com/174 2023년 회고# 1월 친구들과 해커톤에 참여했다. https://mopil.tistory.com/132 SPARCS 2023 StartUp Hackathon 참여 후기 https://hackathon.sparcs.org/ SPARCS 2023 StartUp Hackathon 우리의 생각이 한계까지 함께하는 곳, SPARCS 2023 StartUp Hackmopil.tistory.com # 2023년도 목표 달성술술 사이드 프로젝트 출시 (3월 목표)7월 출시 완료 새로운 사이드 프로젝트...?청년모아 mini 사이드 프로젝트 합류컨퍼런스, 해커톤 1회 이상 씩 참여하기여럿 시도했지만 결국 둘 다 미달성오픈소스 기여 1회 이상 해보기미..
# Rate Limit이란?일정 시간 동안 호출될 수 있는 API 횟수를 제한하는 걸 말한다. 예를 들어 파일 업로드는 10분에 최대 3번만 가능 이런 걸 구현할 때 사용하는 개념이다. 자세한 건 아래글 참조https://gngsn.tistory.com/224 Rate Limiter, 제대로 이해하기Rate limiter의 역할과 강단점을 살펴보고, 구현 알고리즘 5가지를 이해하는 것이 해당 포스팅의 목표입니다. 본 포스팅의 모든 그림은 필자가 직접 그린 것으로 무단 사용을 금하며, 사용 시 출처gngsn.tistory.com 이번 글에서는 로컬 캐시 라이브러리로 유명한 Caffeine으로 Rate Limiter 기능을 구현해 볼 것이다. # 왜 Caffeine인가?Spring Cloud Gateway..
JPA 영속성 컨텍스트가 제공하는 기능 중 하나인 '1차 캐싱' 기능을 눈으로 직접 확인해 보자 @Serviceclass FirstService( private val userRepository: UserRepository,) { @Transactional fun callFirst() { var user = userRepository.findById(1).get() println("first call user = $user") user = userRepository.findById(1).get() println("second call user = $user") user = userRepository.findById(1).ge..