본문 바로가기
슬기로운 자바 개발자 생활/스프링 및 자바웹 서비스

스프링에서 oracle declare 문 사용해보기

by 슬기로운 동네 형 2023. 5. 14.
반응형

스프링에서 oracle declare 문 사용해 보기

DB 프로시져 또는 declare 문

 

 절차지향 언어인 PL/SQL 과 객체지향 언어인 JAVA

 스프링 프레임워크가 일반화되면서 많은 프로젝트에서 DB 프로시져나 DB Function 사용을 자제하고 자바서비스 부분으로 비즈니스 또는 복잡한 계산 프로그래밍을 넣는 방식으로 바뀌고 있다.
 추세가 그렇게 변하는 이유는 꽤 많다.
 DataBase는 비싸고 웹서비스 쪽은 가격이 그에 비해 저렴하기도 하며, 비즈니스 로직을 데이터베이스에 되도록 의존적이지 않게 만들게 되면 스케일업이나 확장 및 이관도 용이한 면이 존재한다.
 또한 개발자들이 객체지향과 데이터베이스의 절차지향 프로그래밍 방법으로 인해, 프로그래밍 패러다임이 엇갈려 많은 고뇌를 할 수밖에 없던 상황을 벗어날 수 있게 도와주는 JPA도 일반화되어 가는 방향으로 바뀌는 모습이 곳곳에서 보인다.
 
 하지만 가끔은 기존 레거시의 DB 프로시져를 사용해야 할 경우도 발생한다.
 특히 은행권이나 복잡한 회계 시스템이 구축되어 있는 회사들의 경우 아직도 많은 곳이 DB 프로그래밍을 버릴 수가 없는 게 현실이다.
 어떤 면에서는 자바와 같은 객체지향 프로그래밍 언어보다는 DB프로시져의 절차적 언어가 유용하게 쓰이는 경우도 분명 있다.
 
이번 포스팅에서는 마이바티스에서 오라클 delcare를 사용하는 방법을 기록해 본다.


declare 문을 수행하고 어떤 결과를 받을 Vo

package com.example.demo.test;

public class TestVO {
    private Integer num;
    private String name;
    private String msg;

    public TestVO() {
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public Integer getNum() {
        return num;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "TestVO{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", msg='" + msg + '\'' +
                '}';
    }
}

mybatis xml => selectTest 메서드

    <select id="selectTest" statementType="CALLABLE" parameterType="com.example.demo.test.TestVO">
        { CALL
            DECLARE
                v_number int := 1000;
                v_name varchar(255);
            BEGIN

                select '데이터베이스 작업후 리턴된 값' as name
                into v_name
                from dual;

                #{name, mode=OUT , jdbcType=VARCHAR, javaType=String} := v_name;
                #{msg, mode=OUT , jdbcType=VARCHAR, javaType=String} := 'call oracle declare programing';

            END
        }
    </select>

xml과 대응되는 mapper 클래스

package com.example.demo.test.mapper;

import java.util.List;
import java.util.Map;

import com.example.demo.test.TestVO;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface TestMapper {
    public void selectTest(TestVO transferVO) throws Exception;
}
TestService

TestServiceImpl

package com.example.demo.test;

import com.example.demo.test.mapper.TestMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class TestServiceImpl implements TestService{

    @Autowired
    TestMapper testMapper;

    @Override
    public TestVO selectTest() throws Exception {
        System.out.println("###########--------------------------------------------------------------");
        TestVO container = new TestVO();
        container.setNum(1001);
        testMapper.selectTest(container);

        System.out.println("----------------------------------------------------------------");
        System.out.println(container.getMsg());
        System.out.println(container.toString());

        return container;
    }
    }

TestVo에는 3개의 필드 값이 존재하는데 3개 중에 num 만 값을 할당해서 sql를 호출한다.
그리고 나머지 값 두개 msg, name은 DB 프로그래밍의 결과로 나온 결과를 자바로 리턴한다.

@RestController
@Slf4j
public class TestController {

    @Resource
    private TestService testService;

    @RequestMapping("/test3")
    public TestVO selectTest() throws Exception {
        TestVO container = testService.selectTest();
        return container;
    }

}

컨트롤러는 딱히 별 내용은 없다. 스프링부트니까 웹브라우저에서 http://localhost/test3 만 호출해서 결과 값을 보는 용도.
 
수행결과

데이터베이스 - 프로시져로/declare 수행 후 리턴 받은 결과

name 과 msg는 오라클데이터베이스 delcare...문에서 실행된 후, 계산된 내용을 컨트롤로 리턴 받았다.
 
데이터베이스에 프로시져나 펑션을 못 만들게 하는 프로젝트도 많이 생겨나고 있다.
이번 설명한 방법은 결국 데이터베이스에 프로시져와 별 차이가 없다. 눈 가리고 야옹 격...
어떤 프로그램은 데이터베이스 프로시져나 펑션을 이용하면 공수가 적게 드는데 자바로 만들면 엄청나게 많은 리소스가 들는 것도 분명히 존재한다.
 추세를 따라가더라도 조금은 융통성 있게 따라갔으면 한다.

반응형

댓글