저장 프로시저란 무엇인가?
저장 프로시저(Stored Procedure)는 데이터베이스 서버에 미리 컴파일되어 저장되는 SQL 문의 집합입니다. 반복적으로 실행해야 하는 작업을 하나의 프로시저로 묶어두면 성능과 유지보수성 면에서 큰 이점을 얻을 수 있습니다.
저장 프로시저의 주요 장점
빠른 응답 속도 — 저장 프로시저는 한 번 컴파일된 후 데이터베이스에 저장되기 때문에, 프로시저를 호출할 때마다 빠른 응답 속도를 기대할 수 있습니다.
SQL 문의 일괄 실행 — 필요한 모든 SQL 문을 하나의 프로시저 안에 그룹화하여 한 번에 실행할 수 있습니다.
서버 측 처리로 인한 성능 향상 — 프로시저는 클라이언트보다 처리 속도가 빠른 데이터베이스 서버에 저장됩니다. 따라서 복잡한 쿼리를 프로시저로 실행하면 전체적인 처리 속도가 향상됩니다.
코드 중복 제거 — 프로시저를 활용하면 동일한 코드를 반복해서 작성할 필요가 없으며, 저장 함수(Stored Function) 호출과 같은 추가 SQL 기능도 함께 사용할 수 있습니다.
손쉬운 유지보수 — 한 번 컴파일된 저장 프로시저는 여러 애플리케이션에서 재사용할 수 있습니다. 변경이 필요할 경우 애플리케이션 코드를 수정하지 않고 프로시저만 수정하면 되므로 유지보수가 매우 편리합니다.
Java와의 상호 운용성 — Java 코드에서 PL/SQL 저장 프로시저를 호출할 수 있고, 반대로 PL/SQL에서 Java 저장 프로시저를 호출하는 것도 가능합니다.
예제: 저장 프로시저 생성 및 호출하기
먼저 다음과 같은 구조를 가진 Employees 테이블이 생성되어 있다고 가정해 보겠습니다.
+----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+-------+ | Name | varchar(255) | YES | | NULL | | | Salary | int(11) | NO | | NULL | | | Location | varchar(255) | YES | | NULL | | +----------+--------------+------+-----+---------+-------+
그리고 Employees 테이블에 데이터를 삽입하는 myProcedure라는 이름의 저장 프로시저가 있다고 가정합니다.
Create procedure myProcedure (IN name VARCHAR(30), IN sal INT, IN loc VARCHAR(45)) -> BEGIN -> INSERT INTO Employees(Name, Salary, Location) VALUES (name, sal, loc); -> END //
다음 JDBC 프로그램은 위에서 생성한 저장 프로시저를 CallableStatement를 통해 호출합니다.
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Example {
public static void main(String args[]) throws SQLException {
// 드라이버 등록
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 연결 설정
String mysqlUrl = "jdbc:mysql://localhost/testdb";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
// CallableStatement 준비
CallableStatement cstmt = con.prepareCall("{call myProcedure(?, ?, ?)}");
cstmt.setString(1, "Amit");
cstmt.setInt(2, 3000);
cstmt.setString(3, "Hyderabad");
cstmt.execute();
cstmt.setString(1, "Kalyan");
cstmt.setInt(2, 4000);
cstmt.setString(3, "Vishakhapatnam");
cstmt.execute();
}
}실행 결과
Connection established......
프로그램 실행 후 Employees 테이블의 내용을 확인해 보면, 아래와 같이 새로 추가된 두 개의 행을 확인할 수 있습니다.
+-----------+--------+----------------+ | Name | Salary | Location | +-----------+--------+----------------+ | Amit | 3000 | Hyderabad | | Kalyan | 4000 | Vishakhapatnam | +-----------+--------+----------------+
마무리
이처럼 저장 프로시저는 성능 최적화, 코드 재사용, 유지보수성 향상 등 다양한 장점을 제공합니다. 특히 반복적인 데이터베이스 작업이 많거나 여러 애플리케이션에서 동일한 로직을 공유해야 하는 환경이라면 저장 프로시저를 적극적으로 활용해 보시기 바랍니다.