목차(클릭하세요)
동적기능을 포함한 웹페이지: 메일전송 기능, 설문조사 자동통계, 데이터 베이스 등
1. 온라인 명함 작성을 위한 기초Tip
1-1. 베이스가 될 디자인
•
•
1-2.index.php를 사용하기 위한 기초
index.html vs index.php 차이점
기본 개념
index.html
index.php
주요 비교
파일 확장자 | .html | .php |
콘텐츠 방식 | 정적인 페이지 | 동적인 페이지 |
서버 처리 | 서버가 그대로 전송 | 서버가 PHP 코드 해석 후 결과만 전송 |
백엔드 연결 | ||
필요한 환경 | 웹 서버 (Apache, Nginx 등) | PHP가 설치된 웹 서버 |
대표 사용 예시 | 회사소개 페이지, 포트폴리오 | 로그인, 게시판, 데이터 입력/출력 페이지 |
핵심 요약
2. 온라인명함제작(기초단계)
2-0.전체 구성 흐름
[브라우저]
↓
[php -S localhost:8000 → index.php 실행]
↓
[1. 사용자 정보 배열 ($user)]
└→ 이름, 포지션, 이메일, 전화번호, 주소, 프로필 이미지
↓
[2. 디바이스 감지 (isMobile 함수)]
└→ 모바일 or 데스크탑 구분
↓
[3. Tailwind CSS + 아이콘/폰트 적용]
↓
[4. HTML 콘텐츠 생성]
├── 프로필 영역 (이미지 + 이름 + 포지션)
├── 네비게이션 (About Me, 약력, 프로젝트, 연락)
├── 연락처 정보
├── 소셜미디어 아이콘
├── 추천 영상 (2x2 유튜브 iframe)
└── 다크/라이트 모드 전환 버튼
↓
[5. 모달 창 (About, History, Projects, Contact)]
└→ JS로 열기/닫기
↓
[6. 연락하기 → send_mail.php로 POST 전송 (fetch API 사용)]
Scss
복사
2-1. 프롬프트
•
핵심은 이미지와 함께 프롬프트를 사용하는 멀티모달
tailwind(테일윈드)CSS프레임워크를 이용해서 내가 첨부한 이미지와 유사한 온라인 명함을 만들어봐. 기본적인 기능만 이용해서 php로 작성하고,
모바일과 데스크톱을 자동으로 인식해서 작동하는 반응형 디자인으로 제작해야 해
Markdown
복사
2-2.PHP설치하기
[참고]
로컬에 PHP 설치하기 (윈도우 기준)
1.

