image





코드스테이츠와 함께하는 ‘AI 부트캠프’ 15주차

S3-Week3 : API 개발과 대시보드





주간회고

더 공부가 필요한 부분

Docker, 대시보드



5F 회고

  • 사실(Fact)
    웹어플리케이션 서비스를 위한 구체적인 기술을 배웠다.

  • 느낌(Feeling)
    딥러닝 모델 만드는 것보다 사용자 친화적인 서비스를 잘 만드는 것이 더 어렵게 느껴진다.

  • 교훈(Finding)
    왜 프론트엔드 개발직군이 따로 있는지 알 것 같다. 프론트엔드 개발자까지는 아니어도 사용자 친화적인 데이터분석을 할 수 있도록 필요한 것은 연습하자!

  • 향후 행동(Future action)
    데이터를 잘 표현하고 설명하기 위한 시각화 기술, 특히 대시보드 사용법과 웹시각화에 대하여 연습할 것이다.

  • 피드백(Feedback)
    피드백을 해 주세요😀





N431 : Note 1 : Docker





🏆ㅤ 학습 목표

  • 🌱 Level 1 : Lecture Note 에 있는 주요 개념을 정의할 수 있으며 예제 코드를 이해하고 재현할 수 있다.
    • Docker 가 필요한 이유를 설명할 수 있다.
    • Docker Image 에 대해 설명할 수 있으며, Whalesay 예제를 재현할 수 있다.
    • Docker Container에 파일을 복사하는 예제를 재현할 수 있다.
    • Docker Hub, Docker Container, Docker Image 사이의 관계를 알고 설명할 수 있다.
  • 🔝 Level 2 : 예제 코드를 해석하고 응용할 수 있으며 과제를 수행할 수 있다.
    • Docker Container 가 Linux Container기술에서 시작했다는 것을 알고, LXC 의 세 종류의 구획화에 대해 설명할 수 있다.
    • Docker Image 이름과 Docker Container 실행 명령어의 구성을 각각 설명할 수 있으며, Docker Container 를 실행할 수 있다.
    • Docker Container 의 터미널을 활용하여 Container 내의 폴더 구조를 파악할 수 있으며, 로컬 환경과 파일을 주고 받을 수 있다.
    • 포트에 대해서 설명할 수 있으며, Container 에서 로컬로 포트 포워딩 을 할 수 있다.
  • 🔥 Level 3 : Lecture Note 에 있는 주요 개념과 코드를 연결하여 설명할 수 있으며 도전 과제를 수행할 수 있다.
    • Docker Docs 에서 필요한 명령어와 옵션을 찾아서 실행할 수 있다.
    • Yaml 문법을 이해하고, Docker-Compose 를 활용하여 여러 개의 Container를 다룰 수 있다.
  • 🚀 Level 4 : Lecture Note 에 있는 개념 중 자신이 모르는 것을 구분해 낼 수 있으며 스스로 목표를 세우고 추가 학습을 진행할 수 있다.
    • Dockerfile 에 사용되는 문법을 이해하고, 원하는 Docker Image 를 제작 후 배포할 수 있다.
    • Docker network 를 활용하여 여려 개의 Container 를 연결하고 활용할 수 있다.
    • Docker 와 Linux Container 사이의 관계를 설명할 수 있다.
    • Kubernetes 와 컨테이너 표준 사이의 관계를 설명할 수 있다.
    • 가상 머신에 대해서 이해하고, Docker 와 가상 머신을 비교하여 설명할 수 있다.



오늘의 키워드

  • Docker, Image, Container, 포트포워딩



공부한 내용

Docker

  • 도커(Docker)란, 애플리케이션 실행 환경을 코드로 작성할 수 있고 OS를 격리화하여 관리하는 기술
  • CLI, GUI 모두 가능
  • 학습 목적상 CLI를 주로 사용할 것임
  • 도커 사용은 주로 다음의 3단계를 거침

