Bill-Inquiry 서비스 운영환경 데이터베이스 설치 계획서
1. 개요
1.1 설치 목적
- Bill-Inquiry 서비스의 운영환경 데이터베이스 구성
- Azure Database for PostgreSQL Flexible Server 활용한 관리형 데이터베이스 구축
- 고가용성, 고성능, 엔터프라이즈급 보안을 제공하는 운영환경 데이터베이스 시스템 구축
1.2 대상 서비스
- 서비스명: Bill-Inquiry Service (요금 조회 서비스)
- 데이터베이스:
bill_inquiry_db
- 운영환경: Azure 운영환경 (99.9% 가용성 목표)
- 예상 사용량: Peak 1,000 동시 사용자 지원
1.3 참조 문서
- 물리 아키텍처 설계서:
design/backend/physical/physical-architecture-prod.md
- 데이터 설계서:
design/backend/database/bill-inquiry.md
- 데이터 설계 종합:
design/backend/database/data-design-summary.md
- 스키마 스크립트:
design/backend/database/bill-inquiry-schema.psql
2. Azure Database for PostgreSQL Flexible Server 구성
2.1 기본 설정
| 구성 항목 |
설정 값 |
설명 |
| 서버 이름 |
phonebill-bill-inquiry-prod-pg |
Bill-Inquiry 운영환경 PostgreSQL |
| 리전 |
Korea Central |
주 리전 |
| PostgreSQL 버전 |
14 |
안정적인 LTS 버전 |
| 서비스 티어 |
General Purpose |
범용 용도 (운영환경) |
| 컴퓨팅 크기 |
Standard_D4s_v3 |
4 vCPU, 16GB RAM |
| 스토리지 |
256GB Premium SSD |
고성능 SSD, 자동 확장 활성화 |
2.2 고가용성 구성
| 구성 항목 |
설정 값 |
설명 |
| 고가용성 모드 |
Zone Redundant HA |
영역 간 중복화 |
| 주 가용 영역 |
1 |
Korea Central 가용 영역 1 |
| 대기 가용 영역 |
2 |
Korea Central 가용 영역 2 |
| 자동 장애조치 |
활성화 |
60초 이내 자동 장애조치 |
| SLA |
99.99% |
고가용성 보장 |
2.3 백업 및 복구
| 구성 항목 |
설정 값 |
설명 |
| 백업 보존 기간 |
35일 |
최대 보존 기간 |
| 지리적 중복 백업 |
활성화 |
Korea South 리전에 복제 |
| Point-in-Time 복구 |
활성화 |
5분 단위 복구 가능 |
| 자동 백업 시간 |
02:00 KST |
트래픽이 적은 시간대 |
3. 네트워크 및 보안 구성
3.1 네트워크 설정
| 구성 항목 |
설정 값 |
설명 |
| 연결 방법 |
Private Access (VNet 통합) |
VNet 내부 전용 접근 |
| 가상 네트워크 |
phonebill-vnet |
기존 VNet 활용 |
| 서브넷 |
Database Subnet (10.0.2.0/24) |
데이터베이스 전용 서브넷 |
| Private Endpoint |
활성화 |
보안 강화된 연결 |
| DNS 영역 |
privatelink.postgres.database.azure.com |
Private DNS 영역 |
3.2 보안 설정
| 구성 항목 |
설정 값 |
설명 |
| TLS 버전 |
1.2 이상 |
암호화 통신 강제 |
| SSL 강제 |
활성화 |
비암호화 연결 차단 |
| 방화벽 규칙 |
VNet 내부만 허용 |
AKS 서브넷만 접근 허용 |
| 인증 방법 |
PostgreSQL Authentication |
기본 인증 + Azure AD 통합 |
| 암호화 |
AES-256 |
저장 데이터 암호화 (TDE) |
3.3 Azure AD 통합
| 구성 항목 |
설정 값 |
설명 |
| Azure AD 인증 |
활성화 |
관리형 ID 지원 |
| AD 관리자 |
phonebill-admin |
Azure AD 기반 관리자 |
| 서비스 주체 |
bill-inquiry-service-identity |
애플리케이션용 관리형 ID |
4. 데이터베이스 및 사용자 구성
4.1 데이터베이스 생성
-- 메인 데이터베이스 생성
CREATE DATABASE bill_inquiry_db
WITH ENCODING = 'UTF8'
LC_COLLATE = 'en_US.UTF-8'
LC_CTYPE = 'en_US.UTF-8'
TEMPLATE = template0;
-- 타임존 설정
ALTER DATABASE bill_inquiry_db SET timezone TO 'Asia/Seoul';
-- 확장 모듈 설치
\c bill_inquiry_db
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_stat_statements";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
4.2 사용자 및 권한 설정
-- 애플리케이션 사용자 생성
CREATE USER bill_app_user WITH PASSWORD 'Complex#Password#2025!';
-- 읽기 전용 사용자 생성 (모니터링/분석용)
CREATE USER bill_readonly_user WITH PASSWORD 'ReadOnly#Password#2025!';
-- 백업 전용 사용자 생성
CREATE USER bill_backup_user WITH PASSWORD 'Backup#Password#2025!';
-- 애플리케이션 사용자 권한
GRANT CONNECT ON DATABASE bill_inquiry_db TO bill_app_user;
GRANT USAGE ON SCHEMA public TO bill_app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO bill_app_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO bill_app_user;
-- 읽기 전용 사용자 권한
GRANT CONNECT ON DATABASE bill_inquiry_db TO bill_readonly_user;
GRANT USAGE ON SCHEMA public TO bill_readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bill_readonly_user;
-- 기본 권한 설정 (신규 테이블에 자동 적용)
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO bill_app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO bill_readonly_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO bill_app_user;
5. 성능 최적화 설정
5.1 PostgreSQL 파라미터 튜닝
-- 연결 풀링 설정
ALTER SYSTEM SET max_connections = 200;
ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_statements';
-- 메모리 설정 (16GB RAM 기준)
ALTER SYSTEM SET shared_buffers = '4GB';
ALTER SYSTEM SET effective_cache_size = '12GB';
ALTER SYSTEM SET work_mem = '64MB';
ALTER SYSTEM SET maintenance_work_mem = '1GB';
-- 체크포인트 설정
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
ALTER SYSTEM SET max_wal_size = '4GB';
ALTER SYSTEM SET min_wal_size = '1GB';
-- 로깅 설정
ALTER SYSTEM SET log_min_duration_statement = 1000;
ALTER SYSTEM SET log_checkpoints = on;
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;
-- 통계 수집 설정
ALTER SYSTEM SET track_activities = on;
ALTER SYSTEM SET track_counts = on;
ALTER SYSTEM SET track_io_timing = on;
-- 설정 적용
SELECT pg_reload_conf();
5.2 연결 풀링 구성
| 구성 항목 |
설정 값 |
설명 |
| 최대 연결 수 |
200 |
동시 연결 제한 |
| HikariCP Pool Size |
15 |
애플리케이션 연결 풀 크기 |
| 연결 타임아웃 |
30초 |
연결 획득 타임아웃 |
| 유휴 타임아웃 |
10분 |
유휴 연결 해제 시간 |
| 최대 라이프타임 |
30분 |
연결 최대 생존 시간 |
6. 스키마 및 데이터 초기화
6.1 스키마 적용
# 스키마 파일 적용
psql -h phonebill-bill-inquiry-prod-pg.postgres.database.azure.com \
-U bill_app_user \
-d bill_inquiry_db \
-f design/backend/database/bill-inquiry-schema.psql
6.2 초기 데이터 확인
-- 테이블 생성 확인
SELECT table_name, table_type
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;
-- 인덱스 생성 확인
SELECT schemaname, tablename, indexname
FROM pg_indexes
WHERE schemaname = 'public'
ORDER BY tablename, indexname;
-- 시스템 설정 확인
SELECT config_key, config_value, description
FROM system_config
WHERE is_active = true
ORDER BY config_key;
7. 읽기 전용 복제본 구성
7.1 읽기 복제본 생성
| 구성 항목 |
설정 값 |
설명 |
| 복제본 이름 |
phonebill-bill-inquiry-prod-pg-replica |
읽기 전용 복제본 |
| 리전 |
Korea South |
재해복구용 다른 리전 |
| 컴퓨팅 크기 |
Standard_D2s_v3 |
2 vCPU, 8GB RAM (읽기용) |
| 스토리지 |
256GB Premium SSD |
마스터와 동일 |
| 용도 |
읽기 부하 분산 및 재해복구 |
- |
7.2 읽기 복제본 활용
application_config:
# Spring Boot DataSource 설정 예시
datasource:
master:
url: jdbc:postgresql://phonebill-bill-inquiry-prod-pg.postgres.database.azure.com:5432/bill_inquiry_db
username: bill_app_user
readonly:
url: jdbc:postgresql://phonebill-bill-inquiry-prod-pg-replica.postgres.database.azure.com:5432/bill_inquiry_db
username: bill_readonly_user
# 읽기/쓰기 분리 라우팅
routing:
write_operations: master
read_operations: readonly
analytics_queries: readonly
8. 모니터링 및 알림 설정
8.1 Azure Monitor 통합
| 모니터링 항목 |
알림 임계값 |
대응 방안 |
| CPU 사용률 |
85% 이상 |
Auto-scaling 또는 수동 스케일업 |
| 메모리 사용률 |
90% 이상 |
연결 최적화 또는 스케일업 |
| 디스크 사용률 |
80% 이상 |
스토리지 자동 확장 |
| 연결 수 |
180개 이상 (90%) |
연결 풀 튜닝 |
| 응답 시간 |
500ms 이상 |
쿼리 최적화 검토 |
| 실패한 연결 |
10회/분 이상 |
네트워크 및 보안 설정 점검 |
8.2 로그 분석 설정
-- 슬로우 쿼리 모니터링
SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements
WHERE total_time > 60000 -- 1분 이상 쿼리
ORDER BY total_time DESC
LIMIT 10;
-- 데이터베이스 통계
SELECT datname, numbackends, xact_commit, xact_rollback,
blks_read, blks_hit,
100.0 * blks_hit / (blks_hit + blks_read) as cache_hit_ratio
FROM pg_stat_database
WHERE datname = 'bill_inquiry_db';
9. 백업 및 재해복구 계획
9.1 백업 전략
| 백업 유형 |
주기 |
보존 기간 |
위치 |
| 자동 백업 |
일 1회 (02:00 KST) |
35일 |
Azure 백업 스토리지 |
| 지리적 백업 |
자동 복제 |
35일 |
Korea South 리전 |
| Point-in-Time |
연속 |
35일 내 5분 단위 |
WAL 로그 기반 |
| 논리적 백업 |
주 1회 (일요일) |
3개월 |
Azure Blob Storage |
9.2 재해복구 절차
RTO/RPO 목표
- RTO (복구 시간 목표): 30분 이내
- RPO (복구 지점 목표): 5분 이내
장애 시나리오별 대응
-
주 서버 장애
- Azure 자동 장애조치 (60초 이내)
- DNS 업데이트 (자동)
- 애플리케이션 재연결 (자동)
-
리전 전체 장애
- 읽기 복제본을 마스터로 승격
- 애플리케이션 설정 변경
- 트래픽 라우팅 변경
-
데이터 손상
- Point-in-Time 복구 수행
- 별도 서버에서 복구 후 전환
- 데이터 무결성 검증
10. 보안 강화 방안
10.1 접근 제어
-- 특권 사용자 역할 생성
CREATE ROLE bill_admin;
GRANT ALL PRIVILEGES ON DATABASE bill_inquiry_db TO bill_admin;
-- 개발자 역할 생성 (제한적 권한)
CREATE ROLE bill_developer;
GRANT CONNECT ON DATABASE bill_inquiry_db TO bill_developer;
GRANT USAGE ON SCHEMA public TO bill_developer;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bill_developer;
-- 감사 역할 생성
CREATE ROLE bill_auditor;
GRANT CONNECT ON DATABASE bill_inquiry_db TO bill_auditor;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bill_auditor;
10.2 데이터 암호화
| 암호화 유형 |
구현 방법 |
대상 데이터 |
| 저장 데이터 암호화 |
TDE (투명한 데이터 암호화) |
모든 테이블 데이터 |
| 전송 데이터 암호화 |
TLS 1.2+ |
클라이언트-서버 간 통신 |
| 컬럼 수준 암호화 |
AES-256 |
고객명, 요금정보 등 민감정보 |
| 백업 암호화 |
AES-256 |
모든 백업 파일 |
10.3 감사 설정
-- 감사 로그 활성화
ALTER SYSTEM SET log_statement = 'all';
ALTER SYSTEM SET log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h ';
ALTER SYSTEM SET log_lock_waits = on;
ALTER SYSTEM SET log_temp_files = 10240; -- 10MB 이상 임시 파일 로그
-- pg_audit 확장 설치 (필요시)
-- CREATE EXTENSION pg_audit;
-- ALTER SYSTEM SET pg_audit.log = 'write,ddl';
11. 비용 최적화
11.1 예상 비용 (월간, USD)
| 구성 요소 |
사양 |
예상 비용 |
최적화 방안 |
| 메인 서버 |
Standard_D4s_v3 |
$450 |
Reserved Instance (1년 약정 20% 절약) |
| 읽기 복제본 |
Standard_D2s_v3 |
$225 |
필요시에만 활성화 |
| 스토리지 (256GB) |
Premium SSD |
$50 |
사용량 기반 자동 확장 |
| 백업 스토리지 |
지리적 중복 |
$20 |
보존 기간 최적화 |
| 네트워킹 |
데이터 전송 |
$10 |
VNet 내부 통신 활용 |
| 총 예상 비용 |
|
$755 |
Reserved Instance 시 $605 |
11.2 비용 모니터링
-- 리소스 사용량 모니터링 쿼리
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size,
pg_total_relation_size(schemaname||'.'||tablename) as size_bytes
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
-- 인덱스 사용률 확인
SELECT
t.tablename,
i.indexname,
i.idx_tup_read,
i.idx_tup_fetch,
pg_size_pretty(pg_relation_size(i.indexname::regclass)) as index_size
FROM pg_stat_user_indexes i
JOIN pg_stat_user_tables t ON i.relid = t.relid
WHERE i.idx_tup_read = 0
ORDER BY pg_relation_size(i.indexname::regclass) DESC;
12. 설치 실행 계획
12.1 설치 단계
| 단계 |
작업 내용 |
예상 시간 |
담당자 |
| 1 |
Azure PostgreSQL Flexible Server 생성 |
30분 |
데옵스 |
| 2 |
네트워크 및 보안 설정 |
20분 |
데옵스 |
| 3 |
고가용성 및 백업 설정 |
15분 |
데옵스 |
| 4 |
데이터베이스 및 사용자 생성 |
10분 |
백엔더 |
| 5 |
스키마 적용 및 초기화 |
15분 |
백엔더 |
| 6 |
읽기 복제본 생성 |
20분 |
데옵스 |
| 7 |
모니터링 및 알림 설정 |
30분 |
데옵스 |
| 8 |
성능 테스트 및 튜닝 |
60분 |
백엔더/QA매니저 |
| 총 예상 시간 |
|
3시간 20분 |
|
12.2 사전 준비사항
prerequisites:
azure_resources:
- Resource Group: phonebill-rg
- Virtual Network: phonebill-vnet
- Database Subnet: 10.0.2.0/24
- Private DNS Zone: privatelink.postgres.database.azure.com
azure_permissions:
- Contributor role on Resource Group
- Network Contributor role on VNet
- PostgreSQL Flexible Server Contributor
network_connectivity:
- AKS cluster network access
- Azure CLI access from deployment machine
- psql client tools installed
12.3 설치 스크립트
#!/bin/bash
# Bill-Inquiry 서비스 PostgreSQL 설치 스크립트
# 변수 설정
RESOURCE_GROUP="phonebill-rg"
SERVER_NAME="phonebill-bill-inquiry-prod-pg"
LOCATION="koreacentral"
ADMIN_USER="postgres"
ADMIN_PASSWORD="Complex#PostgreSQL#2025!"
DATABASE_NAME="bill_inquiry_db"
# PostgreSQL Flexible Server 생성
az postgres flexible-server create \
--resource-group $RESOURCE_GROUP \
--name $SERVER_NAME \
--location $LOCATION \
--admin-user $ADMIN_USER \
--admin-password "$ADMIN_PASSWORD" \
--sku-name Standard_D4s_v3 \
--tier GeneralPurpose \
--storage-size 256 \
--storage-auto-grow Enabled \
--version 14 \
--zone 1 \
--high-availability ZoneRedundant \
--standby-zone 2
# 데이터베이스 생성
az postgres flexible-server db create \
--resource-group $RESOURCE_GROUP \
--server-name $SERVER_NAME \
--database-name $DATABASE_NAME
# VNet 통합 설정
az postgres flexible-server vnet-rule create \
--resource-group $RESOURCE_GROUP \
--name allow-aks-subnet \
--server-name $SERVER_NAME \
--vnet-name phonebill-vnet \
--subnet database-subnet
# 백업 설정
az postgres flexible-server parameter set \
--resource-group $RESOURCE_GROUP \
--server-name $SERVER_NAME \
--name backup_retention_days \
--value 35
echo "PostgreSQL Flexible Server 설치 완료"
echo "Server: $SERVER_NAME.postgres.database.azure.com"
echo "Database: $DATABASE_NAME"
13. 테스트 계획
13.1 기능 테스트
-- 연결 테스트
\conninfo
-- 기본 성능 테스트
SELECT pg_size_pretty(pg_database_size('bill_inquiry_db')) as db_size;
-- 테이블 생성 및 CRUD 테스트
INSERT INTO system_config (config_key, config_value, description)
VALUES ('test.config', 'test_value', 'Test configuration');
SELECT * FROM system_config WHERE config_key = 'test.config';
DELETE FROM system_config WHERE config_key = 'test.config';
13.2 성능 테스트
# pgbench를 이용한 성능 테스트
pgbench -i -s 10 bill_inquiry_db -h $SERVER_NAME.postgres.database.azure.com -U bill_app_user
pgbench -c 50 -j 2 -T 300 bill_inquiry_db -h $SERVER_NAME.postgres.database.azure.com -U bill_app_user
13.3 장애복구 테스트
-
계획된 장애조치 테스트
- Azure Portal에서 수동 장애조치 수행
- 애플리케이션 연결 상태 확인
- 복구 시간 측정
-
백업 복구 테스트
- Point-in-Time 복구 수행
- 데이터 무결성 검증
- 복구 시간 측정
14. 운영 가이드
14.1 일상 운영 점검
daily_checklist:
- [ ] 서버 상태 및 가용성 확인
- [ ] CPU/메모리/디스크 사용률 점검
- [ ] 백업 성공 여부 확인
- [ ] 슬로우 쿼리 로그 검토
- [ ] 오류 로그 검토
- [ ] 연결 수 및 성능 지표 확인
weekly_checklist:
- [ ] 장애조치 메커니즘 테스트
- [ ] 백업 복구 테스트 수행
- [ ] 성능 통계 분석 및 튜닝
- [ ] 보안 패치 적용 검토
- [ ] 용량 계획 검토
monthly_checklist:
- [ ] 전체 시스템 성능 검토
- [ ] 비용 최적화 기회 분석
- [ ] 재해복구 계획 업데이트
- [ ] 보안 감사 수행
14.2 긴급 대응 절차
incident_response:
severity_1: # 서비스 중단
- immediate_action: 자동 장애조치 확인
- notification: 운영팀 즉시 알림
- escalation: 15분 내 관리자 호출
- recovery_target: 30분 내 서비스 복구
severity_2: # 성능 저하
- analysis: 성능 지표 분석
- optimization: 쿼리 튜닝 또는 리소스 증설
- timeline: 2시간 내 해결
severity_3: # 경미한 문제
- monitoring: 지속적 모니터링
- planning: 다음 정기 점검 시 해결
- timeline: 24시간 내 계획 수립
15. 결론
본 설치 계획서는 Bill-Inquiry 서비스의 운영환경에서 요구되는 고가용성, 고성능, 엔터프라이즈급 보안을 만족하는 Azure Database for PostgreSQL Flexible Server 구성을 제시합니다.
15.1 주요 특징
- 고가용성: Zone Redundant HA로 99.99% 가용성 보장
- 성능 최적화: Premium SSD, 읽기 복제본, 연결 풀링
- 보안 강화: VNet 통합, TLS 암호화, Azure AD 인증
- 재해복구: 35일 백업 보존, 지리적 중복, Point-in-Time 복구
- 비용 효율성: Reserved Instance 활용으로 20% 비용 절약
15.2 다음 단계
- 본 계획서 검토 및 승인 ✅
- Azure 리소스 생성 및 구성 수행
- 스키마 적용 및 초기화 실행
- 성능 테스트 및 튜닝 수행
- 모니터링 시스템 구축
- 운영 문서 작성 및 교육
작성일: 2025-09-08
작성자: 데옵스 (최운영), 백엔더 (이개발)
검토자: 아키텍트 (김기획), QA매니저 (정테스트)
승인자: 기획자 (김기획)