기본 콘텐츠로 건너뛰기

DB엔지니어라면 코드를 몰라도 API서버가 만들어지는 것 같습니다.




2007년에 SQL Server에 있는 SP를 기반으로 만든 서비스가 있습니다. 
다른 RDBMS에서는 그냥 프로시저라고 부르는데 유독 SQL Server에서만 Stored Procedure라고 하네요.. 
이유가 뭔지는 모르겠지만..

아뭏든.. 

거의 모든 처리는 SP에서 처리하고 
웹페이지는 그냥 SP를 실행한 결과만 호출하는 방식이죠.
결과 또한 표시 화면에 맞추어 쿼리를 만들었기 때문에 계산이나 변수에 받아서 조정할 일이 없습니다. 

여기에는 많은 개념이 있었는데요.. 
2007년이면 AWS가 막 이름을 내기 시작했고, VMWare가 일본을 장악 했던 떄이죠. 
VMWare의 3.5를 쓰다가 VMWare 4.0부터 많은 부분이 안정화 되었고, 
이 VMWare를 이용한 인프라 관리가 관건이었습니다. 
Xen도 이 때 많이 커지는 듯 하였으나, 어느 정도 중대규모 및 상업용은 VMWare가, 
초 대규모 또는 무상은 Xen이 점령하고 그 밖에 virtualserver, hyper-v, kvm등등 많은 가상화 솔루션들이 있었죠.. 그리고 2011년 정도 되어서 openstack과 cloudstack을 기반으로 오픈소스 진영이 엄청나게 전쟁중이었구요..

VMWare같은 가상화 솔루션은 하나의 머신에 VM을 쓰다가 
vMotion이란 것을 이용해서 가동 중에 여기저기 머신을 오다닐 수 있는 기능을 가지고 있구요, 
그러다 보면 local IP를 바꾸기 일상이죠. 
300대의 물리머신에 대당 10개의 가상머신이 있다면 일일이 동일한 IP로 옮겨다니기 어렵거든요..  
가상 IP를 마구잡이로 넣고 나중에 글로벌IP를 Routing으로 매핑하거나 NAT를 많이 쓰기도 했구요.. 

이 즈음에 Azure 클라우드 서비스가 처음 선보였는데, 
이 때의 Azure에선 고정IP를 사용할 수가 없는 사양이었습니다. 
서버를 리부팅하면 global IP가 바뀌니 도메인만으로 서비스해라.. 
였는데, 그당시엔 그게 불가능한 서비스가 더 많았죠..

그 동안의 인프라 관리 툴에서는 IP가 거의 키가 되었는데, 
여기저기 옮겨다니면서 IP가 마구 바뀌고, 
서버에는 Loccal IP만 탑재되고 글로벌 IP가 바뀌는 바람에
대부분의 인프라 관리 솔루션을 도입하면
바뀌는 IP때문에 문제가 많았습니다. 
게다가 하나의 세그먼트에 하나의 관리툴.. 처럼 들어가다보니
엄청나게 많은 관리툴을 로그인하기도 했죠.. 

vCenter를 살 수 있는 기업이 많지 않았거든요..

이 떄 제가 만든 이 giip라는 인프라 관리 엔진은 2007년에 
고객 인프라를 운영하면서 관리를 편하게 하려고 만들었는데요.. 

VM이나 물리머신, 아니면 회사에 있는 개발 머신까지 
한 화면에서 관리를 하고 소스 동시 배포, OS업데이트 등의
다양한 제어를 했죠. 

이 때만해도 VM관리 전용 솔루션도 거의 없었고, 
있다해도 VM전용이라 물리 머신은 따로 관리하고, 
멀리 떨어진 오피스의 머신을 관리할 수도 없고, 
소스 배포 같은것도 어려웠던 떄였죠.. 
CI/CD란 개념이 거의 2010년 이후에 많은 곳에서 쓰기 시작했거든요.. 

