Programming Language/Python

FastAPI - env파일 사용

hustle_D 2025. 9. 23. 18:06
반응형

프로그램을 만들다보면 설정과 관련된 내용들은 직접 하드코딩 하지 않고 .env파일이나 .properties와 같은 설정 파일에 넣어두고 프로그램에서는 읽어다가 상수처럼 사용하는 방식을 많이 사용한다.

우리는 파이썬에서 사용되는 .env파일을 만들어서 FastAPI에서 사용하는 방법을 확인해보자(FastAPI만 아니고 여기저기서 사용되는 방식일 수 도 있다.)

 

1. .env파일 생성

먼저 설정값의 저장파일이 될 .env파일을 생성해주자.

보통 위치는 가장 상위에 생성한다.

 

그리고 내부에는 

이런식으로 상수로 사용할 설정 정보들을 넣게 된다.

 

2. .env의 사용설정

.env파일을 생성했으면 이 값을 프로그램의 내부에서 사용할 수 있어야 한다.

이를 파이썬에서는 하나의 파일을 생성해서 사용할 수 있도록 클래스를 생성해서 사용한다.

 

settings.py라는 파일을 하나 생성해주고

 

가장 먼저 pydantic-settings라는 라이브러리에서 BaseSettings라는 클래스를 import 해주자.

이 클래스는 pydantic_settings 라이브러리의 핵심 클래스로 이후에 만들 클래스에서 BaseSettings를 상속하면 pydantic이 자동으로 환경변수(.env파일)를 읽어와 해당 클래스의 필드의 값에 할당해준다.

이 과정에서 pydantic은 필드의 타입힌트(str, int 등등..)를 기반으로 데이터의 유효성까지 검사해주고 형을 변환해준다.

 

이제 환경변수를 담아서 프로그램에서 사용할 수 있게 해줄 Settings라는 클래스를 하나 생성해주자.

이때 위에서 말했다 싶이 BaseSettings를 상속해주면서 생성해주면 된다.

이 Settings 클래스는 애플리케이션의 설정에 대한 설계도(스키마)역할을 한다.

클래스에 정의할 각 필드들은 .env파일에서 가져올 환경 변수들을 의미한다.

이 클래스에 .env에 들어가는 필드들을 소문자로 적고 타입에 대한 힌드를 작성해주면 된다.

먼저 하나 선언해보면

이렇게 선언하면 pydantic은 이걸 읽어서 .env파일 내부에 DB_TYPE이라는 속성의 key값을 찾는다.

그럼 이 값을 로드해서 해당 필드에 넣어준다.

 

추가로 .env에 있는 모든 값들은 문자열로 저장되어 있는데 

이렇게 int 형의 타입힌트를 넣어두면

해당 값을 가져와 int의 형태로 변환해서 저장해준다.

이렇게 클래스가 완성 됐다면 이제 이 클래스에 대한 설정들을 추가해주자.

 

설정을 추가할때는 model_config이라는 것을 사용한다.

model_config는 pydantic에 도입되어 있는 모델 설정 방식이다.

이전 버전에서는 Config 클래스를 따로 만들어서 설정했어야 했지만 지금은 model_config라는 것을 사용해서 설정을 하도록 되어 있다.

 

model_config는 그냥 변수 명처럼 사용하면 되고 여기에 값으로는 SettingsConfigDict라는 것을 넣어주자

이 또한 pydantic_settings에 포함되어 있으니 import 해주도록 하자.

 

SettingsConfigDict는 .env 파일의 환경변수를 pydantic 모델에 어떻게 로드하고 처리할지 정의한다.

여기에 들어갈 수 있는 속성을 몆가지 작성하자면

  • env_file : 환경 변수를 불러올 .env 파일의 경로를 저장한다(root에 존재한다면 그냥 ".env")
  • env_file_encoding : .env파일의 문자 인코딩을 설정한다(보통 "utf-8")
  • extra :
    • "ignore" : 모델에 없는 변수를 무시한다(추가 변수 오류 방지)
    • "allow" : 모델에 없는 변수를 허용한다
    • "forbid" : 모델에 없는 변수가 있으면 오류를 발생시킨다(기본값)
  • env_prefix : 환경 변수명에 공통으로 붙는 접두사를 설정한다

그래서 보통은 여기에 

이렇게 추가해주면 루트에 있는 .env에 접근해서 utf-8로 .env를 읽어오고 여기 클래스에 설정되지 않은 속성들은 ignore 한다

라고 설정해주면 된다.
이러고 마지막에 이 클래스를 객체로 생성해서 

이렇게 변수로 담아두면

 

외부에서 사용할때 

이렇게 객체를 담은 settings만 뽑아서

이런식으로 사용하면 된다.

 

반응형