Archive: 2025

0

Terraform 이란?

Terraform 이란?Terraform은 HashiCorp에서 개발한 오픈소스 Infrastructure as Code(IaC) 도구입니다. 선언적 구성 언어(HCL - HashiCorp Configuration Language)를 사용하여 클라우드 및 온프레미스 리소스를 안전하고 효율적으로 구축, 변경, 버전 관리할 수 있습니다. 주요 특징1. 멀티 클라우드 지원 AWS, Azure, GCP, Kubernetes 등 다양한 프로바이더 지원 700개 이상의 프로바이더 사용 가능 단일 구성으로 여러 클라우드 관리 가능 2. 선언적 구성 원하는 최종 상태를 선언하면 Terraform이 자동으로 실행 계획 수립 명령형이 아닌 선언형 접근 방식 3. 실행 계획 (Plan) 변경 사항을 미리 확인 가능 예상치 못한 변경 방지 terraform plan 명령으로 변경 사항 시뮬레이션

0

EC2 를 이용한 WireGuard Full Tunnel 구성

✅ VPN 서버 설정 WireGuard 내부 대역: 10.100.0.0/24 EC2 VPC 대역: 10.1.0.0/16 EC2 설정EC2 를 VPN 서버로 사용하기 위해서는 일단 Client 와 연결하기 위한 Port 가 오픈이 돼 있어야 합니다. Wireguard 는 51820 UDP 포트를 사용하므로 해당 포트를 통해 Client 가 접속할 수 있도록 보안 그룹 허용 목록에 추가해줍니다. EC2 에 WireGuard 설치Debian 계열 리눅스# 패키지 목록 업데이트sudo apt update# WireGuard 설치sudo apt install wireguard -y# WireGuard 버전 확인wg --version RHEL 계열 리눅스

0

RAG 성능 최적화 기법

RAG 시스템 최적화 개요RAG 시스템의 성능은 다음 세 가지 측면에서 최적화할 수 있습니다: 검색 품질 - 관련성 높은 문서 찾기 응답 품질 - 정확하고 유용한 답변 생성 성능/비용 - 빠른 응답과 비용 효율성 1. 청킹 전략 최적화1.1 고정 크기 청킹from langchain.text_splitter import RecursiveCharacterTextSplitter# 기본 설정text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len,)# 문서 유형별 최적화## 기술 문서 - 작은 청크tech_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=100)## 소설/긴 글 - 큰 청크narrative_splitter = RecursiveCharacterTextSplitter( chunk_size=2000, chunk_overlap=400) 1.2 의미 기반 청킹from langchain_experimental.text_splitter import SemanticChunkerfrom langchain_openai.embeddings import OpenAIEmbeddings# 의미론적 유사도로 분할semantic_chunker = SemanticChunker( OpenAIEmbeddings(), breakpoint_threshold_type="percentile", # or "standard_deviation" breakpoint_threshold_amount=95 # 상위 5%에서 분할)chunks = semantic_chunker.split_documents(documents) 1.3 문서 구조 기반 청킹

0

벡터 데이터베이스 비교 및 선택 가이드

벡터 데이터베이스란?벡터 데이터베이스는 고차원 벡터 데이터를 효율적으로 저장하고 검색하는 데 특화된 데이터베이스입니다. RAG 시스템의 핵심 구성 요소입니다. 주요 벡터 데이터베이스 비교1. ChromaDB특징: 오픈소스, 로컬 우선 설계 Python 친화적 가볍고 시작하기 쉬움 임베디드 모드 지원 장점: ✅ 설치 및 설정이 매우 간단 ✅ 로컬 개발에 최적 ✅ 무료 오픈소스 ✅ 메타데이터 필터링 지원 단점:

0

RAG 시스템 구축 가이드

RAG 시스템 구축 단계RAG 시스템을 처음부터 구축하는 전체 과정을 단계별로 설명합니다. 1. 환경 설정필수 라이브러리 설치# Python 가상환경 생성python -m venv venvsource venv/bin/activate # Windows: venv\Scripts\activate# 기본 라이브러리 설치pip install langchain langchain-community langchain-openaipip install chromadb # 벡터 데이터베이스pip install openai # OpenAI APIpip install tiktoken # 토큰 카운팅pip install pypdf # PDF 처리pip install python-dotenv 환경 변수 설정# .env 파일 생성OPENAI_API_KEY=your-api-key-here 2. 문서 준비 및 로딩2.1 문서 로더 선택

