320x100

 

✅ 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 테이블에서 namescore 컬럼의 값을 가져옴

 

 

전체 조회하려면?

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’ 값을 추가

⚠️ idxAuto 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. 또한, 로그인페이지에서 로그인을 시도하면 아래와 같이 로그인에 성공했다는 화면을 볼 수 있다.

 

 

300x250

+ Recent posts