한화시스템 BEYOND SW Camp_0702

퍼킹락스타·2025년 7월 2일

배고파요. 그치만 오늘 MariaDB 마지막 수업이니까, 버텨볼게영
가즈아아!!! 내일 캐비가니가여 룰루 좀 버텨봅시다.

  • 스토어드 프로시저

1. 스트어드 프로시저가 뭔데?

: 자주 쓰는 SQL문들을 하나로 묶어서 이름 붙인 저장된 명령어 세트
예시) "라면 끓이는 방법"을 레시피로 저장해놓는 거임.
그리고 나중에 그냥 “라면 끓여줘!” 하고 부르면 자동으로 실행됨.

  • 왜 쓰는 건데
  1. 반복 작업 자동화
    : 매번 똑같은 SQL을 안 써도 됨
  2. 속도 향상
    : 한 번 파싱돼서 빠름
  3. 보안 강화
    : 사용자에게 SQL 내용을 숨기고 실행만 허용 가능
  4. 유지보수 용이
    : 로직을 DB에 따로 관리할 수 있음
  • SQL로 설명

  • SQL에서 회원 한 명 조회하는 코드를 매번 이렇게 쓰는 건 귀찮음
DELIMITER $$ -- 지금부터는 명령 끝을 $$로 구분하겠다고 선언하는 거야

CREATE PROCEDURE get_user_by_id(IN userId INT) -- get_user_by_id라는 이름의 스토어드 프로시저를 만든다는 뜻
BEGIN -- "이제 프로시저 안의 본격적인 SQL 시작!"
    SELECT * FROM users WHERE id = userId; -- 입력받은 userId 값을 가진 사람을 users 테이블에서 찾아라!
END $$ --스토어드 프로시저 코드가 여기서 끝났어!

DELIMITER ; -- 다시 원래대로 문장 끝 표시를 ;로 돌려놓는 거야.

그럼 아래처럼 사용하면 됨.

CALL get_user_by_id(3);

2. 프로시저 만드는 법

: 프로시저를 생성하려면 CREATE PROCEDURE 구문을 사용.

1) 매개변수 쓸거양

  • 매개변수
    : 프로시저에 값을 전달해주는 변수
    예) 라면 몇 개 끓일지, 누구를 조회할 지 알려주는 값.
    -> 다양한 상황에서 똑같은 프로시저를 재사용하기 위해서 사용함.
    예) “물 500ml 고정”보다는 “물 몇 ml? (매개변수)” 이렇게 하면 라면 1개든 2개든 쉽게 끓일 수 있음
    => 다양한 요구에 맞춰서, 정보 제공할 수 있음
CREATE PROCEDURE 프로시저이름 (IN 매개변수명 자료형)
BEGIN
    -- 여기서 매개변수를 SQL문 안에 사용함
END;

예제)

DELIMITER $$

CREATE PROCEDURE get_user_by_id(IN userId INT)
BEGIN
    SELECT * FROM users WHERE id = userId;
END $$

DELIMITER ;
  • 프로시저 호출
CALL get_user_by_id(3);
SQL 키워드의미
IN외부에서 값을 "넣어주는" 매개변수 (제일 자주 씀)
OUT프로시저가 실행된 결과를 "밖으로 보내주는" 매개변수
INOUT넣기도 하고, 바꾼 결과도 밖으로 주는 매개변수

예) IN: 내가 너한테 “라면 몇 개 끓여줘” 하고 숫자(3)를 보냄
예) OUT: 너는 결과를 계산해서 나한테 줘
예) INOUT: 내가 편지를 보내고, 너는 그걸 바꿔서 다시 줘

2) 조건문 쓸거양

  • if문
IF 조건식 THEN
  실행 문장
ELSE
  실행 문장
END IF
  • case문
CASE 
  WHEN 조건식 1 THEN 실행 문장 1
  WHEN 조건식 2 THEN 실행 문장 2
  ...
  [ELSE 실행 문장]
END CASE;

3) 반복문도 쓸거양

  • while문

오류 처리

  • 트리거

1. 트리거가 뭔데?

: 트리거는 테이블에 삽입, 수정, 삭제 등의 작업이 발생할 때 자동으로 작동되는 개체이다.

