학습일지

[스나이퍼팩토리] 한컴AI아카데미(26.05.07)

cd-record 2026. 5. 7. 17:46
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. 왜 이렇게 매칭하나요? (참조 무결성)

  1. 존재하지 않는 참조 방지: students 테이블에 없는 학번(student_id)을 scores 테이블에 입력하려고 하면 에러가 납니다.
  2. 데이터 일관성: 학생 데이터가 사라지면 그 학생의 성적 데이터는 어떻게 할지(같이 지울지, 남겨둘지) 규칙을 정할 수 있습니다.

 

* 외래키 옵션 (데이터 삭제 시 행동)

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) 현상 방지

정규화를 하지 않으면 다음과 같은 세 가지 문제가 발생합니다.

  1. 삽입 이상: 데이터를 저장할 때 원치 않는 정보까지 억지로 입력해야 하는 경우 (예: 학생 등록을 안 하면 강의 정보를 저장 못 함)
  2. 삭제 이상: 한 정보를 지울 때 상관없는 다른 정보까지 같이 지워지는 경우 (예: 학생이 수강 취소를 했는데 강의 정보 자체가 사라짐)
  3. 갱신 이상: 중복된 데이터 중 일부만 수정되어 데이터 불일치가 일어나는 경우 (예: 이름이 여러 곳에 저장되어 있어 하나만 수정했을 때 정보가 꼬임)
  • 정규화 전 (비정규 테이블)

한 칸에 여러 값이 들어가 있고, 중복이 넘쳐나는 상태입니다.

주문번호(PK) 고객명 연락처 주문상품 학과 지도교수
1 홍길동 010-111, 010-222 모니터, 마우스 컴공 이순신
  • 제1정규형 (1NF) - "한 칸엔 무조건 하나만!"
    • 원자성(Atomicity)을 확보하는 단계입니다. 한 칸에 쉼표로 구분된 데이터들을 각각의 행으로 분리합니다.
    • 수정 후: '홍길동'의 연락처가 두 줄로, 주문상품도 각각 한 줄씩 총 4개의 행으로 늘어납니다.
  • 제2정규형 (2NF) - "기본키 전체에만 의존해!"
    • 부분 함수 종속을 제거하는 단계입니다. 기본키가 (주문번호 + 상품명) 같은 복합키일 때, '고객명'이나 '연락처'는 주문번호에만 상관있지 상품명과는 상관없죠? 이런 애들을 떼어냅니다.
    • 테이블 분리:
      1. 주문-고객 테이블: 주문번호, 고객명, 연락처, 학과, 지도교수
      2. 주문-상품 테이블: 주문번호, 주문상품
  • 정규형 (3NF) - "별명으로 타고 타고 가지 마!"
    • 이행적 함수 종속을 제거하는 단계입니다. 기본키(주문번호) -> 학과 -> 지도교수 순으로 꼬리에 꼬리를 무는 관계를 끊습니다. '지도교수'는 '학과'에 종속되는 것이지 '주문번호'와 직접적인 관련이 없기 때문입니다.
    • 테이블 최종 분리:
      1. 주문 테이블: 주문번호, 고객명, 연락처, 학과명
      2. 학과 정보 테이블: 학과명, 지도교수
      3. 상품 정보 테이블: 주문번호, 상품명

* 한눈에 정리하는 비유

단계 핵심 작업 쉬운 비유
1NF 원자값 유지 한 상자에 사과와 포도를 섞어 담지 마라.
2NF 부분 종속 제거 샴푸 세트 번호 밑에 '치약 제조사' 정보를 적지 마라.
3NF 이행 종속 제거 친구의 친구 정보는 내 연락처가 아니라 친구 연락처에 적어라.

 

query.zip
0.00MB

 

 

 

 

 

 

 

 

 

——————————————————————————

본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.