도커 설치 → 이미지 가져오기 → 컨테이너 실행

Docker CLI 명령어

# 가상환경 실행
source /c/programdata/anaconda3/scripts/activate n43x

# 이미지 가져오기
docker image pull docker/whalesay:latest

# 이미지 리스트 출력
docker image ls

# 컨테이너 실행
docker container run --name myName docker/whalesay:latest cowsay boo

# 컨테이너 리스트 출력
docker container ps -a
docker container ls -a

# 컨테이너 삭제
docker container rm myName

# docker/whalesay 이미지 지우기
docker image rm docker/whalesay
docker image rm my_pacman:1.0

# 이미지가 없으면 이미지 받아와서, 컨테이너 실행하고, 실행이 끝나면 컨테이너를 삭제
docker container run --name my_name --rm docker/whalesay cowsay "이미지가 없으면 이미지 받고, 컨테이너 실행, 컨테이너 삭제를 한꺼번에 해보자"

# 수족관 Docker 실행해보기
docker container run -it --rm danielkraic/asciiquarium:latest

# 주피터노트북 Docker
docker container run --name minimal_jupyter --rm -p 10000:8888 jupyter/minimal-notebook
# http://127.0.0.1:10000/ 으로 접속

# git에서 팩맨 레포 클론
git clone https://github.com/{레포할 깃헙 주소} /D/coding/{복사할 내 폴더 경로}

# httpd 이미지가 없으면 받아서, my_web이름으로 컨테이너 실행, 포트포워딩 818에서 80으로, 종료시 컨테이너 삭제
docker container run --name my_web --rm -p 818:80 httpd
# http://127.0.0.1:818/ 으로 접속
# http://localhost:818/ 으로 접속

# /d/coding/aib/section4/pacman-canvas 의 내용을 my_web:/usr/local/apache2/htdocs/ 컨테이너에 복사
docker container cp ./ my_web:/usr/local/apache2/htdocs/

# 구동한 my_web 컨테이너를 my_pacman으로 버전1.0 지정하여 이미지 생성
docker container commit my_web my_pacman:1.0

# my_pacman 이미지를 my_web2 이름의 컨테이너로 실행
docker run --name my_web2 -p 900:80 my_pacman:1.0
# http://127.0.0.1:900/ 으로 접속
# http://localhost:900/ 으로 접속

# 실행중인 컨테이너 진입하여 파일 보기(안되네...😥)
docker exec -it my_web /bin/bash
docker exec -it my_web "/C/Program Files/Git/bin/bash.exe"

# 컨테이너 실행하여 파일 보기(이건 된다~😃)
docker run --rm -it docker/whalesay:latest
docker run --rm -it docker/whalesay:latest env # 환경변수 확인하기

# 나갈 때는 `exit`

# build 를 이용한 이미지 만들기
# dockerfile 설정
FROM httpd:2.4 # 베이스 이미지를 httpd:2.4 로  사용합니다.
COPY ./ /usr/local/apache2/htdocs/ # 호스트의 현재 경로에 있는 파일을 생성할 이미지 /usr/local/apache2/htdocs/ 에 복사합니다.

# dockerfile 대로 build로 이미지 만들기
docker build --tag my_pacman:2.0 .





N432 : Note 2 : Flask