서버에 가벼운 스크립트 베이스의 Agent를 설치하고 
giip서버에 지속적으로 자신의 로컬 IP와 글로벌 IP를 업데이트를 해서
이게 VM인지 물리서버인지, VM이면 어떤 물리서버에 있는지, 
어떤 경로로 찾아 들어가는지를 알기 쉽게 해주고, 

역으로 IP를 몰라도 서버의 고유번호만 알고 있으면
어디에 있는 명령을 내릴 수 있는 획기적인 서비스였죠..

게다가 VM을 생성해주고 역할을 지정하면
그에 맞는 스크립트를 자동으로 받아서 필요한 설치를 혼자 다 해주죠.. 
수백대를 동시에 업데이트하거나 설정해줄 수 있구요.. 
서버가 고장나면 새로운 물리서버나 VM으로 대체해도 
동일 agent의 번호만 들어가면 동일 서버처럼 관리해주죠.. 

방화벽이 막혀있어도 
TCP hole punching이란 개념으로 
해커는 못들어오지만 giip는 외부에서 제어가 되는
무시무시한 툴이었습니다. 

실제로 AWS에서 설정 다하고 iptable에 자기 아이피 넣는거 잊어먹고
전부 닫아버린 뒤에 연결이 안되는 고객이 있었는데, 
그 떄 당시의 aws에서는 그런 유저 실수는 새로 VM만들어라.. 라고 했었고, 
다행히도 giip agent는 설치를 해두었드라구요..
그래서 다 막혀있었지만 iptable을 풀어서 열어줬지요..

이런 엄청난 툴을.. 
알아주는 사람 없이 15년이 흘렀구요.. 
제가 관리중인 인프라 에서는 여전히 giip를 사용하고 있었죠.

예전에 만들어서 그런지 
프론트 웹이 Classic ASP라고 Active Server Page라는 2005년에 MS의 공식 서포트가 종료한
언어를 쓰고 있었죠. 
그래서 이걸 제안한 적도 몇 번 있었는데, 
한국 기업은 하나같이 자바로 만들지 않으면 안된다는 둥 
천대를 받았습니다. 
일본에서는 어떤 언어든 자기네들에게 맞으면 써줬는데..

다행히도
Azure의 App Service가 Serverless로 아직도 올릴 수가 있어서
그래서 계속 쓰고 있는데요.. 

원래부터가 SQL Server에 모든 부하를 주는 서비스다보니
단순히 HTML만으로도 ajax로 통신하는걸로도 서버 관리가 가능했거든요.. 

여기에 UiPath라는 RPA툴이 생기면서 
UiPath용 Agent를 만들어 UiPath Orchestrator라는 천만원이 넘는 중앙관리 솔루션을 
구입하지 않더라도 giip가 중앙에서 수천대의 UiPath에이전트가 깔린 PC를 관리할 수도 있었죠.. 

이렇게 잘 쓰던 어느날.. 

Slack workflow를 쓰다보니 이거 SQL Server랑 연결만 하면 slack으로 컨트롤 되는거 아냐?
하고 고민을 했습니다. 

그래서 chatgpt에게 물었죠.. 

SQL Server를 연결하는 API서버를 Azure서비스로 가장 쉽게 구현하는 방법을 알려줘!

그랬더니 Azure Function App 과 Azure Logic App을 알려주더랍니다. 

그럼 그 둘다 구현 방법과 하루 10만 리퀘스트당 가격을 비교해줘.. 
라고 하니 Function App이 Logic App에 비해 1/10가량 비용이 적다고 합니다. 

너무 차이가 많이 나니까
그냥 Function App으로 하자.. 

그리고 chatgpt가 Python으로 Function App 샘플을 줘서 
그걸로 만들었습니다. 

그런데.. Linux OS에 Python으로 하니 pyodbc가 설치가 안되네요.. ..

찾아보니 Windows OS로 올리거나 비싼 인스턴스로 하거나 Docker로 해야 한다고 합니다. 