2.
압축 풀기 (예: C:\php)
3.
환경 변수 설정
•
시스템 변수 → Path에 C:\php 추가
4.
cmd에서 php -v 입력 → 버전 확인되면 성공
설치 방법 (Zip 파일 다운로드 후):
1.
압축 풀기 (예: C:\php)
2.
php.exe가 있는지 확인
3.
환경 변수 Path에 C:\php 추가
4.
cmd에서 php -v 입력 → 버전 나오면 성공
PHP 8.4.6 (cli) (built: Apr 9 2025 09:45:13) (NTS Visual C++ 2022 x64)
Copyright (c) The PHP Group
Zend Engine v4.4.6, Copyright (c) Zend Technologies
Markdown
복사
•
만약 아래와 같은 문구가 나왔다면, 이는 Microsoft Visual C++ Redistributable 라이브러리 버전과의 호환성 문제이므로 이를 해결해야 함.
PHP Warning:
'C:\WINDOWS\SYSTEM32\VCRUNTIME140.dll' 14.34 is not compatible with this
PHP build linked with 14.43 in Unknown on line 0
Markdown
복사
2-3.PHP 실행하기
[참고]
•
•
우측 상단에 생긴 PHP 서버를 누르거나 또는 CTRL + SHIFT + P를 누르고 PHP Server: Serve project를 찾아 실행하기
•
2-4.사진 업로드 및 비디오 추가
•
업로드하고 싶은 사진하나를 포스팅이미지와 같은 사이트를 사용해 업로드한 뒤, 해당 주소의 사진을 넣어달라고 요청하기
https://i.postimg.cc/OOOOOOOOOO
해당 이미지사진을 사용해서 이미지수정해봐
Markdown
복사
•
해당 php페이지에서 새로고침을 해야 변경된 것을 볼 수 있음
•
비디오 추가를 위해 다음 프롬프트를 사용
이제 명함 아래쪽에 비디오 섹션부분을 넣어줘. 그냥 정사각형으로 하나의 행에 2개의 유튜브 영상이 들어가도록 2*2그리드로 작성해서 반영해. 영상을 직접 포함하는 임베디드 방식으로 코드로 작성해야해
Markdown
복사
2-5.화면전환 및 메뉴 추가
•
•
이런 기능들은 서버가 아니라 클라이언트에서 처리하는 방식이므로, 자바스크립트로 구현되는 경우가 많음, 따라서 프롬프트를 아래와 같이
지금의 배경의 디자인이 다소 어둡구나. 다크모드와 라이트모드를 상호변환할 수 있는 전환버튼을 화면 우측 하단에 전구 아이콘으로 표시하고, JS로 구현하자
Markdown
복사
•
이제 우측 상단에 메뉴를 만들꺼야. 'about me', 약력, 프로젝트, 연락, 이렇게 4개로 만들고 font awesome을 이용해서 아이콘도 붙여줘
2-5.메뉴 네비게이션바의 기능 연결하기
•
만들어진 페이지에서 특정 영역을 클릭했을때, 특히 위 그림을 기준으로 ‘Navbar’의 4가지 메뉴를 클릭했을 때 반응이 없음
•
네비게이션 메뉴에 UI를 추가하자.
1.about 클릭시 모달창: 컴퓨터교육과출신의 찐 AI 연구자
2.약력 클릭시 타임라인: 정보교육지원단- 정보교육유공교원-AIDEAP 마스터 교원 등
3.프로젝트 클릭시 모달창: 바이든vs날리면 외 다수
4. 연락 클릭시 Dialog (다이얼로그)창: 연락받고 싶은 이메일 또는 연락처를 적으세요
오류없이 추가해
Markdown
복사
•
결과는?
메일 보내기 버튼을 눌러도 실제로 작동하지 않음
•
실제 작동을 위해서는 PHP로 코딩해서 메일전송만 처리하는 페이지를 별도로 만드는 것이 필요
•
3. 메일전송php 기능
•
메일이 정상적으로 오는지 확인하려면, 실제 이메일주소를 기재할 필요가 있음
사용자가 연락을 눌러서 실제 이름과 이메일주소를 누르고 전송하게 되면, 실제 메일이 도착할 수 있도록 작업할꺼야.
1. 별도의 메일 송신을 담당하는 php 파일을 만들어서 연결해줘. php 에서 mail함수를 사용해 사용자가 입력한 메일이 OOOO.com으로 전송되게 구현해봐
Markdown
복사
3-1. 전체 흐름
[연락하기(Contact) 모달에서 사용자 입력 → 이름, 이메일, 메시지]
↓
[JS fetch → POST 전송 → send_mail.php]
↓
[send_mail.php]
├── 1. 요청 방식 확인 (POST 아니면 차단)
├── 2. 입력 데이터 유효성 검사 (빈칸, 이메일 형식 확인)
├── 3. PHPMailer 로드 (Composer autoload 사용)
├── 4. SMTP 설정 (Gmail, SendGrid, Mailtrap 등)
├── 5. 메일 작성 (From, To, 제목, 본문)
├── 6. 메일 전송 시도 → `$mail->send()`
├── 7. 전송 결과에 따라 JSON 응답 (성공 / 실패)
↓
[브라우저]
└── 성공 시 → "전송 완료" 알림
실패 시 → "오류 발생" 알림 (에러 메시지 포함 가능)
Scss
복사
3-2.주의사항
1.
보안 강화:
•
실제 운영 환경에서는 CSRF 토큰, 스팸 방지를 위한 캡차 등의 추가 보안 기능을 구현하는 것이 좋음
•
커서나 코파일럿이 제공하는 코드는 기본적인 입력 검증(필수 필드, 유효한 이메일 형식)만 구현되어 있을 가능성이 높음
3-3.주의사항
•
현재는 send_mail.php 파일이 서버에 존재하지 않기에 메일 전송이 실제로 이루어질 수 없음
현재 상황
항목 | 상태 |
index.php | VS Code + PHP 내장서버 (php -S)로 실행 중 |
send_mail.php | c:\Users\user\Desktop\online_card\send_mail.php에 존재함 |
외부 SMTP 서버 설정 | 없음 (mail 서버 미설정) |
PHP 기본 mail() 함수 | Windows 환경에서는 동작 X (sendmail or SMTP 필요) |
3-4.Composer 설치하기
•
Composer란? PHP 프로젝트에 사용되거나 사용되어야 할 라이브러리들을 기록하고 설치할 수 있게 해주는 역할
•
PHP 버전에 따른 패키지 설치 버전을 자동으로 정리해 줌
•
실행환경: php 5.3.2+ 이상에서 동작
•
설치방법
◦
글로벌 설치와 로컬 설치가 있는데 귀찮으면 윈도우 인스톨러 다운로드
설치 시 주의:
◦
PHP 경로 설정 (예: C:\php\php.exe → PHP가 설치된 위치)
◦
"Add Composer to PATH" 옵션 체크 → 이것이 중요!
◦
중간에 프록시 설정화면에서는 체크해제
•
이후 설치가 완료됨을 확인하기 위해 bash창에 다음 명령어 입력해보기
composer -V
Scss
복사
3-5.Composer 설치후 PHPMailer 설치
composer require phpmailer/phpmailer
Scss
복사
•
해당 프로젝트가 진행중인 폴더경로에서 CMD실행 후 PHP 메일러 설치를 진행하면?
vendor 폴더와 autoload.php가 생성됨.
•
또 추가로 PHPMailer가 SMTP로 메일 전송할 때 TLS/SSL을 사용하기 때문에 반드시 OpenSSL 확장이 필요
3-6.Gmail 보안 설정
•
구글 계정설정으로가서 ‘보안’ → 2단계 인증 활성화 후→ 앱 비밀번호를 상단에서 검색해서 접근 —> 앱 비밀번호 설정
•
→ your_app_password 자리에 설정한 앱 비밀번호 입력
3-7.메일 제목이 깨지는 등 인코딩 설정이 잘못된 경우
•
메일 헤더(Subject)가 UTF-8로 인코딩되지 않으면
•
영어만 있을 때는 괜찮지만, 한글, 일본어, 특수문자 → 깨짐 발생
•
PHPMailer에서는 별도로 CharSet과 Encoding 설정을 해줘야 함.
$mail->CharSet = 'UTF-8'; // ✅ 인코딩 설정 추가!
$mail->Encoding = 'base64'; // ✅ 인코딩 방식 설정!
PHP
복사
4. 깃허브 업로드 후 Render로 배포
4-1. 깃허브 업로드전 readme.md & .gitignore파일 만들기
readme.md와 .gitignore파일 만들어줘
Sass
복사
•
저장소(Repository) 생성후 공개용으로 설정해서 업로드 되었는지 확인
•
GitHub Pages 설정:
GitHub Pages는 PHP 실행을 지원하지 않음
•
따라서
GitHub Pages 설정은 무시하고 바로 Render로 배포 시작
4-2. Render가입
•
https://render.com 접속, 가입시 구글계정이 아닌 깃허브계정 연동으로 가입하기
◦
•
깃허브 계정 연결
•
로그인 → New + → Web Service를 선택
리소스 타입 | 역할 요약 | 주로 사용하는 경우 |
Static Sites | HTML/CSS/JS 등 정적 파일만 CDN으로 배포 | 프론트엔드 웹사이트, 블로그, 포트폴리오 등 |
Web Services | PHP, Node.js, Python 등 동적 웹 애플리케이션 실행 | |
Private Services | Render 내부에서만 접근 가능한 비공개 서비스 | 인증, DB API 등 외부에 노출하지 않을 때 |
Background Workers | 백그라운드 작업, 큐 기반 비동기 처리 | 데이터 처리, 메시지 소비, 비동기 로직 등 |
Cron Jobs | 일정 시간마다 실행되는 짧은 작업 스케줄러 | 매일 백업, 자동 이메일 전송 등 |
Postgres | PostgreSQL 데이터베이스 생성 및 관리 | 데이터 저장소 필요 시 (RDBMS) |
Key Value | Redis 호환 캐시 또는 메시지 큐 | 로그인 세션, 실시간 상태 저장, 큐 처리 등 |
•
GitHub 리포지토리 연동(로그인된 GitHub 계정 연결 단계)
◦
중간 설정 과정에서 모든 저장소 선택
•
연결이 완료되면 다음그림처럼 소스코드가 나오게 됨
4-3. Render 활용배포
Dockerfile + .render.yaml 준비해서 배포하는 방식
•
Environment: PHP
•
Root directory: /
•
Start command: (비워도 됨)
•
Deploy
•
Render는 Node.js, Python, Ruby, Go, Rust, Elixir와 같은 언어를 네이티브로 지원하며, PHP를 직접 지원안함
•
사용하려면 Docker 이미지를 통해 환경을 설정해야 함
•
지역은 싱가포르 선택
•
Root Directory →
비워두기
index.php, send_mail.php, Dockerfile이 모두 리포지토리 최상단에 있는 경우
→ 아무것도 입력하지 않으면 기본 루트로 인식됨
•
Dockerfile Path → ./Dockerfile
또는 . 만 입력해도 자동 인식 (기본으로 . 이 셋팅되어 있음)
•
배포를 위해 깃허브 저장소에 배포설정 파일 추가하기(.render.yaml)
services:
- type: web
name: 프로젝트 명칭
env: docker
region: singapore
plan: free
branch: main
dockerfilePath: ./Dockerfile
autoDeploy: true
YAML
복사
.render.yaml 파일의 역할
주요 항목 설명
항목 | 설명 |
type: web | 웹 서비스 (HTML, PHP 등 포함) |
name | Render 서비스 이름 |
env: docker | Docker 환경으로 배포 |
region: singapore | |
plan: free | 무료 플랜 (Render 기본값) |
branch: main | GitHub 리포지토리의 메인 브랜치 기준 |
dockerfilePath | Dockerfile이 루트에 있으므로 ./Dockerfile |
autoDeploy: true | GitHub push 시 자동 재배포 |
•
또한 프로젝트 루트에 깃허브 프로젝트 루트에 Dockerfile도 함께 만들어야 함
•
Dockerfile: PHP 실행 환경 (Apache 포함) 설정 파일
# 1. PHP + Apache 기반 이미지
FROM php:8.1-apache
# 2. 필요한 PHP 확장 설치 (openssl 제외)
RUN docker-php-ext-install mysqli pdo pdo_mysql mbstring
# 3. Composer 설치 (선택적)
COPY /usr/bin/composer /usr/bin/composer
# 4. index.php 우선 적용
RUN echo "DirectoryIndex index.php index.html" > /etc/apache2/mods-enabled/dir.conf
# 5. 코드 복사
COPY . /var/www/html/
# 6. 권한 설정
RUN chown -R www-data:www-data /var/www/html
# 7. 포트 오픈
EXPOSE 80
Docker
복사
항목 | 설명 |
정식 명칭 | Apache HTTP Server (아파치 HTTP 서버) |
역할 | 웹사이트를 인터넷에 공개하고 제공하는 프로그램 |
개발 | Apache Software Foundation (ASF) |
특징 | 오픈소스, 무료, 전 세계 웹서버 점유율 1~2위 (Nginx와 경쟁) |
•
깃허브 저장소에 올라간 최종 파일들 참고
•
Render설정화면에서 Free 선택
•
마지막으로 환경 변수(Environment Variables) 설정하기
◦
현재 프로젝트에서 send_mail.php에서 SMTP 인증 정보를 안전하게 관리하기 위해 꼭 필요한 부분
◦
SMTP 관련 정보를 변수로 넣는 단계라고 생각
•
send_mail.php에서 환경 변수 사용하도록 수정
[변환 전]
// SMTP 설정
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com'; // Gmail SMTP 서버
$mail->SMTPAuth = true;
$mail->Username = '???'; // 🔴 본인 Gmail 주소
$mail->Password = '???'; // 🔴 Gmail 앱 비밀번호 (2차 인증 시 필수)
$mail->SMTPSecure = 'tls'; // 보안 방식
$mail->Port = 587;
PHP
복사
[변환 후]
$mail->isSMTP();
$mail->Host = getenv('SMTP_HOST');
$mail->Port = getenv('SMTP_PORT');
$mail->SMTPAuth = true;
$mail->Username = getenv('SMTP_USER');
$mail->Password = getenv('SMTP_PASS');
$mail->setFrom(getenv('SMTP_FROM_EMAIL'), getenv('SMTP_FROM_NAME'));
PHP
복사
•
모든 준비가 끝났다면 [Deploy Web Service] 버튼 클릭하기
•
배포 준비가 끝나면 아래와 같이 배포페이지가 나옴
•
해당페이지로 들어가서 배포가 제대로 되고 있는지 확인
◦
도커를 이용한 방식이라 배포 초기 단계에서 상당한 시간 소요
[결과물]
5. (번외) 도커로 빌드하는 이유
왜 도커(Docker)로 빌드할까?
1. 어디서나 똑같이 작동
•
개발자 컴퓨터에서 잘 되는데, 서버에서는 에러? 
→ Docker는 모든 실행 환경을 통째로 감싸서 어디서 실행해도 동일하게 작동함!
“내 컴에선 되는데요…”는 이제 그만!
2. 실행 환경 자동 구성
•
PHP, Apache, 확장 기능 설치까지 → Dockerfile 하나로 서버 세팅 자동화 가능!
매번 수동 설치 안 해도 돼서 편하고 빠름
3. 배포가 쉬워짐
•
Render, AWS, GitHub Actions 등에서→ Docker 이미지로 바로 실행 가능!
배포 환경에서도 개발 그대로 실행
4. 깨끗한 환경 유지
•
실수로 시스템 파일 꼬일 걱정 없음→ Docker는 고립된 공간에서 작동
실험하다 망가져도, 컨테이너만 지우면 끝!