Python 327

[Python] unittest - 미설치 라이브러리 모킹

현상unittest를 작성하다 ModuleNotFoundError: No module named 'airflow' 오류를 만났다.테스트하려는 모듈이 airflow를 import 하고 있었는데, 현재 개발 환경에는 Airflow가 설치되어 있지 않아 발생한 문제다. 진짜 문제는 환경적인 제약사항으로 설치할 수도 없는 상황이라는 것이었다.이런 문제를 좀 해결할 수 있는 방법이 없을까? 찾다가 적어둔다. 해결`sys.modules`에 해당 모듈 이름을 키로, `MagicMock()`을 값으로 등록해 두면 된다.import sysfrom unittest.mock import MagicMock AIRFLOW_MOCKS = [ "airflow", "airflow.decorators", "airf..

Python 2026.03.20

[Python] unittest.patch - 함수 내부 의존성 대체

개요2026.03.16-[Python] unittest.mock - 의존성 대체를 통해 unittest의 Mock에 대해서 알아보았다. Mock은 어떤 객체를 가짜 객체로 대체함으로써 테스트 수행 시의 외부 시스템 의존성을 낮출 수 있다. 단, 의존성을 인자로 직접 주입받는 함수에 한해서다.def get_users(db): return db.query("SELECT * FROM users")def test_get_users(): mock_db = Mock() mock_db.query.return_value = [{"id": 1}] assert get_users(mock_db) == [{"id": 1}]함수 내부에서 외부 시스템을 직접 참조하는 경우, 인자로 Mock을 주입할 수 없기..

Python 2026.03.19

[Python] unittest - MagicMock

개요2026.03.16-[Python] unittest.mock - 의존성 대체에서 mock 객체와 객체가 어떻게 사용되었는지 검증하는 방법에 대해 알아보았다. 다만 실제 사례에서는 일반 Mock이 아니라 MagicMock이라는 객체를 더 많이 사용하는 걸로 보이는데, 어떤 차이가 있는지 알아본다. MockPython의 모든 객체는 특수한 목적으로 쓰이는 매직 메서드를 갖는다. 가령 __str__의 경우 객체를 문자열로 출력하기 위해 사용되는데, Mock은 매직 메서드가 자동으로 모킹 되지 않는다. from unittest.mock import Mock, MagicMock, callif __name__ == '__main__': mock = Mock() print(mock.__str__.r..

Python 2026.03.18

[Python] unittest.mock - 의존성 대체

Mock테스트를 작성하다 보면 필연적으로 외부 서비스를 의존하는 코드를 테스트하게 된다. 그러나 테스트 환경에서는 제약사항으로 인해 실제 데이터베이스나 외부 서비스에 연동하는 것이 어려운 경우가 많다. 때문에 단위 테스트를 작성할 때는 외부에 의존하는 부분을 임의로 가짜로 대체하는 기법이 자주 사용되는데 이를 모킹(mocking)이라고 한다.이번 글에서는 python unittest를 사용할 때 모킹하는 방법에 대해서 적어둔다. unittest.mockunittest.mock은 코드의 특정 부분을 mock 객체로 대체하는 기능을 제공하며, mock 객체가 어떻게 사용되었는지 검증하는데 도움을 준다. unittest가 파이썬 내장 라이브러리인 것과 동일하게 unittest.mock도 내장 라이브러리이기 ..

Python 2026.03.17

[Python] unittest - 예외 발생 확인

개요2026.03.10-[Python] unittest - 단위 테스트에서 unittest의 기본적인 사용법에 대해 알아보았다. 그런데 테스트 케이스를 작성하다 보면 로직이 정상적으로 동작하는 경우가 아니라 예외가 발생해야 하는 상황에서 예상한 예외가 발생하는지도 확인할 필요가 있다. 이번 글에서는 예외 발생 여부를 확인하는 방법을 적어둔다. assertRaises예외가 발생하는지 테스트를 해야 할 때는 assertRaises를 컨텍스트 매니저(with 문)과 함께 사용한다.with self.assertRaises(Exception): LOGIC_CODEassertRaises는 전달받은 예외가 발생하면 테스트를 통과하고, 다른 예외가 발생하면 오류에 해당한다. 아무 예외도 발생하지 않으면 실패인 걸로 ..

Python 2026.03.16

[Python] unittest - 단위 테스트

개요개발 과정에서 테스트는 필수적이다. 하지만 여태까지 테스트 코드를 작성해 본 적은 없는데, 이유는 여럿이 있겠지만 근본 원인은 잘 몰라서였다. 인터넷에서 떠도는 테스트 주도 개발이라는 게 뭔지, 그래서 어떤 함수를 테스트해야 하는지 등등……. 다만 일단 작성 방법을 알아야 할 것 같으니 Python으로 테스트 코드를 작성하도록 도와주는 unittest라는 라이브러리의 사용 방법을 조금 알아보고자 한다. unittestPython의 unittest는 Java JUnit, JavaScript Jest와 같은 단위 테스트 프레임워크이다. 기본적으로 내장되어 있어 바로 임포트 해서 사용할 수 있다.import unittest TestCase단위 테스트는 단위 클래스에 필요한 유틸리티 메서드를 제공하는..

Python 2026.03.13

[Python] psycopg2.execute_values - 여러 데이터 처리

개요python으로 데이터베이스 작업을 수행하다 보면 여러 데이터를 한 번에 처리할 필요가 자주 발생한다. 이때 보통 executemay 등의 이름을 가진 함수를 사용하는데, postgreSQL 연동 라이브러리인 psycopg2의 경우에는 비슷한 기능을 가진 여러 함수를 제공하고 있는 것 같다. 이번 글에서는 그중 하나인 execute_values에 대해서 조금 알아본다. execute_valuesexecute_values는 psycopg2 2.7버전에 추가된 함수로, 매개변수를 사용해 명령문을 실행한다.psycopg2.extras.execute_values(cur, sql, argslist, template=None, page_size=100, fetch=False)# cur : 커서 객체# sql..

Python 2026.03.05

[Python] requests links - link 헤더 사용하기

개요많은 서버들이 자신의 데이터를 효율적으로 제공하기 위해 페이지네이션을 사용한다. 일반적으로는 쿼리 매개변수를 사용해서 제공하는데, 일부 서비스의 경우에는 HTTP 응답 내 헤더에 다음 페이지를 가리키는 링크를 제공한다. 대표적인 서비스로는 Github가 있다.이번 글에서는 Python으로 HTTP 응답을 처리할 때 헤더 내 Link 헤더를 효과적으로 파싱 하는 방법을 적어둔다. 응답 예시예로 들어 requests 라이브러리 공식 문서에서 기재하고 있는 URL에 요청을 날려보겠다.import requestsurl = "https://api.github.com/users/kennethreitz/repos?page=1&per_page=10"response = requests.get(url)print(re..

Python 2026.01.05

[Python] HTTP 헤더에서 ratelimit 파싱 후 대기 및 재시도 구현

개요최근 서버에 HTTP로 요청을 보내는 작업을 많이 하는데, 사용자가 많은 대규모 서비스의 경우에는 특정 사용자가 자원을 점유하지 않도록 ratelimit을 설정해 둔다. 클라이언트가 서버에 요청을 하다 ratelimit에 걸려도 동작이 중단되지 않고 계속 이어나갈 수 있도록 구현하는 방법을 기록해두려고 한다.참고로 Python을 사용하며 요청 서버는 huggingface이며, 재시도는 Tenacity를 사용하여 구현할 예정이다. ratelimit 파싱huggingface의 경우 클라이언트의 요청이 제한에 도달하면 HTTP 429 Too Many Request 오류를 발생시킨다. 이 때, 서버는 할당량, 속도 제한 정책과 함께 클라이언트의 현재 사용량과 제한을 전달하여 속도 제한을 피할 수 있도록 H..

Python 2025.12.19

[Python] Tenacity - 재시도 로직 구현

개요Python으로 API 호출이 발생하는 라이브러리를 사용하려고 하는데, 다량의 요청이 발생하다 보니 Rate Limit에 의해 요청 실패가 발생하는 경우가 있다. 이때 동작을 종료하거나 다음 동작으로 넘어가는 대신, 실패했던 요청을 재시도하려고 한다.재시도 로직은 직접 구현해도 좋지만, 확인해보니 Tenacity라는 Python 범용 재시도 라이브러리가 존재해 이 라이브러리를 사용해보려고 한다. TenacityTenacity는 Apache 2.0 라이선스가 적용된 파이썬 기반의 범용 재시도 라이브러리로, 거의 모든 기능에 재시도 동작을 쉽게 추가하도록 설계되었다. retrying 라이브러리를 포크해서 만들어졌으며, 두 라이브러리 간 호환성은 없지만 신규 기능을 추가하고 버그를 수정하는 등의 개선이..

Python 2025.12.18