ZeroBase 106

Redis

Redis는 In-Memory 데이터 구조 저장소로, 다양한 자료형을 지원합니다. 그 중에서도 String은 Redis에서 가장 기본적이면서도 널리 사용되는 자료형입니다. 실제로 Redis 사용 사례의 90% 이상이 String 자료형을 활용한다고 할 수 있을 정도로 중요하고 유용한 자료형입니다.Redis String의 내부 구조: SDS (Simply Dynamic String) SDS란?Redis String은 내부적으로 SDS(Simply Dynamic String) 구조를 사용합니다. 이는 C언어의 전통적인 null-terminated string이 아닌, Redis가 자체적으로 구현한 동적 문자열 구조입니다. SDS의 주요 장점1. 빠른 문자열 길이 조회시간 복잡도: O(1)C의 strlen()..

ZeroBase/Redis 2026.03.02

Http -> Https Domain 변경

환경 설정서버: 리눅스 Ubuntu웹서버: Nginx (리버스 프록시)도메인: 가비아에서 구매한 도메인네트워크: iptime 공유기 환경SSL: Let's Encrypt 무료 인증서목표https://jenkins.[도메인] - 브라우저 경고 없는 안전한 접속https://fitnesspt.[도메인] - 브라우저 경고 없는 안전한 접속준비 단계: certbot 설치sudo apt update sudo apt install certbotsudo apt install python3-certbot-nginx # Nginx와 acme챌린지를 위한 플러그인sudo apt install python3-certbot-apache # Apache와 acme챌린지를 위한 플러그인 1단계: 도메인 DNS 설정가비아 관리콘솔..

ZeroBase/Infra 2025.10.25

CSS Position - 요소 배치의 모든 것

