1. Oracle Stored Procedure란?
Oracle Stored Procedure(저장 프로시저)는 데이터베이스에 저장된 SQL 쿼리와 PL/SQL 코드를 한 번에 실행할 수 있는 미리 컴파일된 프로그램입니다. 프로시저는 복잡한 로직을 데이터베이스 내에서 수행할 수 있도록 도와주며, 응용 프로그램에서 반복적으로 호출할 수 있어 성능과 유지보수 측면에서 유리합니다. Stored Procedure는 매개변수를 받아 데이터베이스 작업을 수행하거나 결과를 반환할 수 있으며, 주로 대량의 데이터를 처리하거나 복잡한 비즈니스 로직을 처리할 때 사용됩니다.
2. Spring Boot와 MyBatis에서 Oracle Stored Procedure 호출하기
Spring Boot와 MyBatis를 활용해 Oracle의 Stored Procedure를 호출하는 방법을 단계별로 설명하겠습니다. 이 글에서는 Gradle을 빌드 도구로 사용하며, 간단한 예시를 통해 구현해 보겠습니다.
2-1. Gradle 설정
먼저, build.gradle 파일에서 MyBatis와 Oracle JDBC 드라이버에 대한 의존성을 추가해야 합니다.
plugins {
id 'org.springframework.boot' version '3.1.0' // 최신 버전 사용 권장
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0' // MyBatis 의존성
runtimeOnly 'com.oracle.database.jdbc:ojdbc8:19.9.0.0' // Oracle JDBC 드라이버
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
2-2. Oracle Stored Procedure 예시
이제 간단한 Stored Procedure를 만들어 보겠습니다. 이 프로시저는 두 개의 숫자를 받아 그 합계를 출력하는 기능을 합니다.
CREATE OR REPLACE PROCEDURE ADD_NUMBERS(
num1 IN NUMBER,
num2 IN NUMBER,
result OUT NUMBER
) AS
BEGIN
result := num1 + num2;
END;
/
위 프로시저는 num1과 num2라는 입력 값을 받아 result라는 출력 값을 반환합니다.
2-3. Spring Boot에서 MyBatis를 통한 호출 구현
Spring Boot에서 MyBatis로 위 프로시저를 호출하는 예시 코드를 작성해 보겠습니다.
- MyBatis Mapper 인터페이스 작성
package com.example.demo.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.Map;
@Mapper
public interface ProcedureMapper {
@Select("{ CALL ADD_NUMBERS(#{num1, mode=IN, jdbcType=NUMERIC}, #{num2, mode=IN, jdbcType=NUMERIC}, #{result, mode=OUT, jdbcType=NUMERIC}) }")
void callAddNumbersProcedure(@Param("num1") int num1,
@Param("num2") int num2,
@Param("result") Map<String, Object> result);
}
- Service 클래스 작성
Service 클래스에서는 Mapper를 호출하여 실제 프로시저를 실행합니다.
package com.example.demo.service;
import com.example.demo.mapper.ProcedureMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class ProcedureService {
@Autowired
private ProcedureMapper procedureMapper;
public int addNumbers(int num1, int num2) {
Map<String, Object> result = new HashMap<>();
procedureMapper.callAddNumbersProcedure(num1, num2, result);
return (Integer) result.get("result");
}
}
- Controller 클래스 작성
컨트롤러에서는 사용자 요청에 따라 Service를 호출합니다.
package com.example.demo.controller;
import com.example.demo.service.ProcedureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProcedureController {
@Autowired
private ProcedureService procedureService;
@GetMapping("/add")
public String addNumbers(@RequestParam int num1, @RequestParam int num2) {
int result = procedureService.addNumbers(num1, num2);
return "Result of " + num1 + " + " + num2 + " = " + result;
}
}
2-4. 주의사항
- Oracle JDBC 드라이버 버전: Oracle JDBC 드라이버는 버전 호환성을 신중히 검토해야 합니다. ojdbc8는 Java 8 이상 버전에서 사용 가능하며, 데이터베이스와의 호환성도 맞춰야 합니다.
- MyBatis 설정 주의: MyBatis를 사용할 때는 프로시저 호출에서 매개변수의 모드(IN, OUT)와 데이터 타입(jdbcType)을 정확히 지정해야 합니다. 잘못 설정하면 오류가 발생하거나 예상하지 못한 결과가 반환될 수 있습니다.
- Exception Handling: 프로시저 호출 시 발생할 수 있는 예외를 처리하는 것이 중요합니다. Oracle의 오류 메시지는 다소 구체적일 수 있으나, 이를 잘 해석하고 처리하는 것이 필요합니다. 예를 들어, 프로시저가 실패할 경우 트랜잭션 롤백 처리나 로그 기록을 통해 문제를 추적할 수 있습니다.
- Connection Pool 관리: 프로시저 호출은 데이터베이스 연결을 사용하므로, HikariCP 같은 연결 풀(Connection Pool)을 적절히 설정해 성능을 최적화하는 것이 중요합니다. Spring Boot 기본값으로 HikariCP가 설정되어 있지만, application.properties 파일에서 커넥션 풀 관련 설정을 조정할 수 있습니다.
이 글에서는 Spring Boot와 MyBatis를 사용해 Oracle Stored Procedure를 호출하는 방법을 살펴보았습니다. Stored Procedure는 데이터베이스에서 복잡한 작업을 처리하는 데 강력한 도구이며, Spring Boot와 MyBatis의 조합으로 이를 간단하게 호출할 수 있습니다. Stored Procedure 사용 시에는 의존성 설정, 파라미터 매핑, 예외 처리와 같은 사항에 유의하여 안전하고 효율적인 코드를 작성하는 것이 중요합니다.
'Spring' 카테고리의 다른 글
Spring Boot 2에서 3으로의 완벽한 마이그레이션 가이드: 새로운 변화와 적용 방법 (0) | 2024.10.04 |
---|---|
Spring REST Docs vs Swagger: API 문서화를 완벽하게 관리하는 두 가지 방법 (0) | 2024.10.04 |
Spring AI 🤖: 자바 개발자를 위한 인공지능 통합의 새로운 패러다임 (0) | 2024.09.13 |
Spring Cloud Kubernetes로 클라우드 네이티브 애플리케이션 만들기: 주요 기능과 도입 장점 (0) | 2024.09.10 |
Spring Boot 애플리케이션을 Kubernetes에 완벽하게 배포하는 방법: Helm과 Spring Cloud Kubernetes를 활용한 실전 가이드 (0) | 2024.09.10 |