Python - Action 사용하기

마지막 업데이트: 2022년 1월 28일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
만약 여러분이 git과 같은 버전 컨트롤 시스템을 사용하고 계신다면, env 디렉토리를 커밋에 포함시키지않는 것을 추천합니다. 반드시 .gitignore 파일에 env 디렉토리를 추가하세요.

Cloud Firestore 시작하기

이 빠른 시작에서는 Cloud Firestore를 설정하고 데이터를 추가한 후 Firebase Console에서 방금 추가한 데이터를 확인하는 방법을 볼 수 있습니다.

Cloud Firestore 데이터베이스 만들기

Firebase 프로젝트를 아직 만들지 않았다면 Firebase Console에서 프로젝트 추가를 클릭한 후 화면에 표시된 안내에 따라 Firebase 프로젝트를 만들거나 기존 GCP 프로젝트에 Firebase 서비스를 추가합니다.

Firebase Console의 Cloud Firestore 섹션으로 이동합니다. 기존 Firebase 프로젝트를 선택하라는 메시지가 표시됩니다. 데이터베이스 만들기 워크플로를 따릅니다.

Cloud Firestore 보안 규칙의 시작 모드를 선택합니다.

모바일 및 웹 클라이언트 라이브러리를 시작할 때 유용하지만 모든 사용자가 데이터를 읽고 덮어쓸 수 있습니다. 테스트 완료 후 데이터 보안 섹션을 검토해야 합니다.

웹, Apple 플랫폼 또는 Android SDK를 시작하려면 테스트 모드를 선택하세요.

