목록분류 전체보기 (78)
Spring WebFlux는 비동기 및 논블로킹 웹 애플리케이션을 개발하는 데 유용한 프레임워크이다. WebFlux는 Reactive Programming을 기반으로 하며, Mono와 Flux를 사용하여 비동기적으로 데이터를 처리할 수 있다. 이번 글에서는 Spring WebFlux와 Spring MVC의 차이점, Mono와 Flux의 활용 방법에 대해 정리해본다.1. Spring MVC와 Spring WebFluxSpring MVC란?Spring MVC는 Model-View-Controller 패턴을 따르는 전통적인 동기식 웹 애플리케이션 프레임워크이다. 클라이언트의 요청이 들어오면, 요청을 처리하는 컨트롤러가 동기적으로 응답을 반환한다. 요청을 처리하는 동안 스레드가 차단되며, 한 번에 하나의 요청만..
DB Indexing 기초 개념1. 인덱스의 개념인덱스는 테이블의 특정 컬럼 값을 빠르게 찾을 수 있도록 돕는 자료구조다.전체 테이블을 순회하는 풀 테이블 스캔 대신, B-Tree나 해시 테이블 구조를 통해 원하는 행(row)에 효율적으로 접근할 수 있다.2. 인덱스의 특징조회 성능 향상WHERE, JOIN, ORDER BY, GROUP BY 등에 걸린 조건을 만족하는 레코드를 빠르게 찾는다.쓰기 비용 증가INSERT/UPDATE/DELETE 시 인덱스도 함께 갱신해야 하므로 쓰기 성능이 떨어질 수 있다.추가 디스크 공간 사용인덱스는 추가적인 저장 공간을 필요로 하므로, 과도하게 생성하면 디스크 자원을 낭비한다.통계 기반 최적화MySQL 옵티마이저는 테이블 및 인덱스 통계 정보를 활용해 최적의 실행 계획..

코루틴을 사용하는 테스트에서는 더욱 필수적이다.Kotlin + Kotest로 테스트를 작성할 때,IsolationMode.InstancePerTest와 clearAllMocks()를 함께 사용하는 경우를 자주 볼 수 있다.특히 코루틴을 사용하는 테스트라면, 이 설정은 선택이 아니라 필수에 가깝다.이번 글에서는 이 둘을 왜 사용하는지, 어떤 문제가 방지되는지, 그리고 구체적인 예시까지 정리해본다.FunSpec이란?Kotest는 다양한 테스트 스타일을 지원하는데,그중 FunSpec은 자연어처럼 테스트를 작성할 수 있는 스타일이다. class ExampleTest : FunSpec({ test("설명 문장처럼 테스트를 작성할 수 있다") { // 테스트 코드 }})테스트 코드 예시아래 ..

1단계: 문제 이해 및 설계 범위 확정푸시 알림, SMS, 이메일 등 다양한 채널을 모두 지원해야 한다.실시간성을 유지하되 피크 시에는 약간의 지연을 허용하는 연성 실시간(soft real‑time) 시스템이어야 한다.사용자가 각 채널별 알림 설정을 켜고 끌 수 있도록 옵션을 제공해야 한다.하루 평균 1,000만 건의 푸시, 100만 건의 SMS, 500만 건의 이메일 처리량을 목표로 삼아야 한다.2단계: 개략적 설계안 제시2.1 알림 유형별 전송 경로iOS 푸시: 서비스 → APNS → iOS 단말 토큰에 전달한다. (모바일.. 해볼일이 있으려나..)Android 푸시: FCM(Firebase Cloud Messaging)을 통해 Android 단말에 전달한다.SMS: 통신사(SKT, KT, LGU+)..

1. 웹 크롤러의 정의 및 주요 용도웹 크롤러(로봇 또는 스파이더)는 웹 상의 새로운 콘텐츠를 찾아 수집하는 시스템으로, 주된 활용 사례는 다음과 같다. 검색 엔진 인덱싱: Googlebot처럼 수집한 페이지를 검색 색인으로 구축 웹 아카이빙: 장기 보관용 정보 수집 웹 마이닝: 데이터 마이닝을 통한 지식 추출웹 모니터링: 저작권·상표권 침해 감시 2. 문제 이해 및 설계 범위 확정기본 알고리즘은 “시드 URL → 페이지 다운로드 → 링크 추출 → 반복”이지만,대규모 크롤러 설계 전에는 다음과 같은 질문을 통해 요구사항을 명확히 해야 한다:크롤러의 주된 용도는? (예: 검색 인덱스 생성)월간 수집 페이지 수는? (예: 10억 페이지)신규·변경 페이지도 재수집할 것인가?수집한 페이지 보관 기간은? (예: ..

File에 권한 체계를 적용하는데 사용한 closure table을 소개하고, 적용한 사례를 소개합니다. 파일 구조를 만들면서 가장 걱정되었던 부분은 어떻게 authority를 적용시키느냐 였습니다. 파일 구조는 태생적으로 계층구조를 띄게 되고, 상위 파일의 권한에 영향을 받을 수 밖에 없으니까요.RDB는 이런 계층 구조를 나타내기에 적합하지 않기도 해서 다양한 방법들을 고민했습니다.RDBMS에서 tree structure 다루기여기서 parent-child 기법을 사용해서 파일 시스템을 구성했는데… 문제는 다음과 같았습니다.폴더 아래에 파일이 있습니다. 사용자는 폴더에 대해 update 권한을, 파일에 대해 read 권한을 가지고 있습니다.이런 경우 사용자는 파일에 대해서도 update를 할 수 있어야..

Graph DB를 사용하는 방법 도 있지만, RDBMS가 일반적으로 사용되기 때문에 여러 가지 이론들이 나와있습니다.크게 3가지에 대해 다루어 봅니다.Parent-ChildNested SetsMaterialized PathPatenet-Child (Adjacency list)가장 직관적으로 생각 할 수 있는 구조로, 자식이 부모의 기본키를 가지도록 하는 전략이다.적용, 활용이 가장 쉽지만, 성능면에서 가장 비효율적인 방법이다. 데이터 삽입/편집자식엔티티가 부모 엔티티의 PK를 들고 있으면 되기에 가장 쉽다. 데이터 selection특정 데이터를 검색하기 매우 어렵다. 계층이 내려갈 때마다 쿼리를 계속 날려야 하기 때문이다.따라서 데이터 검색을 위해 SQL를 자주 날려줘야 하는 단점이 있다. 데이터 삭제부..

카프카? 그게 뭔데!카프카는 실시간으로 스트리밍 데이터를 처리하는데 최적화된 분산 데이터 스토어입니다.즉, 연속적으로 생성되는 수 많은 데이터(스트리밍 데이터) 를 효과적으로 처리하는데 특화되어 있습니다. 스트리밍 데이터? 그거 API로 계속 쏘면 되는거 아니야? 라고 생각할 수 있겠지만, 현실은 그렇지 않습니다.대규모 서비스에서는 매초마다 수천, 수만건의 이벤트가 발생하며, 이런 데이터를 안정적으로 처리하려면 이것을 위해 설계된 특별한 아키텍처가 필요합니다. 일반적인 API 통신으로는 아래와 같은 문제를 해결하기 어렵습니다.고가용성 - 서버가 다운된다면? 서버 다운을 모르고 쏜 데이터들은 유실될 것이고, DB에 들어가지 못한 데이터들은 손실될 것입니다. 처리 지연 - API 수신 서버의 처리 능력을 초..