본문 바로가기

Spring

Spring Boot와 MyBatis로 Oracle Stored Procedure 구현하기: 실전 예시와 주의사항

728x90
반응형

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. 주의사항

  1. Oracle JDBC 드라이버 버전: Oracle JDBC 드라이버는 버전 호환성을 신중히 검토해야 합니다. ojdbc8는 Java 8 이상 버전에서 사용 가능하며, 데이터베이스와의 호환성도 맞춰야 합니다.
  2. MyBatis 설정 주의: MyBatis를 사용할 때는 프로시저 호출에서 매개변수의 모드(IN, OUT)와 데이터 타입(jdbcType)을 정확히 지정해야 합니다. 잘못 설정하면 오류가 발생하거나 예상하지 못한 결과가 반환될 수 있습니다.
  3. Exception Handling: 프로시저 호출 시 발생할 수 있는 예외를 처리하는 것이 중요합니다. Oracle의 오류 메시지는 다소 구체적일 수 있으나, 이를 잘 해석하고 처리하는 것이 필요합니다. 예를 들어, 프로시저가 실패할 경우 트랜잭션 롤백 처리나 로그 기록을 통해 문제를 추적할 수 있습니다.
  4. Connection Pool 관리: 프로시저 호출은 데이터베이스 연결을 사용하므로, HikariCP 같은 연결 풀(Connection Pool)을 적절히 설정해 성능을 최적화하는 것이 중요합니다. Spring Boot 기본값으로 HikariCP가 설정되어 있지만, application.properties 파일에서 커넥션 풀 관련 설정을 조정할 수 있습니다.

728x90

이 글에서는 Spring Boot와 MyBatis를 사용해 Oracle Stored Procedure를 호출하는 방법을 살펴보았습니다. Stored Procedure는 데이터베이스에서 복잡한 작업을 처리하는 데 강력한 도구이며, Spring Boot와 MyBatis의 조합으로 이를 간단하게 호출할 수 있습니다. Stored Procedure 사용 시에는 의존성 설정, 파라미터 매핑, 예외 처리와 같은 사항에 유의하여 안전하고 효율적인 코드를 작성하는 것이 중요합니다.

728x90
반응형