16 KiB
16 KiB
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 정책 초안:
[
{
"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/imgCDN 전환과 분리한다- 단,
../img/...가 실제로 top-levelimg를 가리키는 member skin/css/js 는 이번 대상에 포함한다
실제 검색 결과 - 현재 우선 수정 대상 파일
-
공통 상수/기본 경로
egbim/config.phpeng/config.phpegbim/extend/default.config.phpeng/extend/default.config.phpegbim/mobile/head.phpeng/mobile/head.php
-
국문 현재 사용 CSS
egbim/css/style_260526.cssegbim/skin/member/basic/style.cssegbim/js/style.css
-
영문 현재 사용 CSS
eng/css/style_260526.csseng/css/style.csseng/skin/member/basic/style.csseng/js/style.css
-
국문 현재 사용 member skin
egbim/skin/member/basic/main.skin.phpegbim/skin/member/basic/main_header.skin.phpegbim/skin/member/basic/main_footer.skin.phpegbim/skin/member/basic/buy.skin.phpegbim/skin/member/basic/floorplan.skin.phpegbim/skin/member/basic/forbim.skin.phpegbim/skin/member/basic/interface.skin.phpegbim/skin/member/basic/primary.skin.phpegbim/skin/member/basic/value.skin.phpegbim/skin/member/basic/login.skin.phpegbim/skin/member/basic/register.skin.phpegbim/skin/member/basic/register_form.skin.phpegbim/skin/member/basic/otp_signup_form.skin.phpegbim/skin/member/basic/password_lost.skin.phpegbim/skin/member/basic/privacy.skin.phpegbim/skin/member/basic/member_confirm.skin.phpegbim/skin/member/basic/mypage.skin.phpegbim/skin/member/basic/mypage01.skin.phpegbim/skin/member/basic/mypage02.skin.phpegbim/skin/member/basic/mypage03.skin.php
-
영문 현재 사용 member skin
eng/skin/member/basic/main.skin.phpeng/skin/member/basic/main_header.skin.phpeng/skin/member/basic/main_footer.skin.phpeng/skin/member/basic/buy.skin.phpeng/skin/member/basic/floorplan.skin.phpeng/skin/member/basic/forbim.skin.phpeng/skin/member/basic/interface.skin.phpeng/skin/member/basic/primary.skin.phpeng/skin/member/basic/value.skin.phpeng/skin/member/basic/login.skin.phpeng/skin/member/basic/register.skin.phpeng/skin/member/basic/register_form.skin.phpeng/skin/member/basic/otp_signup_form.skin.phpeng/skin/member/basic/password_lost.skin.phpeng/skin/member/basic/privacy.skin.phpeng/skin/member/basic/member_confirm.skin.phpeng/skin/member/basic/mypage.skin.phpeng/skin/member/basic/mypage01.skin.phpeng/skin/member/basic/mypage02.skin.phpeng/skin/member/basic/mypage03.skin.php
-
국문 현재 사용 JS
egbim/js/index.jsegbim/js/interface.jsegbim/js/value_240813.js
-
영문 현재 사용 JS
eng/js/index.jseng/js/interface.jseng/js/value_240813.js
실제 검색 결과 - 같이 볼 보조 파일
egbim/bbs/descope_qa_list.phpeng/bbs/descope_qa_list.phpeng/bbs/descope_qa_detail.phpeng/bbs/descope_qa_write.phpegbim/lib/common.lib.phpeng/lib/common.lib.phpegbim/lib/latest.lib.phpeng/lib/latest.lib.phpegbim/tail.phpeng/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/**등 서드파티/플러그인 내부imgtheme/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. 먼저 바로 조사할 파일
.htaccessegbim/config.phpeng/config.phpegbim/common.phpeng/common.phpegbim/bbs/descope_qa_img_upload.phpeng/bbs/descope_qa_img_upload.php- 업로드/이미지 경로를 하드코딩한 추가 파일들
메모
- 우선순위는 "CDN 적용" 이 아니라 "로컬에서 로그인부터 실제 사용까지 지장 없는 상태" 다.
- 따라서 첫 구현은 환경 분리와 경로 정리가 중심이어야 하고, 버킷 업로드 자동화는 다음 단계로 미루는 편이 안전하다.