# Infoway 멀티테넌트 SaaS 플랫폼 > 기업별 독립 콘텐츠 관리 시스템 > 서브도메인 기반 완전 격리형 멀티테넌트 아키텍처 [![PHP Version](https://img.shields.io/badge/PHP-5.3.29-blue.svg)](https://www.php.net/) [![MariaDB](https://img.shields.io/badge/MariaDB-5.0.96-blue.svg)](https://mariadb.org/) [![Bootstrap](https://img.shields.io/badge/Bootstrap-3.0.0-purple.svg)](https://getbootstrap.com/) [![ProcessWire](https://img.shields.io/badge/ProcessWire-2.5-orange.svg)](https://processwire.com/) ## 🎯 프로젝트 개요 Infoway는 각 기업(테넌트)이 독립된 서브도메인과 데이터를 가지는 멀티테넌트 콘텐츠 관리 시스템입니다. ### 주요 특징 - ✅ **완전한 테넌트 격리**: ep_code 기반 데이터/파일/세션 분리 - ✅ **서브도메인 자동화**: `{tenant}.dliveletter.kr` 자동 매핑 - ✅ **8가지 핵심 모듈**: 명함, 출판, 쇼핑, 전자책, 문서, 회원, 관리자, SEO - ✅ **이중 시스템**: _infoway(비즈니스 로직) + _zinpack(CMS 표시) - ✅ **세션 캐싱**: 5분 TTL로 성능 최적화 ## 📚 문서 ### 빠른 시작 - [프로젝트 규칙](.cursorrules) ⭐ **Cursor AI가 자동으로 읽음** - [개발 가이드](docs/guides/development.md) - [프롬프트 템플릿](prompts/debug-template.md) ### 아키텍처 - [프로젝트 분석 보고서](docs/analysis/README.md) - [시스템 아키텍처](docs/analysis/architecture.md) (작성 예정) - [멀티테넌트 시스템](docs/analysis/multitenant.md) - [데이터베이스 스키마](docs/analysis/database-schema.md) (작성 예정) ### 제약사항 및 이슈 - [PHP 5.3 제약사항](docs/analysis/php53-constraints.md) - [현재 이슈 목록](docs/analysis/current-issues.md) - [문제 해결 가이드](docs/guides/troubleshooting.md) (작성 예정) ## 🚀 빠른 시작 ### 필수 요구사항 - PHP 5.3.29 - MariaDB 5.0.96+ - Apache 2.x + mod_rewrite ### 로컬 개발 환경 설정 #### 1. 저장소 클론 ```bash git clone [repository-url] cd DLIVE-Zinpack-AI/infoway/_infoway ``` #### 2. 데이터베이스 설정 ```bash mysql -u root -p CREATE DATABASE infoway CHARACTER SET utf8 COLLATE utf8_general_ci; exit mysql -u root -p infoway < sql/infoway.sql ``` #### 3. 설정 파일 수정 ```php // include/config.php $mysql_host = 'localhost'; $mysql_user = 'root'; $mysql_password = 'your_password'; $mysql_db = 'infoway'; ``` #### 4. hosts 파일 설정 (로컬 개발) ``` # Windows: C:\Windows\System32\drivers\etc\hosts # Mac/Linux: /etc/hosts 127.0.0.1 www.dliveletter.kr 127.0.0.1 wizwin.dliveletter.kr 127.0.0.1 test.dliveletter.kr ``` #### 5. 브라우저 접속 ``` http://www.dliveletter.kr http://wizwin.dliveletter.kr ``` ## 🏗️ 프로젝트 구조 ``` infoway/ ├── _infoway/ # 비즈니스 로직 시스템 │ ├── bbs/ # BBS 모듈 │ │ ├── admin/ # 관리자 페이지 (304개) │ │ ├── m/ # 모바일/사용자 (127개) │ │ └── super/ # 슈퍼관리자 (71개) │ ├── include/ # 핵심 라이브러리 │ │ ├── common.php # 전역 초기화 │ │ ├── config.php # 설정 │ │ ├── subdomain_init.php # 서브도메인 초기화 │ │ └── member_check.php # 권한 체크 │ ├── design/ # CSS/JS/이미지 │ ├── main/ # 테넌트별 콘텐츠 │ ├── scripts/ # 서브도메인 관리 │ └── sql/ # SQL 스크립트 │ ├── _zinpack/ # ProcessWire CMS │ ├── site/ │ └── wire/ │ └── docs/ # 프로젝트 문서 ├── analysis/ # 분석 문서 └── guides/ # 개발 가이드 ``` ## 💻 개발 규칙 ### 필수 준수사항 🚨 #### 1. PHP 5.3 호환성 ```php // ✅ 올바른 코드 array('key' => 'value'); if (!defined("_INFOWAY_")) exit; // ❌ 사용 금지 ['key' => 'value']; // PHP 5.4+ namespace App; // PHP 5.3+ (미사용) ClassName::class; // PHP 5.5+ ``` #### 2. 테넌트 격리 (절대 필수!) ```php // ✅ 모든 쿼리에 ep_code 필터 $sql = "SELECT * FROM {$iw['member_table']} WHERE ep_code = '{$iw['store']}' AND mb_code = '{$iw['member']}'"; // ❌ ep_code 누락 - 다른 테넌트 데이터 노출! $sql = "SELECT * FROM {$iw['member_table']} WHERE mb_code = '{$iw['member']}'"; ``` #### 3. BBS 파일 패턴 ``` {module}_list.php # 목록 {module}_view.php # 상세 {module}_write.php # 작성 폼 {module}_write_ok.php # 작성 처리 {module}_edit.php # 수정 폼 {module}_edit_ok.php # 수정 처리 {module}_delete.php # 삭제 ``` ### 자세한 규칙 전체 코딩 규칙은 [.cursorrules](.cursorrules) 파일을 참고하세요. ## 🗄️ 데이터베이스 ### 주요 테이블 - **코어**: `iw_setting`, `iw_seo`, `iw_enterprise`, `iw_member`, `iw_group` - **명함**: `iw_mcb_data`, `iw_mcb_support` - **출판**: `iw_publishing_*` (7개 테이블) - **쇼핑**: `iw_shop_*` (9개 테이블) - **전자책/문서**: `iw_book_*`, `iw_doc_*` (12개 테이블) ### 테넌트 격리 규칙 ```sql -- 모든 쿼리에 ep_code 필수 SELECT * FROM iw_member WHERE ep_code = 'ep87579064668809f3d632cc'; -- 그룹 사용 시 gp_code 추가 WHERE ep_code = 'ep87579064668809f3d632cc' AND gp_code = 'all'; ``` ## 🔐 보안 ### 권한 레벨 ```php $iw['level'] = "guest" // 비로그인 (mb_display = 0) "member" // 일반회원 (mb_display = 1) "seller" // 판매자 (mb_display = 4) "admin" // 관리자 (mb_display = 7) "super" // 슈퍼관리자 (mb_display = 9) ``` ### 보안 체크리스트 - [x] SQL Injection 방지: `addslashes()` - [x] XSS 방지: `xss_clean()`, `htmlspecialchars()` - [x] 직접 접근 방지: `_INFOWAY_` 상수 체크 - [x] 권한 검증: `member_check.php` - [ ] CSRF 토큰 (미구현) - [ ] Prepared Statements (제한적) ## 🛠️ 서브도메인 관리 ### 새 서브도메인 추가 ```bash cd scripts ./manage_subdomain.sh add newclient ep12345678901234567890ab ``` ### 동기화 확인 ```bash ./subdomain_db_sync.sh ``` ### 캐시 클리어 ```php // 관리자 페이지에서 호출 include_once("$iw[path]/include/subdomain_init.php"); clear_subdomain_cache(); ``` ## 🎨 UI/UX ### CSS 프레임워크 - Bootstrap 3.0.0 (구버전) - Modern Card UI (신규) - Font Awesome ### 모던 카드 UI 사용 ```html

