목록분류 전체보기 (74)
che01 님의 블로그
문제 상황실시간 검색어 수집 시스템을 구현하면서 다음과 같은 비동기 처리 플로우가 필요했다:Redis ZSet에서 검색어 점수 증가 (zincrby)전체 검색어 랭킹 조회 (zrevrangeWithScores)결과를 Map 형태로 변환DB에 저장 및 캐시 초기화Spring의 RedisTemplate은 동기 API만 제공하여 비동기/논블로킹 처리가 불가능했다.해결책: Lettuce RedisAsyncCommandsRedisTemplate vs RedisAsyncCommands 비교특징 RedisTemplate RedisAsyncCommands처리 방식동기 (Blocking)비동기 (Non-blocking)반환 타입직접 결과CompletableFuture성능스레드 블로킹높은 처리량콜백 체이닝불가능thenAp..

개요Spring Boot 애플리케이션에서 Redis Sorted Set을 활용하여 실시간 검색어 수집 및 인기 검색어 관리 시스템을 구현했다. 학습을 위해 AOP로 구현했지만 보통 검색어 수집은 이런 방식으로 구현하지 않는다 횡단 관심사가 일단 아니기 때문이고 요청을 가로체는 부분은 비동기 처리가 안돼기 때문에 검색 성능에 영향을 준다.시스템 아키텍처핵심 구성 요소AOP 기반 검색어 수집: @CollectSearchKeyword 어노테이션으로 자동 수집Redis Sorted Set: 실시간 검색어 카운팅 및 랭킹 관리비동기 처리: 사용자 응답 시간에 영향 없는 백그라운드 처리배치 동기화: 주기적으로 Redis 데이터를 DB에 영속화프로세스 상세 흐름기술적 특징Redis Sorted Set 활용ZINCRB..
개요Redis Java 클라이언트 라이브러리인 Lettuce와 Jedis의 주요 차이점과 특징을 비교 분석기본 특징Lettuce비동기, 논블로킹 I/O 기반Netty 프레임워크 사용Spring Boot 2.0부터 기본 Redis 클라이언트로 채택반응형 프로그래밍 지원 (Reactive Streams)Jedis동기, 블로킹 I/O 기반직접적인 소켓 연결 사용오랜 기간 사용되어온 안정적인 라이브러리단순하고 직관적인 API성능 비교연결 관리Lettuce: 단일 연결을 여러 스레드가 공유 가능. 연결 풀링이 선택사항 Jedis: 스레드 안전하지 않아 연결 풀링 필수. 각 스레드마다 별도 연결 필요처리량Lettuce: 높은 동시성 처리 가능. 단일 연결로도 높은 성능 Jedis: 연결 풀 크기에 따라 성능 결정...
@EnableScheduling 애너테이션의 역할@EnableScheduling을 설정 클래스에 추가하면 Spring은 내부적으로 스케줄링 관련 인프라를 자동으로 구성한다.@SpringBootApplication@EnableSchedulingpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}내부 동작 메커니즘1. ScheduledExecutorService 등록Spring은 @EnableScheduling이 활성화되면 ScheduledExecutorService를 빈으로 등록한다. 기본적으로 단일 스레드 풀을 사용하는 Th..
1. 인덱스(Index)란?인덱스는 데이터베이스에서 검색 성능을 향상시키기 위한 자료구조입니다. 책의 목차처럼 데이터의 위치를 빠르게 찾을 수 있도록 도와줍니다. 인덱스 없이는 테이블 전체를 순차적으로 탐색해야 하므로 데이터가 많을수록 성능이 급격히 저하됩니다.2. 인덱스가 필요한 상황다음과 같은 경우에 인덱스를 고려해야 합니다:WHERE 절에서 자주 사용되는 컬럼ORDER BY로 정렬하는 컬럼JOIN 조건에 사용되는 컬럼범위 검색이 빈번한 컬럼3. B-Tree 구조대부분의 데이터베이스에서 인덱스는 B-Tree 구조로 구현됩니다. B-Tree는 다음과 같은 특징을 가집니다:모든 리프 노드가 같은 깊이를 유지하는 균형 트리키가 정렬된 상태로 저장되어 빠른 탐색 가능시간 복잡도 O(log n)으로 효율적인 ..