다 귀찮아서 그냥 Windows OS로 올리면서 보니까.. 
윈도면 Powershell이 더 편하잖아!
하고 Python을 버리고 Powershell core를 선택해버렸습니다. 
윈도우즈 인프라 관리할 때 powershell로 db연결등을 많이 해봐서 
손에 익숙하거든요..

그리고 시작하려니까 azure에서 기본 앱 소스를 주네요.. 

그걸 복사해서 chatgpt에 붙여넣고 
이 소스를 기반으로 Function app에서 사용 가능한 SQL Server SP를 호출하는 API소스를 만들어줘!

라고 하니 뚝딱 만들어 줬습니다. 

그걸로 function app에 올리고 PostMan으로 테스트하니 성공!

그럼 slack에 붙여야지.. 하고 chatgpt의 도움을 받아서 

Slack app 을 추가 했죠. 
이건 URL과 슬래시커맨드만 설정하면 되니 너무 쉬웠구요.. 

테스트를 하니 슬랙에서는 그냥 안내보내주네요.. 

그래서 slack의 slash command에 맞게 아웃풋을 만들어달라니까
json으로 잘 만들어줬습니다. 

이걸로 API서버는 끝.. 

API를 만들어야 하는데, 
API의 정의를 하나하나 스크립트에서 만드는건 귀찮아서 

SP의 이름중 어간만 따서 api명으로 만들고 
나머지 옵션들은 그대로 넣게 했습니다. 

SP의 가장 큰 장점이 
변수로 받은 데이터는 모두 텍스트로 인지하기 때문에 
Sp_exec같은 시스템 SP만 아니면
SQL 인젝션 자체가 불가능 하죠.. 

SQL서버 사용하시는 분들은 참고하시기 바랍니다. 

이렇게 해놓고 보니 help를 만들어 command리스트를 만들어야 하는데.. 
하고 생각해보니.. 


내가 가진 SP 명을 command명에 맞는 룰로 잘라내고 
파라미터들을 자동으로 뒤에 붙여서 리스트만드는 쿼리만으로 
그럴싸하게 보여줬습니다. 

이걸 조금 수정도 하고 설명도 달고 해야 해서 
자동으로 테이블에 넣는 커맨드를 만들고, 
설명도 넣는 관리자 커맨드를 만들었습니다. 

그리고  giip의 access token 및 서버에서 사용하는 Secret Key를 웹콘솔에서 받아서 넣으면
내 어카운트로 할 수 있는 권한 획득 완료.. 

그리고 커맨드를 실행 했습니다. 

기본 커맨드들, 헬프 커맨드랑
내 정보도 잘 보이고,

가동중인 giip내의 머신에 등록된 정보들도 잘 보이네요.. 

등록된 소스도 잘 보이구요.. 

아직 소스를 slack에서 수정할 수 있는지 모르기 때문에, 
소스는 보기까지만 하는걸로 하고.. 

이렇게 API서버를 구현해서 
표준화만 잘 하면 API서버 만들때 필요한 고생을 전혀 안해도 되게 되어 버렸습니다. 

몇 년 전까지만해도 
API서버를 표준화 하는데 들여야되는 시간과 비용을 생각하면 
아찔했는데 말이죠.. 

DB만 잘하면 개발을 잘 몰라도
API서버를 만들어 slack을 UI로 해서 서비스를 만들 수도 있다!
고 말하고 싶지만, 

역시 저 짧은 한 페이지의 API서버를 구현하는데도
지식이 있는것과 없는 것의 차이는 좀 크긴 하더랍니다. 
(스마트 하게 표시하는 데에는 powershell을 조정하는 시간이 좀 걸림..)

그래도 이젠
SP를 만들면 자동으로 API가 되어버리고, 
간단하게 API매뉴얼을 추가할 수 있게 되어서
API추가나 사양 변경이 그냥 
쿼리 변경 정도로 끝나게 되었습니다. 

