본문 바로가기

Sparta

[Sparta] 02-2. 두번째날, 웹과 파이썬

4. 파이썬 가상환경

데이터 분석을 목적으로 파이썬을 공부했던 나에게는 "가상환경 == 아나콘다"였다. 하지만 아나콘다로 가상환경을 구성해보면 알겠지만... 설치부터 상당히 고통스럽고, 프로그램 자체도 상당히 무겁다. 물론 아나콘다 하나만 설치하면, Jupyter등의 여러 툴도 같이 설치되고 간편하게 사용 할 수 있지만 (사용 할 수 있다고 주장하지만), 이 과정이 여간 어려운 게 아니다.


후에 알게 된 것이지만, 파이썬은 다음과 같이 여러가지 가상환경 툴을 제공한다.


  1. venv
  2. conda
  3. pipenv
  4. pyenv-virtualenv

우선 가상환경을 왜 사용하는가? Sparta의 설명에 의하면 다음과 같다.


  문제상황:
  회사에서는 패키지 A, B, C를 설치해서 쓰고,
  개인 프로젝트에서는 패키지 B, C, D, E를 설치해서 쓰고 있었어요.

  그런데 회사팀장님이 B를 이전 버전인 B_2 로 쓰자고 하시네요.
  그렇게 되면, 같은 컴퓨터에 깔려 있는 개인 프로젝트에서는 B'로 쓰면 코드를 다 바꿔야 해요 😭

  어떻게 하면 좋을까요?

즉, 여러가지 환경에서 적절한 패키지를 이용하기 위해 사용한다고 생각하면 이해가 쉬울 것이다.


가상환경(virtual environment)은
같은 시스템에서 실행되는 다른 파이썬 응용 프로그램들의 동작에 영향을 주지 않기 위해, 파이썬 배포 패키지들을 설치하거나 업그레이드하는 것을 가능하게 하는 격리된 실행 환경 입니다.

위에서 언급한 가상환경의 종류를 간단히 정리해 보겠다.


  1. venv
  • 파이썬에 내장된 가상환경 모듈. Python 3.5 이후부터는 파이썬 표준 라이브러리에 들어가 있는 가상환경 생성 방법이다. pip이 내장되어 있어 매우 편리하다.

무려 "표준" 라이브러리 되시겠다. 실행법은 다음과 같다.

  $ python3 -m venv myvenv # 원하는 가상환경 이름
  $ source ./myvenv/bin/activate # 가상환경 활성화
  $ deactivate # 가상환경 종료

  # 패키지 관리
  $ pip3 freeze > requirements.txt # 내가 설치한 패키지 리스트를 requirements.txt에 저장
  $ pip3 install -r requirements.txt # requirements.txt에 있는 패키지를 한번에 설치

내가 생각하기에 현재는 venv가 가장 사용하기 편한 것 같다.

VSCODE에서는 위와 같이 수동으로 설치 및 사용을 해줘야 하지만, 요새 배우고 있는 Pycharm에서는 반 강제적으로 venv를 활용하는 것 같다.


  1. conda
  • 데이터 사이언스, 머신러닝, 딥러닝 분야에서 사용되는 다양한 라이브러리들이 기본적으로 설치된 런티임이다.(Numpy, Pandas 등) 근데 사실 이제 위에서 언급한 바와 같이 사용할 이유가 없는 것 같다...

    $ conda create -n ENV_NAME python=3.X # 원하는 가상환경 이름, 원하는 파이썬 버전
    $ conda activate ENV_NAME # 가상환경 활성화
    $ conda deactivate # 가상환경 종료
    
    # 패키지 관리
    $ conda env export > conda_requirements.txt # 내가 설치한 패키지 리스트를 conda_requirements.txt에 저장
    $ conda env create -f conda_requirements.txt # requirements.txt에 있는 패키지를 한번에 설치

3번과 4번은 잘 모름..


Pycharm에서 Package 설치

File > Settings > Project:~~ > Python Interpreter(파이썬 버전 선택) > 좌측 상단 +버튼 > 원하는 패키지 검색

물론, 하단의 terminal에서 pip로 설치해도 된다.

pip install 원하는 패키지

5. Mongo DB & Robo 3T

  • Mongo DB는 백그라운드에서 실행, 사용자한테 안보임. 이때, Robo 3T로 Mongo DB의 데이터를 시각화해서 볼 수 있게 함

데이터베이스란?


마찬가지로 이전에 정리해 둔 내용을 참고하면 다음과 같다.

  • 데이터베이스의 개념

    • 구조화된 데이터의 집합 (like 엑셀)
  • 데이터베이스 구성요소

    • 데이터베이스 (database): 테이블(table)의 집합
    • 테이블 (table): 행(row)의 집합
    • 행 (row): 한 단위의 데이터 기록(record)
    • 열 (column): 데이터의 항목 (field)
  • DBMS(DataBase Management System)

    • 데이터베이스를 관리해주는 시스템
      • 클라이언트가 SQL을 이용하여 서버에 명령을 내리면 서버가 클라이언트에 응답을 함
      • ex) MySQL, Oracle, SQLite (파이썬 내장)
  • SQL이란 무엇인가?

    • Structured Query Language
    • 데이터베이스를 관리하기 위해 사용되는 언어
    • SQL의 종류
      1. DDL (Data Definition Language)
        데이터 정의 언어 (CREATE, ALTER, DROP)
      2. DML (Data Manipulation Language)
        데이터 조작 언어 (INSERT, SELECT, UPDATE, DELETE)

