전체 글 썸네일형 리스트형 [알고리즘] 플로이드-워셜 알고리즘 며칠 전 현대오토에버 코딩테스트를 봤다. 거기서 플로이드 워셜 알고리즘이 해결방법 중에 하나라고 해서, 잘 모르는 나는 이번 기회에 공부해서 체득을 하려고한다..!/* 플로이드 워셜 알고리즘 개념 */플로이드-워셜(Floyd-Warshall) 알고리즘은 모든 정점 쌍 간의 최단 경로(All-Pairs Shortest Path, APSP) 를 구하는 알고리즘이다.다익스트라(Dijkstra)는 한 정점에서 다른 모든 정점까지 최단거리를 구할 때 쓰지만, 플로이드-워셜은 그래프의 모든 정점 쌍에 대한 최단 거리를 한 번에 구할 수 있다. 입력그래프의 정점 수 N간선의 가중치 정보 (인접 행렬 dist 형태로 저장, 없는 경로는 INF로 설정)아이디어dist[i][j]: i에서 j까지 가는 최단 거리초기에는 직.. 더보기 [Postgresql] Scan과 Join /* PostgreSQL 실행 계획 속 스캔과 조인*/PostgreSQL에서 SQL이 실행될 때, 단순히 "조건에 맞는 데이터 가져오기"로 끝나는 게 아니다.실제로는 어떤 방식으로 테이블을 읽을지(스캔), 그리고 여러 테이블을 어떻게 결합할지(조인)를 내부적으로 전략 세워서 실행한다.이 전략을 이해하면, 쿼리 튜닝이 한결 쉬워진다. /* 스캔 방식: 데이터를 어떻게 읽을까 */ Sequential Scan (Seq Scan)테이블의 모든 블록을 처음부터 끝까지 훑는 방식.조건이 있든 없든 전부 읽고, 거기서 필터링한다.인덱스가 없어도 되고, 작은 테이블이거나 조건으로 인덱스를 타도 효율이 없을 때 선택됨.예: SELECT * FROM orders WHERE amount > 1000; (amount에 인덱.. 더보기 [Postgresql] Lock 락 /* PostgreSQL 락(Lock) */ PostgreSQL은 데이터 무결성과 일관성을 보장하기 위해 다양한 락(Lock) 메커니즘을 제공한다. 스냅샷 기반의 MVCC만으로는 모든 상황에서 무결성을 완벽히 보장하기 어렵기 때문에, 특정 상황에서는 애플리케이션이나 DB 자체에서 적절한 락을 걸어야 한다.PostgreSQL에서 제공하는 락은 크게 세 가지 레벨로 나뉜다.Object level lock (객체 레벨 락)Row level lock (행 레벨 락)Memory level lock (메모리 락)/* 객체 레벨 락 (Object Level Lock) */객체 레벨 락은 테이블, 인덱스, 시퀀스, 뷰와 같은 데이터베이스 객체에 걸린다.주요 특징은 다음과 같다.테이블/인덱스 변경 시 해당 객체를 보호서.. 더보기 [Postgresql] Vacuum /* PostgreSQL Dead Tuple와 Vacuum 이야기 */PostgreSQL을 쓰다 보면 디스크 사용량이 자꾸 늘어나거나, 쿼리가 점점 느려지는 경험을 한다.그 주범 중 하나가 바로 **Dead Tuple(죽은 튜플)**이다.오늘은 Dead Tuple이 어떻게 처리되는지, 그리고 이를 청소하는 Vacuum이 어떻게 동작하는지,Lazy Vacuum, Auto Vacuum, Vacuum Full까지 깔끔하게 정리해본다. /* Dead Tuple은 왜 생기나? */PostgreSQL은 UPDATE나 DELETE 시 기존 데이터를 바로 덮어쓰지 않는다.대신 MVCC(Multi-Version Concurrency Control)라는 방식으로 새 버전을 만든다. UPDATE users SET name .. 더보기 [Postgresql] 튜플 버전 /* PostgreSQL에서 튜플은 어떻게 살아남는가 - INSERT부터 INDEX까지 */PostgreSQL은 데이터를 단순히 저장하지 않는다. 저장, 삭제, 수정할 때마다 "히스토리"를 남긴다. 이 덕분에 동시성 제어, MVCC, 롤백 모두 가능한데, 그 이면에는 튜플의 버전 관리가 있다. 이 글에서는 튜플이 어떻게 INSERT되고, DELETE되었다가 ROLLBACK되고, 다시 UPDATE되는지 그리고 인덱스가 이 과정을 어떻게 바라보는지를 살펴 보겠다. /* INSERT */트랜잭션 ID가 11140063일 때, 테이블에 튜플 하나를 insert하면 해당 트랜잭션 ID가 xmin으로 기록된다. 이때 xmax는 0이며, 아직 committed도 aborted도 되지 않은 상태다. commit;sel.. 더보기 [RabbitMQ] 비동기 메시징 큐 적용 /* 적용 배경 설명 */배경사용자가 진단을 완료하고, 결과를 기다리는 환경이었습니다. 결과는 pdf로 제공이 되며, pdf 안에는 사용자의 진단 데이터와 데이터를 바탕으로 한 AI의 리뷰가 포함되어 있었습니다. AI의 응답을 기다리기 까지 평균 15초에서 20초가 소요되었습니다.과제 및 행동전체적인 문제: 사용자는 결과를 기다리기 위해서 20초를 가만히 기다려야 했습니다. 물론 프론트에서 “결과를 생성하는 중입니다” 라는 문구와 로딩 중의 gif를 보여주긴 했지만, 중간에 탈주를 할 수도 있고 사용자가 이 웹에 대한 흥미를 쉽게 떨어트릴 수 있는 요소라고 생각을 해서 다른 해결방안을 생각해야 했습니다.해결1 (비동기 메시징 큐 적용): 그래서 생각했던 방향은 비동기 메시징 큐를 이용하는 것입니다. 확실.. 더보기 [SSE] Server Sent Event Stream /* SSE */웹 서비스에서 실시간으로 정보를 전달하고 싶을 때 우리는 흔히 WebSocket이나 polling을 떠올립니다. 하지만 단방향 통신만 필요할 경우, 더 간단하고 효율적인 방식이 있습니다. 바로 SSE(Server-Sent Events) 입니다. SSE는 서버에서 클라이언트로 단방향으로 데이터를 지속적으로 전송할 수 있게 해주는 기술입니다.HTTP 기반이기 때문에 별도의 프로토콜이나 핸드쉐이크가 필요 없습니다.브라우저에서 기본적으로 지원합니다 (EventSource API).실시간 로그, 알림, 상태 업데이트 등에 유용합니다./* SSE 구현 */@Componentclass SseEmitterManager { private val emitters: MutableMap = Concurr.. 더보기 [JWT] JWT란 무엇인가 /* JWT */ JWT는 헤더.내용.서명으로 .(dot)을 구분자로 하여, JWT 토큰 1개를 이룹니다.JSON 객체를 사용하여 정보를 전달합니다. 그리고, 필요한 모든 정보를 한 객체에 담아서 전달하기 때문에 JWT 한 가지로 인증을 마칠 수 있습니다.JSON 을 JWT로 인코딩 작업을 통해 토큰을 만듭니다./* Header */인코딩 : Base64{ "alg": "HS256", "typ": "JWT"}헤더에서는 해시 알고리즘과 토큰의 타입을 정의할 수 있습니다.HS256은 HMAC SHA 256을 의미합니다.해시 알고리즘 중 한 가지입니다.타입의 값 JWT는 이 토큰을 JWT로 지정합니다./* Payload (Data) */{ "sub": "1234567890", "name": "John .. 더보기 이전 1 2 3 4 ··· 10 다음