🏆ㅤ 학습 목표

  • 🌱 Level 1 : Lecture Note 에 있는 주요 개념을 정의할 수 있으며 예제 코드를 이해하고 재현할 수 있다.
    • 웹 애플리케이션과 웹 프레임워크에 대해 설명할 수 있다.
    • Flask, Jinja, 라우팅, 블루프린터에 대해 설명할 수 있다.
    • Flask 예제를 활용하여 간단한 웹 애플리케이션을 제작할 수 있다.
    • Python 코드에서 HTML 에 정보를 전달하는 Jinja 템플릿 예제 코드를 재현할 수 있다.
    • Bootstrap 을 통해 HTML 을 꾸미는 예제 코드를 재현할 수 있다.
    • IP 주소에 대해 설명할 수 있다.
  • 🔝 Level 2 : 예제 코드를 해석하고 응용할 수 있으며 과제를 수행할 수 있다.
    • 웹 애플리케이션을 제작하여 csv 파일의 내용을 출력할 수 있다.
    • Jinja 템플릿을 활용하여 웹 애플리케이션의 사용자가 입력한 데이터를 활용할 수 있다.
    • 웹 애플리케이션의 Endpoint 마다 요구하는 기능을 구현할 수 있으며, HTTP 상태 코드를 전달할 수 있다.
  • 🔥 Level 3 : Lecture Note 에 있는 주요 개념과 코드를 연결하여 설명할 수 있으며 도전 과제를 수행할 수 있다.
    • Application Factory 를 기반으로 웹 애플리케이션을 제작할 수 있다.
    • 제작한 웹 어플리케이션을 폴더와 라우팅에 따른 프레임워크 기반으로 설명할 수 있다.
    • Flask 기반 웹 어플리케이션에 데이터베이스를 연결하고 데이터를 읽고 쓰는 API 제작할 수 있다.
  • 🚀 Level 4 : Lecture Note 에 있는 개념 중 자신이 모르는 것을 구분해 낼 수 있으며 스스로 목표를 세우고 추가 학습을 진행할 수 있다.
    • Flask-SQLAlchemy 를 활용하여 웹 애플리케이션과 데이터베이스를 연결하고 조작할 수 있다.
    • Flask 에서의 리다이렉트 및 사용자 세션처리에 대해 설명할 수 있다.
    • 웹 3계층 시스템 아키텍처에 대해서 설명할 수 있다.



오늘의 키워드

  • Flask, Jinja, 라우팅, 블루프린터



공부한 내용

Flask

  • Flask는 대표적인 python의 마이크로 웹 프레임워크(Micro Web Framework)
  • 웹 프레임워크는 웹 애플리케이션을 개발할 수 있도록 웹 서비스(Web Service) 나 웹 API(Web API) 등을 제공하고 웹 개발과 배포를 할 수 있는 특정 방법을 제공하는 패키지
  • Flask 기본 폴더구조
      flask_app
      ├── static
      │       ├── css
      │       └── ...
      ├── templates
      ├── views
      └── __init__.py
    
  • flask_app : 루트폴더의 이름은 만들고 싶은 어플리케이션 이름을 지정
  • __init__.py : flask를 실행하면 가장 먼저 실행되는 파일
      # __init__.py
    
      from flask import Flask
    
      app = Flask(__name__)
    
      @app.route('/')
      def index():
          return '<h1>Hello World!</h1>'
    
    • CLI에서 FLASK_APP=flask_app flask run 명령어로 flask를 실행하면 __init__.py이 실행
    • Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) 에 나타난 주소로 이동하면 어플리케이션에 접속할 수 있음
  • static : 각종 정적 파일(예: style.css, script.js, Faivicon.ico …)이 저장되는 폴더
  • templates : 각종 HTML 페이지가 저장되는 폴더
  • views : 웹페이지 구현을 위한 각종 python 파일이 저장되는 폴더


Jinja

  • Jinja는 맞춤형 웹페이지를 생산하도록 도움을 주는 웹 템플릿 엔진 (Web Template Engine)
  • 장고(Django) 의 템플릿 엔진을 모델링 했음
  • 사용 방법
    • python파일에서 render_template()함수 활용하여 HTML로 정보 넘겨주기
    @app.route('/')
    def index():
        apple = 'red'
        apple_count = 10
        return render_template('index.html', fruit_color=apple, number=apple_count)
    
    • 넘겨줄 때, 변수, 리스트, 딕셔너리 타입을 모두 이용할 수 있음

    • HTML에서 넘겨받은 정보를 jinja 형식으로 사용하기