이제 슬랙 챗으로 
자유롭게 백업이나 서버 재기동을 하고, 
서버내 필요한 정보를 
채팅만으로 가져올 수 있는 환경을 만들었습니다. 

나중에 LLM을 어떻게 도입할지도 좀 고민해봐죠.. 
리스크가 있는 작업들이다보니 
바로 LLM에게 시키는게 아니라 
작업에 맞는 스크립트를 만들어달라고 하는 식으로 현재 쓰고는 있지만, 
연결되어 있진 않고 채팅하다가 제일 적절한 것을 
수동으로 골라서 giip의 작업 큐에 넣고 있지요.. 

이렇게 여러대의 서버를 채팅으로 관리하기 시작했습니다. 
앞으로 문제가 생기면 대처 방법까지
채팅으로 자동으로 제안해주는 서비스를 
만들 날을 기대하면서.. 

여러분도 참고가 되셨으면 합니다. 


giip :: Control all Robots and Devices! Free inter-RPA orchestration tool! https://giipasp.azurewebsites.net/

댓글

이 블로그의 인기 게시물

일본 두바퀴 여행(바이크 편)

영상버전 : https://youtu.be/P3vC17iVu1I 이번에는 일본으로 넘어와서 일본 종주하시는 바이커들을 위한 정보입니다.  일본에서의 2륜의 정의가 면허와 도로교통법이 조금씩 다르다고 합니다.  그래도 그렇게 크게 신경쓸 건 없으니 딱 세 종류로 말씀 드릴께요.  50cc는 원동기 1종이라고 하여 3차선 이상 교차로에서 우회전, 한국에선 좌회전 같이 크게 도는 것이지요..  이게 불가능합니다.  직진 신호로 넘어간 뒤에 방향을 틀고 다시 직진으로 두번 꺾어 가야 하구요,  두 명이 타면 안됩니다.  그리고 맨 가장자리 길로만 가야해서 애매하게 끝에서 두 번째 차선만 직진인 곳들이 있어서 난감할 때가 있지요. 그런데에 직진하면 걸리는 곳이 있다고 합니다. 어느 정도까지 걸리고 안걸리고는 정확히는 모르지만,  직좌 마크가 아닌 좌회전 마크만 있는 곳이 은근히 많으니 조심해야 하겠더라구요.  최고 시속도 30km를 넘기면 안되어 천천히 달려야 합니다.  아뭏든 제약이 엄청나게 많으므로 60cc이상을 가져오시거나 렌트 하시는 것을 추천하구요,  125cc미만은 겐츠키 2종이라고 하여 두 명이 타도 되고, 3차선 이상에서 우회전이 가능합니다.  상당히 제약이 풀리는 대신 고속도로를 탈 수가 없지요.  만약 국도로 천천히 올라오신다면 125cc미만으로도 충분합니다.  실제로 일본인 바이커들 중에서도 국도 종주하는 모습을 많이 볼 수 있구요,  도심에 가면 125cc미만까지만 주차 가능한 바이크 주차장도 꽤 많기 때문에 도심용으로는 메리트가 큰 것 같습니다.  뭐, 125cc대는 곳에 큰 바이크를 대는 경우도 자주 보는데, 아무도 뭐라 안하긴 합니다.  그도 그럴 것이, 일본의 바이크 등록대수는 1031만대 인데도 바이크 전용 주차장은 턱없이 부족하다고 합니다. 바이크 주차장이 저렴하기 때문에 웬만한 ...

책에서는 안 알려주는 대규모 트래픽을 위한 설계