모바일 및 웹 클라이언트의 모든 읽기 및 쓰기를 거부합니다. 인증된 애플리케이션 서버(C#, Go, 자바, Node.js, PHP, Python, Ruby)에서는 사용자의 데이터베이스에 계속 액세스할 수 있습니다.

C#, Go, 자바, Node.js, PHP, Python 또는 Ruby 서버 클라이언트 라이브러리를 시작하려면 잠금 모드를 선택하세요.

데이터베이스의 위치를 선택합니다.

이 위치 설정이 프로젝트의 기본 Python - Action 사용하기 Google Cloud Platform(GCP) 리소스 위치입니다. 이 위치는 특히 기본 Cloud Storage 버킷 및 App Engine 앱(Cloud Scheduler 사용 시 필요)과 같이 위치 설정이 필요한 프로젝트의 GCP 서비스에 사용됩니다.

위치를 선택할 수 없다면 프로젝트에 이미 기본 GCP 리소스 위치가 있는 것입니다. 이 위치는 프로젝트 생성 과정이나 위치 설정이 필요한 다른 서비스를 설정할 때 지정한 것입니다.

완료를 클릭합니다.

Cloud Firestore를 사용 설정하면 Cloud API Manager의 API도 사용 설정됩니다.

개발 환경 설정

필요한 종속 항목 및 클라이언트 라이브러리를 앱에 추가하세요.

Web version 8

  1. 안내에 따라 Firebase를 웹 앱에 추가합니다.
  2. Firebase 및 Cloud Firestore 라이브러리를 앱에 추가합니다.Cloud Firestore SDK는 npm 패키지로도 제공됩니다.Firebase와 Cloud Firestore를 수동으로 요청해야 합니다.

Web version 9

  1. 안내에 따라 Firebase를 웹 앱에 추가합니다.
  2. Cloud Firestore SDK는 npm 패키지로 제공됩니다. Firebase와 Cloud Firestore를 모두 가져와야 합니다.

Swift Package Manager를 사용해 Firebase 종속 항목을 설치하고 관리하세요.

  1. 앱 프로젝트를 연 상태로 Xcode에서 File(파일) > Swift Packages(Swift 패키지) > Add Package Dependency(패키지 종속 항목 추가)로 이동합니다.
  2. 메시지가 표시되면 Firebase Apple 플랫폼 SDK 저장소를 추가합니다. 참고: 새 프로젝트에서 기본(최신) SDK 버전을 사용해야 하지만, 필요하면 이전 버전을 선택할 수도 있습니다.
  3. Firestore 라이브러리를 선택합니다.
  4. 완료되면 Xcode가 백그라운드에서 자동으로 종속 항목을 확인하고 다운로드하기 시작합니다.
  1. 안내에 따라 Firebase를 Android 앱에 추가합니다. 을 사용하여 모듈(앱 수준) Gradle 파일(일반적으로 app/build.gradle )에서 Cloud Firestore Android 라이브러리의 종속 항목을 선언합니다.

Firebase Android BoM을 사용하면 앱에서 항상 호환되는 Firebase Android 라이브러리 버전을 사용합니다.

(대안) BoM을 사용하지 않고 Firebase 라이브러리 종속 항목을 선언합니다.

Firebase BoM을 사용하지 않도록 선택한 경우에는 종속 항목 줄에 각 Firebase 라이브러리 버전을 지정해야 합니다.

앱에서 여러 Firebase 라이브러리를 사용하는 경우 모든 버전이 호환되도록 BoM을 사용하여 라이브러리 버전을 관리하는 것이 좋습니다.

Kotlin+KTX

  1. 안내에 따라 Firebase를 Android 앱에 추가합니다. 을 사용하여 모듈(앱 수준) Gradle 파일(일반적으로 app/build.gradle )에서 Cloud Firestore Android 라이브러리의 종속 항목을 선언합니다.

Firebase Android BoM을 사용하면 앱에서 항상 호환되는 Firebase Android 라이브러리 버전을 사용합니다.

(대안) BoM을 사용하지 않고 Firebase 라이브러리 종속 항목을 선언합니다.

Firebase BoM을 사용하지 않도록 선택한 경우에는 종속 항목 줄에 각 Firebase 라이브러리 버전을 지정해야 합니다.

앱에서 여러 Firebase 라이브러리를 사용하는 경우 모든 버전이 호환되도록 BoM을 사용하여 라이브러리 버전을 관리하는 것이 좋습니다.

  1. 아직 구성하지 않았다면 Flutter 앱에서 Firebase를 구성하고 초기화합니다.
  2. Flutter 프로젝트 루트에서 다음 명령어를 실행하여 플러그인을 설치합니다.
  3. 완료되면 Flutter 애플리케이션을 다시 빌드합니다.
  4. 선택사항: 사전 컴파일된 프레임워크를 포함하여 iOS 및 macOS 빌드 시간을 개선합니다.

현재 iOS용 Firestore SDK는 Xcode에서 빌드하는 데 5분 이상 걸릴 수 있는 코드를 사용합니다. 빌드 시간을 크게 줄이려면 Podfile의 target 'Runner' do 블록에 다음 줄을 추가하여 사전 컴파일된 버전을 사용하면 됩니다.

또한 CocoaPods를 1.9.1 이상으로 업그레이드했는지 확인합니다.

자세한 내용은 GitHub의 문제를 참조하세요.

  1. Firebase Admin SDK를 앱에 추가합니다.
    • Gradle 사용:
    • Maven 사용:
  2. 아래 안내에 따라 사용자 환경에서 적절한 사용자 인증 정보를 사용해 Cloud Firestore를 초기화합니다.
Python
  1. Firebase Admin SDK를 Python 앱에 추가합니다.
  2. 아래 안내에 따라 사용자 환경에서 적절한 사용자 인증 정보를 사용해 Cloud Firestore를 초기화합니다.
  1. 안내에 따라 Firebase를 C++ 프로젝트에 추가합니다.
  2. Python - Action 사용하기
  3. Android용 C++ 인터페이스
    • Gradle 종속 항목 모듈(앱 수준) Gradle 파일(일반적으로 app/build.gradle )에 다음을 추가합니다.
    • 바이너리 종속 항목 마찬가지로 바이너리 종속 항목을 가져올 때 권장되는 방법은 CMakeLists.txt 파일에 다음을 추가하는 것입니다.
  4. 데스크톱 통합을 설정하려면 C++ 프로젝트에 Firebase 추가를 참조하세요.
Unity
  1. 안내에 따라 Firebase를 Unity 프로젝트에 추가합니다.
  2. Android용 Unity 인터페이스

Android용으로 빌드할 때 Android DEX 제한을 피하려면 ProGuarding을 사용 설정하세요. 이렇게 하려면 Unity 편집기에서 다음을 수행합니다.

  1. File(파일) > Build Settings(빌드 설정)를 선택합니다.
  2. ‘Platform(플랫폼)’을 ‘Android’로 전환하고 ‘Switch Platform(플랫폼 전환)’을 클릭합니다.
  3. ‘Player Settings…(플레이어 설정…)'를 클릭합니다.
  4. 기본 Unity UI의 ‘Settings for Android(Android 설정)’에서 ‘Publishing Settings(게시 설정)’를 선택합니다.
  5. ‘Minify(압축)’ 섹션에서 Release(출시) 및 Debug(디버그) 설정을 ‘None(없음)’에서 ‘ProGuard’로 변경합니다.
Node.js
  1. Firebase Admin SDK를 앱에 추가합니다.
  2. 아래 안내에 따라 사용자 환경에서 적절한 사용자 인증 정보를 사용해 Cloud Firestore를 초기화합니다.
  1. Firebase Admin SDK를 Go 앱에 추가합니다.
  2. 아래 안내에 따라 사용자 환경에서 적절한 사용자 인증 정보를 사용해 Cloud Firestore를 초기화합니다.
  1. Cloud Firestore 서버 클라이언트 라이브러리(자바, Node.js, Python, Go, PHP, C#, Ruby)는 인증을 위해 Google 애플리케이션 기본 사용자 인증 정보를 사용합니다.
    • 개발 환경에서 인증하려면 GOOGLE_APPLICATION_CREDENTIALS 환경 변수가 JSON 서비스 계정 키 파일을 가리키도록 설정합니다. API 콘솔 사용자 인증 정보 페이지에서 키 파일을 만들 수 있습니다.
    • 프로덕션 환경에서는 Cloud Firestore에 사용하는 것과 동일한 프로젝트를 사용하여 App Engine이나 Compute Engine에서 애플리케이션을 실행하는 경우 인증할 필요가 없습니다. 그 외의 경우는 서비스 계정을 설정합니다.
  2. 클라이언트 라이브러리를 사용하는 데 필요한 PHP용 gRPC 확장 프로그램을 설치하고 사용 설정합니다.
  3. Cloud Firestore PHP 라이브러리를 앱에 추가합니다.
  1. Cloud Firestore 서버 클라이언트 라이브러리(자바, Node.js, Python, Go, PHP, C#, Ruby)는 인증을 위해 Google 애플리케이션 기본 사용자 인증 정보를 사용합니다.
    • 개발 환경에서 인증하려면 GOOGLE_APPLICATION_CREDENTIALS 환경 변수가 JSON 서비스 계정 키 파일을 가리키도록 설정합니다. API 콘솔 사용자 인증 정보 페이지에서 키 파일을 만들 수 있습니다.
    • 프로덕션 환경에서는 Cloud Firestore에 사용하는 것과 동일한 프로젝트를 사용하여 App Engine이나 Compute Engine에서 애플리케이션을 실행하는 경우 인증할 필요가 없습니다. 그 외의 경우는 서비스 계정을 설정합니다.
  2. Cloud Firestore C# 라이브러리를 .csproj 파일의 앱에 추가합니다.
  3. Program.cs 파일에 다음을 추가합니다.
  1. Cloud Firestore 서버 클라이언트 라이브러리(자바, Node.js, Python, Go, PHP, C#, Ruby)는 인증을 위해 Google 애플리케이션 기본 사용자 인증 정보를 사용합니다.
    • 개발 환경에서 인증하려면 GOOGLE_APPLICATION_CREDENTIALS 환경 변수가 JSON 서비스 계정 키 파일을 가리키도록 설정합니다. API 콘솔 사용자 인증 정보 페이지에서 키 파일을 만들 수 있습니다.
    • 프로덕션 환경에서는 Cloud Firestore에 사용하는 것과 동일한 프로젝트를 사용하여 App Engine이나 Compute Engine에서 애플리케이션을 실행하는 경우 인증할 필요가 없습니다. 그 외의 경우는 서비스 계정을 설정합니다.
  2. Cloud Firestore Ruby 라이브러리를 Gemfile 의 앱에 추가합니다.
  3. 다음을 사용하여 Gemfile 의 종속 항목을 설치합니다.

(선택사항) Firebase 로컬 에뮬레이터 도구 모음으로 프로토타입 제작 및 테스트

모바일 개발자를 대상으로 앱이 Cloud Firestore에서 데이터를 읽고 쓰는 방법에 대해 설명하기 전에 Cloud Firestore 기능을 프로토타입으로 제작하고 테스트하는 데 사용할 수 있는 도구 모음인 Firebase 로컬 에뮬레이터 도구 모음을 소개하려 합니다. 다양한 데이터 모델을 사용해 보거나, 보안 규칙을 최적화하거나, 백엔드와 상호작용할 수 있는 가장 비용 효율적인 방법을 찾는 경우 실시간 서비스를 배포하지 않고 로컬에서 작업할 수 있다는 것은 획기적인 아이디어입니다.

Cloud Firestore 에뮬레이터는 로컬 에뮬레이터 도구 모음에 포함되어 있으며, 에뮬레이션된 데이터베이스 콘텐츠 및 구성은 물론 필요할 경우 에뮬레이션된 프로젝트 리소스(함수, 기타 데이터베이스, 보안 규칙)와 앱이 상호작용할 수 있게 해줍니다.

Cloud Firestore 에뮬레이터를 사용하려면 몇 가지 단계만 거치면 됩니다.

  1. 에뮬레이터에 연결하려면 앱의 테스트 구성에 Python - Action 사용하기 코드 줄을 추가합니다.
  2. 로컬 프로젝트 디렉터리의 루트에서 firebase emulators:start 를 실행합니다.
  3. 평소와 같이 Cloud Firestore 플랫폼 SDK를 사용하여 앱의 프로토타입 코드에서 호출합니다.

Cloud Firestore 초기화

Cloud Firestore 인스턴스를 초기화합니다.

Web version 9

`initializeApp`의 값은 웹 앱의 `firebaseConfig`에서 확인할 수 있습니다. 기기의 연결이 끊겨도 데이터를 유지하려면 오프라인 데이터 사용 설정 문서를 참조하세요.

Web version 8

`initializeApp`의 값은 웹 앱의 `firebaseConfig`에서 확인할 수 있습니다. 기기의 연결이 끊겨도 데이터를 유지하려면 오프라인 데이터 사용 설정 문서를 참조하세요.

Swift
Objective-C

Kotlin+KTX

자체 서버에서 Firebase Admin SDK를 사용하려면 서비스 계정을 사용합니다.

Cloud Platform Console에서 IAM 및 관리자 > 서비스 계정으로 이동합니다. 새 비공개 키를 생성하고 JSON 파일을 저장합니다. 그런 다음 이 파일을 사용하여 SDK를 초기화합니다.

Python

자체 서버에서 Firebase Admin SDK를 사용하려면 서비스 계정을 사용합니다.

Cloud Platform Console에서 IAM 및 관리자 > 서비스 계정으로 이동합니다. 새 비공개 키를 생성하고 JSON 파일을 저장합니다. 그런 다음 이 파일을 사용하여 SDK를 초기화합니다.

Python

자체 서버에서 Firebase Admin SDK를 사용하려면 서비스 계정을 사용합니다.

Cloud Platform Console에서 IAM 및 관리자 > 서비스 계정으로 이동합니다. 새 비공개 키를 생성하고 JSON 파일을 저장합니다. 그런 다음 이 파일을 사용하여 SDK를 초기화합니다.

Node.js
  • Cloud Functions에서 초기화
  • Google Cloud Platform에서 초기화
  • 자체 서버에서 초기화

자체 서버(또는 다른 Node.js 환경)에서 Firebase Admin SDK를 사용하려면 서비스 계정을 사용합니다. Cloud Platform Console에서 IAM 및 관리자 > 서비스 계정으로 이동합니다. 새 비공개 키를 생성하고 JSON 파일을 저장합니다. 그런 다음 이 파일을 사용하여 SDK를 초기화합니다.

자체 서버에서 Firebase Admin SDK를 사용하려면 서비스 계정을 사용합니다.

Cloud Platform Console에서 IAM 및 관리자 > 서비스 계정으로 이동합니다. 새 비공개 키를 생성하고 JSON 파일을 저장합니다. 그런 다음 이 파일을 사용하여 SDK를 초기화합니다.

Unity

데이터 추가

Cloud Firestore는 컬렉션에 저장되는 문서에 데이터를 저장합니다. 문서에 데이터를 처음 추가할 때 Cloud Firestore에서 암시적으로 컬렉션과 문서를 만듭니다. 컬렉션이나 문서를 명시적으로 만들 필요가 없습니다.

Python

먼저 아래와 같이 Python - Action 사용하기 이름과 장소를 포함한, "Hello World"를 출력하는 간단한 Python 액션인 'hello'를 작성합니다.

hello python Action

Python 코드는 여러 개의 함수를 포함할 수 있지만 main 함수는 프로그램의 시작점으로서 반드시 선언되어야 합니다.

위에서 작성한 코드로 hello라는 이름의 액션을 생성합니다.

compute-15-2-201.png

의존성 파일을 함께 패키징하여 액션 생성하기

코드를 작성하다 보면 하나의 액션 외의 의존 모듈을 패키지해야 하는 경우가 있습니다. 이런 경우, 관련된 파일들을 하나의 모듈로 패키징하고, 패키징된 파일을 이용하여 액션을 생성할 수 있습니다.

함수에 접근하기 위한 entry point인 main 함수는 __main__.py 파일 안에 정의되어 있어야 합니다. 예를 들어 메인 액션에서 사용되는 함수들이 작성된 helper.py 파일과 함께 패키징하여 액션을 만들고 싶다면 아래의 명령어를 사용하면 됩니다.

액션과 관련된 파일들을 helloPython.zip으로 압축합니다.

이후 생성된 압축 파일을 사용하여 액션을 생성합니다.

virtual environment와 함께 패키징하여 액션 생성하기

1. Linux & Mac

Cloud Functions에서 기본으로 제공되는 라이브러리 외의 추가 라이브러리를 사용하기 위해 virtual environment( virtualenv )를 사용하여 함께 패키징할 수 있습니다.

기본적으로 지원하는 패키징 방법과 동일하게 메인 함수는 __main__.py 파일 안에 정의되어 있어야 하며 virtualenv의 폴더 이름은 반드시 'virtualenv'로 설정해야 합니다.

virtual environment를 구축하여 Cloud Functions에서 제공하지 않는 pyjokes 라이브러리를 사용하여 joke를 반환하는 액션을 생성하는 예제입니다.

먼저 virtualenv 이름을 가지는 virtualenv 환경을 구축합니다.

__main__.py에서 get_joke() 메서드를 호출하여 joke를 반환하는 아래의 코드를 작성합니다.

virtualenv 폴더와 __main__.py 파일을 함께 압축합니다.

Cloud Functions는 최대 액션 소스 코드의 크기가 38MB로 제한되어 있습니다. 따라서 사용하는 라이브러리가 많아 파일 크기가 제한 용량을 넘어가는 경우 배포가 제한될 수 있으며, 자주 사용되지 않는 액션의 경우 컨테이너가 cold 상태로 전환되어 초기 액션 실행 시간이 늘어날 수 있습니다.

2. Windows

현재 Windows OS에서는 mac과 Linux에서 Python - Action 사용하기 지원하는 virtualenv와 동일한 형태로 지원하기 힘든 상태입니다. Windows에서는 가상으로 환경을 구성해서 패키지화하는 두 가지 방법을 안내합니다.(Python이나 pip는 설치되어 있다고 가정합니다.)

방법 1. Docker를 사용하여 패키지

Docker를 이용할 수 있는 개발 환경이라면, 간단히 가상으로 개발환경을 구성해서 패키지화할 수 있습니다.

Step 1. 자신의 OS에 맞는 Docker for Windows (Community Edition) 또는 Docker Toolbox를 설치합니다.

Step 2. 소스코드 작성

Step 3. requirements.txt 파일 작성

  • 위 문서를 만드는 방법은 의존성 라이브러리의 버전을 알고 있거나, 작성법을 안다면 직접 작성 가능합니다.

작성법을 모르면 windows용 virtualenv 설치 후 pip freeze 를 이용하여 작성 가능합니다.

Step 4. Docker 명령어를 사용한 zip 파일 생성

파일 구조가 아래와 같다면 작업 경로는 C:\WorkingDir 라고 가정합니다.

아래의 Docker 명령어를 실행합니다.
아래 명령어는 docker를 이용해서 가상의 개발환경을 만들어 해당 환경을 압축해서 zip 파일로 만들어주는것까지의 과정을 함축합니다.

Step 5. Zip 파일 업로드.

방법 2 의존성 라이브러리들만 따로 패키징

Docker와 같은 추가 환경 구성이 어렵다면, windows용 python vitualenv에서 내 코드와 의존성 라이브러리들만 따로 압축해서 패키징할 수 있습니다.

Step 1. 소스코드 작성

Step 2. Vitualenv 생성 및 의존성 패키지 설치 및 복사

Step 3. 작업 경로 c:\WorkingDir 내 virtualenv 폴더를 제외하고 모두 압축 (zip)

compute-15-2-202.png

Step 4. 압축된 파일 업로드

기본 파라미터 설정하기

매번 액션을 실행할 때마다 파라미터를 전달하는 대신, 특정 파라미터에 기본값을 지정할 수 있습니다.
위에서 생성한 hello 액션의 place 파라미터에 기본 값을 등록해보도록 하겠습니다.

compute-15-2-105.png

액션 실행 시 파라미터 전달하기

액션 실행 시 입력으로 파라미터를 전달할 수 있습니다.
Main 함수에 전달되는 파라미터는 JSON object 형식으로 전달됩니다.

파라미터는 액션 실행 시 직접 입력하거나, JSON 형식의 파일을 작성하여 전달할 수 있습니다.
파일을 통해 파라미터를 전달하는 경우에는 아래와 같은 JSON 형식의 파일을 작성해야 합니다.

compute-15-2-106.png

액션 런타임 정보

각 액션 컨테이너에는 기본 라이브러리들이 내장되어 있으며,
이 라이브러리들은 별도의 추가적인 작업 없이 임포트하여 사용하실 수 있습니다.

파이썬 초심자를 위한 PIP 그리고 Virtualenv 소개

파이썬의 신규 개발자들이 반드시 넘어야할 산중 하나는 파이썬 패키징 생태계를 이해하는 것입니다. 이 글에서는 Python for Programming training course에서 다루었던 자료를 기반으로 파이썬 초심자들을 위해 pipvirtualenv 를 설명하고자 합니다.

전제 조건

Python for Programmers 강의는 하나 이상의 개발 언어에 익숙한 개발자들을 대상으로 한 강의였기 때문에, 이 글은 여러분이 어느 정도 수준의 기술 지식을 가지고 있다고 가정하고 있습니다. 커맨드 라인 사용에 대해 편하게 느낀다면 이 글을 쉽게 이해하는데 도움이 될것입니다. 이 글에서 예제들은 맥과 리눅스 환경에서 기본으로 사용되는 shell인 bash 를 사용할 예정입니다. 하지만, 사용할 명령어들이 매우 간단하기 때문에 윈도우의 PowerShell에서도 동일한 개념의 명령어를 쉽게 찾아서 사용하실 수 있을 겁니다.

이제 시작해봅시다. pipPython Package Index (PyPI) 저장소로부터 파이썬 패키지를 받아 설치하는 패키지 관리 도구입니다. PyPI (Python - Action 사용하기 가끔 The Cheeseshop 이라고도 불리는)는 third-party 파이썬 오픈소스 패키지들을 위한 저장소입니다. Ruby에서의 RubyGems 혹은 PHP의 Packagist, Perl의 CPAN 그리고 Node.js의 NPM와 비슷하다고 생각하시면 됩니다.

사실 Python은 훨씬 더 기초적인 패키지 매니저인 easy_install을 가지고 있습니다. 여러분이 처음 Python을 설치할때 easy_install은 자동으로 설치됩니다. 하지만, 여러 측면에서 easy_install 보다 훨씬 더 우월한 pip를 사용하는것이 일반적입니다. 먼저, easy_install을 통해 pip를 다음과 같이 설치할 수 있습니다:

이제 pip를 통해 패키지들을 설치할 수 있습니다. (아래 예제에서는 Django를 설치해봅시다):

여기서 우리는 Django를 시스템 전체에 (global) 설치하였습니다. 하지만, 대부분의 경우 패키지를 글로벌하게 설치하지 않아야합니다. 계속해서 읽어보면서 이유를 찾아보세요.

Virtualenv

virtualenv 는 아주 구체적인 문제를 해결합니다: 보통 여러개의 파이썬 프로젝트가 하나의 컴퓨터에서 충동을 일으키지 않고 존재할 수 있도록 도와줍니다.

어떤 문제를 해결하나요?

virtualenv가 해결하는 문제를 설명하기 위해, 먼저 virtualenv가 존재하지 않는다고 가정해봅시다. 여러분은 외부 웹 서버에 HTTP 요청을 보내는 파이썬 프로그램을 작성해야하는 상황입니다. 이 일에 뛰어난 Requests 라이브러리를 사용할 예정입니다. 위에서 보여준것처럼 pip를 이용해 Requests 라이브러리를 설치해봅시다.

그런데, pip는 여러분의 컴퓨터 어느곳에 패키지를 설치할까요? 여러분이 pip install requests 명령어를 실행시키면 다음과 같은 일이 발생합니다.

pip가 /Library/Python/2.7/site-packages/requests 안에 패키지를 설치하려고 했던 것으로 보입니다. 이 폴더는 파이썬이 알고있는 특별한 폴더입니다. site-packages 내부에 패키지가 설치되면, 파이썬 프로그램에서 이 패키지를 임포트해서 사용할 수 있게됩니다.

하지만, 위에서는 에러가 발생했습니다. 일반적으로 맥에서 “일반 사용자” 는 /Library 폴더에 쓰기 권한이 없기 때문에 위와 같은 에러가 발생한것입니다. 이 에러를 고치기 위해서는 sudo pip install requests 명령어를 실행하면 됩니다. 여기에서 sudo는 “슈퍼 유저”로 명령어를 실행하라는 의미입니다.

이제 정상적으로 동작합니다. python 명령어를 실행해서 Requests 라이브러리를 임포트해봅시다:

지금까지 우리는 pip를 통해 라이브러리를 설치하고, 이 패키지를 import requests 구문을 통해 파이썬 프로그램 내에서 사용해보았습니다. 시간이 지나서, PyPI에서 다른 라이브러리들을 가져와서 우리의 앱을 계속 발전시켰다고 가정해봅시다. 시간이지나 우리가 발전시킨 앱은 뛰어난 성능을 보여주면서 많은 돈을 벌 수 있었고, 사용자들은 약간의 차이가 있는 새로운 프로그램을 작성해달라는 요청을 보내고 있습니다.

사용자들의 요청에 보답하여 새로운 앱을 만들어보고자 새로운 프로젝트를 시작했습니다. 이번 앱에도 requests 라이브러리가 필요한데, 첫번째 앱을 만들었던 이후로 requests 라이브러리에는 새로운 기능이 추가된것을 확인했습니다. 이 추가된 기능이 새로 앱에서 필수적인 상황입니다. 새로운 기능을 사용하기 위해 다음과 같은 pip 명령어로 requests 라이브러리를 업데이트했다고 가정합니다:

모든 것이 좋아보이지만, 우리가 알지 못하는 사이에 재앙은 발생하고 있습니다! 업데이트 이후, 우리에게 돈을 많이 벌어다주던 기존의 프로그램을 돌려보자 프로그램이 에러가 납니다. 왜일까요? 바로 requests 라이브러리가 변경되었기 때문입니다. 아주 작은 변화였지만, 우리의 코드가 더 이상 이 라이브러리를 못쓰는 상황이 벌어진 것입니다. 모든 것이 망가져 버렸습니다.

물론, 새로운 requests API를 사용하도록 기존의 프로그램을 변경해 문제를 해결할 수 있습니다. 하지만, 시간이 소요되고 새로운 프로젝트에서 집중도를 잃게 됩니다. 보통 숙련된 파이썬 개발자는 단지 2개의 프로젝트만 가지고 있지 않습니다. 수십가지 프로젝트를 동시에 진행하고, 각 프로젝트는 수십가지의 라이브러리에 대한 의존성을 가지고 있습니다! 이 라이브러리 전체를 최신버전으로 유지하고 모든 프로젝트에서 동일한 버전의 라이브러리를 사용하도록 만드는 것은 완전 악몽입니다.

어떻게 virtualenv는 이 문제를 해결하나요?

virtualenv는 각 프로그램별로 완전히 독립적인 가상의 환경을 만들어냄으로써 이 문제를 해결합니다. 여기서 환경이란 파이썬 프로그램을 실행시키는데 필요한 모든것의 복사본을 가지고 있는 단순한 폴더입니다. 전체 파이썬 스탠다드 라이브러리 복사본, pip 설치 프로그램 복사본, 그리고 위에서 언급한 site-packages 복사본 등을 포함합니다. 여러분이 virtualenv 도구를 이용해 생성된 pip 복사본을 이용해 PyPI로 부터 패키지를 설치하면, virtualenv 폴더 내부의 site-packages 폴더에 이를 설치합니다. 그리고 설치된 패키지는 이전과 동일한 방법으로 파이썬 프로그램 내부에서 사용할 수 있습니다.

어떻게 virtualenv를 설치하나요?

만약 여러분이 이미 pip를 설치하셨다면, virtualenv를 설치하는 가장 쉬운 방법은 sudo pip install virtualenv 명령어 입니다. pip와 virtualenv는 일반적으로 글로벌 설치가 되어야하는 유일한 패키지입니다. 이 두개를 설치하고 나면 나머지 패키지들은 가상 환경에 설치하면 되기 때문입니다.

사실, virtualenv는 pip의 복사본을 수반하고 있습니다. 그렇기에 여러분이 필요한것은 사실상 virtualenv 뿐입니다. virtualenv는 PyPi에서 설치하는 것이 아닌 독립적인 패키지로 설치가 가능합니다. 이런 방법은 윈도우 사용자들에게 더 쉬울 수 있습니다. virtualenv.org 에 있는 설치 안내를 참고해주세요.

어떻게 새로운 가상 환경을 생성할 수 있나요?

새로운 환경을 만들기 위해서는 virtualenv만 있으면 됩니다. 아주 간단하죠. 여러분 프로젝트의 루트 폴더로 이동한 이후, 아래와 같이 virtualenv 명령어로 생성하면 됩니다.

여기에서, env 는 여러분의 가상 환경을 생성할 폴더의 이름입니다. 아무런 이름을 붙여도 되지만, 보통 env 라고 부르고 프로젝트 디렉토리 내부에 이를 만드는 것이 일반적인 관습입니다. 예를 들어, 여러분이 코드를 ~/code/projectname/ 에 보관한다고 하면, ~/code/projectname/env 가 새롭게 만들어진 환경이라고 생각하시면 됩니다. 하지만, 여러분이 원하는 폴더 이름으로 지으셔도 상관없고, 프로젝트 폴더 외부에 위치시켜도 상관 없습니다.

만약 여러분이 git과 같은 Python - Action 사용하기 버전 컨트롤 시스템을 사용하고 계신다면, env 디렉토리를 커밋에 포함시키지않는 것을 추천합니다. 반드시 .gitignore 파일에 env 디렉토리를 추가하세요.

어떻게 새로운 가상 환경을 사용하나요?

방금 새롭게 생성한 env 폴더 내부를 살펴보면, 아래와 같은 몇몇개의 폴더를 확인할 수 있습니다.

여러분이 가장 관심을 기울여야하는 폴더는 bin 입니다. 이 폴더는 파이썬 라이브러리의 로컬 복사본과 pip 설치 복사본이 있는 곳입니다. 이제 pip 복사본을 이용해서 vitrualenv 내부에 requests 라이브러리를 설치해봅시다.

동작하는군요! 여기에서 여러분이 sudo를 사용하지 않았다는 점을 기억하세요. 이제 requests를 글로벌로 설치하지 않고 home 폴더내부에 설치하기 때문에, 더이상 sudo가 필요하지 않은것입니다.

이제, Python shell을 실행하기 위해 pytho 명령어를 실행하지 않고, env/bin/python 명령어를 실행하면 됩니다.

하지만, 너무 타이핑을 많이해야해요

virtualenv는 숨겨진 다양한 트릭들을 가지고 있습니다. env/bin/python 그리고 env/bin/pip 를 매번 입력하는 대신, 우리가 만든 가상 환경을 실행시킬 수 있습니다. source env/bin/activate 명령어를 통해서 활성화시키면 이 스크립트는 여러분의 shell의 몇몇 변수들을 일시적으로 조정합니다. 그래서, python 을 타이핑하면 글로벌 python 대신 virtualenv 내부에 있는 Python 실행파일을 얻을 수 있게 됩니다:

이제 여러분이 env/bin/pip install requests 를 입력하는 대신에 pip install requests 라고 입력하면 글로벌이 아닌 우리의 가상환경에 라이브러리를 설치하게 됩니다. 스크립트가 터미널에 준 이 변화는 터미널이 열려있는 동안만 유지가 됩니다. 때문에 여러분이 새로운 터미널을 실행시키면 다시 source env/bin/activate 스크립트를 실행시켜야합니다. 다른 프로젝트로 이동하고 싶다면 deactivate 명령어를 통해 현재 가상환경의 사용을 종료시킬 수 있습니다. 이후, 해당 프로젝트로 이동해 source /env/bin/activate 명령어를 실행시키면 됩니다.

Activating과 Deactivating은 여러분이 타이핑을 하는 것을 감소시켜줍니다. 하지만, 이것을 사용하면 조금은 혼란스러울 수 있습니다. 이를 사용할지 말지는 여러분에게 달려있습니다.

Requirements 파일

pip의 requrements 기능을 사용할때 virtualenv와 pip는 서로 아주 좋은 동료가 됩니다. 여러분의 각 작업 프로젝트는 각기 자기들만의 requirements.txt 파일을 가지고 있습니다. 이 파일을 가상환경에서 필요한 라이브러리들을 설치하는데 사용할 수 있습니다:

더 자세한 정보는 pip 문서를 참고해주세요.

  • pip는 Python Package Index에서 패키지를 설치하는 도구입니다.
  • virtualenv는 python, pip, PyPI 부터 설치된 라이브러리들의 복사본을 만듦으로써, 독립적인 파이썬 환경을 만들어주는 도구입니다.
  • 이는 여러분이 동시에 하나의 기기에서 여러개의 프로젝트가 가지는 다른 의존성을 다룰 수 있도록 디자인되었습니다.
  • 설치 관련 가이드는 virtualeng.org에서 찾을 수 있습니다.
  • 설치 후에, env라는 가상환경 폴더를 만들고 싶다면 virtualenv env 명령어를 실행시키면 됩니다.
  • 여러분의 각 프로젝트 마다 이러한 환경이 하나씩 필요하게 됩니다. 이 폴더들을 버전 컨트롤 시스템에서 제외하는것을 잊지 마세요.
  • 가상환경에서 python과 pip를 사용하고 싶다면, env/bin/python 그리고 env/bin/pip 를 사용하면 됩니다.
  • 가상환경을 source env/bin/activate 스크립트로 활성화 시킬 수 있고 deactivate 명령어를 통해 비활성화 시킬 수 있습니다. 선택적이지만 개발을 조금 더 편하게 도와줄 것입니다.

만일 여러분이 일반적인 파이썬 사용자라면 pip와 virtualenv는 서로 떨어질 Python - Action 사용하기 수 없는 도구들일것입니다. 둘다 상대적으로 이해하기 간단하기에 이들을 명확히 이해하는 것을 추천합니다.

만약 이 글이 파이썬을 배우고 싶도록 여러분을 자극했다면 Python for Programmers 강의를 확인해보세요.

핍 이해하기

이번 포스팅에서는 파이썬 패키지를 배포하는 방법에 대해서 함께 살펴보도록 하겠습니다.

1. pip: 파이썬 패키지 관리자

파이썬 패키지를 배포하는 방법에 대해 설명드리기에 앞서 간단하게 pip, 파이썬 패키지 관리자에 대해 짚고 넘어가보겠습니다.

파이썬을 공부하고 어느정도 사용을 해본 분들이라면 자연스럽게 pip를 사용해 보셨을 것이라고 생각합니다.

가령, 데이터 분석을 위해서 주로 numpy나 pandas, 웹 개발을 할 때에는 django, flask 등을 이용하기 위해 아래와 같이 pip를 이용하여 필요한 라이브러리를 다운받아 사용하셨을 겁니다.

이때 우리가 사용하는 pip는 무엇일까요?

pip란, Python Package Index(PyPI)라는 저장소에서 제공되는 파이썬 패키지 소프트웨어를 설치 및 관리하는 패키지 관리 시스템입니다.

즉 우리가 그 동안 pip를 통해 설치한 다양한 라이브러리(패키지)들은 모두 PyPI라는 곳에 저장되어 있으며 실제로 아래 PyPI사이트에서 검색을 통해 확인해볼 수 있습니다.

그리고 위의 PyPI사이트에 일정한 템플릿을 맞추어 자신의 패키지를 어렵지 않게 등록할 수 있습니다.

별도의 승인과정이나 절차가 없으며 단순히 특정 파일들만 잘 셋팅하면 어렵지 않게 자신만의 라이브러리(패키지)를 등록하여, pip로 설치할 수 있게 되는 것 입니다.

자신이 구현한 알고리즘이나, 특정 기능을 하는 함수를 더 많은 사람들에게 공유하고, 기회가 된다면 피드백을 받아 보다 좋은 코드로 발전시키는 것은 언제나 중요하고 보람찬 일이라고 생각합니다.

그럼 이제, 어떻게 PyPI 사이트에 자신의 코드를 등록할 수 있는지 살펴보도록 하겠습니다.

2-1. PyPI 회원가입

제일 먼저 PyPI에 회원가입을 진행합니다.

아래 사이트에서 우측 상단의 Register를 클릭하고 이름과 이메일, 비밀번호를 입력 후 이메일 인증만 진행하면 됩니다.

추후 패키지를 등록하고자 할 때 PyPI의 계정이 필요하니 미리 가입을 해두는 것을 추천드립니다.

2-2. 패키지 이름 중복 확인

가입이 완료되었다면, 위의 사이트에서 search를 통해 자신이 등록하고자 하는 패키지의 이름의 있는지 확인합니다. 패키지 이름은 추후 사용해야 할 곳이 많으니 자신이 쓰고자 하는 패키지의 이름이 중복되지 않는지를 먼저 확인 후 이후 과정을 진행하시는 것이 편리합니다.

만약, 이름이 중복된다면 다양한 것들을 수정해야 할 수 있습니다.

저는 doorbw-test 라는 이름으로 패키지가 없는 것을 확인하였기에 해당 이름으로 패키지 생성 및 등록을 진행해보도록 하겠습니다.


0 개 댓글

답장을 남겨주세요