<body>
    <h2>Apple is </h2>
    <h2>{{ number }} 개의 과일이 있습니다.</h2>
</body>
  • 리스트는 {{ vegetables[0] }} 형식으로, 딕셔너리는 {{ fruits.apple }}형식으로 사용 가능

  • if 구문
      {% if True %}
      <h1>It is True</h1>
      {% elif False %}
      <h1>It is False</h1>
      {% else %}
      <h1>It is not True</h1>
      {% endif %}
    
  • for 구문
      {% for item in item_list %}
      <p>{{ item }}</p>
      {% endfor %}
    
    • for 구문에서 유용한 loop

      loop 속성 설명
      loop.index 반복 순서 1부터 1씩 증가
      loop.index0 반복 순서 0부터 1씩 증가
      loop.first 반복 순서가 처음일 경우 True 아니면 False
      loop.last 반복 순서가 마지막일 경우 True 아니면 False
    • for 구문에서 인덱스 번호를 사용할 경우 다음과 같이 사용

      <p>인덱스 : {{ loop.index0 }}, 이름 : {{ item }}</p>
      
  • Jinja 상속
{% extends %}
{% block %} ... {% endblock %}
  • jinja 페이지 삽입
<div>본문 내용</div>
{% include 'footer.html' %}


Bootstrap





N433 : Note 3 : BI와 대시보드





🏆ㅤ 학습 목표

  • 🌱 Level 1 : Lecture Note 에 있는 주요 개념을 정의할 수 있으며 예제 코드를 이해하고 재현할 수 있다.
    • DA 업무와 대시보드를 연결지어 설명할 수 있다.
    • matplotlib 와 비교하여 대시보드 특징에 대해 설명할 수 있다.
    • Looker Studio 에서 활용되는 차트를 사용할 수 있다.
  • 🔝 Level 2 : 예제 코드를 해석하고 응용할 수 있으며 과제를 수행할 수 있다.
    • 기본적으로 제작된 예제 Looker Studio 대시보드를 수정할 수 있다.
    • Titanic: EDA to ML (Beginner) 의 그래프를 Metabase 를 통해 표현할 수 있다.
  • 🔥 Level 3 : Lecture Note 에 있는 주요 개념과 코드를 연결하여 설명할 수 있으며 도전 과제를 수행할 수 있다.
    • Looker Studio의 정렬, 필터, 함수를 활용하여 하나의 완성된 대시보드를 제작할 수 있다.
    • Looker Studio 를 통해 GCP 혹은 Google Sheet 가 연결된 대시보드를 구성할 수 있다.
  • 🚀 Level 4 : Lecture Note 에 있는 개념 중 자신이 모르는 것을 구분해 낼 수 있으며 스스로 목표를 세우고 추가 학습을 진행할 수 있다.
    • 웹 3계층 시스템 아키텍처를 이해하여 설명할 수 있다.
    • Looker Studio를 통해 하나의 완성된 대시보드를 제작하고 처음부터 끝까지 고객맞춤형 커뮤니케이션을 할 수 있다.
    • 배포된 데이터베이스의 Migration 에 대해서 설명할 수 있다.
    • IaaS, CaaS, PaaS, FaaS, SaaS 의 각각 특징과 차이점을 설명할 수 있다.

오늘의 키워드

  • 대시보드, Metabase, Looker Studio



공부한 내용

Metabase

  • 대시보드를 생성하여 시각화에 도움을 주는 BI(business intelligence)
  • 오픈소스
# 메타베이스 이미지 가져오기
docker pull metabase/metabase:latest

# 메타베이스 컨테이너 실행
docker run --name my_metabse --rm -p 3000:3000 --name metabase metabase/metabase

# /d/coding/aib/section4/ds-sa-db-api 의 chinook.db 를 실행중인 metabase 컨테이너의 /app 으로 복사
docker cp ./chinook.db metabase:/app

# http://127.0.0.1:3000/ 으로 접속
# http://localhost:3000/ 으로 접속


