Intro
기술 면접에서 이러한 질문을 받은 적이 있다.
"API 제작해본 경험이 있을까요?"
백엔드 경험이 거의 없던 나는 역시 '아니오'라고 대답할 수 밖에 없었다.(Elasticsearch의 CRUD API를 이용한 데이터 조회 경험이라도 말해볼 걸 그랬다...)
간단한 API 제작해보는 경험도 필요할 것 같다.
어떤 API를 제작할 것인가?
이번에 HTTP와 REST API에 대해 공부도 할 겸, 간단하게 백엔드 프레임워크를 사용하여 API를 제작해보려고 한다.
Q. 그렇다면 어떤 API를 제작해볼 것인가? 현업에서는 실제 어떤 API 요청이 들어올까?
- 다른 ML 엔지니어나 분석가로 부터 데이터를 조회 및 검색하는 API 제작 주문이 들어올 수 있다고 한다.
- 그렇다면 Oracle SQL을 공부하는 김에 Oracle DB를 조회하는 API를 제작하면 좋을 것 같다. (나중에 알게된 사실인데 ORDS 라는 Oracle에서 제공하는 REST API가 존재한다고 한다...)
Q. 프레임워크는 FastAPI를 사용할 예정이다. 왜 FastAPI인가?
- 일단 나는 Python 사용자고, 선택지로는 Django, Flask, FastAPI가 있었다.
- Django는 다른 둘과 비교하자면 매우 복잡한 편이다.
- Flask와 FastAPI는 간단하게 API를 만들 수 있어서 지금 프로젝트에는 둘 다 적합하다.
- FastAPI가 막 뜨고 있는 툴이면서 훨씬 성능이 좋다고하니 FastAPI를 선정하게 되었다.
정리하자면, FastAPI를 이용하여 Oracle DB를 조회하는 API를 제작해보려고 한다.
orcl.py : Oracle 연결
- Oracle에서는 python 사용자를 위해 cx_oracle 모듈을 제공한다. 해당 모듈을 이용하여 Oracle DB에 접근이 가능하다.
- 접속에 필요한 정보를 connect 함수에 넣고 cursor를 생성한다. cursor.execute 함수를 통해 sql을 입력할 수 있게 된다.
- 그리고 fetchall 함수를 이용하여 sql 쿼리 결과 테이블을 가져온다.
main.py : FastAPI 서버
- get 메서드를 통해 table을 조회할 수 있도록 하였다.
- 'host:port/<테이블이름>'
- 쿼리를 입력하지 않을 경우, oracle에 'SELECT * FROM <테이블이름>' sql 쿼리를 보내면서 테이블을 모두 조회하도록 설정하였다.
- 'host:port/<테이블이름>?empno=<숫자>'
- empno 쿼리를 이용할 경우 테이블에서 empno 값과 매칭되는 레코드들을 가져오도록 설정하였다.
서버 실행 및 테스트
uvicorn main:app --reload --host 0.0.0.0 --port 8000
- uvicorn 명령어를 통해 모든 host에서 8000 포트로 접속 가능하도록 서버를 실행시켰다.
- 위와 같이 다른 환경에서 URL을 통해 API가 작동하는 것을 확인할 수 있었다.