본문 바로가기
Dev/MSSql

MSSql로 HTTP 통신하기 (API 결과 받아오기) - devgilgilit

by 데브길길잇 2022. 8. 19.
728x90
반응형

안녕하세요 dev-길길IT입니다.

 

API를 사용하는 경우는 서버를 별도로 만들어서 호출하는 것이 일반적이지만

MSSql에서 API를 다이렉트로 호출하는 방법이 있는 것도 알고계시나요?

단순하게 간단한 텍스트 정보를 받아오는 경우에 아주 유용합니다.

 

오늘은 MSSql에서 HTTP 통신을 어떻게 할 수 있는지 그 방법을 소개해드리려 합니다.

 

 

※ 목차
1. XMLHTTP란?
2. sp_OACreate 활용법 / 소스코드
3. MSSql에서의 HTTP 호출 방법
    3-1. GET 방식
    3-2. POST 방식
4. 마무리
 

 


1. XMLHTTP란?

@ https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms759148(v=vs.85)

 

SQL Server에서는 웹 페이지를 읽는 XML Parser인 

MSXML2.XMLHTTP (MSXML2.ServerXMLHTTP)

개체 형식의 OLE 인스턴스로 생성한 후

이것을 활용하여 HTTP 통신을 하게 됩니다.

 

쉽게 말하면 XML 방식 (<태그></태그>) 으로

HTTP Request, Response를 주고 받는 것입니다.

 

 

2. sp_OACreate 활용법 / 소스 코드 예제

 

XMLHTTP는 sp_OACreate라는 내장 Stored Procedure를 통해 만들 수 있습니다.

 

예제 코드
 DECLARE 
     @url  VARCHAR(300),  
     @Object Int,   
     @ResponseText nvarchar(4000),       
     @text nvarchar(4000)  
  
 SELECT @url = 'URL'  
    
      
 Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;      
 Exec sp_OAMethod @Object, 'open', NULL, 'get', @url,'false'      
 Exec sp_OAMethod @Object, 'send'      
 Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
 
 EXEC sp_OADestroy @Object

 

간략한 코드를 설명해드리겠습니다.

 

1. sp_OACreate 'MSCML2.XMLHTTP'를 통해서 XML Parser 개체를 생성한 후 Object ID(숫자)를 Return 받습니다.

2. sp_OAMethod를 통해서 해당 Object ID의 Request의 Method, url등의 Header 셋팅을 합니다.

​3. 그 후 @ResponseText를 출력하면 Response를 확인할 수 있습니다..

4. 마지막으로 sp_OADestroy를 실행하여 해당 Object를 파기합니다.

 

 

※ sys.sp_OACreate'에 대한 액세스가 차단되었습니다.

만약 위와 같은 오류가 뜰 경우 아래와 같이 OLE 자동화에 대한 권한을 부여하면 해결이 됩니다.

EXEC sp_configure 'Ole Automation Procedures', 1;  --OLE 자동화 저장 프로시저 엑세스 활성화
RECONFIGURE;
GO

 

 

3. MSSql에서의 HTTP 호출 방법

 

IntellJ를 활용한 Spring Boot 강의를 들으면서 간단한 API 서버를 만들었습니다.

그 서버에 아래와 같은 get Method의 API를 호출하는 것으로 테스트를 진행해보겠습니다.

 

 

3-1. GET 방식 호출

DECLARE @Object AS INT;
DECLARE @ResponseText AS VARCHAR(8000);
DECLARE @Body AS VARCHAR(8000) = ''

EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'get','http://localhost:8080', 'false'
EXEC sp_OAMethod @Object, 'send', null, @body

EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
SELECT @ResponseText

EXEC sp_OADestroy @Object

 

1) 5번째 라인에 있는 sp_OAMethod Header 셋팅 구문을 주목해보겠습니다.

    - 여기서 3번째에 항목이 Method를 정의하는데요. get이라고 적으면 get 방식으로 요청이 됩니다.   

    - 4번째 항목은 API의 URL주소를 넣어줍니다.

 

2) 6번째 라인은 Request Body 내용을 정의할 수 있는데 여기서는 생략하겠습니다.

 

3) 그 이후 ResponseText를 통해 결과를 출력해줍니다.

 

4) sp_OADestroy를 통해 해당 개체를 파기합니다.

 

이 API 서버에서 Get 호출은 SELECT 문을 수행합니다.

실행 결과

왼쪽은 Postman을 통해서 API를 호출한 것이고

오른쪽은 MSSql을 통해서 동일한 API를 호출한 것입니다.

Json 방식으로 Return이 오는데 동일한 결과를 얻을 수 있구요

다만 차이점은 SQL은 Pretty View가 안 된다는 것입니다.

 

 

3-2. POST 방식 호출

 

DECLARE @Object AS INT;
DECLARE @ResponseText AS VARCHAR(8000);
DECLARE @Body AS VARCHAR(8000) = 
'{
    "title":"테스트 입니다222"
}'

EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'post','http://localhost:8080', 'false'

EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
EXEC sp_OAMethod @Object, 'send', null, @body

EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
SELECT @ResponseText

EXEC sp_OADestroy @Object

 

Post 방식의 호출은 Get 방식과 2가지만 신경써주면 됩니다.

    1) Parameter를 Body에 넣어서 전송

    2) op_OAMethod의 'get' 헤더를 'post'로 변경

 

이 때 만약 Body에 담는 내용을 JSON으로 하려면

9번째 라인에서 setRequestHeader의 Content-type = application/json으로 지정해주면 됩니다.

이 API 서버에서 Post 호출은 CREATE문을 수행합니다. (ID가 하나씩 증가)

 

실행 결과

동일하게 왼쪽은 Postman을 통해서 API를 호출한 것이고

오른쪽은 MSSql을 통해서 동일한 API를 호출한 것입니다.

동일한 결과를 보실 수 있습니다.

 

4. 마무리

오늘은 MSSql에서 HTTP 통신을 하는 방법을 알아보았습니다.

사실 DB에서 API 통신을 하는 경우가 흔하지는 않습니다.

대부분 API 서버를 통해서 웹서버나 백엔드 단에서 처리를 하는 것이 일반적이죠.

하지만 모든 개발 기법이 그렇듯 이런 것도 가능하다는 것을 알아두면

언젠가 특별한 상황에서 쓰이는 상황이 오게 되더라구요.

 

도움이 되셨으면 좋겠습니다.

감사합니다.


 

728x90
반응형

댓글