패키지와 프로시저에 대한 단상
국비 다닐 동안 오라클에 대해 배웠지만, CRUD, 조인, 서브쿼리, 뷰 정도가 전부였다.
수료 후 면접을 다니면서 DB는 어느 정도 다루느냐는 질문을 자주 받았는데,
내가 어느 정도 아는지도 알 수 없을 정도로 무지했기에 아주 어려운 질문이었다.
개발자로 첫 회사에 입사한 이후에서야 패키지, 프로시저, 펑션의 존재를 알게 됐다.
레거시 솔루션을 대할때 지금도 가장 난감한 부분이 DB가 대부분의 비즈니스 로직을 들고 있다는 점이다.
어느정도 익숙해지고 나면 이게 어떤 의도이고 대략 어떻게 작성되었겠거니 파악이 가능하지만,
들여다본적 없는 새로운 부분을 작업해야할 땐 그 때마다 엄청난 노력이 필요하다.
한번의 패키지 호출로 DB내 설정값 조회, 전달된 파라미터를 이용한 CRUD, 아웃풋 매핑까지
여러차례 DB연결을 시도하지 않아도 된다는 점에서 패키지의 장점이 있긴 하지만,
변경 사항에 대한 추적관리가 어렵다는점, 완성된 패키지를 사용해서 개발하는 사람 입장에선
패키지가 완전 블랙박스와도 같아서 DX 만족도를 떨어뜨리는 주요한 요인이 된다는 점에서
나는 여전히 패키지, 프로시저와 친하지 못하다.
여러 차례의 커넥션을 가져가야 한다 하더라도,
비즈니스로직이나 검증로직등은 자바단에서 가져가야 추적관리나 협업에 낫다고 생각한다.
기존 VB로 구성되어있던 솔루션이 자바로 변환되는 과정에서,
기존 DB의 역할을 그대로 가져오는 과정에서 생긴 기술부채가 아닌가 생각된다.
기본적인 프로시저 문법
지금도 사실 잘 모르지만, 이제는 어떻게 파라미터를 받고, 자료형을 정의하고,
변수를 선언하고, 쿼리를 수행하고 결과를 내보내고 하는지 보고 이해할 수 있게 됐다.
그리고 오늘 프로시저 일부 수정이 필요했는데, 그 과정에서 알게된 내용을 간략하게 정리해본다.
변수선언, 조건문, 반복문 정도이다.
이를 활용하면 대부분의 내용은 작성하거나 수정할 수 있을 것 같다.
-- 콘솔 PRINT를 활성화 한다.
SET SERVEROUTPUT ON;
-- DECLARE 이후에 변수명 자료형 := 값; 으로 변수를 선언한다.
DECLARE
RICHFLAG VARCHAR2(1) := 'Y';
RICHKEY NUMBER := 0;
RICHSECONDKEY NUMBER := 7;
-- IF 변수명 = 값 THEN <수행할내용> END IF 로 조건문을 작성한다.
-- WHILE(조건문) LOOP <수행할내용> END LOOP 로 반복문을 작성한다.
BEGIN
IF RICHFLAG = 'Y' THEN
IF RICHKEY = '0' THEN
WHILE(RICHKEY < RICHSECONDKEY)
LOOP
DBMS_OUTPUT.PUT_LINE('RICHKEY VS RICHSECONDKEY : ' || RICHKEY || ' ' || RICHSECONDKEY);
RICHKEY := RICHKEY + 1;
END LOOP;
END IF;
END IF;
END;
SQL Developer에서 콘솔 출력 결과
변수선언, 조건문과 반복문을 이용해 콘솔 출력을 수행한 결과이다.
SET SERVEROUTPUT ON을 통해 콘솔 출력을 활성화해줘야 한다.
IntelliJ에서 콘솔 출력 결과
인텔리제이에서는 SET SERVEROUTPUT ON 대신에,
Enable DBMSOUTPUT 을 활성화 해줘야한다.
'Database' 카테고리의 다른 글
MySQL의 트랜잭션 격리 수준 (5) | 2022.06.28 |
---|---|
MySQL 구조 및 동작 흐름 (Real MySQL 8.0 - 4장 아키텍처) (1) | 2022.06.13 |
중성화 여부 파악하기 - CASE WHEN 조건 THEN 값 WHEN 조건 THEN 값 ELSE 값 END AS 컬럼별칭 (0) | 2020.11.25 |
보호소에서 중성화한 동물 - LIKE, % (0) | 2020.11.25 |
오랜 기간 보호한 동물(1) - LEFT JOIN, SUB QUERY (0) | 2020.11.24 |