본문 바로가기

나는 이렇게 학습한다/Debug14

docker-compose 작성하면서 생긴 이슈 세 가지 (feat. m1) docker-compose를 이용해 app과 db를 각각 컨테이너로 구현해보고자 했다. 도커를 처음 사용하다 보니 여러가지 문제들이 있었는데 그 중에서 가장 애먹었던 세 가지 이슈에 대해서 적어본다. 이슈1. 도커 빌드 중에 asyncpg만 유독 설치되지 않는 문제가 있었다. 원인 - 정확히는 알기 어려우나 m1 관련 이슈로 보인다. 해결 - 빌드 과정에서 gcc를 추가 설치하여 해결할 수 있었다. # Dockerfile 에 추가 RUN apt-get install -y gcc gcc는 ‘다양한 프로그래밍 언어를 위한 컴파일러’ 라고 한다. 자세한 내용은 위키를 참고하기 바란다. 참고 링크 Error with pip install in Docker on Mac M1 when using Slim distr.. 2022. 5. 10.
VSCode _ 디버깅하는 방법 (feat. Python - FastAPI) print로 디버깅? 서버 런타임 중에 버그가 발생했다고 가정해보자. 내가 원하는 값을 반환해주어야 하는데 엉뚱한 값이 나온다. 버그를 찾아 고치기 위해 작성된 코드를 보지만 어디서부터 잘못된 건지 모르겠다. 그럴 때 흔히 하는 방법이 print()로 코드 중간중간을 출력하는 것이다. 의심스러운 지점에 print를 배치하고 내가 생각한 대로 작동하는지 출력해본다. 하지만 이 방법은 리소스가 많이 든다. 개발자가 직접 코드를 작성해야하고 상태나 변수명을 직접 호출해야 한다. 설령 버그를 발견하고 고치더라도 print 지우는 것을 까먹어 불필요한 코드까지 커밋해버리기도 한다...ㅜㅜ 다행히도 VSCode는 우리가 손쉽게 디버깅 할 수 있도록 도와준다. 이번 글에서는 Python - FastAPI 서버를 기준.. 2022. 5. 3.
SQLAlchemy _ NotSupportedError(InvalidCachedStatementError) 에러 해결 AsyncSessionNotSupportedError, InvalidCachedStatementError 테스트 코드를 작성하는 중에 에러가 발생했다!! 에러 메시지는 다음과 같다. """ sqlalchemy.exc.NotSupportedError: (sqlalchemy.dialects.postgresql.asyncpg.InvalidCachedStatementError) : cached statement plan is invalid due to a database schema or configuration change (SQLAlchemy asyncpg dialect will now invalidate all \\ prepared caches in response to this exception) E [.. 2022. 4. 29.
컬럼 속성 변경 후 alembic migration할 때 ‘None’ 생기는 현상 테이블 컬럼의 속성을 변경하고 alembic migration 할 때 version 파일에 None이 생기는 현상을 발견했습니다. 의도 일단 저는 stock 테이블에서 code와 name컬럼의 속성을 unique로 변경하고자 했습니다. # models.py class Stock(Base): __tablename__ = "stock" id = Column(Integer, primary_key=True, autoincrement=True) code = Column(String(50), unique=True) # unique=True 속성 추가 name = Column(String(50), unique=True) # unique=True 속성 추가 market = Column(ENUM("KOSPI", "KOS.. 2022. 4. 26.
pytest _ 하나의 함수에서 복수 케이스 테스트 하는 방법 단일 케이스 테스트 보통 테스트는 단일 케이스로 이루어집니다. 단일 케이스로 테스트를 하면 최소의 단위로 테스트를 진행하기 때문에 코드의 정확도를 높일 수 있고, 보는 이에게도 명확한 케이스 사례를 보여줄 수 있다는 장점이 있습니다. 예를 들어 회원가입 API를 테스트한다고 할 때 케이스를 다음처럼 나눌 수 있습니다. 성공 : 회원가입이 성공했는가? 실패1 : 회원가입 시 이메일이 중복되는가? 실패2 : 회원가입 시 닉네임이 중복되는가? 실패3 : 회원가입 시 패스워드가 유효한가? 하지만 유사한 케이스를 모두 단일 케이스로 테스트할 경우 비슷한 코드가 반복되면서 가독성과 효율이 떨어질 수 있습니다. 위의 케이스 중에서 실패1, 실패2를 살펴보겠습니다. 이 둘은 중복여부에 의한 실패를 확인하는 테스트로 엄.. 2022. 4. 20.
@pytest.fixture 로 test 데이터 세팅하기 pytest.fixture 는 왜 사용할까? 테스트 코드를 작성하다보면 ‘클라이언트’나 ‘토큰’, ‘객체’ 등이 필요할 수 있습니다. 보통은 setup 이나 teardown 등으로 데이터를 세팅할 수 있지만 pytest에는 fixture 데코레이터를 통해 필요한 데이터를 세팅하고 어떤 테스트 함수든지 재활용할 수 있습니다. 테스트 코드 예시 아래는 로그인 api를 테스트 하는 함수입니다. # test_login.py def test_login_api(client, create_user): data = { "email": "test@test.com", "password": "password", } r = client.post("/api/v1/login", json=data) r_message = r.jso.. 2022. 4. 14.