제목

내용

``` ## 📊 개발 로드맵 ### Phase 1: Quick Wins (1주일) - [ ] 보안 패치 재검증 - [ ] SEO 완성 (sitemap.xml) - [ ] 모바일 백키 에러 수정 ### Phase 2: Short-term (1개월) - [ ] UI 현대화 (Bootstrap 5) - [ ] 성능 최적화 - [ ] AI 명함 시스템 개선 ### Phase 3: Long-term (3개월+) - [ ] Docker 개발 환경 - [ ] 템플릿 클로닝 위자드 - [ ] 뉴스 자동 수집 시스템 - [ ] PHP 업그레이드 검토 ## 🤝 기여하기 ### Git 워크플로우 ```bash # feature 브랜치 생성 git checkout -b feature/module-name # 개발 및 커밋 git add . git commit # .gitmessage 템플릿 사용 # 푸시 git push origin feature/module-name ``` ### 커밋 메시지 형식 ``` [TYPE] 제목 본문 (선택) 관련 이슈: #123 PHP 5.3 호환: ✅ 테넌트 격리: ✅ ``` **TYPE**: `FEAT`, `FIX`, `DOCS`, `STYLE`, `REFACTOR`, `TEST`, `CHORE`, `PERF`, `SECURITY` ## 🐛 문제 해결 ### 일반적인 문제 #### Q: 서브도메인 접속 시 메인으로 리다이렉트됨 ``` A: DB 확인 SELECT * FROM iw_enterprise WHERE ep_domain = 'subdomain'; ep_exposed = 0 으로 설정되어 있는지 확인 세션 캐시 클리어: clear_subdomain_cache() ``` #### Q: 다른 테넌트 데이터가 보임 ``` A: 쿼리에 ep_code 필터 누락 모든 쿼리에 WHERE ep_code = '$iw[store]' 추가 ``` #### Q: 모바일 백키 에러 ``` A: 페이지 헤더에 캐시 제어 추가 header("Cache-Control: no-cache, must-revalidate"); ``` 더 많은 문제 해결은 [troubleshooting.md](docs/guides/troubleshooting.md) 참고 ## 📞 지원 - **이슈 보고**: [GitHub Issues](이슈 링크) - **문서**: [docs/](docs/) - **프롬프트 템플릿**: [prompts/](prompts/) ## 📄 라이선스 [라이선스 정보] ## 👥 팀 - 프로젝트 관리자: [이름] - 개발자: [이름] --- **⚠️ 중요**: 이 프로젝트는 PHP 5.3.29 환경에서 운영됩니다. 최신 PHP 문법을 사용할 수 없으므로 [.cursorrules](.cursorrules)를 반드시 확인하세요. **📖 시작 문서**: [개발 가이드](docs/guides/development.md)를 먼저 읽어보세요!