참고 자료 Kafka Producer Internal 실전 카프카 개발부터 운영까지 - 프로듀서 내부 동작 원리 토리맘의 한글라이즈 - Producer Config Kafka Consumer Internal 실전 카프카 개발부터 운영까지 - 컨슈머 내부 동작 원리 ...
수위키 - Caffeine Cache를 활용하여 홈 API 응답시간 개선 과정
참고자료 CaffeineCache-1 CaffeineCache-2 eTag Caffeine Cache를 활용하여 홈 API 응답시간 개선 왜 홈 API에 캐시를 적용했는가? 사용자들의 빈번한 CS로 홈 화면의 로딩이 느리게 된다는 점을 제보받았다. 클라이언트와 서버 측 모두 개선할 여지가 있는 부분이기 때문에 이를 개선해보고자 했다. ...
수위키 - 운영 중인 프로덕션의 테스트 환경 개선에 관하여 (+테스트 대역)
테스트 환경을 개선하여 테스트 코드 작성으로 발생할 생산성 저하 문제 개선 기존에는 테스트 환경이 전혀 마련되어있지 않고 Postman으로 일일히 E2E테스트를 하는게 전부였다. 때문에 실제 프로덕트에서 예상치 못한 버그가 발생한 경우가 조금씩 나오게 되면서 테스트 프레임워크를 활용한 자동화된 테스트 환경을 도입하기로 했다. 그런데, 이미 발생한...
수위키 - 사용자 인증 방식에 관하여 (Session vs Token)
JWT를 활용한 토큰 기반 인증 vs 세션 기반 인증 사용자 인증을 수행하기 위해 크게 토큰 기반, 세션 기반 두 방법이있다. 둘 중 어떤 방법을 택할 것인지 결정하기 위해 각 장단점을 비교해봤다. JWT를 활용한 토큰 기반 인증 방식 장/단점 장점 1. 확장성과 분산화 JWT는 토큰을 생성하고 검증하는 키를 기반으로...
수위키 - 비관적 락을 활용한 동시성 문제 해결 과정
강의평가 작성 시 비관적 락을 활용한 동시성 문제를 해결 문제 상황 A라는 강의 레코드에 X, Y 가 각각 값을 올리고 내리는 요청이 동시에 발생했다. 레코드의 값을 증가시키기위 위해 SELECT 하는 구문과, 값을 감소시키기 위해 SELECT 하는 구문이 동시에 발생했고 커밋되는 시점이 달라 값을 증가시킨 요청이 커밋되었음에도 값을 감소시키는...
수고 - @Async 애노테이션과 비동기 처리 시 주의점
문제 상황 클라이언트에 푸쉬 알림을 전송하기 위해 FCM 서버에 요청하는 로직을 추가했더니 아래와 같이 658ms가 소요되는 현상이 발생했다. 이 메서드를 추가하기 전에는 100ms도 넘지 않았던 응답시간이 저렇게 급격하게 늘어나니 클라이언트단에서도 응답을 기다리느라 사용자 경험을 해치는 상황이 발생하게 되었다. 어떻게 속도를 빠르게 할 ...
숏스 - 150만건이 담긴 Table내 BETWEEN 조건 질의시 성능 개선 과정
문제 상황 현재 레코드 수는 아래 그림과 같이 약 150만개 이고, 매 1시간마다 800 ~ 1200개의 레코드가 추가되는 테이블을 사용하고 있다. 위 요구사항을 해결하기 위한 로직을 처리하는데 아래와 같이 12초 ~ 13초의 시간이 소요되어 이를 개선하고자 한다. 해결 과정 우선 슬로우 쿼리가 발생하는 이유를 찾기 위해 실행 계획을...
숏스 - 사용자 인증/인가 관심사 분리 문제 해결 과정, Thread Local 톺아보기와 적용
사용자 인증/인가 관심사 분리 문제 해결 과정 왜 이런 과정이 필요했는지? 기존 코드에는 특정 API 컨트롤러마다 사용자 인증 정보를 가져오는 로직이 반복되고있었다. 컨트롤러에서 이에 대한 관심사를 해결하는 것 보다는 이를 분리하는게 더 역할에 맞다고 생각해서 이를 분리하기로 했다. 구체적으로 어떻게 구현한건지? HTTP Connectio...
숏스 - 형태소 분석기 키워드 추출 로직 구현 과정
1. 키워드 추출에 관한 기술 조사 Jsoup Lucene Lucene Korean Analyze Komoran 후보 1. Lucene Korean Analyzer -Lucene Nori Korean Analyze Jsoup을 활용하여 뉴스 크롤링 News 저장 Lucene의 Analyzer를 활용하여 키워드 ...
숏스 - DB Connection 부족 문제와 OOM 문제 해결 과정에 관하여
1. 코드 전문 및 발생했던 문제점 @Component class CrawlerBase { internal fun extractMoreHeadLineLinks(url: String, categoryName: CategoryName): Elements { return Jsoup.connect(url).get() ...