Product-Change 서비스 운영환경 데이터베이스 설치 계획서
1. 개요
1.1 프로젝트 정보
- 프로젝트명: 통신요금 관리 서비스
- 서비스명: Product-Change Service (상품변경)
- 환경: 운영환경 (Production)
- 데이터베이스명: product_change_db
- 작성일: 2025-09-08
- 작성자: 데옵스 (최운영)
1.2 설치 목적
- Product-Change 서비스의 운영환경 전용 데이터베이스 구축
- Azure Database for PostgreSQL Flexible Server를 활용한 고가용성 구성
- 99.9% 가용성을 목표로 한 엔터프라이즈급 데이터베이스 환경 제공
- 1,000명 동시 사용자 지원 및 성능 최적화
1.3 설계 원칙
- 고가용성 우선: Zone Redundant HA로 99.9% 가용성 보장
- 보안 강화: Private Endpoint, TLS 1.3, 감사 로깅 적용
- 성능 최적화: Premium SSD, Read Replica, 자동 인덱스 관리
- 재해복구: 자동 백업, Point-in-Time Recovery, 지리적 복제
- 모니터링: 포괄적 메트릭 수집 및 알림 설정
2. 아키텍처 설계
2.1 전체 아키텍처
┌─────────────────────────────────────────────────────────────┐
│ 운영환경 데이터 아키텍처 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Product-Change │ │ AKS Cluster │ │
│ │ Application │◄──►│ (Multi-Zone) │ │
│ │ Pods │ │ Korea Central │ │
│ └─────────────────┘ └─────────────────┘ │
│ │ │ │
│ │ Private Endpoint │ │
│ ▼ │ │
│ ┌─────────────────┐ │ │
│ │ Azure Database │ │ │
│ │ for PostgreSQL │ │ │
│ │ Flexible Server │ │ │
│ │ (Zone Redundant)│ │ │
│ └─────────────────┘ │ │
│ │ │ │
│ │ Read Traffic │ │
│ ▼ │ │
│ ┌─────────────────┐ │ │
│ │ Read Replica │ │ │
│ │ (Korea South) │ │ │
│ └─────────────────┘ │ │
│ │ │
│ ┌─────────────────┐ │ │
│ │ Azure Cache │◄─────────────┘ │
│ │ for Redis │ │
│ │ (Premium P2) │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2.2 데이터베이스 구성 요소
2.2.1 주 데이터베이스
| 구성 항목 |
설정 값 |
설명 |
| 서비스 유형 |
Azure Database for PostgreSQL Flexible Server |
관리형 PostgreSQL 서비스 |
| 위치 |
Korea Central |
주 리전 |
| PostgreSQL 버전 |
14 |
안정화된 최신 버전 |
| 서비스 티어 |
GeneralPurpose |
범용 프로덕션 환경 |
| 컴퓨팅 사이즈 |
Standard_D4s_v3 |
4 vCore, 16GB RAM |
| 스토리지 |
256GB Premium SSD |
고성능 스토리지 |
| IOPS |
1,280 (자동 확장) |
고성능 I/O |
| 데이터베이스명 |
product_change_db |
Product-Change 전용 DB |
2.2.2 고가용성 구성
| 구성 항목 |
설정 값 |
설명 |
| HA 모드 |
Zone Redundant HA |
영역 간 중복화 |
| Primary Zone |
Zone 1 |
주 데이터베이스 영역 |
| Standby Zone |
Zone 2 |
대기 데이터베이스 영역 |
| 자동 장애조치 |
활성화 |
60초 이내 자동 전환 |
| 복제 모드 |
동기식 복제 |
데이터 일관성 보장 |
| 가용성 SLA |
99.95% |
Zone Redundant SLA |
2.2.3 읽기 전용 복제본
| 구성 항목 |
설정 값 |
설명 |
| 위치 |
Korea South |
재해복구 리전 |
| 복제본 수 |
1개 |
읽기 부하 분산용 |
| 컴퓨팅 사이즈 |
Standard_D2s_v3 |
2 vCore, 8GB RAM |
| 복제 지연 |
< 1분 |
실시간에 가까운 복제 |
| 사용 목적 |
읽기 부하 분산, 재해복구 |
성능 및 가용성 향상 |
2.3 네트워크 구성
2.3.1 네트워크 보안
| 구성 항목 |
설정 값 |
설명 |
| 네트워크 액세스 |
Private Access (VNet) |
VNet 내부 접근만 허용 |
| Private Endpoint |
활성화 |
10.0.2.0/24 서브넷 |
| Private DNS Zone |
privatelink.postgres.database.azure.com |
내부 DNS 해석 |
| 방화벽 규칙 |
VNet 규칙만 |
AKS 서브넷에서만 접근 허용 |
| SSL 암호화 |
필수 (TLS 1.3) |
전송 구간 암호화 |
2.3.2 연결 설정
database_connection:
# 주 데이터베이스 연결
primary:
host: "phonebill-postgresql-prod.postgres.database.azure.com"
port: 5432
database: "product_change_db"
ssl_mode: "require"
connect_timeout: 30
# 읽기 전용 복제본 연결
read_replica:
host: "phonebill-postgresql-replica.postgres.database.azure.com"
port: 5432
database: "product_change_db"
ssl_mode: "require"
connect_timeout: 30
3. 스토리지 및 성능 최적화
3.1 스토리지 구성
3.1.1 스토리지 설정
| 구성 항목 |
설정 값 |
설명 |
| 스토리지 유형 |
Premium SSD |
고성능 스토리지 |
| 초기 용량 |
256GB |
서비스 시작 용량 |
| 최대 용량 |
16TB |
자동 확장 상한 |
| 자동 확장 |
활성화 |
80% 사용 시 자동 확장 |
| 증분 단위 |
64GB |
확장 단위 |
| IOPS |
1,280 (기본) |
자동 확장 가능 |
3.1.2 성능 튜닝 매개변수
-- PostgreSQL 운영환경 최적화 매개변수
# 메모리 설정
shared_buffers = '4GB' # 전체 메모리의 25%
effective_cache_size = '12GB' # 사용 가능한 메모리의 75%
work_mem = '32MB' # 정렬/해시 작업용 메모리
maintenance_work_mem = '512MB' # 유지보수 작업용 메모리
# 연결 및 인증
max_connections = 200 # 최대 동시 연결 수
idle_in_transaction_session_timeout = '30min' # 유휴 트랜잭션 타임아웃
# 체크포인트 및 WAL
checkpoint_completion_target = 0.9 # 체크포인트 완료 목표
wal_buffers = '16MB' # WAL 버퍼 크기
max_wal_size = '4GB' # 최대 WAL 크기
# 로깅 설정
log_statement = 'all' # 모든 SQL 로깅 (운영환경)
log_duration = on # 쿼리 실행 시간 로깅
log_slow_queries = on # 느린 쿼리 로깅
log_min_duration_statement = 1000 # 1초 이상 쿼리 로깅
# 통계 및 모니터링
track_activities = on # 활동 추적
track_counts = on # 통계 수집
track_functions = all # 함수 통계
shared_preload_libraries = 'pg_stat_statements' # 쿼리 통계
3.2 인덱스 전략
3.2.1 핵심 인덱스 설계
-- 상품변경 이력 테이블 인덱스 (성능 최적화)
-- 1. 회선번호 + 처리상태 + 요청일시 (복합 인덱스)
CREATE INDEX idx_pc_history_line_status_date
ON pc_product_change_history(line_number, process_status, requested_at DESC);
-- 2. 고객ID + 요청일시 (고객별 이력 조회)
CREATE INDEX idx_pc_history_customer_date
ON pc_product_change_history(customer_id, requested_at DESC);
-- 3. 처리상태 + 요청일시 (상태별 모니터링)
CREATE INDEX idx_pc_history_status_date
ON pc_product_change_history(process_status, requested_at DESC);
-- 4. JSONB 데이터 검색용 GIN 인덱스
CREATE INDEX idx_pc_history_kos_request_gin
ON pc_product_change_history USING GIN(kos_request_data);
CREATE INDEX idx_pc_history_kos_response_gin
ON pc_product_change_history USING GIN(kos_response_data);
-- KOS 연동 로그 테이블 인덱스
-- 1. 요청ID + 연동유형 + 생성일시
CREATE INDEX idx_kos_log_request_type_date
ON pc_kos_integration_log(request_id, integration_type, created_at DESC);
-- 2. 연동유형 + 성공여부 + 생성일시 (성공률 모니터링)
CREATE INDEX idx_kos_log_type_success_date
ON pc_kos_integration_log(integration_type, is_success, created_at DESC);
-- 3. 응답시간 성능 분석용 인덱스
CREATE INDEX idx_kos_log_response_time
ON pc_kos_integration_log(integration_type, response_time_ms DESC, created_at DESC)
WHERE response_time_ms IS NOT NULL;
4. 보안 설계
4.1 인증 및 권한 관리
4.1.1 데이터베이스 사용자 계정
-- 1. 애플리케이션 사용자 (운영)
CREATE USER product_change_app WITH
PASSWORD 'PCApp2025Prod@#'
CONNECTION LIMIT 150
VALID UNTIL 'infinity';
-- 2. 읽기 전용 사용자 (모니터링/분석)
CREATE USER product_change_readonly WITH
PASSWORD 'PCRead2025Prod@#'
CONNECTION LIMIT 20
VALID UNTIL 'infinity';
-- 3. 관리자 사용자 (DBA)
CREATE USER product_change_admin WITH
PASSWORD 'PCAdmin2025Prod@#'
CONNECTION LIMIT 10
VALID UNTIL 'infinity'
CREATEDB CREATEROLE;
4.1.2 권한 설정
-- 애플리케이션 사용자 권한 (최소 권한 원칙)
GRANT CONNECT ON DATABASE product_change_db TO product_change_app;
GRANT USAGE ON SCHEMA product_change TO product_change_app;
GRANT SELECT, INSERT, UPDATE ON TABLE product_change.pc_product_change_history TO product_change_app;
GRANT SELECT, INSERT ON TABLE product_change.pc_kos_integration_log TO product_change_app;
GRANT SELECT, UPDATE ON TABLE product_change.pc_circuit_breaker_state TO product_change_app;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA product_change TO product_change_app;
-- 읽기 전용 사용자 권한
GRANT CONNECT ON DATABASE product_change_db TO product_change_readonly;
GRANT USAGE ON SCHEMA product_change TO product_change_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA product_change TO product_change_readonly;
-- 관리자 사용자 권한 (전체 권한)
GRANT ALL PRIVILEGES ON DATABASE product_change_db TO product_change_admin;
GRANT ALL PRIVILEGES ON SCHEMA product_change TO product_change_admin;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA product_change TO product_change_admin;
4.2 데이터 암호화
4.2.1 저장 데이터 암호화
| 암호화 유형 |
설정 값 |
설명 |
| TDE (Transparent Data Encryption) |
활성화 |
데이터파일, 로그파일 암호화 |
| 암호화 알고리즘 |
AES-256 |
업계 표준 암호화 |
| 키 관리 |
Azure Key Vault 통합 |
중앙 집중식 키 관리 |
| 키 회전 |
매년 자동 |
보안 정책 준수 |
4.2.2 전송 데이터 암호화
| 구성 항목 |
설정 값 |
설명 |
| SSL/TLS |
TLS 1.3 (최신) |
전송 구간 암호화 |
| SSL 모드 |
require |
SSL 연결 강제 |
| 인증서 검증 |
활성화 |
서버 인증서 검증 |
| 클라이언트 인증서 |
고려 사항 |
양방향 SSL (필요시) |
4.3 감사 및 모니터링
4.3.1 감사 로깅
-- 감사 로깅 설정
ALTER SYSTEM SET log_statement = 'all'; -- 모든 SQL 로깅
ALTER SYSTEM SET log_connections = on; -- 연결 로깅
ALTER SYSTEM SET log_disconnections = on; -- 연결 해제 로깅
ALTER SYSTEM SET log_duration = on; -- 실행 시간 로깅
ALTER SYSTEM SET log_hostname = on; -- 호스트명 로깅
ALTER SYSTEM SET log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h '; -- 로그 형식
-- 로그 보관 설정
ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'; -- 로그 파일명 형식
ALTER SYSTEM SET log_file_mode = 0640; -- 로그 파일 권한
ALTER SYSTEM SET log_rotation_age = '1d'; -- 1일 단위 로그 회전
ALTER SYSTEM SET log_rotation_size = '100MB'; -- 100MB 단위 로그 회전
ALTER SYSTEM SET log_truncate_on_rotation = off; -- 로그 파일 유지
4.3.2 보안 정책
security_policies:
password_policy:
min_length: 12
complexity: "uppercase, lowercase, number, special char"
expiry: 90 days
history: 5 passwords
connection_security:
max_failed_attempts: 5
lockout_duration: 30 minutes
session_timeout: 8 hours
idle_timeout: 30 minutes
network_security:
allowed_subnets:
- "10.0.1.0/24" # AKS Application Subnet
- "10.0.4.0/24" # Management Subnet
blocked_countries: [] # 필요시 지역 차단
rate_limiting: 100 connections/minute
5. 백업 및 재해복구
5.1 백업 전략
5.1.1 자동 백업 설정
| 백업 유형 |
설정 값 |
설명 |
| 자동 백업 |
활성화 |
Azure 관리형 자동 백업 |
| 백업 보존 기간 |
35일 |
최대 보존 기간 |
| 백업 시간 |
02:00-04:00 KST |
비즈니스 영향 최소화 |
| 백업 압축 |
활성화 |
스토리지 비용 절약 |
| 백업 암호화 |
활성화 |
AES-256 암호화 |
5.1.2 백업 유형별 설정
backup_configuration:
# 전체 백업
full_backup:
frequency: "매일"
time: "02:00 KST"
retention: "35일"
compression: true
encryption: "AES-256"
# 트랜잭션 로그 백업
log_backup:
frequency: "5분"
retention: "7일"
compression: true
# Point-in-Time Recovery
pitr:
enabled: true
granularity: "5분"
retention: "35일"
# 지리적 복제 백업
geo_backup:
enabled: true
target_region: "Korea South"
retention: "35일"
5.2 재해복구 계획
5.2.1 복구 목표
| 복구 지표 |
목표 값 |
설명 |
| RTO (Recovery Time Objective) |
30분 |
서비스 복구 목표 시간 |
| RPO (Recovery Point Objective) |
1시간 |
데이터 손실 허용 범위 |
| 복구 우선순위 |
높음 |
비즈니스 크리티컬 서비스 |
| 장애조치 방식 |
자동 + 수동 |
HA는 자동, 지역 간은 수동 |
5.2.2 재해복구 시나리오
disaster_recovery_scenarios:
# 시나리오 1: 단일 가용성 영역 장애
zone_failure:
detection: "자동 (Azure Monitor)"
response: "자동 장애조치 (60초)"
rto: "2분"
rpo: "0분"
action: "Zone Redundant HA 활성화"
# 시나리오 2: 전체 리전 장애
region_failure:
detection: "수동 확인 필요"
response: "수동 장애조치"
rto: "30분"
rpo: "1시간"
action: "읽기 복제본을 마스터로 승격"
# 시나리오 3: 데이터 손상
data_corruption:
detection: "모니터링 알림 또는 사용자 신고"
response: "Point-in-Time Recovery"
rto: "4시간"
rpo: "손상 발생 시점까지"
action: "특정 시점으로 데이터베이스 복원"
5.2.3 복구 절차
recovery_procedures:
# 자동 장애조치 (Zone Redundant HA)
automatic_failover:
- step: "1. 장애 감지 (헬스 체크 실패)"
duration: "30초"
- step: "2. Standby 승격 결정"
duration: "15초"
- step: "3. DNS 업데이트 및 트래픽 전환"
duration: "15초"
- step: "4. 애플리케이션 연결 재시도"
duration: "자동"
# 수동 지역 간 장애조치
manual_failover:
- step: "1. 주 리전 장애 확인"
responsible: "DBA/운영팀"
- step: "2. 읽기 복제본 상태 확인"
responsible: "DBA"
- step: "3. 복제본을 마스터로 승격"
responsible: "DBA"
command: "az postgres flexible-server replica promote"
- step: "4. 애플리케이션 연결 문자열 업데이트"
responsible: "개발팀"
- step: "5. DNS 레코드 업데이트"
responsible: "네트워크팀"
- step: "6. 서비스 상태 확인"
responsible: "운영팀"
6. 모니터링 및 알림
6.1 모니터링 지표
6.1.1 시스템 메트릭
| 메트릭 분류 |
지표명 |
임계값 |
알림 레벨 |
| CPU 사용률 |
cpu_percent |
> 80% |
Warning |
| 메모리 사용률 |
memory_percent |
> 85% |
Warning |
| 스토리지 사용률 |
storage_percent |
> 75% |
Warning |
| IOPS 사용률 |
iops_percent |
> 80% |
Warning |
| 연결 수 |
active_connections |
> 150 |
Critical |
| 복제 지연 |
replica_lag_seconds |
> 300 |
Critical |
6.1.2 성능 메트릭
| 메트릭 분류 |
지표명 |
목표값 |
임계값 |
| 평균 응답시간 |
avg_query_time |
< 100ms |
> 500ms |
| 트랜잭션 처리량 |
transactions_per_second |
> 100 TPS |
< 50 TPS |
| 캐시 적중률 |
buffer_cache_hit_ratio |
> 95% |
< 90% |
| 데드락 발생률 |
deadlock_rate |
0 |
> 5/hour |
| 슬로우 쿼리 비율 |
slow_query_percentage |
< 1% |
> 5% |
6.1.3 비즈니스 메트릭
business_metrics:
# 상품변경 성공률
product_change_success_rate:
target: "> 95%"
warning: "< 90%"
critical: "< 80%"
measurement: "성공한 요청 / 전체 요청 * 100"
# KOS 연동 성공률
kos_integration_success_rate:
target: "> 98%"
warning: "< 95%"
critical: "< 90%"
measurement: "성공한 연동 / 전체 연동 * 100"
# 평균 처리시간
avg_processing_time:
target: "< 5초"
warning: "> 10초"
critical: "> 30초"
measurement: "처리완료시간 - 요청시간"
6.2 알림 설정
6.2.1 알림 채널
| 채널 유형 |
용도 |
대상 |
| Microsoft Teams |
실시간 알림 |
운영팀, 개발팀 |
| Email |
중요 알림 |
DBA, 관리자 |
| SMS |
긴급 알림 |
담당자 |
| Azure Monitor |
자동 스케일링 |
시스템 |
6.2.2 알림 규칙
alert_rules:
# Critical 알림 (즉시 대응 필요)
critical_alerts:
- name: "데이터베이스 연결 실패"
condition: "connection_failed > 0"
duration: "1분"
channels: ["teams", "sms"]
- name: "복제 지연 임계 초과"
condition: "replica_lag > 300초"
duration: "2분"
channels: ["teams", "email"]
- name: "자동 장애조치 발생"
condition: "failover_event = true"
duration: "즉시"
channels: ["teams", "sms", "email"]
# Warning 알림 (주의 감시)
warning_alerts:
- name: "CPU 사용률 높음"
condition: "cpu_percent > 80%"
duration: "5분"
channels: ["teams"]
- name: "스토리지 사용률 높음"
condition: "storage_percent > 75%"
duration: "10분"
channels: ["teams", "email"]
- name: "느린 쿼리 증가"
condition: "slow_query_count > 10/분"
duration: "5분"
channels: ["teams"]
6.3 대시보드 구성
6.3.1 운영 대시보드
operational_dashboard:
# 실시간 상태
real_time_status:
- "데이터베이스 상태 (Primary/Standby)"
- "현재 연결 수"
- "진행 중인 트랜잭션 수"
- "복제 지연 시간"
# 성능 지표
performance_metrics:
- "CPU/메모리 사용률 (시계열)"
- "IOPS 및 처리량 (시계열)"
- "쿼리 응답시간 분포"
- "슬로우 쿼리 TOP 10"
# 비즈니스 지표
business_metrics:
- "상품변경 성공률 (일/주/월)"
- "KOS 연동 성공률 (일/주/월)"
- "사용자별 활동 통계"
- "오류 발생 추이"
7. 설치 및 구성
7.1 Azure 리소스 생성
7.1.1 리소스 그룹 및 네트워킹
# 1. 리소스 그룹 생성
az group create \
--name rg-phonebill-prod \
--location koreacentral
# 2. Virtual Network 생성 (이미 존재하는 경우 스킵)
az network vnet create \
--resource-group rg-phonebill-prod \
--name vnet-phonebill-prod \
--address-prefix 10.0.0.0/16
# 3. 데이터베이스 서브넷 생성
az network vnet subnet create \
--resource-group rg-phonebill-prod \
--vnet-name vnet-phonebill-prod \
--name subnet-database \
--address-prefix 10.0.2.0/24 \
--delegations Microsoft.DBforPostgreSQL/flexibleServers
7.1.2 PostgreSQL Flexible Server 생성
# 1. 주 데이터베이스 서버 생성
az postgres flexible-server create \
--resource-group rg-phonebill-prod \
--name phonebill-postgresql-prod \
--location koreacentral \
--admin-user dbadmin \
--admin-password 'ProductChange2025Prod@#$' \
--sku-name Standard_D4s_v3 \
--tier GeneralPurpose \
--storage-size 256 \
--storage-auto-grow Enabled \
--version 14 \
--high-availability ZoneRedundant \
--standby-zone 2 \
--backup-retention 35 \
--geo-redundant-backup Enabled \
--vnet vnet-phonebill-prod \
--subnet subnet-database \
--private-dns-zone phonebill-prod.private.postgres.database.azure.com
# 2. 데이터베이스 생성
az postgres flexible-server db create \
--resource-group rg-phonebill-prod \
--server-name phonebill-postgresql-prod \
--database-name product_change_db
7.1.3 읽기 전용 복제본 생성
# 읽기 전용 복제본 생성 (Korea South)
az postgres flexible-server replica create \
--resource-group rg-phonebill-prod \
--replica-name phonebill-postgresql-replica \
--source-server phonebill-postgresql-prod \
--location koreasouth \
--sku-name Standard_D2s_v3
7.2 데이터베이스 초기 설정
7.2.1 스키마 및 초기 데이터 생성
# 1. 스키마 파일 적용
psql -h phonebill-postgresql-prod.postgres.database.azure.com \
-U dbadmin \
-d product_change_db \
-f design/backend/database/product-change-schema.psql
# 2. 초기 설정 확인
psql -h phonebill-postgresql-prod.postgres.database.azure.com \
-U dbadmin \
-d product_change_db \
-c "\dt product_change.*"
7.2.2 성능 튜닝 매개변수 적용
# PostgreSQL 서버 매개변수 설정
az postgres flexible-server parameter set \
--resource-group rg-phonebill-prod \
--server-name phonebill-postgresql-prod \
--name shared_buffers --value 4194304 # 4GB
az postgres flexible-server parameter set \
--resource-group rg-phonebill-prod \
--server-name phonebill-postgresql-prod \
--name effective_cache_size --value 12582912 # 12GB
az postgres flexible-server parameter set \
--resource-group rg-phonebill-prod \
--server-name phonebill-postgresql-prod \
--name work_mem --value 32768 # 32MB
az postgres flexible-server parameter set \
--resource-group rg-phonebill-prod \
--server-name phonebill-postgresql-prod \
--name max_connections --value 200
7.3 보안 구성
7.3.1 방화벽 및 네트워크 규칙
# 1. AKS 서브넷에서의 접근 허용
az postgres flexible-server firewall-rule create \
--resource-group rg-phonebill-prod \
--name phonebill-postgresql-prod \
--rule-name allow-aks-subnet \
--start-ip-address 10.0.1.0 \
--end-ip-address 10.0.1.255
# 2. SSL 강제 설정
az postgres flexible-server parameter set \
--resource-group rg-phonebill-prod \
--server-name phonebill-postgresql-prod \
--name require_secure_transport --value on
7.3.2 사용자 계정 및 권한 설정
-- 애플리케이션별 사용자 생성 스크립트 실행
psql -h phonebill-postgresql-prod.postgres.database.azure.com \
-U dbadmin \
-d product_change_db \
-c "
-- 애플리케이션 사용자 생성 및 권한 부여
CREATE USER product_change_app WITH PASSWORD 'PCApp2025Prod@#';
GRANT CONNECT ON DATABASE product_change_db TO product_change_app;
GRANT USAGE ON SCHEMA product_change TO product_change_app;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA product_change TO product_change_app;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA product_change TO product_change_app;
-- 읽기 전용 사용자 생성
CREATE USER product_change_readonly WITH PASSWORD 'PCRead2025Prod@#';
GRANT CONNECT ON DATABASE product_change_db TO product_change_readonly;
GRANT USAGE ON SCHEMA product_change TO product_change_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA product_change TO product_change_readonly;
"
7.4 모니터링 설정
7.4.1 Azure Monitor 통합
# 1. Log Analytics 워크스페이스 생성
az monitor log-analytics workspace create \
--resource-group rg-phonebill-prod \
--workspace-name law-phonebill-prod \
--location koreacentral
# 2. 진단 설정 활성화
az monitor diagnostic-settings create \
--resource-group rg-phonebill-prod \
--name diagnostic-postgresql \
--resource phonebill-postgresql-prod \
--resource-type Microsoft.DBforPostgreSQL/flexibleServers \
--workspace law-phonebill-prod \
--logs '[{"category":"PostgreSQLLogs","enabled":true}]' \
--metrics '[{"category":"AllMetrics","enabled":true}]'
7.4.2 알림 규칙 생성
# CPU 사용률 높음 알림
az monitor metrics alert create \
--resource-group rg-phonebill-prod \
--name alert-high-cpu \
--description "데이터베이스 CPU 사용률이 80%를 초과했습니다" \
--severity 2 \
--condition "avg cpu_percent > 80" \
--window-size 5m \
--evaluation-frequency 1m \
--target-resource-id "/subscriptions/{subscription-id}/resourceGroups/rg-phonebill-prod/providers/Microsoft.DBforPostgreSQL/flexibleServers/phonebill-postgresql-prod"
# 연결 수 임계 초과 알림
az monitor metrics alert create \
--resource-group rg-phonebill-prod \
--name alert-high-connections \
--description "데이터베이스 연결 수가 150을 초과했습니다" \
--severity 1 \
--condition "avg active_connections > 150" \
--window-size 1m \
--evaluation-frequency 1m \
--target-resource-id "/subscriptions/{subscription-id}/resourceGroups/rg-phonebill-prod/providers/Microsoft.DBforPostgreSQL/flexibleServers/phonebill-postgresql-prod"
8. 운영 절차
8.1 일상 운영 체크리스트
8.1.1 일일 점검 항목
daily_checklist:
system_health:
- [ ] 데이터베이스 서비스 상태 확인
- [ ] Primary/Standby 상태 정상 여부
- [ ] 복제 지연 시간 확인 (< 1분)
- [ ] CPU/메모리/스토리지 사용률 확인
performance_monitoring:
- [ ] 슬로우 쿼리 로그 검토
- [ ] 대기 이벤트 분석
- [ ] 연결 풀 상태 확인
- [ ] 캐시 적중률 확인
security_audit:
- [ ] 로그인 실패 시도 검토
- [ ] 권한 변경 이력 확인
- [ ] 비정상 접근 패턴 검토
backup_verification:
- [ ] 자동 백업 성공 여부 확인
- [ ] 백업 파일 무결성 검사
- [ ] 복구 테스트 (주 1회)
8.1.2 주간 점검 항목
weekly_checklist:
capacity_planning:
- [ ] 스토리지 증가 추세 분석
- [ ] 트랜잭션 볼륨 추세 분석
- [ ] 동시 사용자 수 추세 분석
performance_optimization:
- [ ] 인덱스 사용률 분석
- [ ] 쿼리 계획 변경 검토
- [ ] 통계 정보 업데이트 상태 확인
security_maintenance:
- [ ] 패치 적용 가능 여부 확인
- [ ] 사용자 계정 정기 검토
- [ ] 인증서 만료일 확인
8.2 장애 대응 절차
8.2.1 장애 심각도 분류
| 심각도 |
설명 |
대응시간 |
에스컬레이션 |
| P1 (Critical) |
서비스 완전 중단 |
15분 |
즉시 관리팀 호출 |
| P2 (High) |
성능 심각 저하 |
1시간 |
업무시간 내 대응 |
| P3 (Medium) |
부분적 기능 장애 |
4시간 |
정규 업무시간 대응 |
| P4 (Low) |
경미한 성능 저하 |
24시간 |
다음 정기 점검 시 |
8.2.2 P1 장애 대응 절차
p1_incident_response:
immediate_actions:
- step: "1. 장애 상황 파악 및 확인"
duration: "5분"
responsible: "운영팀"
- step: "2. 관리팀 및 개발팀 즉시 호출"
duration: "즉시"
responsible: "운영팀"
- step: "3. 장애 원인 초기 분석"
duration: "10분"
responsible: "DBA"
recovery_actions:
- step: "4. 자동 장애조치 상태 확인"
duration: "2분"
action: "Zone Redundant HA 동작 확인"
- step: "5. 수동 장애조치 결정"
duration: "5분"
condition: "자동 장애조치 실패 시"
- step: "6. 읽기 복제본으로 긴급 전환"
duration: "10분"
condition: "주 리전 전체 장애 시"
communication:
- step: "7. 고객 공지 발송"
duration: "장애 확인 후 30분 내"
responsible: "CS팀"
- step: "8. 복구 상황 업데이트"
frequency: "30분마다"
responsible: "운영팀"
8.3 정기 유지보수
8.3.1 월간 유지보수 작업
monthly_maintenance:
performance_optimization:
- "통계 정보 수동 업데이트"
- "미사용 인덱스 정리"
- "슬로우 쿼리 패턴 분석 및 최적화"
- "파티션 정리 (12개월 이전 로그)"
security_hardening:
- "사용자 계정 정기 검토"
- "권한 최소화 원칙 적용"
- "패치 적용 계획 수립"
- "취약점 스캔 실시"
capacity_management:
- "향후 6개월 용량 예측"
- "스토리지 확장 계획 수립"
- "성능 개선 방안 도출"
- "비용 최적화 검토"
9. 비용 관리
9.1 예상 비용 분석
9.1.1 월간 운영 비용 (USD)
| 구성 요소 |
사양 |
월간 비용 |
연간 비용 |
| Primary DB |
Standard_D4s_v3, 256GB, HA |
$820 |
$9,840 |
| Read Replica |
Standard_D2s_v3, 256GB |
$290 |
$3,480 |
| 백업 스토리지 |
35일 보존, 지리적 복제 |
$150 |
$1,800 |
| 네트워크 비용 |
Private Endpoint, 데이터 전송 |
$80 |
$960 |
| 모니터링 |
Log Analytics, 메트릭 수집 |
$60 |
$720 |
| 총 예상 비용 |
|
$1,400 |
$16,800 |
9.1.2 비용 최적화 방안
cost_optimization:
# Reserved Instance 활용
reserved_instances:
savings: "~30%"
commitment: "1년 또는 3년"
estimated_savings: "$4,200/년"
# 스토리지 최적화
storage_optimization:
- "로그 데이터 정기 정리"
- "백업 압축률 향상"
- "불필요한 인덱스 제거"
estimated_savings: "$600/년"
# 네트워크 비용 절감
network_optimization:
- "데이터 전송량 최적화"
- "캐시 활용률 향상"
- "압축 전송 적용"
estimated_savings: "$200/년"
9.2 비용 모니터링
9.2.1 비용 추적 메트릭
cost_tracking:
daily_monitoring:
- "데이터베이스 컴퓨팅 비용"
- "스토리지 사용량 및 비용"
- "백업 스토리지 비용"
- "네트워크 데이터 전송 비용"
monthly_analysis:
- "비용 추세 분석"
- "예산 대비 실제 비용"
- "비용 효율성 지표"
- "최적화 기회 식별"
cost_alerts:
- threshold: "$1,600/월"
action: "예산 초과 알림"
- threshold: "20% 증가"
action: "비정상 증가 알림"
10. 검증 및 테스트
10.1 설치 검증
10.1.1 기능 검증 테스트
-- 1. 연결 테스트
\conninfo
-- 2. 스키마 존재 확인
SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'product_change';
-- 3. 테이블 생성 확인
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'product_change'
ORDER BY table_name;
-- 4. 인덱스 생성 확인
SELECT indexname, tablename FROM pg_indexes
WHERE schemaname = 'product_change'
ORDER BY tablename, indexname;
-- 5. 기본 데이터 확인
SELECT service_name, state FROM product_change.pc_circuit_breaker_state;
10.1.2 성능 검증 테스트
-- 1. 샘플 데이터 삽입
INSERT INTO product_change.pc_product_change_history
(line_number, customer_id, current_product_code, target_product_code, process_status)
VALUES
('010-1234-5678', 'CUST001', 'PLAN_A', 'PLAN_B', 'REQUESTED'),
('010-2345-6789', 'CUST002', 'PLAN_B', 'PLAN_C', 'COMPLETED'),
('010-3456-7890', 'CUST003', 'PLAN_C', 'PLAN_A', 'FAILED');
-- 2. 인덱스 사용 확인
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM product_change.pc_product_change_history
WHERE line_number = '010-1234-5678'
AND process_status = 'REQUESTED';
-- 3. 성능 측정
SELECT
query,
calls,
mean_exec_time,
total_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 5;
10.2 고가용성 테스트
10.2.1 장애조치 테스트
# 1. 현재 Primary 서버 상태 확인
az postgres flexible-server show \
--resource-group rg-phonebill-prod \
--name phonebill-postgresql-prod \
--query "{name:name,state:state,haState:highAvailability.state}"
# 2. 강제 장애조치 테스트 (계획된 유지보수 시)
az postgres flexible-server restart \
--resource-group rg-phonebill-prod \
--name phonebill-postgresql-prod \
--restart-ha-server
# 3. 장애조치 후 상태 확인
az postgres flexible-server show \
--resource-group rg-phonebill-prod \
--name phonebill-postgresql-prod \
--query "{name:name,state:state,haState:highAvailability.state}"
10.2.2 복구 테스트
# 1. Point-in-Time Recovery 테스트
az postgres flexible-server restore \
--resource-group rg-phonebill-prod \
--name phonebill-postgresql-test \
--source-server phonebill-postgresql-prod \
--restore-time "2025-09-08T10:00:00Z"
# 2. 복구된 서버 검증
psql -h phonebill-postgresql-test.postgres.database.azure.com \
-U dbadmin \
-d product_change_db \
-c "SELECT COUNT(*) FROM product_change.pc_product_change_history;"
# 3. 테스트 서버 정리
az postgres flexible-server delete \
--resource-group rg-phonebill-prod \
--name phonebill-postgresql-test \
--yes
11. 프로젝트 일정
11.1 설치 일정
| 단계 |
작업 내용 |
소요 시간 |
담당자 |
의존성 |
| Phase 1 |
Azure 리소스 생성 |
2시간 |
데옵스 |
- |
| Phase 2 |
네트워크 구성 |
1시간 |
데옵스 |
Phase 1 |
| Phase 3 |
PostgreSQL 서버 생성 |
2시간 |
데옵스 |
Phase 2 |
| Phase 4 |
스키마 및 초기 데이터 생성 |
1시간 |
백엔더 |
Phase 3 |
| Phase 5 |
보안 구성 |
2시간 |
데옵스 |
Phase 4 |
| Phase 6 |
모니터링 설정 |
2시간 |
데옵스 |
Phase 5 |
| Phase 7 |
테스트 및 검증 |
4시간 |
백엔더, QA매니저 |
Phase 6 |
| Phase 8 |
문서화 및 인수인계 |
2시간 |
데옵스 |
Phase 7 |
| 총 소요 시간 |
|
16시간 |
|
|
11.2 주요 이정표
milestones:
M1_Infrastructure_Ready:
date: "설치 시작일"
deliverable: "Azure 리소스 및 네트워크 구성 완료"
M2_Database_Deployed:
date: "설치 시작일 + 1일"
deliverable: "PostgreSQL 서버 및 스키마 배포 완료"
M3_Security_Configured:
date: "설치 시작일 + 2일"
deliverable: "보안 설정 및 모니터링 구성 완료"
M4_Testing_Complete:
date: "설치 시작일 + 3일"
deliverable: "기능/성능/가용성 테스트 완료"
M5_Production_Ready:
date: "설치 시작일 + 4일"
deliverable: "운영환경 준비 완료"
12. 위험 관리
12.1 위험 요소 분석
| 위험 요소 |
발생 가능성 |
영향도 |
위험 수준 |
대응 방안 |
| Azure 서비스 장애 |
낮음 |
높음 |
중간 |
다중 리전 구성, SLA 모니터링 |
| 네트워크 연결 오류 |
중간 |
중간 |
중간 |
Private Endpoint, 네트워크 이중화 |
| 데이터 손실 |
낮음 |
높음 |
중간 |
자동 백업, 지리적 복제 |
| 성능 저하 |
중간 |
중간 |
중간 |
모니터링 강화, 자동 스케일링 |
| 보안 침해 |
낮음 |
높음 |
중간 |
다층 보안, 정기 감사 |
12.2 비상 계획
12.2.1 데이터 센터 장애
datacenter_failure:
scenario: "Korea Central 리전 전체 장애"
impact: "서비스 중단 30분"
response_plan:
- "Korea South 읽기 복제본을 마스터로 승격"
- "애플리케이션 연결 문자열 업데이트"
- "DNS 레코드 변경"
- "서비스 상태 모니터링"
recovery_time: "30분"
12.2.2 데이터 손상
data_corruption:
scenario: "애플리케이션 버그로 인한 데이터 손상"
impact: "일부 데이터 불일치"
response_plan:
- "영향받은 데이터 범위 확인"
- "Point-in-Time Recovery 실행"
- "데이터 무결성 검증"
- "애플리케이션 버그 수정"
recovery_time: "4시간"
13. 승인 및 검토
13.1 검토 사항
13.2 승인자
| 역할 |
이름 |
승인 사항 |
서명 |
일자 |
| 프로젝트 매니저 |
김기획 |
전체 계획 승인 |
|
|
| 기술 아키텍트 |
이개발 |
기술 사양 승인 |
|
|
| 보안 관리자 |
정테스트 |
보안 정책 승인 |
|
|
| 인프라 관리자 |
최운영 |
인프라 구성 승인 |
|
|
부록
A. 참조 문서
B. 연락처
C. 응급상황 연락처
- 24시간 운영센터: +82-2-1234-5678
- DBA 긴급전화: +82-10-1234-5678
- 인프라 관리자: +82-10-2345-6789
최운영/데옵스: Product-Change 서비스용 운영환경 데이터베이스 설치 계획서를 완성했습니다. Azure Database for PostgreSQL Flexible Server의 Zone Redundant HA를 활용한 고가용성 구성과 엔터프라이즈급 보안, 그리고 체계적인 모니터링 및 재해복구 방안을 포함하여 99.9% 가용성 목표 달성이 가능하도록 설계했습니다.