SQLite를 배우며 정리해 둔 내용이다. 오늘 학습한 Mongo DB와는 무엇이 다르지..?

RDBMS(SQL)

행/열의 생김새가 정해진 엑셀에 데이터를 저장하는 것과 유사합니다. 데이터 50만 개가 적재된 상태에서, 갑자기 중간에 열을 하나 더하기는 어려울 것입니다. 그러나, 정형화되어 있는 만큼, 데이터의 일관성이나 / 분석에 용이할 수 있습니다.

ex) MS-SQL, My-SQL 등

No-SQL (Not only SQL)

딕셔너리 형태로 데이터를 저장해두는 DB입니다. 고로 데이터 하나 하나 마다 같은 값들을 가질 필요가 없게 됩니다. 자유로운 형태의 데이터 적재에 유리한 대신, 일관성이 부족할 수 있습니다.

ex) MongoDB

My-SQL, SQLite는 SQL 형식의 데이터 베이스이다. 그리고 Mongo DB는 딕셔너리 형태로 데이터를 저장해두는 데이터 베이스이다. 이는 큰 차이점을 가지는데 SQL은 "관계형 DB"이다. 따라서 다음과 같은 특징을 가진다.


데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.
데이터는 관계를 통해 여러 테이블에 분산된다.


하지만 NoSQL은 관계형 DB의 반대, 즉, 스키마도 없고, 관계도 없다. NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다.


다음은 Python의 pymongo 패키지로 mongo DB에 데이터를 추가하는 방법이다.



from pymongo import MongoClient

client = MongoClient('localhost', 27017) # local mongo DB에 접속
db = client.dbsparta # dbsparta DB에 접근 (없으면 만들어 줌)

doc = {'name':'bobby','age':21} # No SQL은 기본적으로 dict가 쌓이는 개념으로 생각
db.users.insert_one(doc) # users라는 collection에 데이터를 insert

same_ages = list(db.users.find({'age':21},{'_id':False})) # users라는 collection에서 해당하는 조건을 find

# db.users.find({조건},{'_id':False}) # false는 가져오지 말라는 뜻, {조건}을 {}로 두면 all

db.users.update_one({'name':'bobby'},{'$set':{'age':19}}) # 조건을 찾아서 뒤에 걸로 바꿔라

db.users.delete_one({'name':'bobby'}) # 조건을 찾아서 삭제

다음과 같은 장단점을 가진다.


  • SQL 장점
    • 명확하게 정의된 스키마, 데이터 무결성 보장
    • 관계는 각 데이터를 중복없이 한번만 저장

  • SQL 단점
    • 덜 유연함. 데이터 스키마를 사전에 계획하고 알려야 함. (나중에 수정하기 힘듬)
    • 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음
    • 대체로 수직적 확장만 가능함

  • NoSQL 장점
    • 스키마가 없어서 유연함. 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능
    • 데이터는 애플리케이션이 필요로 하는 형식으로 저장됨. 데이터 읽어오는 속도 빨라짐
    • 수직 및 수평 확장이 가능해서 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능

  • NoSQL 단점
    • 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음
    • 데이터 중복을 계속 업데이트 해야 함
    • 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함 (SQL에서는 중복 데이터가 없으므로 한번만 수행이 가능)

참조 블로그

6. Library Vs. Framework

이 또한 많이 헷갈리는 개념이다.(기술 면접에서 종종 물어본다고 함.) 우선 공통점부터 알아보자, Library와 Framework 모두 소프트웨어 개발을 쉽게 할 수 있도록 돕는 요소이다. 다른 사람이 이미 작성해둔 코드를 가져와서 사용하는 것이 공통점이라 할 수 있다.


그렇다면 어떤 차이점이 있을까?


1. 라이브러리(Library)


라이브러리는 개발에서 필요한 특정한 기능들을 불러와서 사용하는 것을 말한다. 다른 개발자에 의해 (혹은 자신이) 미리 구현된 자주 사용되는 함수들을 모아놓은 도서관이라고 생각하면 쉬울 것이다. 그러니까, 해당 개발에 있어서 주체는 "나"이다. 처음부터 내가 짜는 코드에 여러가지 도구들을 라이브러리에서 꺼내온다고 생각하면 된다.

대표적인 라이브러리로는 JavaScript의 jQuery, Python의 Numpy, pandas 등이 있다.


2. 프레임워크(Framework)


프레임워크는 말 그대로, 구조 혹은 뼈대를 의미한다. 일종의 템플릿으로 개발 과정에서 이미 필요한 대부분의 기능 및 아키텍처를 미리 구현하여 제공하는 것을 의미한다. 웹 페이지를 만든다면, 예상 할 수 있는 필요한 기능들이 있을 것이다. 그러한 기능들을 미리 모아서 뼈대를 만들어두면, 비슷한 웹 페이지를 만들때 디테일만 바꿔준다면 충분 할 것이다. 그러니까, 처음부터 내가 짜는 코드가 아닌, 이미 만들어진 뼈대위에 내가 필요한 기능을 추가하는 것이라고 생각하면 쉽다.

대표적인 프레임워크로는 Python의 Django, Flask, JavaScript의 Angular 등이 있다.