0

RAG (Retrieval-Augmented Generation) 개요

RAG란?RAG(Retrieval-Augmented Generation)는 대규모 언어 모델(LLM)의 응답을 개선하기 위해 외부 지식 베이스에서 관련 정보를 검색하여 활용하는 기술입니다. RAG의 필요성 지식 최신성 문제 해결 LLM은 학습 시점까지의 데이터만 알고 있음 최신 정보나 실시간 데이터 제공 불가 RAG를 통해 최신 문서/데이터 참조 가능 환각(Hallucination) 감소 LLM이 사실이 아닌 내용을 생성하는 문제 외부 신뢰할 수 있는 소스 참조로 정확성 향상 도메인 특화 지식 제공 기업 내부 문서, 특정 도메인 지식 활용 재학습 없이 특정 분야 전문성 확보 비용 효율성 모델 재학습(Fine-tuning) 대비 저렴 데이터 업데이트가 용이 RAG 작동 원리기본 워크플로우사용자 질문 ↓1. 질문 임베딩 생성 ↓2. 벡터 DB에서 유사 문서 검색 ↓3. 검색된 문서 + 질문을 LLM에 입력 ↓4. LLM이 컨텍스트 기반 답변 생성 ↓최종 답변 제공 핵심 구성 요소 문서 처리 (Document Processing) 문서 수집 및 전처리 청크 분할 (Chunking) 임베딩 생성 검색 시스템 (Retrieval System) 벡터 데이터베이스 유사도 검색 알고리즘 하이브리드 검색 (키워드 + 벡터) 생성 모델 (Generation Model) LLM (GPT, Claude, Llama 등) 프롬프트 엔지니어링 컨텍스트 윈도우 관리

0

PostgreSQL - Top N 쿼리 확인 방법

pg_stat_statements를 이용한 Top N 쿼리 확인PostgreSQL에서 가장 많이 실행되거나 느린 쿼리를 확인하는 방법을 정리합니다. 1. pg_stat_statements 확장 설치-- 확장 설치CREATE EXTENSION IF NOT EXISTS pg_stat_statements;-- 설치 확인SELECT * FROM pg_available_extensions WHERE name = 'pg_stat_statements'; 2. postgresql.conf 설정# postgresql.conf 파일에 추가shared_preload_libraries = 'pg_stat_statements'# 추적할 쿼리 수 (기본값: 5000)pg_stat_statements.max = 10000# 쿼리 추적 모드 (top: 최상위 쿼리만, all: 중첩 쿼리 포함)pg_stat_statements.track = all 설정 변경 후 PostgreSQL 재시작 필요: # 재시작sudo systemctl restart postgresql# 또는pg_ctl restart 3. 실행 횟수가 많은 Top N 쿼리

0

MySQL - Top N 쿼리 확인 방법

MySQL에서 가장 많이 실행되거나 느린 쿼리를 확인하는 방법을 정리합니다. Log 파일 기반 Top N 쿼리 확인5. Slow Query Log 설정-- Slow Query Log 활성화SET GLOBAL slow_query_log = 'ON';-- Slow Query 기준 시간 설정 (초 단위)SET GLOBAL long_query_time = 2;-- Slow Query Log 파일 위치 확인SHOW VARIABLES LIKE 'slow_query_log_file';-- 인덱스를 사용하지 않는 쿼리도 로깅SET GLOBAL log_queries_not_using_indexes = 'ON'; SHOW VARIABLES LIKE 'slow_query%';SHOW VARIABLES LIKE 'long_query_time'; SHOW VARIABLES LIKE 'slow_query_log_file'; 6. Slow Query Log 분석 (mysqldumpslow)# 가장 느린 쿼리 10개mysqldumpslow -s t -t 10 /path/to/slow-query.log# 가장 많이 실행된 쿼리 10개mysqldumpslow -s c -t 10 /path/to/slow-query.log# 평균 실행 시간이 긴 쿼리 10개mysqldumpslow -s at -t 10 /path/to/slow-query.log Performance Schema를 이용한 Top N 쿼리 확인

0

Ubuntu Linux에 OpenVPN 설치 및 설정 가이드

