MySQL
1. JOIN (테이블 합치기)
JOIN은 서로 다른 두 테이블을 공통된 컬럼(보통 외래키)을 기준으로 옆으로 연결하는 것입니다.
- INNER JOIN: 두 테이블에 모두 데이터가 있는 경우만 합칩니다. (교집합)
- LEFT JOIN: 왼쪽 테이블 데이터는 무조건 다 보여주고, 오른쪽은 매칭되는 것만 보여줍니다.
- RIGHT JOIN: 오른쪽 테이블 데이터는 무조건 다 나오고, 왼쪽은 매칭되는 것만 출력
-- users 테이블과 score 테이블을 idx와 user_id를 기준으로 합치기
SELECT u.username, s.dept, s.f_score
FROM users AS u
INNER JOIN score AS s ON u.id = s.user_id;
2. UNION (결과 쌓기)
UNION은 두 개 이상의 SELECT 문 결과를 위아래로 합쳐서 하나의 결과로 만드는 것입니다.
- UNION: 중복된 데이터는 제거하고 합칩니다.
- UNION ALL: 중복을 포함하여 모든 데이터를 합칩니다. (속도가 더 빠름)
- 주의사항: 합치려는 두 SELECT 문의 컬럼 개수와 데이터 타입이 같아야 합니다.
-- 1학년 명단과 2학년 명단을 하나로 합쳐서 보고 싶을 때
SELECT name, dept FROM students_grade1
UNION
SELECT name, dept FROM students_grade2;
3. SESSION (사용자 기억하기)
세션은 서버가 "현재 접속 중인 사용자"가 누구인지 기억하는 저장 공간입니다. HTTP는 원래 한 번 요청하면 연결을 끊어버리는 특징(Stateless)이 있어서, 로그인을 유지하려면 세션이 꼭 필요합니다.
- 작동 방식: 사용자가 로그인하면 서버는 세션 저장소에 정보를 담고, 사용자 브라우저에는 Session ID라는 열쇠(쿠키)를 줍니다. 브라우저는 요청할 때마다 이 열쇠를 보여줍니다.
from flask import session
@app.route('/login', methods=['POST'])
def login():
# ... 로그인 검증 성공 후 ...
session['user_id'] = user['id'] # 서버 세션 저장소에 저장
session['username'] = user['username']
return "로그인 성공!"
@app.route('/index')
def index():
if 'user_id' in session: # 세션 열쇠가 있는지 확인
return f"환영합니다, {session['username']}님!"
return "로그인이 필요합니다."
4. 테이블 매칭
데이터베이스에서 Primary Key(PK, 기본키)와 Foreign Key(FK, 외래키)를 매칭하는 것은 두 테이블 사이의 '관계(Relationship)'를 맺어주는 핵심 과정입니다.
쉽게 말해, 한 테이블의 데이터가 다른 테이블의 어떤 데이터를 참조하고 있는지 연결 고리를 만드는 것입니다.
- Primary Key (PK) 테이블 (부모 테이블): 연결의 기준이 되는 고유한 ID를 가진 테이블입니다. (예: 학생 정보)
- Foreign Key (FK) 테이블 (자식 테이블): 부모 테이블의 PK를 빌려와서 연결하는 테이블입니다. (예: 성적표)
부모 테이블 생성 (Primary Key)
CREATE TABLE students (
student_id INT PRIMARY KEY, -- 이 친구가 PK입니다.
name VARCHAR(50) NOT NULL
);
자식 테이블 생성 (Foreign Key)
CREATE TABLE scores (
score_id INT PRIMARY KEY,
subject VARCHAR(50),
point INT,
user_id INT, -- 참조할 컬럼
-- Foreign Key 설정: user_id가 students 테이블의 student_id를 바라보게 합니다.
FOREIGN KEY (user_id) REFERENCES students(student_id)
);
Q. 왜 이렇게 매칭하나요? (참조 무결성)
- 존재하지 않는 참조 방지: students 테이블에 없는 학번(student_id)을 scores 테이블에 입력하려고 하면 에러가 납니다.
- 데이터 일관성: 학생 데이터가 사라지면 그 학생의 성적 데이터는 어떻게 할지(같이 지울지, 남겨둘지) 규칙을 정할 수 있습니다.
* 외래키 옵션 (데이터 삭제 시 행동)
PK 테이블의 데이터를 지울 때 자식 테이블을 어떻게 할지 정하는 옵션이 중요합니다.
- ON DELETE CASCADE: 부모(학생)가 삭제되면 자식(성적)도 함께 삭제됩니다. (가장 많이 씀)
- ON DELETE SET NULL: 부모가 삭제되면 자식의 FK 값을 NULL로 바꿉니다.
- ON DELETE RESTRICT: 자식 데이터가 남아있으면 부모 데이터를 삭제하지 못하게 막습니다.
FOREIGN KEY (user_id) REFERENCES students(student_id) ON DELETE CASCADE
5. 데이터 베이스 정규화 과정
데이터베이스 정규화(Normalization)란 관계형 데이터베이스 설계에서 데이터의 중복을 최소화하고, 무결성(Integrity)을 유지하기 위해 테이블을 분해하는 과정
- 정규화의 핵심 이유: 이상(Anomaly) 현상 방지
정규화를 하지 않으면 다음과 같은 세 가지 문제가 발생합니다.
- 삽입 이상: 데이터를 저장할 때 원치 않는 정보까지 억지로 입력해야 하는 경우 (예: 학생 등록을 안 하면 강의 정보를 저장 못 함)
- 삭제 이상: 한 정보를 지울 때 상관없는 다른 정보까지 같이 지워지는 경우 (예: 학생이 수강 취소를 했는데 강의 정보 자체가 사라짐)
- 갱신 이상: 중복된 데이터 중 일부만 수정되어 데이터 불일치가 일어나는 경우 (예: 이름이 여러 곳에 저장되어 있어 하나만 수정했을 때 정보가 꼬임)
- 정규화 전 (비정규 테이블)
한 칸에 여러 값이 들어가 있고, 중복이 넘쳐나는 상태입니다.
| 주문번호(PK) | 고객명 | 연락처 | 주문상품 | 학과 | 지도교수 |
| 1 | 홍길동 | 010-111, 010-222 | 모니터, 마우스 | 컴공 | 이순신 |
- 제1정규형 (1NF) - "한 칸엔 무조건 하나만!"
- 원자성(Atomicity)을 확보하는 단계입니다. 한 칸에 쉼표로 구분된 데이터들을 각각의 행으로 분리합니다.
- 수정 후: '홍길동'의 연락처가 두 줄로, 주문상품도 각각 한 줄씩 총 4개의 행으로 늘어납니다.
- 제2정규형 (2NF) - "기본키 전체에만 의존해!"
- 부분 함수 종속을 제거하는 단계입니다. 기본키가 (주문번호 + 상품명) 같은 복합키일 때, '고객명'이나 '연락처'는 주문번호에만 상관있지 상품명과는 상관없죠? 이런 애들을 떼어냅니다.
- 테이블 분리:
- 주문-고객 테이블: 주문번호, 고객명, 연락처, 학과, 지도교수
- 주문-상품 테이블: 주문번호, 주문상품
- 정규형 (3NF) - "별명으로 타고 타고 가지 마!"
- 이행적 함수 종속을 제거하는 단계입니다. 기본키(주문번호) -> 학과 -> 지도교수 순으로 꼬리에 꼬리를 무는 관계를 끊습니다. '지도교수'는 '학과'에 종속되는 것이지 '주문번호'와 직접적인 관련이 없기 때문입니다.
- 테이블 최종 분리:
- 주문 테이블: 주문번호, 고객명, 연락처, 학과명
- 학과 정보 테이블: 학과명, 지도교수
- 상품 정보 테이블: 주문번호, 상품명
* 한눈에 정리하는 비유
| 단계 | 핵심 작업 | 쉬운 비유 |
| 1NF | 원자값 유지 | 한 상자에 사과와 포도를 섞어 담지 마라. |
| 2NF | 부분 종속 제거 | 샴푸 세트 번호 밑에 '치약 제조사' 정보를 적지 마라. |
| 3NF | 이행 종속 제거 | 친구의 친구 정보는 내 연락처가 아니라 친구 연락처에 적어라. |
——————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.05.11) (0) | 2026.05.12 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.05.08) (0) | 2026.05.08 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.06) (0) | 2026.05.07 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.04) (0) | 2026.05.04 |
| [스나이퍼팩토리] 한컴AI아카데미(영단어장 리뷰) (0) | 2026.04.30 |