마치 도어벨에 센서를 설치해두고
누군가 문을 열면 자동으로 “삐빅!” 하고 알람이 울리는 것처럼,
트리거는 데이터가 바뀌면 미리 지정한 SQL이 자동 실행된다.

  • 그럼 왜 써?
  1. 자동화: 사람이 안 해도 DB가 알아서 실행
  2. 무결성 유지: 데이터 일관성 보장
  3. 로그 기록: 변경 이력 자동 저장
  4. 중복 로직 제거: 코드 없이 DB에서 처리

2. 트리거의 종류는?

  • 테이블에 삽입, 수정, 삭제 작업 후에 작동하는 트리거를 AFTER 트리거라 한다.
    => 문을 열고 나간 후 CCTV가 자동으로 녹화 시작 → 로그 기록, 백업

  • 테이블에 삽입, 수정, 삭제 작업 전에 작동하는 트리거를 BEFORE 트리거라 한다.
    => 사람이 문 열기 전에 센서가 울려서 “이 문 닫혀 있어요!” 라고 막는 것 → 사전 검사, 값 조정

3. 트리거 만들자(생성)~

DELIMITER $$
CREATE [OR REPLACE] TRIGGER 트리거명
BEFORE|AFTER INSERT|UPDATE|DELETE ON 테이블명
FOR EACH ROW
BEGIN
    -- SQL 프로그래밍 코드 작성
END $$
DELIMITER ;
  1. 상품에 대한 데이터를 보관할 테이블 생성
CREATE TABLE product(
	pcode INT AUTO_INCREMENT PRIMARY KEY, -- 상품 코드
	pname VARCHAR(100), -- 상품 이름
	brand VARCHAR(100), -- 브랜드 이름
	price INT, -- 가격
	stock INT DEFAULT 0 -- 재고
);

INSERT INTO product(pname, brand, price)
VALUES ('아이폰 15프로', '애플', 1200000);

INSERT INTO product(pname, brand, price)
VALUES ('갤럭시 S25', '삼성', 1300000);

SELECT * FROM product;
  1. 상품 입/출력 상세 이력을 보관할 테이블 생성
CREATE TABLE product_detail(
	`dcode` INT AUTO_INCREMENT PRIMARY KEY,  -- 입/출고 이력코드
	`status` VARCHAR(2) CHECK(`status` IN ('입고', '출고')), -- 상태
	`amount` INT, -- 수량
	`pcode`INT REFERENCES product,  -- 상품코드(외래 키)
	`ddate` DATE DEFAULT CURDATE() -- 입/출고 일자
);

-- 1번 상품이 2025-06-30 날짜로 10개 입고
INSERT INTO product_detail (`status`, `amount`, `pcode`, `ddate`)
VALUES('입고', 10, 1, 2025-06-30);

-- 1번 상품의 재고 수량 변경
UPDATE product
SET stock = stock + 10
WHERE pcode = 1;

-- 1번 상품이 2025-06-30 날짜로 5개 출고
INSERT INTO product_detail (`status`, `amount`, `pcode`, `ddate`)
VALUES('출고', 5, 1, 2025-06-30);

-- 1번 상품의 재고 수량 변경
UPDATE product
SET stock = - 5
WHERE pcode = 1;
-- 2번 상품이 2025-06-30날짜로 20개 입고
INSERT INTO prduct_detalo `status`,`amount`, `pcode`


-- 2번 상품이 2025-07-01낼짜로 20개 입고
INNER INTO product_detail(`status`, `amount`, `pcode`, `ddate`)
VALUES ('입고', 20, 2, '202-07-01');

SELECT * FROM product;

INNER INTO product_detail(`status`, `amount`, `pcode`, `ddate`)
VALUES ('출고', 30, 2, '202-07-01');

-- 1번 상품이 오늘 날짜로 100개 입고
INNER INTO product_detail(`status`, `amount`, `pcode`)
VALUES ('출고', 100, 1);

4. 트리거 깨꼬닥(삭제)

DROP TRIGGER trg_product_stock;

분명 많이 잔 것 같은데, 왜 이렇게 피곤하징.

profile
메가우쿨렐레는 나의 것

2개의 댓글

comment-user-thumbnail
2025년 7월 3일

정리 진짜 잘하시는 것 같아요! 재미있어서 계속 보게 되네요 ㅎㅎ

1개의 답글