Position은 HTML 요소를 원하는 위치에 배치하기 위한 CSS 속성입니다.top, bottom, left, right 속성과 함께 사용하여 정확한 위치를 지정할 수 있습니다. 1. 부모-자식 관계 설정기본 원칙부모 요소: position: relative자식 요소: position: absolute→ 자식 요소는 부모를 기준으로 배치됨CSS.parent { position: relative; /* 기준점 설정 */ width: 600px; height: 300px; background-color: dodgerblue;}.child { position: absolute; /* 부모 기준 절대 위치 */ width: 200px; height: 100px; ..

MySQL 스토리지 엔진(InnoDB vs MyISAM)

스토리지 엔진데이터베이스 시스템에서 데이터의 저장, 검색, 트랜잭션 관리, 동시성 제어, 캐싱 등 핵심을 담당하는 필수 구성 요소입니다. MySQL의 스토리지 엔진InnoDB: MySQL 8.0의 기본 스토리지 엔진MyISAM: 이전 버전의 기본 엔진, 현재도 선택 가능 -- 스토리지 엔진 확인SHOW TABLE STATUS WHERE name = 'users';-- 테이블 생성 시 엔진 지정CREATE TABLE users ( user_id INT PRIMARY KEY, username VARCHAR(50)) ENGINE=InnoDB; -- 또는 ENGINE=MyISAM InnoDB vs MyISAM 차이특성InnoDBMyISAM트랜잭션지원 (ACID)미지원락 레벨행 레벨 락 (Row-le..

ZeroBase/CS 2025.10.16

데이터베이스 데드락 - 발생 조건과 해결 방법

둘 이상의 트랜잭션이 서로가 잠금을 포기하기를 기다리는 상황(교착상태)을 말합니다. 데드락 예시Transaction A: Lock(X) → Wait for Lock(Y)Transaction B: Lock(Y) → Wait for Lock(X)A는 Y를 기다리고, B는 X를 기다리며서로 영원히 대기하는 교착상태 발생 데드락 발생 조건다음 4가지 조건이 동시에 충족될 때 데드락 발생 1. 상호 배제 (Mutual Exclusion)자원은 한 번에 하나의 트랜잭션만 사용할 수 있습니다. -- 트랜잭션 A가 Row 1을 잠금-- 트랜잭션 B는 Row 1에 동시 접근 불가 2. 점유 및 대기 (Hold and Wait)트랜잭션이 최소한 하나의 자원을 점유하고 있으면서 다른 트랜잭션이 점유한 자원을 추가로 요구할 ..

ZeroBase/CS 2025.10.12

데이터베이스 정규화 - 이상 현상 해결과 정규형

정규화 과정은 릴레이션 간의 잘못된 함수 종속 관계로 인해 데이터베이스 이상 현상이 일어나는 것을 해결하는 과정이자 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정입니다. 정규화의 목적데이터 중복 최소화이상 현상 방지데이터 일관성 유지저장 공간 효율화 이상 현상 (Anomaly)데이터베이스의 설계를 잘못하게 되었을 때 불필요한 데이터 중복이 발생하여 릴레이션에 대한 데이터의 삽입, 갱신, 삭제 연산을 수행할 때 부작용이 발생하는 것을 말합니다. 삽입 이상 (Insertion Anomaly)불필요한 데이터도 같이 삽입해야 하는 문제비정규화 테이블:┌─────────┬──────────┬──────────┬─────────┐│ 학생ID │ 학생이름 │ 과목코드 │ 과목명..

ZeroBase/CS 2025.10.12

Linux Server SSH 접속 메일 알림(sSMTP)

서버에 SSH로 접속할 때마다 실시간을 이메일 알림을 받는 보안 모니터링 시스템을 구현합니다.NAT/게이트웨이 환경에서도 실제 외부 IP를 추적하여 보안을 강화합니다. 시스템 아키텍처[SSH Client] → [Router/NAT] → [SSH Server] → [PAM] → [Alert Script] → [sSMTP] → [Gmail] ↓ [External IP Tracking] 프로세스 플로우 1. sSMTP 설치 및 설정sudo apt updatesudo apt install ssmtp mailutils sSMTP 설정 (/etc/ssmtp/ssmtp.conf) # 서버 호스트명hostname=your-server-name# Gmail SMTP..

ZeroBase/Infra 2025.10.03

Clustered Index vs Non-Clustered Index

Clustered Index (클러스터형 인덱스) 유일성과 최소성을 가지는 기본키 중 하나로 설정됩니다. 테이블당 한 개만 생성 가능하며, 보통 테이블의 기본키가 클러스터형 인덱스가 됩니다. 내부 구조Clustered Index 구조:인덱스 페이지 ↓리프 노드 = 실제 데이터 페이지[10][25][50][75][100] ← 인덱스 ↓ ↓ ↓ ↓ ↓실제 데이터가 정렬되어 저장됨 데이터 페이지가 정렬되어 저장되며 인덱스 페이지의 리프 노드에 "데이터 페이지"가 들어가 있습니다.장점탐색 성능 우수: 데이터가 정렬되어 있어 범위 검색에 유리추가 포인터 불필요: 리프 노드가 실제 데이터단점데이터가 추가될 때마다 다시 모든 테이블을 정렬해야 하기 때문에 삽입, 삭제, 수정이 느립니다.-- Cl..

ZeroBase/CS 2025.09.30

데이터베이스 인덱스 - B-Tree와 성능 최적화

데이터 접근(검색, 삽입, 삭제 등) 속도를 향상시키기 위해 사용되는 데이터 구조입니다. B-Tree 인덱스 보통의 데이터베이스에서 사용되는 인덱스 구조로, 이진검색트리를 일반화한 자료구조입니다. 2개 이상의 자식을 가진 노드를 허용하고 탐색에 평균 O(log N) 시간이 걸립니다.주요 데이터베이스의 인덱스MySQLPostgreSQLOracleB-Tree 구조B-Tree 구성 요소: [50] ← 루트 노드 / \ [25] [75] ← 브랜치 노드 (내부 노드) / \ / \[10][40][60][90] ← 리프 노드핵심 원리:요소들을 선형적으로 탐색하는 것이 아닌트리 자료구조를 이용해 있을 법한 노드를 기반으로찾고자..

ZeroBase/CS 2025.09.30

트랜잭션 격리 수준과 발생 가능한 현상

격리 수준에 따른 현상 팬텀 리드 (Phantom Read)한 트랜잭션 내에서 동일한 쿼리를 2번 이상 보냈을 때 해당 조회 결과가 다른 현상T1: SELECT * FROM products WHERE price 반복 가능하지 않은 조회 (Non-Repeatable Read)한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 것T1: SELECT price FROM products WHERE id = 1; 결과: 10000T2: UPDATE products SET price = 15000 WHERE id = 1;T2: COMMIT;T1: SELECT price FROM products WHERE id = 1; 결과: 15000 ← 같은 행인데 값이 다름 (Non-Re..

ZeroBase/CS 2025.09.30