OpenVPN 개요OpenVPN은 오픈소스 VPN 솔루션으로, 안전한 원격 접속과 네트워크 간 통신을 제공합니다. SSL/TLS를 사용하여 강력한 암호화를 지원하며, 방화벽을 통과하기 쉬운 구조로 설계되어 있습니다. 1. OpenVPN 서버 설치# 패키지 목록 업데이트sudo apt updatesudo apt upgrade -y# OpenVPN 설치sudo apt install openvpn -y# Easy-RSA 설치 (인증서 관리 도구)sudo apt install easy-rsa -y# OpenVPN 버전 확인openvpn --version# 설치된 파일 확인dpkg -L openvpn | grep bin 2. PKI (Public Key Infrastructure) 설정Easy-RSA 디렉토리 설정# Easy-RSA 디렉토리 생성make-cadir ~/openvpn-ca# 디렉토리 이동cd ~/openvpn-ca CA (Certificate Authority) 설정# vars 파일 편집nano vars# 다음 내용 수정 (예시)set_var EASYRSA_REQ_COUNTRY "KR"set_var EASYRSA_REQ_PROVINCE "Seoul"set_var EASYRSA_REQ_CITY "Seoul"set_var EASYRSA_REQ_ORG "MyCompany"set_var EASYRSA_REQ_EMAIL "admin@example.com"set_var EASYRSA_REQ_OU "IT Department"

0

Fail2ban 설치 및 사용 가이드

Fail2ban 개요Fail2ban은 로그 파일을 모니터링하여 악의적인 활동(무차별 대입 공격, 포트 스캔 등)을 탐지하고 자동으로 차단하는 침입 방지 소프트웨어입니다. 주요 기능 로그 파일 실시간 모니터링 정규표현식 기반 패턴 매칭 자동 IP 차단 (iptables, firewalld, ufw 등) 시간 기반 자동 차단 해제 이메일 알림 기능 다양한 서비스 지원 (SSH, Apache, Nginx, MySQL 등) 작동 원리 로그 모니터링: Fail2ban은 지정된 로그 파일을 실시간으로 감시합니다. 패턴 매칭: 설정된 정규표현식 패턴(filter)과 로그를 비교합니다. 실패 횟수 카운트: 특정 IP에서 실패가 발생할 때마다 카운트를 증가시킵니다. 차단 실행: 설정된 임계값(maxretry)을 초과하면 해당 IP를 차단합니다. 자동 해제: 설정된 시간(bantime) 후 자동으로 차단을 해제합니다. 1. 설치Ubuntu/Debian# 패키지 업데이트sudo apt update# Fail2ban 설치sudo apt install fail2ban -y# 서비스 시작 및 자동 시작 설정sudo systemctl start fail2bansudo systemctl enable fail2ban# 상태 확인sudo systemctl status fail2ban

0

[Network] NAT Gateway 란?

NAT Gateway 란?NAT Gateway는 Network Address Translation의 약자로, 프라이빗 네트워크의 리소스가 인터넷과 통신할 수 있도록 IP 주소를 변환해주는 관리형 네트워크 서비스입니다. 주로 프라이빗 서브넷의 인스턴스들이 외부 인터넷에 접근할 수 있게 하면서도, 외부에서 직접적인 인바운드 연결은 차단하는 역할을 합니다. NAT의 기본 개념NAT (Network Address Translation)NAT는 IP 패킷의 송신지 또는 목적지 IP 주소를 변환하는 기술입니다. 프라이빗 IP → NAT → 퍼블릭 IP10.0.1.5 → NAT → 203.0.113.510.0.1.10 → NAT → 203.0.113.510.0.1.15 → NAT → 203.0.113.5 NAT가 필요한 이유 IPv4 주소 고갈 문제 해결 제한된 퍼블릭 IP 주소를 효율적으로 사용 하나의 퍼블릭 IP로 여러 프라이빗 IP 리소스 관리 보안 강화 내부 네트워크 구조 은닉 외부에서 직접 접근 차단 유연한 네트워크 구성 내부 IP 체계를 자유롭게 설계 외부 네트워크 변경 시 내부 영향 최소화 NAT Gateway vs NAT InstanceNAT Gateway

0

[쿠버네티스] - Health Probes (Startup, Liveness, Readiness)

