최초 커밋

This commit is contained in:
root
2026-07-23 16:15:57 +09:00
commit c8f5efb6b7
14652 changed files with 4812531 additions and 0 deletions
+316
View File
@@ -0,0 +1,316 @@
# EGBIM 로컬 이전 및 CDN 분리 작업 목록
## 목표
- 운영 기준 도메인: `eg-bim.com`
- 1차 목표: Cafe24 환경과 분리된 로컬 환경에서 로그인부터 주요 사용 흐름까지 문제 없이 동작하게 만든다.
- 2차 목표: 대용량 이미지 파일은 Cloudflare 버킷/CDN으로 분리하고, 코드 및 소형 정적 파일만 저장소와 운영 서버에 배포하는 구조를 만든다.
- 3차 목표: 이후 내부 서버 배포 시 환경별 설정만 바꿔 재현 가능하도록 정리한다.
## 현재 확인된 전제
- 최종 운영 도메인은 `eg-bim.com` 기준으로 정리한다.
- 루트 `.htaccess` 에 운영 도메인 강제 리다이렉트가 있어 로컬에서는 그대로 사용하면 진입이 막힌다.
- `egbim/config.php`, `eng/config.php` 에 URL/PATH 상수가 집중되어 있어 환경 분리의 기준점으로 적합하다.
- 업로드 경로가 여러 군데에 퍼져 있고, 일부는 `/egbim/uploads/...` 같은 하드코딩 URL을 사용한다.
- 국문 `egbim/` 과 영문 `eng/` 가 거의 병렬 구조라서 변경 시 양쪽 동기화가 필요하다.
## 1. 로컬 실행 기반 정리
- [ ] 로컬 웹서버 방식 결정: Apache 또는 Nginx + PHP 버전 + MariaDB/MySQL 버전 확정
- [ ] 로컬 가상호스트 또는 hosts 매핑 방식 결정
- [ ] DB 덤프 확보 및 로컬 DB 생성
- [ ] `data/dbconfig.php` 와 관련 민감 설정은 저장소 제외 대상인지 확인
- [ ] 로컬에서 쓰기 권한이 필요한 디렉터리 목록 정리
- [ ] 세션, 캐시, 업로드, 썸네일 생성 경로가 실제로 writable 인지 점검
### 로컬 환경에서 바로 손봐야 할 후보
- [ ] 루트 `.htaccess` 의 운영 도메인 강제 리다이렉트 규칙을 로컬 예외 포함 구조로 분리
- [ ] `eg-bim.com` 기준 canonical/redirect 정책과 로컬 예외 정책을 함께 정의
- [ ] HTTPS 강제 규칙이 로컬 개발을 막지 않도록 조건 정리
- [ ] `G5_DOMAIN`, `G5_HTTPS_DOMAIN`, `G5_COOKIE_DOMAIN` 을 환경별로 분기할 방법 확정
- [ ] 운영용 절대 URL 의존 로직이 있는지 추가 검색
## 2. 로그인/핵심 기능 우선 검증
- [ ] 회원 로그인/로그아웃 동작 확인
- [ ] 세션 유지, 쿠키 도메인, 리다이렉트 URL 이상 여부 확인
- [ ] 관리자 로그인 가능 여부 확인
- [ ] 게시판 조회/상세/작성 흐름 중 필수 기능 점검
- [ ] 파일 업로드가 있는 화면 최소 1개 이상 검증
- [ ] 국문 `egbim/` 과 영문 `eng/` 에서 동일 증상이 재현되는지 비교
### 로그인 단계에서 함께 확인할 항목
- [ ] 메일 인증/비밀번호 재설정이 로컬에서 막히면 우선순위 하향 또는 임시 비활성화 여부 결정
- [ ] 외부 연동 기능이 로그인 흐름을 막는지 확인
- [ ] Cloudflare 프록시 헤더를 가정한 HTTPS 판별 로직이 로컬에서 문제 없는지 확인
## 3. 정적 자산/이미지 분리 설계
- [ ] 저장소에 남길 파일과 외부 버킷으로 보낼 파일 기준 정의
- [ ] 이미지 원본, 업로드 이미지, 에디터 이미지, 썸네일을 각각 어느 저장소에 둘지 분류
- [ ] Cloudflare 버킷 경로 규칙과 공개 URL 규칙 설계
- [ ] CDN 도메인 또는 커스텀 서브도메인 사용 여부 결정
- [ ] 캐시 정책과 캐시 무효화 방식 정의
### 코드 변경 후보
- [ ] `G5_IMG_URL`, `G5_DATA_URL` 만으로 해결 가능한지 검토
- [ ] 업로드 결과 URL 을 직접 조합하는 코드들을 공통 헬퍼로 치환할지 결정
- [ ] `bbs/descope_qa_img_upload.php` 같은 업로드 엔드포인트의 하드코딩 URL 제거
- [ ] `/uploads/`, `/data/`, `/img/` 하위 참조 중 CDN 치환 대상 검색
- [ ] 국문/영문 트리에서 동일 수정이 필요한 파일 목록 작성
### 현재 버킷 기준 추가 정리
- [ ] Cloudflare R2 버킷 현재 경로 기준 확정: `baron-hompage-test/egbim_img/egbim/`
- [ ] 확인 완료: 버킷 `egbim_img/egbim/` 내부 파일 구조는 로컬 `egbim/img/` 와 동일
- [ ] 현재 버킷에 올라간 파일이 운영에서 직접 참조할 최종 자산인지 확인
- [ ] `egbim_img/egbim/` 하위 경로를 코드에서 어떤 URL prefix 로 매핑할지 확정
- [ ] 운영 도메인 `eg-bim.com` 기준으로 이미지 전용 서브도메인 사용 여부 확정
- [ ] 권장안: `cdn.eg-bim.com/egbim/...` 형태로 고정하고 R2 퍼블릭 URL 직접 노출은 피한다
- [ ] 현재 helper 기준 매핑안: `https://<공개호스트>/egbim_img/egbim/<파일명>`
### Cloudflare R2 + CDN 설정 작업
- [ ] R2 버킷 `baron-hompage-test` 에 커스텀 도메인 연결
- [ ] 후보 도메인 확정: `cdn.eg-bim.com` 또는 `img.eg-bim.com`
- [ ] Cloudflare DNS 에 해당 서브도메인 레코드 생성 여부 확인
- [ ] Cloudflare 프록시가 켜진 상태로 R2 Public Domain 연결 확인
- [ ] 연결 후 `https://cdn.eg-bim.com/egbim_img/egbim/...` 또는 최종 매핑 URL 로 실제 파일 접근 테스트
- [ ] 캐시 정책 초안 작성: 이미지 장기 캐시 + 파일명 버전/쿼리 버전 전략 중 택1
### CORS 정책 작업
- [ ] R2 버킷 CORS 정책 추가
- [ ] 운영 Origin 허용: `https://eg-bim.com`
- [ ] 서브경로 운영이 실제 `https://www.eg-bim.com` 또는 `https://eg-bim.com` 둘 다 쓰는지 확인 후 모두 반영
- [ ] 로컬 검증용 Origin 허용: `http://localhost:8088`
- [ ] 필요 시 개발용 추가 Origin 허용: 내부 테스트 도메인
- [ ] 허용 메서드는 우선 `GET`, `HEAD` 로 제한
- [ ] `AllowedHeaders` 는 우선 `*` 허용 후 필요 시 축소
- [ ] Canvas/스크립트 조작이 없다면 CORS 영향 범위를 문서화하고 최소 허용 정책으로 정리
예시 CORS 정책 초안:
```json
[
{
"AllowedOrigins": [
"https://eg-bim.com",
"https://www.eg-bim.com",
"http://localhost:8088"
],
"AllowedMethods": [
"GET",
"HEAD"
],
"AllowedHeaders": [
"*"
],
"ExposeHeaders": [],
"MaxAgeSeconds": 3000
}
]
```
## 4. redirect module / 자산 우회 방식 결정
- [ ] 웹서버 rewrite/redirect 로 처리할지, PHP 상수/헬퍼로 처리할지 결정
- [ ] 신규 업로드는 바로 CDN URL 을 반환할지, 로컬 저장 후 동기화할지 결정
- [ ] 기존 DB 에 저장된 이미지 URL 이 상대경로인지 절대경로인지 샘플 확인
- [ ] 기존 게시물 본문 내 이미지 경로를 일괄 치환해야 하는지 판단
### redirect module 관련 실제 판단 포인트
- [ ] Apache `mod_rewrite` 또는 Nginx rewrite 로 `/img/`, `/data/`, `/uploads/` 요청을 CDN 으로 301/302/307 보낼지 결정
- [ ] 단순 리다이렉트보다 HTML 에서 처음부터 CDN URL 을 출력하는 방식이 가능한지 우선 검토
- [ ] 권장안: 기존 페이지가 생성하는 이미지 URL 을 애플리케이션 레벨에서 CDN 주소로 바꾸고, redirect module 은 레거시 경로 보완용으로만 사용
- [ ] 레거시 URL 보완이 필요하면 `/egbim/img/...` 또는 `/egbim/data/...` 요청만 CDN 으로 우회시키는 규칙 초안 작성
- [ ] 게시물 본문처럼 DB 에 박힌 상대경로가 많다면 redirect module 로 1차 호환성을 확보하고, 이후 본문 치환 배치를 별도 수행
### redirect module 적용 시 체크리스트
- [ ] 로컬 개발환경에서는 redirect module 비활성화 또는 예외 처리
- [ ] 운영에서만 CDN redirect 가 동작하도록 `HTTP_HOST` 또는 환경변수 조건 분기
- [ ] HTML, CSS background-image, JS 동적 조합 URL 중 어느 케이스까지 rewrite 가 커버되는지 확인
- [ ] redirect 후 CORS, mixed content, 캐시 헤더가 깨지지 않는지 확인
- [ ] 이미지 404 발생 시 원본 경로와 CDN 경로 중 어디가 문제인지 추적할 로깅/테스트 절차 마련
### 권장 방향
- [ ] 1차는 로컬 안정화가 목적이므로 업로드 저장은 로컬 유지
- [ ] 2차에서 이미지 URL 생성만 공통화
- [ ] 3차에서 Cloudflare 버킷 업로드/동기화 및 CDN URL 전환 적용
- [ ] rewrite 규칙은 보조 수단으로만 쓰고, 가능하면 애플리케이션 레벨 URL 생성 지점을 통제
- [ ] 현재 상황 기준 추가 권장안: 이미 버킷 적재가 끝난 정적 이미지부터 CDN 참조로 전환하고, 사용자 업로드/에디터 업로드는 별도 단계로 분리
## 4-1. 이번 질문 기준 바로 해야 할 일
- [ ] Cloudflare R2 버킷 `baron-hompage-test` 에 커스텀 도메인 연결 여부 확인
- [ ] 이미지 전용 서브도메인 최종 결정: `cdn.eg-bim.com` 권장
- [ ] R2 CORS 정책에 운영/로컬 Origin 추가
- [ ] 현재 코드에서 대용량 이미지가 어디서 참조되는지 검색해 CDN 치환 대상 목록 작성
- [ ] 우선 치환 대상 후보: `/egbim/img/`, `/eng/img/`, 게시물 본문 내 절대/상대 이미지 URL
- [ ] 코드에서 직접 출력하는 이미지 URL 은 CDN prefix 상수 또는 헬퍼 함수로 통일
- [ ] 레거시 경로 호환이 필요하면 웹서버 redirect module 규칙 초안 작성
- [ ] 실제 브라우저에서 Network 기준 캐시 적중, 200 응답, CORS 오류 없음 확인
### 실제 검색 기준 정리
- [ ] 이번 범위의 1차 대상은 top-level `egbim/img/*`, `eng/img/*` 를 직접 참조하는 코드만 본다
- [ ] `theme/.../img`, `plugin/.../img`, `adm/.../img`, `shop/.../img`, `skin/.../img` 의 자체 스킨 아이콘은 이번 `egbim/img` CDN 전환과 분리한다
- [ ] 단, `../img/...` 가 실제로 top-level `img` 를 가리키는 member skin/css/js 는 이번 대상에 포함한다
### 실제 검색 결과 - 현재 우선 수정 대상 파일
- [ ] 공통 상수/기본 경로
- `egbim/config.php`
- `eng/config.php`
- `egbim/extend/default.config.php`
- `eng/extend/default.config.php`
- `egbim/mobile/head.php`
- `eng/mobile/head.php`
- [ ] 국문 현재 사용 CSS
- `egbim/css/style_260526.css`
- `egbim/skin/member/basic/style.css`
- `egbim/js/style.css`
- [ ] 영문 현재 사용 CSS
- `eng/css/style_260526.css`
- `eng/css/style.css`
- `eng/skin/member/basic/style.css`
- `eng/js/style.css`
- [ ] 국문 현재 사용 member skin
- `egbim/skin/member/basic/main.skin.php`
- `egbim/skin/member/basic/main_header.skin.php`
- `egbim/skin/member/basic/main_footer.skin.php`
- `egbim/skin/member/basic/buy.skin.php`
- `egbim/skin/member/basic/floorplan.skin.php`
- `egbim/skin/member/basic/forbim.skin.php`
- `egbim/skin/member/basic/interface.skin.php`
- `egbim/skin/member/basic/primary.skin.php`
- `egbim/skin/member/basic/value.skin.php`
- `egbim/skin/member/basic/login.skin.php`
- `egbim/skin/member/basic/register.skin.php`
- `egbim/skin/member/basic/register_form.skin.php`
- `egbim/skin/member/basic/otp_signup_form.skin.php`
- `egbim/skin/member/basic/password_lost.skin.php`
- `egbim/skin/member/basic/privacy.skin.php`
- `egbim/skin/member/basic/member_confirm.skin.php`
- `egbim/skin/member/basic/mypage.skin.php`
- `egbim/skin/member/basic/mypage01.skin.php`
- `egbim/skin/member/basic/mypage02.skin.php`
- `egbim/skin/member/basic/mypage03.skin.php`
- [ ] 영문 현재 사용 member skin
- `eng/skin/member/basic/main.skin.php`
- `eng/skin/member/basic/main_header.skin.php`
- `eng/skin/member/basic/main_footer.skin.php`
- `eng/skin/member/basic/buy.skin.php`
- `eng/skin/member/basic/floorplan.skin.php`
- `eng/skin/member/basic/forbim.skin.php`
- `eng/skin/member/basic/interface.skin.php`
- `eng/skin/member/basic/primary.skin.php`
- `eng/skin/member/basic/value.skin.php`
- `eng/skin/member/basic/login.skin.php`
- `eng/skin/member/basic/register.skin.php`
- `eng/skin/member/basic/register_form.skin.php`
- `eng/skin/member/basic/otp_signup_form.skin.php`
- `eng/skin/member/basic/password_lost.skin.php`
- `eng/skin/member/basic/privacy.skin.php`
- `eng/skin/member/basic/member_confirm.skin.php`
- `eng/skin/member/basic/mypage.skin.php`
- `eng/skin/member/basic/mypage01.skin.php`
- `eng/skin/member/basic/mypage02.skin.php`
- `eng/skin/member/basic/mypage03.skin.php`
- [ ] 국문 현재 사용 JS
- `egbim/js/index.js`
- `egbim/js/interface.js`
- `egbim/js/value_240813.js`
- [ ] 영문 현재 사용 JS
- `eng/js/index.js`
- `eng/js/interface.js`
- `eng/js/value_240813.js`
### 실제 검색 결과 - 같이 볼 보조 파일
- [ ] `egbim/bbs/descope_qa_list.php`
- [ ] `eng/bbs/descope_qa_list.php`
- [ ] `eng/bbs/descope_qa_detail.php`
- [ ] `eng/bbs/descope_qa_write.php`
- [ ] `egbim/lib/common.lib.php`
- [ ] `eng/lib/common.lib.php`
- [ ] `egbim/lib/latest.lib.php`
- [ ] `eng/lib/latest.lib.php`
- [ ] `egbim/tail.php`
- [ ] `eng/tail.php`
### 실제 검색 결과 - 과거본/백업 파일
- [ ] 국문 버전 파일: `egbim/css/style_240927.css`, `egbim/css/style_250203.css`, `egbim/css/style_250307.css`, `egbim/css/style_250310.css`, `egbim/css/style_250312.css`
- [ ] 국문 스킨 버전 파일: `egbim/skin/member/basic/*_250204.php`, `*_250310.php`, `*_250728.php`, `main.skin OR.php`, `main.skin copy.php`, `register_form.skin2.php`, `login.skin2.php`
- [ ] 국문 JS 버전 파일: `egbim/js/common_OR.js`, `egbim/js/index_240813.js`, `egbim/js/index_250204.js`, `egbim/js/index_250310.js`
- [ ] 영문 스킨 버전 파일: `eng/skin/member/basic/interface.skin_251226.php`, 기타 `*_250204.php`, `main.skin OR.php`
- [ ] 영문 JS 버전 파일: `eng/js/common_OR.js`, `eng/js/index_240813.js`, `eng/js/index_250204.js`, `eng/js/index_250310.js`, `eng/js/interface_251226.js`
### 실제 검색 결과 - 이번 범위에서 제외할 노이즈
- [ ] `js/ckeditor/**` 샘플/테스트 파일
- [ ] `plugin/editor/**`, `plugin/kcaptcha/**` 등 서드파티/플러그인 내부 `img`
- [ ] `theme/basic/**`, `mobile/skin/shop/**`, `adm/**`, `shop/**` 의 자체 `img` 경로
- [ ] 단, 나중에 운영 전체 CDN 전환 범위를 넓히면 이 목록도 별도 단계로 다시 포함
### 파일 수집 기준 메모
- [ ] 실제 검색상 현재 우선 수정 대상은 국문/영문 합쳐 대략 50개 내외
- [ ] 이 중 변경 우선순위는 `config.php`/공용 CSS/`main.skin.php`/`main_header.skin.php`/`main_footer.skin.php`/`index.js` 가 가장 높음
- [ ] `floorplan`, `interface`, `primary`, `forbim`, `buy`, `value` 는 각 페이지별 대량 이미지 참조 구간이라 2차 묶음으로 처리
## 4-2. 코드 반영 전 확인 질문
- [ ] CDN 으로 뺄 대상이 공용 정적 이미지인지, 사용자 업로드 이미지까지 포함인지 확정
- [ ] 버킷 경로를 `egbim_img/egbim/` 그대로 노출할지, 커스텀 도메인 루트에 매핑할지 결정
- [ ] `egbim/``eng/` 가 같은 버킷 prefix 를 공유할지 분리할지 결정
- [ ] 썸네일/리사이즈 이미지도 버킷으로 옮길지 결정
- [ ] DB 본문에 저장된 기존 이미지 경로를 치환할지, redirect 로만 흡수할지 결정
## 5. 저장소/배포 분리 준비
- [ ] 대용량 파일 제외 정책 초안 작성 (`uploads`, `data`, 썸네일, 백업 등)
- [ ] `.gitignore` 와 배포 제외 목록 정리
- [ ] 환경별 설정 파일 분리 전략 수립
- [ ] 운영 서버 배포 절차 초안 작성
- [ ] 버킷 동기화 스크립트 또는 수동 절차 결정
- [ ] 운영 배포 전후 검증 체크리스트 작성
## 6. 실제 작업 순서 제안
- [ ] 1단계: 로컬에서 진입 가능한 상태 만들기 (`.htaccess`, 도메인/쿠키/세션)
- [ ] 2단계: 로컬 DB 연결 및 로그인 검증
- [ ] 3단계: 업로드/이미지 표시 문제 수집
- [ ] 4단계: 자산 URL 공통화 포인트 확정
- [ ] 5단계: Cloudflare 버킷 연동 설계
- [ ] 6단계: 저장소 제외 정책 및 배포 방식 정리
## 7. 먼저 바로 조사할 파일
- [ ] `.htaccess`
- [ ] `egbim/config.php`
- [ ] `eng/config.php`
- [ ] `egbim/common.php`
- [ ] `eng/common.php`
- [ ] `egbim/bbs/descope_qa_img_upload.php`
- [ ] `eng/bbs/descope_qa_img_upload.php`
- [ ] 업로드/이미지 경로를 하드코딩한 추가 파일들
## 메모
- 우선순위는 "CDN 적용" 이 아니라 "로컬에서 로그인부터 실제 사용까지 지장 없는 상태" 다.
- 따라서 첫 구현은 환경 분리와 경로 정리가 중심이어야 하고, 버킷 업로드 자동화는 다음 단계로 미루는 편이 안전하다.