✅ WEB - WAS - DB 구조 요약
📌 역할 구분
- WEB 서버 (Apache, Nginx 등)→ 클라이언트의 요청을 처리하고, 필요한 경우 WAS에 전달
- → 정적 페이지(.html, .jpg, .css 등) 제공
- WAS (Web Application Server)→ 비즈니스 로직 처리, DB 연동 등 수행
- → 동적 페이지(.php, .jsp, .asp 등) 처리
- DB (MySQL, MariaDB 등)→ WAS가 데이터를 요청하고 처리 결과를 돌려줌
- → 실제 데이터 저장소
✅ 웹 루트 경로 (기본)
- 기본적으로 /var/www/html
- → 웹 서버는 이 폴더를 기준으로 파일을 찾아 응답
✅ 응답 헤더 설정
- header() 함수 사용 → 응답의 헤더를 직접 설정 가능
- 코드 마지막에 exit; 을 적으면 실행이 종료되어 아래쪽에 있는 코드가 보이지 않는다. (보안상 필요)

⚠️ 에러 디버깅 방법
- PHP 에러 출력 켜기
ini_set('display_errors', 1);
error_reporting(E_ALL);
→ 몇 번째 줄에서 어떤 오류가 발생했는지 알려줌
- echo 디버깅
echo "여기까지 실행됨";
→ 코드 흐름을 확인하거나 값 확인할 때 사용
✅ . 의 역할 (PHP)
- PHP에서 .는 문자열을 이어주는 연산자입니다.
- JavaScript의 +, Python의 +와 비슷한 역할이지만, PHP에서는 +를 문자열 연결에 사용하지 않고 반드시 .을 써야 합니다.

✅ phpMyAdmin에서 테이블 만들기 예시
1️⃣ 사용자 로그인
- 브라우저에서 phpMyAdmin 접속:
http://localhost/phpmyadmin
- Username: test
- Password: (설정한 비밀번호 입력)
2️⃣ 데이터베이스 생성 (또는 선택)
- 좌측 메뉴에서 “New” 클릭 → 새로운 데이터베이스 생성
- 이름: test
- Collation: utf8_general_ci
- ➡️ “Create” 클릭
3️⃣ 테이블 생성
- 데이터베이스 test 선택
- 새 테이블 이름 입력: score_table
- 필드 수 입력: 4
- ➡️ “Go” 클릭
| 필드 | 이름 | 타입길이 /값 | 인덱스 | AI (자동 증가) |
| idx | INT | 10 | PRIMARY | ✅ 체크 |
| name | VARCHAR | 20 | 없음 | |
| score | VARCHAR | 20 | 없음 | |
| pass | VARCHAR | 20 | 없음 |
- idx 필드는 고유 식별자 역할 → PRIMARY 키 설정, A_I(Auto Increment) 체크
✅ SQL 기본 명령어 정리
🔍 1. SELECT 문 — 데이터를 조회할 때 사용
SELECT [컬럼이름] FROM [테이블이름];
예시: SELECT name, score FROM score_table;
→ score_table 테이블에서 name과 score 컬럼의 값을 가져옴
전체 조회하려면?
SELECT * FROM score_table;
📝 2. INSERT 문 — 데이터를 추가할 때 사용
INSERT INTO [테이블이름] (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);
예시: INSERT INTO score_table (name, score, pass) VALUES ('Alice', '90', 'Pass');
→ name, score, pass 컬럼에 각각 ‘Alice’, ‘90’, ‘Pass’ 값을 추가

⚠️ idx는 Auto Increment로 자동 증가되므로 따로 넣지 않아도 됨!
컬럼이름을 *(전체)로 넣을때는 아래와 같이 적지 않고 바로 value로 넘어간다.


✅ 정교한 SELECT 문 - WHERE 조건 사용
SELECT [컬럼명] FROM [테이블명] WHERE [조건];
📌 조건이 하나일 때
SELECT * FROM score_table WHERE name = 'normaltic';
📌 조건이 여러 개일 때
AND: 모든 조건이 참일 경우
SELECT * FROM score_table
WHERE name = 'normaltic' AND pass = 'Pass';
OR: 하나라도 조건이 참이면
SELECT * FROM score_table
WHERE name = 'normaltic' OR pass = 'Pass';
✅ PHP - MySQL 연동 예제 (db_test.php)
<?php
// 데이터베이스 접속 정보 정의
define('DB_SERVER', 'localhost'); // DB 서버 주소
define('DB_USERNAME', 'admin'); // DB 아이디
define('DB_PASSWORD', 'admin1234'); // DB 비밀번호
define('DB_NAME', 'test'); // 사용할 DB 이름
// DB 연결 시도
$db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 연결 확인
if ($db_conn === false) {
die("ERROR: Could not connect. " . mysqli_connect_error());
} else {
echo "DB 연결 성공!";
}
?>
db_conn 이라는 변수에 넣어 mysqli_connect를 통해서 mysql과 연동하겠다.
if 만약 db_conn 변수가 연결이 되면 OK, 아닐경우, Fail 문구가 나오게 해라
sql 이라는 변수 안에 select를 통해 test_table 속 전체를 보여줘라
그 결과를 result에 담아라

