프로시저
SQL 쿼리를 미리 작성하여 컴파일 한 후 저장한 객체이다.
여러 쿼리를 한 번에 수행하는 것이다
프로시저는 데이터 베이스의 향상되며, 반복적으로 사용되는 SQL쿼리를 매번 실행하는 것 보다 프로시저를 사용한것이 좋다.
함수와 유사한 느낌이다.
함수는 클라이언트에서 처리하며, 리턴값이 필수이고, 리턴값은 하나만 변환가능하다.
하지만 프로시저는 서버로 보내서 처리하며, 리턴값은 선택하고, 리턴값은 여러개 반환된다.
SQL처리하는 위치에서 차이이며, 프로시저가 더 빠른 성능을 보인다.
프로시저는 언제 사용해?? ++ 장점
- 자주 반복되는 작업을 할 경우
- 복잡한 작업을 할 경우
- 보안성을 높여야 할 경우
- 성능을 높여야 할 경우
예를 들면 회원가입시 포인트도 같이 주는것
이 프로시저는 회원가입과 동시에 지급할 포인트를 계산하여 포인트를 지급한다. >>
프로시저를 통해 동시에 이뤄지므로 성능면에서 뛰어나다.
프로시저를 사용하는 이유가 뭐야??
- 하나의 요청으로 여러 SQL문 실행
- 네트워크 소요 시간 줄인다.
- 보수성 뛰어나다
- 개발 업무를 구분하여 개발할 수 있다.
프로시저는 트랜잭션을 지원하며, 프로시저 내에서 트랜잭션을 처리할 수 있다.
또한, 프로시저는 매개변수를 사용하여 인자를 전달할 수 있습니다
단점은 뭐야??
- 복잡성: 쿼리 작성하는 것보다 복잡하다
- 이식성: db마다 프로시저 구현하는 방식이 다르다
- 디버깅: 프로시저가 오류가 있을 경우, 디버깅이 쉽지 않다.
- 제한된 유연성: 미리 정의된 작업 이외의 다른 작업을 수행하기 위해서는 새로운 프로시저를 만들어야함
트랜잭션 : 데이터베이스의 하나의 논리적인 작업단위
특징
- 원자성(Atomicity): 트랜잭션이 전부 실행되거나 전부 않아야 합니다.
- 일관성(Consistency): 트랜잭션 전후 데이터의 일관성이 유지되어야 합니다.
- 격리성(Isolation): 트랜잭션 수행 중 다른 트랜잭션의 연산이 끼어들지 못하도록 보장합니다.
- 지속성(Durability): 트랜잭션이 성공적으로 완료됐을 경우, 결과가 영구적으로 반영되어야 합니다.
사용자 업데이트 하는 프로시저를 만든다고 칠때 프로시저는 해당 사용자의 id,password,생일 등을 받아 db에 저장가능하다.
이렇게 만든 프로시저는 필요할 때 마다 사용 할 수 있으며, 반복된 코드를 줄일 수 있다.
프로시저를 실행하는 도중에 어떤 오류가 발생하면, 이전에 실행된 작업들이 모두 롤백되어 데이터 일관성을 유지할 수 있습니다.
어떻게 만들어 ??
CREATE PROCEDURE register_member(IN member_name VARCHAR(255), IN email VARCHAR(255))
BEGIN
-- 회원 정보 등록
INSERT INTO members(name, email) VALUES (member_name, email);
-- 포인트 지급
UPDATE members SET points = points + 100 WHERE email = email;
END;
register_member 라는 이름을 가진 프로시저를 만드는데
매개변수로 사용될 인자들을 넘긴다. 위 코드로는 member_name, email 을 넘긴다.
members 테이블에 name, email 에 저 두개를 넘긴다.
members 테이블에 potins 에 100 포인트를 더해준다.
In / Out
CREATE PROCEDURE calculate_salary(IN employee_id INT, OUT salary INT)
BEGIN
SELECT salary INTO salary FROM employees WHERE id = employee_id;
SET salary = salary * 1.1;
END;
위 프로시저는 employee_id를 IN 매개변수로 받아 해당 id를 가진 employees 테이블의 salary 값을 조회한다.
그리고 salary 값을 1.1배로 증가시켜 OUT 매개변수인 salary에 대입한다.
이렇게 하면 salary 값의 계산 결과를 호출자에게 반환할 수 있다.
프로시저 목록 확인
show procedure status;
프로시저 내용 확인
show create procedure 프로시저이름
프로시저 삭제
drop procedure 프로시저 이름
댓글