@Async 기본 개념@Async는 Spring이 제공하는 비동기 처리 기능입니다. 메서드에 이 어노테이션을 붙이면 해당 메서드는 별도의 스레드에서 실행되어 메인 흐름과 병렬로 작업을 수행할 수 있습니다. 프록시 기반 동작 원리프록시 생성 과정Spring은 @Async가 붙은 메서드를 감싸기 위해 프록시 객체를 생성합니다.프록시로 교체되는 시점은 Spring 애플리케이션 시작 시 Bean 생성 시점입니다. Spring이 @Async, @Transactional 등 AOP 대상 어노테이션을 감지하여 자동으로 프록시를 생성하고 Spring 컨테이너에 등록합니다.실제 실행 과정keywordService.collect(keyword); // 진짜 객체가 아닌 프록시가 호출됨실제 실행 흐름:1. keywordSe..
기본 메타문자패턴 설명 예시 매칭 결과.임의의 한 문자 (개행문자 제외)a.bacb, arb, a3b*앞 문자가 0개 이상 반복bo*b, bo, boo, booo+앞 문자가 1개 이상 반복go+glegogle, google, gooogle?앞 문자가 0개 또는 1개colou?rcolor, colour문자 클래스패턴 설명 예시 매칭 결과\d숫자 (0~9)\d+123, 45, 7890\D숫자가 아닌 문자\D+abc, Hello\w단어 문자 (영문, 숫자, _)\w+abc123, word_1\W단어 문자가 아닌 문자\W+!@#, ***\s공백 문자 (스페이스, 탭, 개행)\s+공백, 탭, 개행\S공백이 아닌 문자\S+Hello, 123위치 지정자패턴 설명 예시 매칭 결과^문자열의 시작^Hello"Hello"로..

1. 프로젝트 폴더 생성 및 Git 초기화먼저 터미널을 열고, 프로젝트를 저장할 디렉토리로 이동한 후 Git 버전 관리를 시작합니다.git init해당 폴더가 Git으로 관리되기 시작합니다.2. 변경 사항 추적 및 커밋 저장모든 변경사항 추적git add .특정 파일만 추적git add 파일명변경사항 저장 (커밋)git commit -m "변경사항에 대한 간단한 설명"3. 원격 저장소(GitHub) 연결 및 업로드https://github.com 접속 → 로그인 후 New Repository 생성Repository 주소 복사터미널에서 아래 명령어 입력git remote add origin https://github.com/사용자명/저장소명.gitGitHub에 처음 업로드git push -u origin ..
Level 1 트러블슈팅1. @Transactional(readOnly = true)에서 insert 발생 시 예외 해결문제 상황 서비스 클래스에 @Transactional(readOnly = true)가 설정되어 있는 상태에서 데이터 삽입을 시도했을 때 Connection is read-only 예외가 발생했습니다.원인: 읽기 전용 트랜잭션에서는 데이터 변경 작업이 허용되지 않습니다.해결 방법: 데이터 변경이 필요한 메서드에 @Transactional(readOnly = false) 명시적으로 설정하여 메서드 레벨에서 오버라이드했습니다.2. User 엔티티에 nickname 컬럼 추가 및 JWT 토큰 처리문제 상황 기존 JWT 토큰에는 userId만 포함되어 있어 매번 사용자 정보를 조회해야 했습니다...
AWS란 무엇인가?AWS(Amazon Web Services)는 아마존에서 제공하는 클라우드 컴퓨팅 서비스입니다. 쉽게 말해 인터넷을 통해 서버, 데이터베이스, 파일 저장소 등을 빌려 쓸 수 있는 서비스입니다.기존 방식 vs 클라우드 방식기존 방식 (온프레미스)물리적 서버를 직접 구매하고 설치높은 초기 비용과 유지보수 부담용량 증설 시 추가 서버 구매 필요클라우드 방식 (AWS)필요한 만큼만 빌려서 사용사용한 만큼만 요금 지불클릭 몇 번으로 용량 증설 가능핵심 서비스 이해하기EC2 (Elastic Compute Cloud)컴퓨터 한 대를 통째로 빌리는 서비스입니다. 이 컴퓨터에 여러분의 웹사이트나 애플리케이션을 설치해서 운영할 수 있습니다.실제 활용 예시:블로그 웹사이트 호스팅게임 서버 운영API 서버 ..