728x90
Python으로 API를 테스트하거나 사용하는데 크게 2가지 라이브러리를 사용할 수 있을 것입니다.
Requests 와 Httpx 가 바로 그것인데요 어떤 차이점이 있고 각각의 장단점은 무엇인지 알아보도록 하겠습니다.
** 해당 포스팅은 개인의 궁금증으로 시작하여 ChatGPT가 알려준 답변을 기준으로 작성되어있습니다.
일단 어떤 차이점이 있는지 확인해보겠습니다.
Requests | Httpx | |
비동기 지원 | 동기 요청만 지원합니다. 따라서 요청을 보낸 후 응답이 올 때까지 기다려야 하며, 이로 인해 병렬 요청에 제약이 있습니다. |
비동기 방식 (async/await)과 동기 방식 모두를 지원합니다. 이를 통해 비동기 프로그래밍을 수행하여 I/O 병목을 줄이고 요청을 병렬로 처리할 수 있습니다. |
HTTP/2 및 HTTP/1.1 지원 | HTTP/1.1만 지원합니다. | HTTP/2를 지원하여, 더 빠른 연결 성능을 제공하고 멀티플렉싱을 통해 여러 요청을 효율적으로 처리할 수 있습니다. |
사용성/유연성 | 간편하게 사용할 수 있습니다. 하지만 비동기 설정이나 세션 재사용에서 약간의 제약이 있습니다. | 커넥션 풀링, 타임아웃 및 세션 구성 기능이 향상되었습니다. 프록시, 인증 등 다양한 네트워크 요구 사항을 보다 세밀하게 설정할 수 있습니다. |
내용을 종합해보면 이렇습니다.
- 동기식 요청이 필요하거나 간단한 요청을 보낼 때는 requests로 충분합니다.
- 비동기 처리가 필요하거나, 고성능/복잡한 네트워크 환경에서 HTTP 통신을 최적화하려면 httpx가 유리합니다.
이렇게만 보면 비동기처리가 압도적으로 우세한 것으로 보입니다.
하지만 단점이 없을 수는 없죠. ChatGPT가 알려주는 단점은 이렇습니다.
1. 코드의 복잡성 증가
- 비동기 프로그래밍을 도입하면 await, async, Task, Event Loop와 같은 개념이 추가되면서 코드가 복잡해집니다.
- 코드 흐름을 이해하고 디버깅하기가 더 어려워질 수 있습니다. 특히 비동기 작업 간의 실행 순서나 의존성을 잘못 처리하면 예기치 않은 동작이나 에러가 발생할 수 있습니다.
2. 데드락(Deadlock)과 경쟁 조건(Race Condition) 가능성
- 비동기 코드는 여러 작업이 동시에 실행되므로, 공유 자원에 접근할 때 데드락이나 경쟁 조건 문제가 발생할 수 있습니다.
- 이는 특히 여러 async 함수가 같은 자원에 접근하는 경우에 발생할 수 있으며, 잘못 처리하면 데이터 불일치나 프로그램이 중단될 수 있습니다.
3. CPU 집약적인 작업에는 비효율적
- 비동기는 입출력(I/O) 작업에는 유리하지만, CPU 집약적인 작업에는 효율적이지 않습니다. 예를 들어, 복잡한 수학 계산을 포함한 작업은 비동기 코드에서 처리해도 큰 이점이 없고 오히려 더 복잡해집니다.
- CPU 작업에는 멀티스레딩이나 멀티프로세싱을 사용하는 것이 효율적입니다.
4. 호환성 문제
- async 함수는 기존의 동기 코드와 호환성이 떨어질 수 있습니다. 예를 들어, 동기식 웹 프레임워크나 동기식 API와 비동기 함수를 함께 사용하려면, 추가적인 라이브러리나 변환 작업이 필요할 수 있습니다.
5. 이벤트 루프 관리 필요
- 비동기 코드에서는 이벤트 루프가 프로그램 실행을 관리합니다. 하지만 여러 이벤트 루프를 사용할 때는 충돌이나 불필요한 리소스 사용이 생길 수 있어, 이벤트 루프를 명확하게 관리해야 합니다.
요약
- 비동기 프로그래밍의 성능적 단점은 거의 없으며, 오히려 효율적입니다. 하지만 코드의 복잡성과 디버깅 어려움, 경쟁 조건 등으로 인해 관리가 까다로울 수 있습니다.
- 일반적인 입출력 작업이 많은 프로그램에는 장점이 크지만, 비동기를 도입할 때는 필요한 부분에만 적용하여 관리 가능한 수준으로 유지하는 것이 좋습니다.
기승전장점으로 끝나는 말이였지만 Httpx가 장점이 많은 것은 확실히 알게 되었네요.
저는 postman으로 주로 API를 사용하거나 테스트하고 있는데 UI 테스트 자동화시에는 python으로 API를 사용하고 있습니다.
이 때에는 확실히 Httpx 라이브러리를 사용하는 것이 훨씬 장점이 많을 것 같네요.
'Study > Python' 카테고리의 다른 글
Python에서 Appium 테스트 코드 재시도 로직 (0) | 2024.10.03 |
---|---|
sys.argv 로 명령줄 인수 사용하기 (0) | 2023.09.27 |
technology ebooks. 다양한 언어와 기술 전자책이 있는 웹사이트 공유 (0) | 2023.05.19 |
Slack files.upload로 이미지 전송하기 (0) | 2022.03.09 |
Slack Block Kit 을 사용한 메시지 전송 (0) | 2022.03.09 |
댓글