기억의 비, 바람, 풍파에 스스로 바래져, 흔적을 지워 가던 이름 하나가
비 바람 소리를 뚫고, 뜬금없이 울부짖는 토르의 망치 처럼 쿵하닝
MyBatis에서 Procedure를 호출하는 법을 내어 놓아 보라고 잔잔한 연못에 망치질이당.
테두리에 항상 DB와 SQL을 옴팡지게 사랑하는 히어로들의 감옥에 갇힌 나에게
이런 매달림은 인생에서의 쇼생크 탈출이나, 빠삐용의 꿈을 꾸믈꾸믈 꿈틀이한당.
이게 어디 몇 마디 말로 다 설명할 수 있겠는강? 넓은 강?, 기픈 강?, 둘 합친 강?
다 설명이나 할 수 있는 강?... 그냥 뉘앙스의 배로 넘어 갈 수 있는 강을 택하장!.
일단 SQL-Developer에서
테스트용 초 심플 SUM을 구하는 프로시저 1개 맹글깅.
-- 초 심플 SUM을 구하는 프로시저, IN 2개, OUT 1개
CREATE OR REPLACE PROCEDURE PROC_SUM
(
p_num1 IN NUMBER,
p_num2 IN NUMBER,
p_sum OUT NUMBER
)
AS
BEGIN
p_sum := p_num1 + p_num2;
END;
잘 되는징 테스통(주의: 위 소스로 프로시저 맹글고 나서 실행!)
-- 프로시저 테스트, var로 bind변수 선언했으니 요것만 따로 실행할 것
VAR v_sum NUMBER;
EXECUTE PROC_SUM(272,272,:v_sum);
PRINT v_sum;
아래 처럼 잘 출력 되지 않을 이유는 오타가 아니면 찾을 수 없을꺼당.

괘니 PROCEDUE와 FUNCTION 비교를 위해
초 심플 SUM을 FUNCTION도 미리 한개 만들어 두장
CREATE OR REPLACE FUNCTION FUNC_SUM
( p_num1 IN NUMBER, p_num2 IN NUMBER)S
RETURN NUMBER
AS
BEGIN
RETURN (p_num1 + p_num2);
END;
잘 되는징 테스통
SELECT func_sum(272,272) as sum FROM dual;
분명 잘 될테닝, 화면 캡처는 생략이당.
Spring Boot 프로젝트를 생성했다 치공 (당든 web,mybatis, oracle driver, lombok등 포함해성...)
application.properties (내꺼 그대로 붙인거닝, 본인 프로젝트에 맞게 쑤떵할 것)
spring.application.name=free
server.port=8272
logging.level.com.e7e.free=debug
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=merong
spring.datasource.password=e7e
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.jdbc-type-for-null=varchar
mybatis.type-aliases-package=com.e7e.free.vo
mybatis.mapper-locations=classpath:mybatis/mapper/*-Mapper.xml
Procedure 와 Funcion의 호출 맵퍼 인터페이스를 맹글장.
ProcMapper.java
package com.e7e.free.mapper;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface ProcMapper {
// procedure call , map을 넘겨 주어야 map에 out 출력을 담아준당.
void procSum(Map<String, Object> map);
// function call
int funcSum(@Param("p1") int p1,@Param("p2") int p2);
}
맵퍼 인터페이스에 대응되는 sql 맵퍼 xml을 맹글장.
프로시저 호출시 mode=OUT에 해당하는 부분에서 뉘앙스(느낌)을 얻는게 뽀인또의 문이당.
Proc-Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.e7e.free.mapper.ProcMapper">
<resultMap type="int" id="e7e" />
<select id="procSum" statementType="CALLABLE" parameterType="hashmap">
CALL PROC_SUM(#{num1, mode=IN, jdbcType=NUMERIC},
#{num2, mode=IN, jdbcType=NUMERIC},
#{result, mode=OUT, jdbcType=NUMERIC,javaType=Integer,resultMap=e7e})
</select>
<select id="funcSum" resultType="int">
select func_sum(#{p1},#{p2}) from dual
</select>
</mapper>
이제 위 내용을 테스트 해보장.
테스트 소스는 src/test/java 아래에 패키지명 맞추어 맹그는거시당.
TestProcMapper.java
package com.e7e.free.mapper;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
public class TestProcMapper {
@Autowired
private ProcMapper procMapper;
@Test
@DisplayName("Procedure Call")
void procTest() {
Map<String, Object> tMap = new HashMap<>();
tMap.put("num1", 2);
tMap.put("num2", 7);
procMapper.procSum(tMap);
log.info("체킁: {}",tMap); // tMap에 out 결과가 담겨 있음
assertEquals(9,tMap.get("result"));
}
@Test
@DisplayName("Function Call")
void funcTest() {
int hap = procMapper.funcSum(2, 7);
log.info("체킁: {}",hap);
assertEquals(9, hap);
}
}
결과는 아래와 같을 지어당.~~ (VO 쓰는 예제도 추가 해야 할깡?)
넘긴 Map에 mode=OUT으로 설정된 result 속성이 추가되고, 그것에 결과값이 담긴 것이
잘 사용하긴 위한 뽀인또임이 왠지 모르게 뇌에 깊게 뉘앙스를 남긴당.(떠나지 못하게 잡아랑)

사실 Oracle의 Procedure나 Function은 그리 어려운 내용이 아니지만
사용에 어려움이 있는 건 사실이당. 오라클은 에러 메세지가 시대에 맞지 않게 불친절하면서도
자동완성도 그저 몇 개 그것도 아주 굼벵이 조상처럼 느리게 되는 척만 하니,
사용의 불편함이 뇌에 어렵다로 왜곡되는 걸 증명하는 대표적 케이스당.
sql을 편하게 쓸 수 있는 Tool들이 없는 건 아니지만, 대부분 유료에다가 비싸당.
(비싸당은 비가 싸다는 말도, 비오면 싸게 살 수 있다는 뜻도 아님을 분명히 하장!~~ ㅋㅋ)
한달 정도 무료로 전 기능을 쓰다가 한달이 지다면 자동으로 유료 기능만 못 쓰게 되고
무료기능은 계속 쓸 수 있는 기능을 갖춘 (정확히는 미리 카드 등록이 필요없는)
dbforge studio for oracle (오라클 말고 다른 DB용도 있음)은 한번 써 볼만 하다 하겠당.
나이란 놈이 자꾸 나에게 시간의 가치,
그 가격을 흥정하고자 한다.
경제적 관점에선 그저 쉽다.
많으면 싸고, 적으면 비싸다.
근데 왜 내 저울에선 젊음이 훨씬 무겁게 나갈까?
양이 아닌가? 젊음은 고급진가?
아~! 젊음은 그렇게 빨리도 흘러갔징!
삶이 틈틈히 친절히 주었던 Sign들....
https://www.youtube.com/watch?v=RoRP8zsp9sw
| Spring Security session(jsp) + jwt(react) (2) | 2025.11.13 |
|---|---|
| NGROK 무료 static 도메인 (기쁨) (2) | 2024.08.23 |
| boot Thymeleaf(타임리프) 사용 (2) | 2024.04.20 |
| Faker 이용 가짜 데이터 맹글기 (0) | 2024.04.10 |
| spring boot 3 security 그냥 한번 해보고 한번 더 해보면 잘 될꺼얼! (2) | 2024.03.19 |