개요쿠버네티스는 컨테이너의 상태를 모니터링하고 관리하기 위해 세 가지 유형의 Health Probe를 제공합니다: Startup Probe: 컨테이너가 시작되었는지 확인 Liveness Probe: 컨테이너가 정상적으로 실행 중인지 확인 Readiness Probe: 컨테이너가 트래픽을 받을 준비가 되었는지 확인 Probe 메커니즘모든 Probe는 다음 세 가지 방식 중 하나로 동작합니다: 1. HTTP GET 요청httpGet: path: /healthz port: 8080 httpHeaders: - name: Custom-Header value: Awesome scheme: HTTP # or HTTPS 지정된 경로로 HTTP GET 요청을 보냅니다 200-399 범위의 상태 코드를 반환하면 성공 그 외의 코드는 실패로 간주 2. TCP Socket 연결

0

[QueryDSL] Transform 사용 시 HikariCP Connection Leak 문제 해결

QueryDSL Transform 사용 시 HikariCP Connection Leak 문제QueryDSL의 transform() 메서드는 쿼리 결과를 그룹화하고 Map으로 변환할 때 매우 유용한 기능입니다. 하지만 부적절하게 사용할 경우 심각한 데이터베이스 커넥션 누수(Connection Leak)를 발생시킬 수 있습니다. 문제 상황운영 중인 서비스에서 다음과 같은 에러가 발생했습니다: HikariPool-1 - Connection is not available, request timed out after 30000ms. DB 커넥션 수는 POD 당 20개(max-connection-pool) 로 충분한 상태였고, 트랜잭션이 길게 잡히는 슬로우 쿼리도 없는 상황이라 아무래도 Connection Leak 이 발생하는 상황이라 생각 했습니다. 원인 분석QueryDSL의 transform() 메서드 특징문제의 원인은 QueryDSL의 transform() 메서드의 내부 동작 방식에 있었습니다.

0

[Spring Boot] 애플리케이션 Warm Up 가이드

참고 - IF(kakao) 2022 https://www.youtube.com/watch?v=CQi3SS2YspY 🤔 Warm Up이 필요한 주요 이유Spring Boot 와 같은 JAVA 애플리케이션을 최초 실행하거나 재배포할 때, 첫 번째 요청이 다른 요청들에 비해 현저히 느린 현상을 경험한 적이 있을 것입니다. 이러한 현상을 Cold Start 문제라고 하며, 이를 해결하기 위해 Warm Up이 필요합니다. 1. JVM 의 JIT (Just-In-Time) 컴파일Java 애플리케이션은 바이트코드 로 컴파일되어 실행되며, JVM은 런타임에 자주 사용되는 코드를 네이티브 코드 로 최적화합니다. 초기에는 인터프리터 모드 로 실행되어 바이트 코드를 한줄 한줄 해석하기 때문에 성능이 상대적으로 낮습니다. JIT 컴파일러가 자주 실행되는 코드 핫스팟(Hot Spot) 을 식별하고 최적화된 네이티브 코드로 전환됩니다. 때문에 애플리케이션 구동 후 JIT 컴파일러가 핫스팟(Hot Spot) 을 식별하고 최적화하는 전까지는 상대적으로 느릴 수 있습니다.

0

Git - Git Hook으로 워크플로우 자동화하기

Git Hook이란?Git Hook은 Git에서 특정 이벤트가 발생했을 때 자동으로 실행되는 스크립트입니다. 커밋, 푸시, 머지 등의 작업 전후에 사용자 정의 스크립트를 실행하여 코드 품질 검사, 테스트 자동화, 메시지 검증 등 다양한 워크플로우를 자동화할 수 있습니다. Git Hook의 종류Git Hook은 크게 클라이언트 훅(Client-side Hooks) 과 서버 훅(Server-side Hooks) 으로 나뉩니다. 클라이언트 훅 (Client-side Hooks)개발자의 로컬 저장소에서 실행되는 훅입니다. Commit 관련 훅 pre-commit: 커밋 메시지 작성 전 실행 (코드 린트, 테스트 실행) prepare-commit-msg: 커밋 메시지 에디터가 열리기 전 실행 (메시지 템플릿 설정) commit-msg: 커밋 메시지 검증 (메시지 형식 확인) post-commit: 커밋이 완료된 후 실행 (알림 전송) Merge/Rebase 관련 훅