LifeMate 365 전체 MariaDB / MySQL DDL 스크립트
schema.sql · 18개 테이블 생성문
-- ============================================================================
-- LifeMate 365 (라이프메이트 365) - 통합 MariaDB / MySQL 데이터베이스 스키마
-- Engine: MariaDB 11.8+ / MySQL 8.0+
-- Character Set: utf8mb4 / Collation: utf8mb4_unicode_ci
-- Table Prefix: life_
-- Excludes: Sub-project tables (01 ~ 08 folders)
-- ============================================================================
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------------------------------------------------------
-- 1. [회원 및 인증 도메인]
-- ----------------------------------------------------------------------------
-- 1-1. 회원 기본 정보 테이블
DROP TABLE IF EXISTS `life_users`;
CREATE TABLE `life_users` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '회원 고유 식별 번호 (PK)',
`email` VARCHAR(191) NOT NULL COMMENT '회원 로그인 이메일 (Unique)',
`nickname` VARCHAR(50) NOT NULL COMMENT '회원 닉네임 / 활동명',
`real_name` VARCHAR(50) NULL DEFAULT NULL COMMENT '실명 성함',
`phone` VARCHAR(30) NULL DEFAULT NULL COMMENT '연락처 휴대폰 번호',
`password_hash` VARCHAR(255) NULL DEFAULT NULL COMMENT '비밀번호 해시 (소셜 회원은 Null)',
`age_group` ENUM('4050', '6064', '65plus', 'OTHER') NOT NULL DEFAULT '4050' COMMENT '연령대 구분',
`points_balance` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '현재 보유 누적 포인트 (출석/활동)',
`font_mode` ENUM('normal', 'large', 'xlarge') NOT NULL DEFAULT 'normal' COMMENT '선호 글자 크기 설정',
`lang_code` ENUM('ko', 'en', 'ja', 'zh') NOT NULL DEFAULT 'ko' COMMENT '선호 다국어 설정',
`status` ENUM('ACTIVE', 'SUSPENDED', 'WITHDRAWN') NOT NULL DEFAULT 'ACTIVE' COMMENT '계정 상태',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '가입 일시',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
`deleted_at` DATETIME NULL DEFAULT NULL COMMENT '탈퇴 일시 (소프트 딜리트)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_life_users_email` (`email`),
KEY `idx_life_users_status_created` (`status`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원 기본 정보 테이블';
-- 1-2. 소셜 간편 로그인 연동 계정 테이블
DROP TABLE IF EXISTS `life_social_accounts`;
CREATE TABLE `life_social_accounts` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '소셜 연동 식별 번호 (PK)',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '연결된 회원 ID (FK)',
`provider` ENUM('NAVER', 'KAKAO', 'GOOGLE') NOT NULL COMMENT '소셜 로그인 제공자',
`social_id` VARCHAR(191) NOT NULL COMMENT '소셜 제공자별 고유 ID (sub/id)',
`social_email` VARCHAR(191) NULL DEFAULT NULL COMMENT '소셜 프로필 이메일',
`connected_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '소셜 계정 최초 연동 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_life_social_provider_id` (`provider`, `social_id`),
KEY `idx_life_social_user_id` (`user_id`),
CONSTRAINT `fk_life_social_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='소셜(네이버/카카오/구글) 로그인 연동 계정';
-- 1-3. 회원 로그인 세션 관리 테이블
DROP TABLE IF EXISTS `life_user_sessions`;
CREATE TABLE `life_user_sessions` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '세션 고유 식별 번호',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '회원 ID (FK)',
`session_token` VARCHAR(128) NOT NULL COMMENT '세션 해시 토큰 (Unique)',
`ip_address` VARCHAR(45) NOT NULL COMMENT '접속 IP 주소 (IPv4/IPv6)',
`user_agent` VARCHAR(255) NULL DEFAULT NULL COMMENT '접속 브라우저 환경',
`expires_at` DATETIME NOT NULL COMMENT '세션 만료 일시',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '로그인 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_life_sessions_token` (`session_token`),
KEY `idx_life_sessions_user_expires` (`user_id`, `expires_at`),
CONSTRAINT `fk_life_sessions_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원 로그인 세션 토큰 관리';
-- ----------------------------------------------------------------------------
-- 2. [출석 체크 & 포인트 원장 도메인]
-- ----------------------------------------------------------------------------
-- 2-1. 일일 출석체크 기록 테이블
DROP TABLE IF EXISTS `life_attendance_logs`;
CREATE TABLE `life_attendance_logs` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '출석 기록 번호 (PK)',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '출석 회원 ID (FK)',
`check_date` DATE NOT NULL COMMENT '출석 일자 (YYYY-MM-DD)',
`points_reward` INT UNSIGNED NOT NULL DEFAULT 100 COMMENT '출석 지급 포인트',
`ip_address` VARCHAR(45) NOT NULL COMMENT '출석 요청 IP 주소',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '출석 도장 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_life_att_user_date` (`user_id`, `check_date`),
KEY `idx_life_att_check_date` (`check_date`),
CONSTRAINT `fk_life_att_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='일일 출석체크 도장 기록';
-- 2-2. 포인트 적립/차감 원장 테이블
DROP TABLE IF EXISTS `life_point_ledger`;
CREATE TABLE `life_point_ledger` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '원장 트랜잭션 번호 (PK)',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '회원 ID (FK)',
`point_amount` INT NOT NULL COMMENT '변동 포인트 (+/- 금액)',
`balance_after` INT UNSIGNED NOT NULL COMMENT '변동 후 최종 잔여 포인트',
`reason_code` ENUM('SIGNUP', 'ATTENDANCE', 'HEALTH_LOG', 'COMMUNITY', 'EVENT_REWARD', 'EXPIRATION') NOT NULL COMMENT '포인트 지급/차감 사유',
`description` VARCHAR(255) NOT NULL COMMENT '포인트 변동 상세 설명',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '원장 기록 일시',
PRIMARY KEY (`id`),
KEY `idx_life_points_user_created` (`user_id`, `created_at`),
CONSTRAINT `fk_life_points_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원 포인트 적립/차감 내역 원장';
-- ----------------------------------------------------------------------------
-- 3. [열린 방명록 & 커뮤니티 도메인]
-- ----------------------------------------------------------------------------
-- 3-1. 방명록 게시글 테이블
DROP TABLE IF EXISTS `life_guestbook_entries`;
CREATE TABLE `life_guestbook_entries` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '방명록 글 번호 (PK)',
`user_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '작성 회원 ID (비회원은 NULL)',
`author_name` VARCHAR(50) NOT NULL COMMENT '작성자 성함 / 닉네임',
`title` VARCHAR(100) NOT NULL COMMENT '방명록 글 제목',
`message` TEXT NOT NULL COMMENT '방명록 소감 본문 내용',
`sticker` VARCHAR(50) NOT NULL DEFAULT '🍀 응원해요' COMMENT '마음 스티커 (응원/감사/건강/행복)',
`likes_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '공감(좋아요) 누적 수',
`is_public` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '공개 여부 (1: 공개, 0: 비공개)',
`ip_address` VARCHAR(45) NOT NULL COMMENT '작성자 IP 주소',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '작성 일시',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (`id`),
KEY `idx_life_gb_created` (`created_at` DESC),
KEY `idx_life_gb_sticker` (`sticker`),
KEY `idx_life_gb_user_id` (`user_id`),
CONSTRAINT `fk_life_gb_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='열린 방명록 및 나눔터 게시글';
-- 3-2. 방명록 공감(좋아요) 로그 테이블
DROP TABLE IF EXISTS `life_guestbook_likes`;
CREATE TABLE `life_guestbook_likes` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '공감 식별 번호 (PK)',
`entry_id` BIGINT UNSIGNED NOT NULL COMMENT '방명록 글 ID (FK)',
`user_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '회원 ID (비회원은 NULL)',
`ip_hash` VARCHAR(64) NOT NULL COMMENT '공감 클릭자 IP 해시 (중복 방지용)',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '공감 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_life_gb_likes_entry_ip` (`entry_id`, `ip_hash`),
KEY `idx_life_gb_likes_user` (`user_id`),
CONSTRAINT `fk_life_gb_likes_entry` FOREIGN KEY (`entry_id`) REFERENCES `life_guestbook_entries` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='방명록 게시글 공감(좋아요) 이력';
-- ----------------------------------------------------------------------------
-- 4. [매일 건강 관리 & 자가 진단 도메인]
-- ----------------------------------------------------------------------------
-- 4-1. 혈압 자가 측정 및 진단 기록 테이블
DROP TABLE IF EXISTS `life_health_bp_logs`;
CREATE TABLE `life_health_bp_logs` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '혈압 기록 번호 (PK)',
`user_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '회원 ID (비회원은 NULL)',
`systolic` INT UNSIGNED NOT NULL COMMENT '수축기 혈압 (최고 mmHg)',
`diastolic` INT UNSIGNED NOT NULL COMMENT '이완기 혈압 (최저 mmHg)',
`pulse` INT UNSIGNED NULL DEFAULT NULL COMMENT '맥박수 (회/분)',
`diagnosis_grade` ENUM('NORMAL', 'PRE_HYPERTENSION', 'STAGE1', 'STAGE2', 'HYPOTENSION') NOT NULL COMMENT '혈압 판정 등급',
`diagnosis_memo` VARCHAR(255) NULL DEFAULT NULL COMMENT '진단 소견 및 권장 코멘트',
`measured_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '측정 일시',
`ip_address` VARCHAR(45) NOT NULL COMMENT '측정 요청 IP 주소',
PRIMARY KEY (`id`),
KEY `idx_life_bp_user_date` (`user_id`, `measured_at` DESC),
CONSTRAINT `fk_life_bp_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='시니어 혈압 측정 및 자가 진단 기록';
-- 4-2. 체질량지수(BMI) 자가 측정 기록 테이블
DROP TABLE IF EXISTS `life_health_bmi_logs`;
CREATE TABLE `life_health_bmi_logs` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'BMI 기록 번호 (PK)',
`user_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '회원 ID (비회원은 NULL)',
`height_cm` DECIMAL(5,2) NOT NULL COMMENT '신장 (cm)',
`weight_kg` DECIMAL(5,2) NOT NULL COMMENT '체중 (kg)',
`bmi_value` DECIMAL(4,2) NOT NULL COMMENT '계산된 BMI 지수',
`diagnosis_grade` ENUM('UNDERWEIGHT', 'NORMAL', 'OVERWEIGHT', 'OBESE', 'EXTREME_OBESE') NOT NULL COMMENT '체형 판정 등급',
`measured_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '측정 일시',
PRIMARY KEY (`id`),
KEY `idx_life_bmi_user_date` (`user_id`, `measured_at` DESC),
CONSTRAINT `fk_life_bmi_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='체질량지수(BMI) 자가 진단 기록';
-- 4-3. 시니어 365 건강 상식 카드 사전 테이블
DROP TABLE IF EXISTS `life_health_tips`;
CREATE TABLE `life_health_tips` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '건강 팁 번호 (PK)',
`category` ENUM('CARDIO', 'DIET', 'EXERCISE', 'MENTAL', 'HABIT') NOT NULL DEFAULT 'HABIT' COMMENT '건강 분류',
`title` VARCHAR(100) NOT NULL COMMENT '건강 상식 제목',
`content` TEXT NOT NULL COMMENT '건강 상식 세부 설명 및 실천법',
`icon_class` VARCHAR(50) NOT NULL DEFAULT 'fa-heart-pulse' COMMENT '아이콘 CSS 클래스',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '노출 정렬 순서',
`is_active` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '노출 활성 여부',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록 일시',
PRIMARY KEY (`id`),
KEY `idx_life_tips_cat_order` (`category`, `sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='시니어 맞춤형 365 건강 상식 카드 사전';
-- ----------------------------------------------------------------------------
-- 5. [노후 자산 & 연금/세금 모의계산 도메인]
-- ----------------------------------------------------------------------------
-- 5-1. 국민연금/기초연금 모의 계산 이력 테이블
DROP TABLE IF EXISTS `life_pension_simulations`;
CREATE TABLE `life_pension_simulations` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '연금 시뮬레이션 번호 (PK)',
`user_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '회원 ID (비회원은 NULL)',
`current_age` INT UNSIGNED NOT NULL COMMENT '계산 당시 연령',
`contribution_years` INT UNSIGNED NOT NULL COMMENT '국민연금 납부 기간 (년)',
`est_start_age` INT UNSIGNED NOT NULL COMMENT '연금 수령 개시 연령 (만 65세 등)',
`est_monthly_payout` DECIMAL(12,2) NOT NULL COMMENT '예상 월 연금 수령액 (원)',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '계산 일시',
PRIMARY KEY (`id`),
KEY `idx_life_pension_user_date` (`user_id`, `created_at` DESC),
CONSTRAINT `fk_life_pension_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='국민연금 및 기초연금 모의 계산 이력';
-- 5-2. 상속세/증여세 모의 계산 이력 테이블
DROP TABLE IF EXISTS `life_tax_simulations`;
CREATE TABLE `life_tax_simulations` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '세금 시뮬레이션 번호 (PK)',
`user_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '회원 ID (비회원은 NULL)',
`tax_type` ENUM('INHERITANCE', 'GIFT') NOT NULL COMMENT '세목 (상속세 / 증여세)',
`total_asset_value` DECIMAL(15,2) NOT NULL COMMENT '상속/증여 총 자산 평가액 (원)',
`has_spouse` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '배우자 공제 대상 유무',
`child_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '자녀 수',
`tax_base_value` DECIMAL(15,2) NOT NULL COMMENT '공제 후 과세표준 (원)',
`calculated_tax` DECIMAL(15,2) NOT NULL COMMENT '모의 산출 세액 (원)',
`ip_address` VARCHAR(45) NULL DEFAULT NULL COMMENT '요청 IP',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '계산 일시',
PRIMARY KEY (`id`),
KEY `idx_life_tax_user_date` (`user_id`, `created_at` DESC),
CONSTRAINT `fk_life_tax_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='상속세 및 증여세 모의 계산 이력';
-- 5-3. 든든한 노후 준비 실무 가이드 및 정책 사전 테이블
DROP TABLE IF EXISTS `life_finance_guides`;
CREATE TABLE `life_finance_guides` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '가이드 번호 (PK)',
`category` VARCHAR(50) NOT NULL COMMENT '분류 (national_pension, basic_pension, inheritance_tax, gift_tax, retirement_fund)',
`badge_text` VARCHAR(50) NOT NULL COMMENT '뱃지 텍스트',
`icon_class` VARCHAR(50) NOT NULL DEFAULT 'fa-coins' COMMENT '아이콘 CSS 클래스',
`title` VARCHAR(200) NOT NULL COMMENT '가이드 제목 (한국어)',
`title_en` VARCHAR(200) NULL DEFAULT NULL COMMENT '가이드 제목 (영어)',
`title_ja` VARCHAR(200) NULL DEFAULT NULL COMMENT '가이드 제목 (일본어)',
`title_zh` VARCHAR(200) NULL DEFAULT NULL COMMENT '가이드 제목 (중국어)',
`summary` VARCHAR(300) NOT NULL COMMENT '한 줄 요약 (한국어)',
`summary_en` VARCHAR(300) NULL DEFAULT NULL COMMENT '한 줄 요약 (영어)',
`summary_ja` VARCHAR(300) NULL DEFAULT NULL COMMENT '한 줄 요약 (일본어)',
`summary_zh` VARCHAR(300) NULL DEFAULT NULL COMMENT '한 줄 요약 (중국어)',
`content` TEXT NOT NULL COMMENT '상세 실무 내용 (한국어)',
`content_en` TEXT NULL DEFAULT NULL COMMENT '상세 실무 내용 (영어)',
`content_ja` TEXT NULL DEFAULT NULL COMMENT '상세 실무 내용 (일본어)',
`content_zh` TEXT NULL DEFAULT NULL COMMENT '상세 실무 내용 (중국어)',
`highlight_points` TEXT NULL DEFAULT NULL COMMENT '핵심 체크리스트 포인트 (JSON array)',
`official_link` VARCHAR(255) NULL DEFAULT NULL COMMENT '정부 공식 사이트 링크',
`official_link_name` VARCHAR(100) NULL DEFAULT NULL COMMENT '공식 기관 명칭',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '정렬 순서',
`view_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '조회수',
`is_active` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '노출 활성 여부',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록 일시',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '수정 일시',
PRIMARY KEY (`id`),
KEY `idx_life_fg_cat` (`category`, `is_active`, `sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='든든한 노후 준비 실무 가이드 및 정책 사전';
-- ----------------------------------------------------------------------------
-- 6. [정부 지원금 & 시니어 복지 혜택 도메인]
-- ----------------------------------------------------------------------------
-- 6-1. 정부 복지 혜택 프로그램 마스터 테이블
DROP TABLE IF EXISTS `life_welfare_programs`;
CREATE TABLE `life_welfare_programs` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '복지 혜택 번호 (PK)',
`category` ENUM('INCOME', 'MEDICAL', 'LIVING', 'CARE', 'JOB') NOT NULL COMMENT '혜택 분야',
`target_age_group` ENUM('4050', '6064', '65plus', 'ALL') NOT NULL DEFAULT '65plus' COMMENT '수혜 대상 연령대',
`badge_text` VARCHAR(30) NOT NULL COMMENT '헤더 뱃지 텍스트 (예: 65세 이상, 전 시니어)',
`title` VARCHAR(150) NOT NULL COMMENT '복지 지원 프로그램 명칭',
`summary_desc` VARCHAR(255) NOT NULL COMMENT '핵심 지원 요약 설명',
`benefit_details` TEXT NOT NULL COMMENT '상세 지원 내용 및 혜택 한도',
`apply_guide` TEXT NOT NULL COMMENT '신청 방법 및 구비 서류 안내',
`external_url` VARCHAR(255) NULL DEFAULT NULL COMMENT '정부 복지로/지자체 공식 링크',
`view_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '조회수',
`is_active` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '노출 여부',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록 일시',
PRIMARY KEY (`id`),
KEY `idx_life_welfare_cat_age` (`category`, `target_age_group`, `is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='정부 복지 지원금 및 시니어 혜택 마스터';
-- 6-2. 회원별 관심 복지 혜택 북마크(저장) 테이블
DROP TABLE IF EXISTS `life_welfare_bookmarks`;
CREATE TABLE `life_welfare_bookmarks` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '북마크 번호 (PK)',
`user_id` BIGINT UNSIGNED NOT NULL COMMENT '회원 ID (FK)',
`welfare_id` INT UNSIGNED NOT NULL COMMENT '복지 프로그램 ID (FK)',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '북마크 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_life_wf_bookmarks_user_wf` (`user_id`, `welfare_id`),
KEY `idx_life_wf_bookmarks_welfare` (`welfare_id`),
CONSTRAINT `fk_life_wf_bm_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_life_wf_bm_welfare` FOREIGN KEY (`welfare_id`) REFERENCES `life_welfare_programs` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='회원별 관심 복지 혜택 보관함';
-- ----------------------------------------------------------------------------
-- 7. [운세 & 꿈해몽 & 행운 추첨 도메인]
-- ----------------------------------------------------------------------------
-- 7-1. 12간지 오늘의 띠별 운세 테이블
DROP TABLE IF EXISTS `life_fortune_zodiac_daily`;
CREATE TABLE `life_fortune_zodiac_daily` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '운세 번호 (PK)',
`zodiac_animal` ENUM('RAT', 'OX', 'TIGER', 'RABBIT', 'DRAGON', 'SNAKE', 'HORSE', 'SHEEP', 'MONKEY', 'ROOSTER', 'DOG', 'PIG') NOT NULL COMMENT '12간지 띠',
`fortune_date` DATE NOT NULL COMMENT '운세 적용 일자 (YYYY-MM-DD)',
`overall_score` TINYINT UNSIGNED NOT NULL DEFAULT 85 COMMENT '총운 점수 (0-100)',
`wealth_score` TINYINT UNSIGNED NOT NULL DEFAULT 80 COMMENT '금전운 점수 (0-100)',
`health_score` TINYINT UNSIGNED NOT NULL DEFAULT 90 COMMENT '건강운 점수 (0-100)',
`lucky_color` VARCHAR(30) NOT NULL COMMENT '오늘의 행운의 색상',
`lucky_number` VARCHAR(20) NOT NULL COMMENT '오늘의 행운의 숫자',
`summary_fortune` VARCHAR(255) NOT NULL COMMENT '한 줄 운세 총평',
`detail_advice` TEXT NOT NULL COMMENT '상세 조언 및 주의사항',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_life_fortune_zodiac_date` (`zodiac_animal`, `fortune_date`),
KEY `idx_life_fortune_date` (`fortune_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='12간지 일일 띠별 운세 데이터';
-- 7-2. 전통 꿈해몽 사전 및 키워드 풀이 테이블
DROP TABLE IF EXISTS `life_dream_dictionary`;
CREATE TABLE `life_dream_dictionary` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '꿈해몽 번호 (PK)',
`keyword` VARCHAR(50) NOT NULL COMMENT '꿈 검색 키워드 (조상, 돼지, 물, 황금 등)',
`title` VARCHAR(150) NOT NULL COMMENT '꿈 내용 요약',
`interpretation` TEXT NOT NULL COMMENT '꿈해몽 풀이 및 의미',
`fortune_type` ENUM('GREAT_LUCK', 'GOOD_LUCK', 'NORMAL', 'CAUTION') NOT NULL DEFAULT 'GOOD_LUCK' COMMENT '길몽/흉몽/경고 구분',
`search_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '누적 검색 횟수',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '등록 일시',
PRIMARY KEY (`id`),
KEY `idx_life_dream_keyword` (`keyword`),
KEY `idx_life_dream_type` (`fortune_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='전통 꿈해몽 사전 및 길흉 풀이';
-- 7-3. 무료 행운 로또 번호 추첨 기록 테이블
DROP TABLE IF EXISTS `life_lotto_draws`;
CREATE TABLE `life_lotto_draws` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '로또 추첨 번호 (PK)',
`user_id` BIGINT UNSIGNED NULL DEFAULT NULL COMMENT '회원 ID (비회원은 NULL)',
`num1` TINYINT UNSIGNED NOT NULL COMMENT '추첨 번호 1 (1~45)',
`num2` TINYINT UNSIGNED NOT NULL COMMENT '추첨 번호 2 (1~45)',
`num3` TINYINT UNSIGNED NOT NULL COMMENT '추첨 번호 3 (1~45)',
`num4` TINYINT UNSIGNED NOT NULL COMMENT '추첨 번호 4 (1~45)',
`num5` TINYINT UNSIGNED NOT NULL COMMENT '추첨 번호 5 (1~45)',
`num6` TINYINT UNSIGNED NOT NULL COMMENT '추첨 번호 6 (1~45)',
`draw_type` ENUM('RANDOM', 'ZODIAC_CUSTOM', 'DREAM_CUSTOM') NOT NULL DEFAULT 'RANDOM' COMMENT '추첨 방식',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '추첨 일시',
PRIMARY KEY (`id`),
KEY `idx_life_lotto_user_date` (`user_id`, `created_at` DESC),
CONSTRAINT `fk_life_lotto_user` FOREIGN KEY (`user_id`) REFERENCES `life_users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='무료 행운 로또 추천 번호 생성 이력';
-- ----------------------------------------------------------------------------
-- 8. [시스템 버전 & 웹 보안 센터 도메인]
-- ----------------------------------------------------------------------------
-- 8-1. 실서버 버전 배포 및 변경 이력 테이블
DROP TABLE IF EXISTS `life_system_versions`;
CREATE TABLE `life_system_versions` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '버전 식별 번호 (PK)',
`version_tag` VARCHAR(20) NOT NULL COMMENT '버전 태그 (예: v0.52)',
`commit_hash` VARCHAR(40) NOT NULL COMMENT 'Git 커밋 해시 (7~40자)',
`summary_msg` VARCHAR(255) NOT NULL COMMENT '사용자 친화적 핵심 변경 내역',
`files_changed_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '변경된 파일 수',
`deployed_by` VARCHAR(50) NOT NULL DEFAULT 'winona' COMMENT '배포 관리자 계정',
`deployed_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '배포 완료 일시',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_life_ver_commit_hash` (`commit_hash`),
KEY `idx_life_ver_tag` (`version_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='실서버 버전 배포 및 Git 커밋 동기화 이력';
-- 8-2. 관리자 보안 인증 & 접근 감사 로그 테이블
DROP TABLE IF EXISTS `life_admin_access_logs`;
CREATE TABLE `life_admin_access_logs` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '감사 로그 번호 (PK)',
`admin_username` VARCHAR(50) NOT NULL COMMENT '관리자 계정명',
`action_type` ENUM('LOGIN_SUCCESS', 'LOGIN_FAILED', 'LOGOUT', 'CHANGE_PWD', 'COMMIT_VERSION', 'ROLLBACK_VERSION', 'SECURITY_SCAN') NOT NULL COMMENT '수행 동작 유형',
`ip_address` VARCHAR(45) NOT NULL COMMENT '접속자 IP 주소',
`user_agent` VARCHAR(255) NULL DEFAULT NULL COMMENT '접속 브라우저 User-Agent',
`status` ENUM('SUCCESS', 'FAILED', 'BLOCKED') NOT NULL DEFAULT 'SUCCESS' COMMENT '처리 상태',
`action_details` TEXT NULL DEFAULT NULL COMMENT '수행 세부 내용 (JSON 또는 텍스트)',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '감사 기록 일시',
PRIMARY KEY (`id`),
KEY `idx_life_admin_logs_created` (`created_at` DESC),
KEY `idx_life_admin_logs_action` (`action_type`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='관리자 보안 인증 및 시스템 변경 감사 로그';
SET FOREIGN_KEY_CHECKS = 1;
-- ============================================================================
-- 초기 기본 시드 데이터 (Seed Initial Data)
-- ============================================================================
-- 시니어 365 건강 팁 기본 데이터
INSERT INTO `life_health_tips` (`category`, `title`, `content`, `icon_class`, `sort_order`) VALUES
('HABIT', '아침 기상 직후 미온수 한 잔', '밤사이 땀과 호흡으로 배출된 수분을 즉시 보충해주며 혈전 생성을 방지하고 뇌졸중 위험을 크게 낮춥니다.', 'fa-droplet', 1),
('EXERCISE', '식후 15분 가벼운 산책', '식사 후 바로 15분간 가볍게 걸어주면 혈당 스파이크(급상승)를 완화하고 인슐린 저항성을 개선합니다.', 'fa-person-walking', 2),
('DIET', '하루 견과류 한 줌과 오메가3', '불포화지방산이 풍부한 호두, 아몬드와 등푸른생선은 뇌혈관 건강을 지키고 치매 예방에 탁월합니다.', 'fa-bowl-food', 3),
('MENTAL', '햇볕 쬐며 하루 20분 비타민D 합성', '오전 10시~오후 2시 사이 햇살을 받으면 멜라토닌 분비가 원활해져 불면증을 해소하고 골다공증을 예방합니다.', 'fa-sun', 4);
-- 주요 정부 복지 혜택 마스터 기본 데이터
INSERT INTO `life_welfare_programs` (`category`, `target_age_group`, `badge_text`, `title`, `summary_desc`, `benefit_details`, `apply_guide`, `external_url`) VALUES
('INCOME', '65plus', '만 65세 이상', '기초연금 지원제도 (월 최대 334,810원)', '만 65세 이상 어르신 중 소득 인정액 하위 70% 가구에 매월 현금 지급', '단독가구 월 최대 334,810원, 부부가구 월 최대 535,680원 지급 (2026년 기준)', '주소지 관할 읍·면·동 주민센터 방문 또는 복지로(bokjiro.go.kr) 온라인 신청', 'https://www.bokjiro.go.kr'),
('MEDICAL', '65plus', '모든 어르신', '임플란트 & 틀니 건강보험 70% 국비 지원', '평생 2개까지 임플란트 시술비의 70%를 건강보험공단에서 지원 (본인부담 30%)', '만 65세 이상 건강보험 가입자 대상 상하악 구분 없이 평생 2개 임플란트 70% 지원, 부분틀니 및 완전틀니 5년마다 보험 적용', '치과 병·의원에서 진료 후 건강보험 대상자 등록 신청', 'https://www.nhis.or.kr'),
('LIVING', '65plus', '교통·문화', '지하철 무임승차 & 국공립 문화시설 무료·할인', '수도권 및 전국 도시철도 무료 탑승 및 국립공원, 고궁, 박물관 무료입장', '전국 지하철 100% 무임승차, 국립박물관·미술관 100% 무료입장, KTX·SRT 및 통일호 30~50% 운임 할인', '주민센터에서 어르신 우대용 교통카드(시니어패스) 발급 후 이용', 'https://www.gov.kr'),
('CARE', '65plus', '돌봄·요양', '노인맞춤돌봄서비스 & 장기요양보험', '혼자 힘으로 일상생활이 어려운 어르신 대상 안전 확인, 가사 지원 및 요양 등급 판정', '전담 생활지원사의 정기 방문 안부 확인, 병원 동행, 가사 지원 및 장기요양 1~5등급 판정 시 방문요양비 85~100% 국비 지원', '주민센터 복지담당자 상담 및 국민건강보험공단 장기요양보험 신청', 'https://www.longtermcare.or.kr');
-- 꿈해몽 기본 사전 데이터
INSERT INTO `life_dream_dictionary` (`keyword`, `title`, `interpretation`, `fortune_type`, `search_count`) VALUES
('조상', '돌아가신 조상님이 밝게 웃으며 돈이나 보물을 주는 꿈', '가문에 경사가 생기고 뜻밖의 횡재수나 큰 재물이 들어오는 대길몽(大吉夢)입니다.', 'GREAT_LUCK', 245),
('돼지', '황금돼지나 어미돼지가 품 안으로 뛰어들어오는 꿈', '사업 번창, 복권 당첨, 투자 성공 등 일생일대의 큰 재물운이 상승하는 길몽입니다.', 'GREAT_LUCK', 380),
('물', '맑고 깨끗한 물이 집안으로 가득 차오르는 꿈', '막혔던 자금 흐름이 원활해지고 집안에 부귀영화와 건강이 깃드는 상서로운 꿈입니다.', 'GREAT_LUCK', 190),
('불', '온 집이나 산에 큰 불이 활활 타오르는 꿈', '사업이나 추진 중인 일의 세력이 크게 번창하고 명예와 재물이 크게 일어나는 길몽입니다.', 'GREAT_LUCK', 165),
('똥', '온몸에 똥을 묻히거나 똥통에 빠지는 꿈', '더럽게 느껴지지만 대표적인 횡재수의 상징으로, 막대한 금전적 이득을 얻는 길몽입니다.', 'GREAT_LUCK', 310);
Total: 18 Tables · UTF8MB4 · InnoDB