본문 바로가기

전체 글

(18)
[UBLE] 실시간 인기 검색어 순위 구현 프로젝트 중 구현했던 실시간 인기 검색어 조회 기능에 대해 정리해보고자 한다.💡 내용 상세실시간 인기 검색어는 최대 10개를 반환하며, 순위 변동(상승, 하락, 동일, 신규) 정보가 함께 제공된다.실시간 검색어는 검색창 아래에 뜨기 때문에 API 호출 횟수가 매우 많을 것이라 판단하였다. 따라서 1시간마다 스케줄러로 값을 갱신하여 캐싱해둔 후, API 호출 시에는 저장된 값을 바로 꺼내주도록 구현하였다.정각으로 바뀌는 시간의 오류를 예방하기 위해 TTL은 90분으로 설정했으며, 조회 API에서도 hit 여부를 검증하도록 하였다.단기 프로젝트였던 만큼 유저가 많지 않았기 때문에 결과의 품질을 유지하기 위해 최근 3시간 이내의 검색 로그를 기준으로 값을 측정했다.SearchLog는 Elasticsearc..
[UBLE] 다중 서버 환경에서의 스케줄러 동시성 관리 프로젝트를 진행하며 스케줄러의 동시성을 처리해야 하는 문제가 발생했다.그 과정에서 했던 고민 및 구현 내용에 대해 기록해보고자 한다.✨ 구현 내용대부분의 제휴처에서는 월 1회, 일 1회와 같이 기간에 따른 사용 횟수 제한이 존재한다. 특히 사용자로부터 사용 내역을 등록 받고 있기 때문에, 유저가 현재 특정 매장에서 멤버십 혜택을 사용할 수 있는 지 여부를 확인하는 로직이 필요해졌다. 제휴처 별 이용 가능 최대 횟수를 관리하기 위해 brand 테이블에 주기/횟수 필드를 새롭게 추가하였으며, 각 유저별 제휴처 이용 횟수를 관리하기 위해 usage_count 테이블을 새롭게 생성하였다. 또한, 전체 제휴처를 통틀어 vip콕은 월 1회, 우리 동네 멤버십은 일 1회 사용 가능하다는 특수 제한이 존재했기 때문에 ..
[Elasticsearch] API & Query 정리 💡 개요찾아봤던 API & Query 문법 및 예시들 총정리 (계속 업데이트할 예정)Kibana의 dev_tools 사용하면 자동완성 / 명령어 다중 실행 등의 추가 기능 사용할 수 있어서 postman보다 편함✨ INDEX📌 Index 생성// index 생성// PUT /{index_name}PUT /products// mapping 정의// PUT /{index_name}/_mappingsPUT /products/_mappings{ "properties": { "name": { "type": "text" }, "content": { "type": "text" }, "price": { "type": "integer" } }} 두 쿼리를 합쳐서 한번에 요청을 보내는 것도 가능하..
[Elasticsearch] 기본 개념 정리 🔍 Elasticsearch란?Apache Lucene(아파치 루씬) 기반의 Java 오픈소스 분산 검색 엔진처음에는 Full-text search engine으로 개발되었지만, 지금은 보안, 로그 분석, 위치 기반 정보 데이터 분석 등 다양한 분야에서 활용됨자체적으로 사용되기도 하지만, ELK Stack으로 사용되기도 함간단하게 말하자면 받은 데이터에 대해 인덱싱 과정을 거쳐서 검색하기 좋은 형태로 재구성하고, 실제 데이터 조회 시 이를 활용해서 빠른 조회가 가능하게 만들어주는 역할을 수행하는 검색 엔진이다. 최근에는 주로 검색 기능 및 데이터 분석에서 사용되고 있다.🛠️ Elastic Stack (feat.ELK Stack) ELK Stack : Elasticsearch + Logstash + ..
[JUKSOON] QueryDSL로 페이지네이션 구현하기 (Feat. Index 적용기) 프로젝트에서 홈 화면에 띄울 피드들을 조회하는 API를 담당하게 되었다.이를 구현하는 과정에서 페이지네이션과 인덱스에 대해 많이 고민하고 배울 수 있었기 때문에 해당 내용들을 정리해보고자 한다.💡 개발 환경JDK 17Springboot 3.4.5 (Gradle)MySQL 0.8.3 (Local)💡 요구 사항1. 정렬최신순 or 가격낮은순 으로 선택 정렬 가능2. 필터링현재 상태가 OPEN인 것만 보기키워드 기반 검색 (Feed 제목 / 가게 이름으로 검색 가능)선택한 카테고리의 피드만 보기 (한식, 중식, 일식 등)3. 페이지네이션한 페이지에 8개씩 조회 가능해당 API에서는 조회를 위해 고려해야 하는 조건들이 많기 때문에, 정적 쿼리를 사용한다면 모든 경우의 수를 고려하기 위해 총 2 ^ 4 = 1..
[JUKSOON] JDBC를 활용한 Bulk Insert 구현 프로젝트를 진행하던 중 피드의 이미지들을 한 번에 저장하는 로직에서 saveAll()을 사용할 경우 insert 쿼리가 여러 번 나가게 된다는 리뷰를 받았다. 이 문제를 해결하기위해 JDBC를 사용한 Bulk Insert를 구현하게 되었다. 먼저 .save()와 .saveAll()의 차이를 먼저 확인해보자.📌 .save()하나의 엔티티를 저장각 Entity마다 트랜잭션 처리, 영속성 컨텍스트 반영, 쿼리 실행 등이 발생📌 .saveAll()여러 개의 엔티티를 저장엔티티들을 Iterable 형태로 받아 각각 save 처리여러 개를 저장할 경우, 하나의 트랜잭션 내에서 save가 수행되므로 매번 트랜잭션을 여는 .save()보다 빠름 같은 트랜잭션 내에서 여러 persist()가 실행되면, JPA는 여러..
[네트워크] IP (Internet Protocol) 🏠 IP (Internet Protocol)IP란, 인터넷에서 데이터를 어떻게 보내고 받을지를 정해주는 규칙(프로토콜)을 의미한다.그리고 여기서 각 device를 구분하기 위해 사용되는 고유한 주소를 IP 주소라고 한다. 네트워크 계층 (Network Layer, L3) 에서는 src 호스트에서 dst 호스트로 데이터를 전달하기 위해 IP를 사용한다.그러나 IP는 Connectionless (비연결성)이라는 특징을 가지고 있기 때문에 실제로 데이터가 전달되었는지 여부는 신경쓰지 않는다는 한계가 존재한다. 이를 해결하고 신뢰성 있는 IP를 지원하기 위해, 문제 발생 시 이를 src에게 알려주는 ICMP 등을 함께 사용해 IP를 보조하기도 한다.💡 IP의 주요 기능📌 Addressing (주소 지정)i..
[네트워크] TCP & UDP 🔗 전송 계층 (Transport Layer, L4) 에서의 통신전송 계층(Transport Layer, L4)은 서로 다른 호스트(목적지)간의 신뢰가능한 데이터 전달을 담당한다. 해당 계층에서 데이터의 중복/누락을 검사하고, 오류 없이 순서대로 전송되도록 관리함으로써 다른 계층이 데이터의 유효성을 검사하지 않아도 되는 것이다. 데이터 전달 방식으로는 크게 연결형 통신과 비연결형 통신이 있다. # 연결형 통신데이터를 교환하기 전에 연결을 맺고, 데이터를 교환하는 동안 계속 연결을 관리신뢰성 & 정확성이 높은 데이터 전송 시 사용# 비연결형 통신연결에 대한 초기화 과정 없이, 상대를 확인하지 않고 일방적으로 데이터를 전송효율성이 중요한 데이터 전송 시 사용됨 (동영상 등)여기서 TCP가 연결형 통신, U..