Looker Studio


Looker Studio





N434 : Note 4 : 시간과 부호화





🏆ㅤ 학습 목표

  • 🌱 Level 1 : Lecture Note 에 있는 주요 개념을 정의할 수 있으며 예제 코드를 이해하고 재현할 수 있다.
    • UTC 와 KST 에 대해서 설명할 수 있다.
    • 스케줄링이 언제 사용되는지 설명할 수 있다.
    • 부호화와 복호화에 대해서 설명할 수 있다.
  • 🔝 Level 2 : 예제 코드를 해석하고 응용할 수 있으며 과제를 수행할 수 있다.
    • APScheduler 를 활용하여 파이썬 스케줄러를 제작할 수 있다.
    • 피클링을 통해 파이썬 객체에 대한 복호화와 부호화를 진행할 수 있다.
    • JSON 라이브러리를 통해 JSON에 대한 복호화와 부호화를 진행할 수 있다.
  • 🔥 Level 3 : Lecture Note 에 있는 주요 개념과 코드를 연결하여 설명할 수 있으며 도전 과제를 수행할 수 있다.
    • CSV 와 JSON 의 문제점을 알고 설명할 수 있다.
    • API 에 작성된 시간 표기법에 따라 데이터를 가져오고, 데이터베이스의 datetime 형식을 기반으로 저장할 수 있다.
  • 🚀 Level 4 : Lecture Note 에 있는 개념 중 자신이 모르는 것을 구분해 낼 수 있으며 스스로 목표를 세우고 추가 학습을 진행할 수 있다.
    • Parquet, Avro 와 같은 압축 방식에 대해 알고 그 특징에 대해 설명할 수 있다.
    • 데이터 압축이 필요한 상황에 대해서 설명할 수 있다.
    • 배치 형과 스트리밍 형의 데이터 플로우와 연관지어 스케줄러와 시간이 중요한 이유를 설명할 수 있다.



오늘의 키워드

  • UTC, KST, Timestamp, Scheduling, Pickling



공부한 내용

컴퓨터에서 시간을 표기하는 방법

image

  • 협정 세계시(UTC : Coordinated Universal Time, Universal Time Coordinated)
    • 1972년 1월 1일부터 시행된 국제 표준시
    • 1970년 1월 1일 자정을 0 밀리초로 설정하여 기준을 삼아 그 후로 시간의 흐름을 밀리초로 계산
    • UTC는 간단하게 영국의 표준시간으로 이해할 수 있음
    • UTC는 영국 그리니치 천문대의 시간을 기준으로 하기 때문에, 그리니치 평균 시라고 하는 GMT(Greenwich Mean Time)로도 자주 표기 됨
  • 한국 표준시 (KST : Korea Standard Time)

  • Time Stamp
    • 타임스탬프는 특정한 시각을 나타내거나 기록하는 문자형식
    • 타임스탬프의 예
      • Tue 01-01-2009 6:00
      • 2005-10-30 T 10:45 UTC
      • 2007-11-09 T 11:20 UTC
      • Sat Jul 23 02:16:57 2005
      • 1256953732 (유닉스 시간)
      • (1969-07-21 T 02:56 UTC) –
      • 07:38, 11 December 2012 (UTC)
  • ISO 8601
    • 날짜와 시간과 관련된 데이터 교환을 다루는 국제 표준
    • ISO 8601에 따라 표현된 날짜와 시간 예
      • 2016-10-27T17:13:40+00:00
      • 2016-10-27T17:13:40Z
      • 20161027T171340Z

image

  • Unix Time
    • 1970년 1월 1일 00:00:00 협정 세계시(UTC) 부터의 경과 시간을 초로 환산하여 정수로 나타낸 것
    • POSIX 시간, Epoch 시간 으로도 불림
    • 주로 특정 시간 t1 과 특정 시간 t2 의 차이를 표현하려고 할 때 사용