음성 버전 :  https://www.youtube.com/watch?v=ZZlW6diG_XM 대규모 트래픽을 커버하는 첫 페이지 만드는 법..  보통 DB를 연결할 때 대규모 설계는 어떻게 하시나요?  잘 만들었다는 전제 하에 동접 3000명 이하는  어떤 DBMS를 사용해도 문제 없이 돌아갑니다.  여기서 이미 터졌다면 이 콘텐츠를 보기 전에 DB의 기초부터 보셔야 합니다.  아.. 개발 코드가 터졌다구요? 그럼 개발자를 때리셔야지요..  만약 3000명을 넘겼다면? 이제 Write/Read를 분리해서  1 CRUD + n개의 READ Replica를 만들겠죠?  보통 Read Replica는 5개가 최대라고 보시면 됩니다.  누가 연구한 자료가 있었는데...  6번째 레플리카를 만든느 순간 마스터가 되는 서버의 효율 저하 때문에  5번째에서 6번쨰로 올릴때의 성능이 급격히 줄어든다는 연구 결과가 있습니다.  때문에 Azure에서도 replica설정할 때 5대까지 밖에 설정 못하게 되어 있지요.  유저의 행동 패턴에 따라 다르긴 하지만,  1 CRUD + 5 Read Replica의 경우 동접 15000명 정도는 커버 합니다.  즉, 동접 15000명 에서 다시 터져서 저를 부르는 경우가 많지요..  이 때부터는  회원 DB, 게시판DB, 서비스DB, 과금 DB 등등 으로 성격, 서로의 연관도에 따라 나누기 시작합니다.  물리적으로 DB가 나눠지면 Join을 못하거나 Linked Table또는 LinkDB등의 연결자를 이용해서 JOIN이 되기도 합니다.  그에 따라 성능 차이가 생기지만 가장 중요한 포인트는  서로 다른 물리적 테이블의 JOIN은 인덱스를 타지 않는다!  라는 것입니다. 즉, JOIN할 테이블들을 최소한으로 만든 뒤에 JOIN을 걸지 않으면 NoSQ...

BI의 궁극판! Apache Drill을 써보자!

사실 Apache Drill 은 BI(Business Intelligence)라고 부르는 것 보다는 단순 데이터 연결 엔진이다. https://drill.apache.org/ 하지만 내가 왜 극찬을 하느냐면.. DBA로서 항상 문제가 되어왔던게, 이기종 데이터의 변환이나 처리였다. 포맷을 맞추는데 엄청난 시간이 걸리고, 데이터 임포트 실패가 무수하게 나고.. 한 번 잘못 데이터를 추출하면 다시 조정, 변환, 추출하는데 시간이 많이 걸린다. 그런데! Apache Drill은 그냥 RDB를 CSV랑 연결해서 조인해서 통계를 낼 수 있다. 그것도 표준 SQL을 사용하여! 예를 들어, CSV의 세 번째 컬럼이 price 이고, 물건의 판매이력을 PG사에서 CSV로 출력 받았다. 우리 DB와의 검증을 위해서는 수동으로 Import를 한 뒤에 포맷이 안맞아 잘리는 데이터가 있다면 다시 맞춰주고, 재 임포트를 수십 번, 그리고 나서 겨우 들어간 데이터를 조인하여 빠진 데이터를 분간한다. 숫자가 적다면 개발자가 개발로 처리할 수도 있지만, 건수가 하루에 300만건 짜리라면.. 한 달 온 파일은 9천만 건이다. 프로그램으로 고작 처리하는 것이 초당 500건. 거의 20만초, 에러 없이 약 56시간.. 에러가 생기면 다시 56시간.. ㅠㅡㅠ 이런게 현실이기 때문에 쿼리 말고는 방법이 없다. apache drill 의 진면목을 보자! 이번에는 좀 범용 적인 MySQL DB와 붙여 보자. . 난 이번에는 Mac에서 작업을 했기 때문에 그냥 다운 받아서 풀었음.. https://drill.apache.org/download/ 여기서 자기 OS에 맞는 버전을 받아서 설치하시길.. 압축을 풀고 나면 MySQL 커넥터를 붙여야 한다. https://dev.mysql.com/downloads/connector/j/5.1.html 여기서 다운로드 이런 커넥터 들을 붙일 때마다 콘피그를 수정해 줘야 하지만, 몇 번만...