MySQL 결과 중에서 맨 위의 하나의 행만 가져오는 방법으로 mysqli_fetch_array() 또는 mysqli_fetch_assoc()을 사용합니다.
| 함수 | 반환 형태 | 설명 |
| mysqli_fetch_array() | 연관 배열 + 숫자 인덱스 | ["name"], [1] 둘 다 가능 |
| mysqli_fetch_assoc() | 연관 배열만 | ["name"] 처럼 컬럼명으로만 접근 |
✅ var_dump() 란?
- 변수에 어떤 값이 들어있는지, 데이터 타입까지 자세히 출력해주는 PHP 함수입니다.
- 디버깅(오류 찾기)할 때 많이 사용돼요.


동일한 문구를 한번 더 쓰고 dump로 출력하면 두번째가 나온다

.은 두개의 문자열을 연결시켜주는 문구

[ ] = 객체를 가져오는 괄호
( ) = 함수 호출, 조건문, 수학 계산식 등 다양한 용도로 사용
여담
docker 를 날려도, db 파일은 안날아간다.

주석, 변수이름을 잘 적어야한다.
2주차 과제
[1] 복습 (Database, SQL)
[2] Mini Mission
학생 이름과 점수가 들어가있는 db를 만들고, get 방식으로 그 학생의 이름을 넣으면 학생의 점수가 출력되는 페이지 만들기

[3] 회원가입 페이지 만들기 (기능 구현) - 아이디, 비밀번호, 이름, 이메일 등
[4] 로그인 페이지 (DB 연동하기)
- 추가 미션
→ 가입한 나의 정보를 보는 ‘마이페이지’ 개발 (비밀번호 안보이고, 이름, 회원가입 정보가 보이는 페이지)
부트스트랩 이용해서 아래 정도로만 하면 된다고 함
디자인 템플릿 다른사람이 만들어온거 가져와도 된다. CSS
그런데, 어려울 것이다.

빠르게 사이트 만드려면 부트스트랩 사용하는게 좋다.
개발자들도 만들어져있는 템플릿 틀을 가져와서 내 입맛대로 바꾼다.
✅ 회원가입 페이지 만들기
register.php
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f2f5;
font-family: 'Segoe UI', sans-serif;
}
.register-box form {
display: flex;
flex-direction: column; /* ← 세로 정렬 */
gap: 10px; /* ← 입력창 사이 간격 */
}
.input-group {
display: flex;
align-items: center;
margin-bottom: 16px;
}
.input-group label {
width: 120px; /* ✅ 라벨 너비 고정해서 정렬 맞추기 */
font-weight: bold;
margin-right: 10px;
}
.input-group input {
flex: 1; /* ✅ 남은 공간을 입력칸이 꽉 채우도록 */
padding: 10px; /*입력 창 안에 내용과 테두리 사이 간격을 지정*/
font-size: 16px;
border-radius: 6px;
border: 1px solid #ccc; /*테두리 두께 1px, 실선, 연한 회색*/
}
</style>
</head>
<body>
<div class="register-box">
<h2>회원가입</h2>
<form method="POST" action="register_process.php">
<div class="input-group">
<label for="name">이름</label>
<input type="text" name="name" placeholder="이름" required />
</div>
<div class="input-group">
<label for="id">아이디</label>
<input type="text" name="id" placeholder="아이디" required />
</div>
<div class="input-group">
<label for="password">비밀번호</label>
<input type="password" name="password" placeholder="비밀번호" required />
</div>
<div class="input-group">
<label for="password_confirm">비밀번호 확인</label>
<input type="password" name="password_confirm" placeholder="비밀번호 확인" required />
</div>
<div class="input-group">
<label for="email">이메일</label>
<input type="email" name="email" placeholder="이메일" required />
</div>
<input type="submit" value="가입하기" />
</form>
</div>
</body>
</html>
register_process.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// DB 연결
$conn = new mysqli("localhost:3306", "choyongyeop", "1234", "test");
// 연결 오류 확인
if ($conn->connect_error) {
die("DB 연결 실패: " . $conn->connect_error);
}
// 입력값 받기
$name = $_POST['name'];
$id = $_POST['id'];
$pw = $_POST['password'];
$pw2 = $_POST['password_confirm'];
$email = $_POST['email'];
// 비밀번호 일치 확인
if ($pw !== $pw2) {
die("❌ 비밀번호가 일치하지 않습니다.");
}
// ✅ 바로 여기에 암호화 코드 추가!
$hashed_pw = password_hash($pw, PASSWORD_DEFAULT);
$sql = "INSERT INTO users (name, id, password, email) VALUES ('$name', '$id', '$hashed_pw', '$email')";
$result = $conn->query($sql);
// 결과 확인
if ($result) {
echo "✅ 회원가입이 완료되었습니다!";
} else {
echo "❌ 회원가입 실패: " . $conn->error;
}
$conn->close();
?>

1. 아래와 같이 회원가입을 진행할 경우

2. mysql 테이블에 정상적으로 삽입이 되는 것을 확인할 수 있다.

3. 또한, 로그인페이지에서 로그인을 시도하면 아래와 같이 로그인에 성공했다는 화면을 볼 수 있다.

'Information Technology > Web dev' 카테고리의 다른 글
| 필터링 우회 기법 (URL인코딩, HEX값 변경, alternative 대체값 변경 .. ) (0) | 2025.05.28 |
|---|---|
| 로그인 페이지 만들기 - 식별,인증,SQL 연산, JWT, 암호화, 인코딩, 해시, 쿠키, 세션 (1) | 2025.04.21 |
| 로그인페이지 만들기 - SFTP, web root, NAT, PHP, GET방식, POST방식 (0) | 2025.04.13 |