EC2 기반 RESTful API 개발 및 Python을 활용한 API 호출 시연

Kim jisu·2025년 2월 25일
0

 Debugging Note

목록 보기
16/37

📝 개요

이번 프로젝트에서는 RESTful API를 개발하고 이를 다양한 시나리오에서 호출 및 테스트하는 과정을 진행했습니다.
API 호출 시 단순한 응답 확인이 아닌 Header 내 토큰 처리, 다양한 인증 방식 적용, 에러 핸들링 등의 과정을 유연하게 다루기 위해 Python을 활용했습니다.
Postman 같은 GUI 기반 도구보다 Python이 더욱 효과적인 이유는 다양한 테스트 케이스를 자동화할 수 있기 때문입니다.

🔥 주요 내용

  • API 테스트 방식 결정: Postman vs. Python
  • Python을 활용한 API 호출 및 인증 테스트
  • 로컬 환경에서 실행 실패 (Jupyter Notebook, Python 버전 문제)
  • AWS EC2에서 Python 기반 API 서버 구축
  • Flask 기반 API 개발 및 Spring Boot 연동
  • API 호출 중 발생한 문제 해결 과정 (CORS, 인증, 보안 등)
  • API 호출 결과를 Thymeleaf에서 시각화

🔹 1. API 테스트 방식 결정: Postman vs. Python

1️⃣ Postman vs. Python, 왜 Python을 선택했나?

PostmanPython
GUI 기반 도구로 직관적인 테스트 가능코드 기반으로 다양한 테스트 케이스 적용 가능
Header, Body, Params 쉽게 입력 가능반복적인 테스트를 자동화할 수 있음
데이터 저장 기능 있지만, 커스텀 로직 적용 어려움API 응답을 활용하여 동적 요청 가능
대량 테스트 및 시뮬레이션 어려움복잡한 인증 프로세스 (JWT, OAuth 등) 쉽게 적용 가능

결론: Postman은 단순한 API 테스트에 적합하지만, Header 내 동적 토큰 활용, 자동화된 테스트, 다양한 인증 방식 적용 등의 유연성을 위해 Python을 선택했습니다.


🔹 2. Python을 활용한 API 호출 및 인증 테스트

API 테스트 중 중요한 부분은 인증 처리 및 다양한 시나리오 테스트였습니다.
특히, JWT 토큰을 Header에 삽입하여 연속적인 API 호출을 처리하는 과정을 구현해야 했습니다.

import requests

# 1️⃣ 로그인 API 호출하여 JWT 토큰 발급
login_url = "http://example.com/api/users/login"
login_data = {"username": "testuser", "password": "password123"}

response = requests.post(login_url, json=login_data)
token = response.json().get("accessToken")  # 토큰 추출

# 2️⃣ 발급받은 토큰을 Header에 삽입하여 API 호출
headers = {"Authorization": f"Bearer {token}"}
user_info_url = "http://example.com/api/users/profile"

response = requests.get(user_info_url, headers=headers)
print(response.json())  # 사용자 정보 출력

🔥 Postman 대신 Python을 사용한 이유

  • Header 내 토큰 활용 (JWT 동적 적용)
  • 연속된 API 호출 (로그인 후 다른 API 호출)
  • 자동화 가능 (테스트 케이스 반복 실행)
  • 에러 발생 시 예외 처리 및 로깅 가능

🔹 3. 로컬 환경에서 실행 실패 (Jupyter Notebook, Python 버전 문제)

🚨 실행 실패 원인

  • Jupyter Notebook에서 실행 시, Python 버전 불일치
  • pip 패키지 설치 시 externally-managed-environment 오류 발생
  • Python 환경이 팀원마다 달라 일관된 실행 환경 유지 어려움

✅ 해결 과정

  1. 가상 환경 사용 (venv)
    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
  2. EC2 환경으로 이전
    • 로컬 환경에서 실행 오류 발생 → AWS EC2에서 공통 환경 구축

🔹 4. AWS EC2에서 Python 기반 API 서버 구축

1️⃣ EC2 인스턴스 설정

  • Ubuntu 22.04 환경에서 Python API 서버 실행
  • 보안 그룹에서 5000번 포트 허용 (Flask 서버 접근 가능)

2️⃣ Flask API 서버 실행

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/run-python', methods=['GET'])
def run_python():
    output = "! 요구사항에 안 맞는 아이디\n\n============ 1. 회원가입 테스트 ============\n회원가입 응답:\n{\"status\":\"fail\",\"data\":\"아이디는 최소 4자 이상, 최대 10자 이하여야 합니다.\"}\n! 요구사항에 안 맞는 비밀번호\n\n"
    return jsonify({"output": output})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  • http://<EC2_IP>:5000/run-python 에서 실행 가능

🔹 5. API 호출 중 발생한 문제 해결 과정

1️⃣ CORS 오류 발생

  • Spring Boot와 Flask가 다른 서버에서 실행되므로, CORS(Cross-Origin Resource Sharing) 오류 발생
  • 해결 방법: Flask에서 CORS 설정 추가
from flask_cors import CORS
CORS(app)

2️⃣ 인증 오류 (401 Unauthorized)

  • JWT 토큰이 올바르게 포함되지 않아 인증 실패
  • 해결 방법: API 호출 시 Header에 Bearer 토큰 포함
headers = {"Authorization": f"Bearer {token}"}
requests.get(user_info_url, headers=headers)

3️⃣ AWS 보안 그룹 문제 (5000 포트 차단)

  • EC2 보안 그룹에서 5000번 포트가 차단되어 API 호출 실패
  • 해결 방법: AWS 콘솔에서 5000번 포트 허용

🔹 6. API 호출 결과를 Thymeleaf에서 시각화

<pre id="result">결과를 불러오는 중...</pre>
<button onclick="fetchPythonResult()">결과 가져오기</button>

<script>
    async function fetchPythonResult() {
        try {
            const response = await axios.get("/api/python/python-result");
            let resultText = response.data.output;
            document.getElementById("result").textContent = resultText;
        } catch (error) {
            console.error("Error fetching Python result:", error);
        }
    }
</script>

최종 결과

  • API 실행 결과가 웹 브라우저에서 줄바꿈이 적용된 형태로 출력됨.
  • Python을 활용하여 JWT 인증, Header 처리, API 테스트 자동화 가능.

📌 결론

Postman 대신 Python을 사용하여 API 테스트 자동화
EC2에서 Python API 서버 실행, Flask API 배포
Spring Boot와 연동하여 API 호출 및 응답 시각화
JWT 인증 및 다양한 API 호출 시나리오 테스트 가능

profile
Dreamer

0개의 댓글