Files
egbim_homepage/MIGRATION_TASKS.md
2026-07-23 16:15:57 +09:00

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/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 적용" 이 아니라 "로컬에서 로그인부터 실제 사용까지 지장 없는 상태" 다.
  • 따라서 첫 구현은 환경 분리와 경로 정리가 중심이어야 하고, 버킷 업로드 자동화는 다음 단계로 미루는 편이 안전하다.