date +%s
# 1680760028
CURRENT_UNIX = int(time())
print(CURRENT_UNIX)
# 1680760102
  • datetime()모듈의 utcfromtimestamp()매서드로 Unix Time을 ISO 8601 포멧으로 변환하기
CURRENT_UNIX = int(time()) + 32400
CONVERT_ISO = datetime.utcfromtimestamp(CURRENT_UNIX).strftime('%Y-%m-%dT%H:%M:%SZ')

print(f"한국의 현재 Unix Time : {CURRENT_UNIX}")
print(f"한국의 현재 ISO 8601 표준시 : {CONVERT_ISO}")

#한국의 현재 Unix Time : 1680793203
#한국의 현재 ISO8601 표준시 : 2023-04-06T15:00:03Z
  • 각종 시간 표현 방법
print(f"""✅ Time Stamp
{time.time()}
{datetime.datetime.now().timestamp()}
{datetime.datetime.now(datetime.timezone.utc)}

✅ UTC Time
{datetime.datetime.utcnow()}
{datetime.datetime.utcnow().astimezone(datetime.timezone(datetime.timedelta(hours=9)))}

✅ KST Time
{datetime.datetime.now()}
{datetime.datetime.now().date()}
{time.localtime()}
{time.strftime('%Y-%m-%dT%H:%M:%S+09:00')}
""")

# ✅ Time Stamp
# 1681059495.044415
# 1681059495.044414
# 2023-04-09 16:58:15.044414+00:00
# 
# ✅ UTC Time
# 2023-04-09 16:58:15.044414
# 2023-04-09 16:58:15.044414+09:00
# 
# ✅ KST Time
# 2023-04-10 01:58:15.044414
# 2023-04-10
# time.struct_time(tm_year=2023, tm_mon=4, tm_mday=10, tm_hour=1, tm_min=58, tm_sec=15, tm_wday=0, tm_yday=100, tm_isdst=0)
# 2023-04-10T01:58:15+09:00


스케줄링

# bash 에서 python 실행 후
from apscheduler.schedulers.blocking import BlockingScheduler

# UTC+0 기반으로 실행하려면 Timezone 에 매개변수를 선언 후 사용
scheduler = BlockingScheduler({'apscheduler.timezone':'UTC'})

# KST 기반으로 실행하는 방법
#scheduler = BlockingScheduler({'apscheduler.timezone':'Asia/seoul'})

def hello():
    print("hello. My first Scheduler")

scheduler.add_job(func=hello, trigger='interval',seconds=5)
scheduler.start()
# 멈춤은 Ctrl+C


객체부호화

  • 부호화와 복호화
    • 부호화 : 직렬화, 인코딩, 마샬링, 피클링
      • 인메모리 방식 👉 바이트열 방식
    • 복호화 : 역직렬화, 디코딩, 언마샬링, 역피클링
      • 바이트열 방식 👉 인메모리 방식
  • pickle 라이브러리(pickle 공식문서)
    • 부호화 : pickle.dump()
      import pickle
      
      with open('model.pkl','wb') as pickle_file:
          pickle.dump(model, pickle_file)
      
    • 복호화 : pickle.load()
      model = None
      with open('model.pkl','rb') as pickle_file:
          model = pickle.load(pickle_file)
      
  • JASON 라이브러리
    • 부호화 : json.dumps()
      data = {
          "first_value": {
              "name": "odee",
              "album": "ZIPLOC"
          }
      }
      
      import json
      
      # json으로 부호화한 뒤, 객체에 읽을 때
      json_data = json.dumps(data)
      
      # json으로 부호화한 뒤, 파일에 쓸 때
      with open('json_file.json','w') as json_file:
          json.dump(data,json_file)
      
    • 복호화 : json.load()
      import json
      
      with open('json_file1.json','r') as json_file:
          str_1 = json.load(json_file)
      





끝까지 읽어주셔서 감사합니다😉





댓글남기기