image





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

S4-Week1 : 환경과 관계형 데이터베이스





주간회고

더 공부가 필요한 부분

데코레이터 만들기, 각종 API 활용, 데이터베이스 복제와 파티션



5F 회고

  • 사실(Fact)
    데이터 엔지니어링을 위한 파이썬 사용법, 웹스크래핑, API 사용법, NoSQL에 대하여 학습하였다.

  • 느낌(Feeling)
    이미 홈페이지를 배포해본 경험이 있어서 익숙한 부분이 많았지만, 그동안 잘못알고 있던 것을 수정하고, 비어있는 부분은 보충하면서 더욱 단단해진 느낌이다.

  • 교훈(Finding)
    어떤 내용을 알았다고해서 배움을 멈추지 말고 꾸준하게 공부하고, 다른 사람들의 코드를 참조하면서 꾸준하게 발전해나가야겠다.

  • 향후 행동(Future action)
    파이써닉한 개발자가 되기 위하여 좋은 방법이 무엇인지 찾아보고, 아직 학습이 부족한 부분(데코레이터 만들기, 각종 API 활용, 데이터베이스 복제와 파티션)을 보충할 것이다.

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





N411 : Note 01 : 개발 환경





🏆ㅤ 학습 목표

🌱 Level 1 : Lecture Note 에 있는 주요 개념을 정의할 수 있으며 예제 코드를 이해하고 재현할 수 있다.

  • 터미널을 이용하여 CLI에 접근하고, 노트에 기재된 TOP 5 기본 명령어를 이용한 작업들을 수행할 수 있다.
  • 파이썬 가상환경이 왜 필요한지 설명할 수 있고, conda 예제를 재현할 수 있다.
  • Git과 Github를 분류하여 설명할 수 있으며, 깃을 이용하여 버전 관리를 할 수 있다.

🔝 Level 2 : 예제 코드를 해석하고 응용할 수 있으며 과제를 수행할 수 있다.

  • 워킹 디렉토리(작업 폴더)와 git, 가상환경을 분리해서 설명할 수 있다.
  • conda를 이용하여 의도하는 가상환경을 생성 및 삭제할 수 있고, 코드를 해석하여 설명할 수 있다.
  • requirements.txt 의 필요성을 설명할 수 있고, 제작할 수 있다.
  • 코드의 변경 사항을 Git을 이용하여 기록하고 원격 레포에 반영하여 PR을 생성할 수 있다.

🔥 Level 3 : Lecture Note 에 있는 주요 개념과 코드를 연결하여 설명할 수 있으며 도전 과제를 수행할 수 있다.

  • 기본 터미널 명령어를 찾아보지 않고 사용할 수 있다.
  • conda 외의 파이썬 가상환경을 이용하여 의도하는 개발환경을 구축할 수 있다.
  • Git branch를 이용할 수 있고, git pull 혹은 git merge 과정에서 발생하는 충돌을 해결할 수 있다.

🚀 Level 4 : Lecture Note 에 있는 개념 중 자신이 모르는 것을 구분해 낼 수 있으며 스스로 목표를 세우고 추가 학습을 진행할 수 있다.

  • CLI, 터미널, 쉘을 분리해서 설명할 수 있다.
  • 리눅스 역사와 철학을 설명할 수 있고, 우분투 리눅스 환경에서 파일 권한 설정을 할 수 있다.
  • Git의 기본요소를 구성하는 스냅샷을 설명할 수 있다.



오늘의 키워드

  • CLI, 가상환경, 아나콘다, Git, Github



공부한 내용

CLI

  • 기본 명령어
    # 현재 폴더의 경로 나타내기
    pwd
    # 폴더 만들기
    mkdir {폴더명}
    # 위치 이동
    cd {폴더명}
      # Anaconda Powershell Prompt  
          # 작업폴더로 이동  
      cd D:\coding\aib\Section4
      # Gitbash  
          #  작업폴더로 이동  
      cd /D/coding/aib/Section4
    # 한단계 위로 이동
    cd ..
    # 현재 디렉토리 안의 파일 및 폴더 목록을 출력
    ls
    ls -l   # 상세정보 출력
    ls -a   # 숨긴 파일까지 표시
    ls -al  # 숨긴 파일까지 상세정보 포함해서 출력
    


가상환경

  • 파이썬에서 가상환경을 사용하는 이유?
    • 파이썬 패키지는 하나의 버전만 설치할 수 있음
    • 어플리케이션마다 다른 버전의 패키지가 필요할 수 있음
    • 패키지 충돌을 방지하기 위하여 가상환경을 사용
    • 정리하면, 하나의 어플리케이션에 최적화 된 파이썬 가상환경을 사용하면 패키지 충돌이 최소화 됨
  • 가상환경 관리 툴
    • 아나콘다
      • 데이터과학분야에서 자주 사용됨
      • 파이썬 버전지정 가능
    • pipenv (공식문서, pipenv 사용법1, pipenv 사용법2)
    • 파이썬 공식 가상환경 관리 툴
    • 파이썬 버전지정 불가능
    • venv
      • Python 3.5 이후 파이썬 표준 라이브러리에 포함
      • PyCharm에서 기본적으로 제공하는 가상환경
    • virtualenv (공식문서, )
      • 파이썬 버전지정 불가능
    • pyenv (공식문서)
      • 파이썬 버전지정 가능


아나콘다

  • 기본 명령어
    # 버전 확인
    conda --version
    # 가상환경 리스트 보기
    conda env list
    conda info --envs
    # 가상환경 생성
    conda create --name 'practice' python=3.8
      # 설치 기본경로 C:\Users\leeyeonjun85\.conda\envs
      # 경로 설정해서 가상환경 만들기
    conda create --prefix 'C:/coding/practice' python=3.8
    # 가상환경 삭제
    conda env remove --name 'practice'
    conda remove --name 'practice' --all
    # 가상환경 실행
    conda activate 'practice'
      # Git bash 에서 가상환경 실행
    source C:/ProgramData/Anaconda3/Scripts/activate {가상환경이름}
    # 가상환경 종료
    conda deactivate
    # TEXT파일에서 가상환경에 패키지 설치
    pip install -r requirements.txt
    # 가상환경 패키지를 TEXT파일로 생성
    pip freeze > requirements.txt
    # 파이썬 가상환경에서 주피터노트북 실행을 위한 라이브러리
    pip install ipykernel
    


Git & Github

# Git 원격레포 등록
git remote add {원격 저장소 이름} {원격 저장소 주소}
# 깃repo 클론
git clone {git repo 주소 ~~.git}
git clone {git repo 주소 ~~.git} {D:/coding/aib/Section4/폴더이름}
# 클론한 폴더를 VSCode로 실행
code {D:/coding/aib/폴더이름}
# 변경 파일 확인
git status
# 변경 파일 추가하기
git add .
# 변경파일 취소하기
git reset HEAD^
# 커밋 진행
git commit -m "1차 제출"
# 원격저장소 이름 보기
git remote -v
# push
git push
# Add , Commit , Push 를 한번에
git add . && git commit -m "Update" && git push


과제관련

# 패키지 설치(requirements.txt에서 pytest 설치 후 실행 할 것)
# 과제관련 패키지가 설치되었는지 확인하기
pip list | findstr pytest
# 파이테스트 점검
python -m pytest tests
# 파이테스트 점검 : tests/Part_1 를 점검
python -m pytest tests/Part_1
# 제출하기
python -m pytest --submit
# 점수 확인
python -m pytest --score
python -m pytest --all # 제출한 모든 과제 점수 확인
python -m pytest --all 5 # Section 4 에 제출한 모든 과제 점수를 확인





N412 : Note 02 : SQL (01)





🏆ㅤ 학습 목표

  • 🌱 Level 1 : Lecture Note 에 있는 주요 개념을 정의할 수 있으며 예제 코드를 이해하고 재현할 수 있다.
    • 데이터베이스의 필요성과 관계형 데이터베이스의 특징을 설명할 수 있다.
    • SQL 특징을 설명할 수 있고, 스키마를 통해 관계를 설명할 수 있다.
    • SQL Basics를 이해하고 예제를 재현할 수 있다.
  • 🔝 Level 2 : 예제 코드를 해석하고 응용할 수 있으며 과제를 수행할 수 있다.
    • 주어진 스키마를 SQL을 활용하여 구현할 수 있다.
    • SQL 쿼리문을 활용하여 원하는 조건의 데이터를 출력할 수 있다.
  • 🔥 Level 3 : Lecture Note 에 있는 주요 개념과 코드를 연결하여 설명할 수 있으며 도전 과제를 수행할 수 있다.
    • 주어진 데이터와 출력값을 살펴보고 어떤 SQL 쿼리문을 사용할지 판단하고 구현할 수 있다.
    • SQL JOIN 의 종류를 분류하고 활용 예시를 들어 설명할 수 있다.
  • 🚀 Level 4 : Lecture Note 에 있는 개념 중 자신이 모르는 것을 구분해 낼 수 있으며 스스로 목표를 세우고 추가 학습을 진행할 수 있다.
    • 3층 스키마에 대해 데이터베이스를 보는 관점과 연관지어 간단하게 설명할 수 있다.
    • 함수 종속과 정규화(제3정규형까지)를 연관지어 설명할 수 있고, 정규화가 필요한 이유에 대해 설명할 수 있다.



오늘의 키워드

  • 데이터베이스, 관계형 데이터베이스, SQL, 쿼리문, JOIN



공부한 내용

데이터베이스(database, DB)

  • 데이터의 집합


관계형 데이터베이스(Relational Database)

  • 키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 데이터베이스

image


SQL(Structured Query Language)

  • 관계형 데이터베이스를 관리하기 위한 프로그래밍 언어


SQL 쿼리문

  • SQL의 JOIN 종류
    image


3층 스키마

  • 사용자(외부스키마), 설계자(개념스키마), 개발자(내부스키마)가 데이터 베이스를 보는 관점에 다라 데이터 베이스를 기술하고 이들간의 관계를 정의한 ANSI 표준
  • 데이터베이스의 독립성을 확보하기 위한 방법임
  • 독립성을 확보하면 생기는 장점
    • 데이터 복잡도 증가
    • 데이터 중복 제거
    • 사용자 요구사항 변경에 따른 대응력 향상
    • 관리 및 유지보수 비용 절감
  • 각 계층을 view 라고도 함

image

구조 설명
외부 스키마
(External Schema)
• 사용자 관점
• 업무상 관련이 있는 데이터 접근
• 관련 데이터베이스의 뷰(View)를 표시
• 응용 프로그램이 접근하는 데이터베이스를 정의
개념 스키마
(Conceptual Schema)
• 설계자 관점
• 사용자 전체 집단의 데이터베이스 구조
• 전체 데이터베이스 내의 규칙과 구조를 표현
• 통합 데이터베이스 구조
내부 스키마
(Internal Schema)
• 개발자 관점
• 데이터베이스의 물리적 저장 구조
• 데이터 저장 구조, 레코드 구조, 필드 정의, 인덱스 등을 의미


함수 종속성

  • 함수 종속성(Functional Dependency)은 어떤 테이블의 속성 A와 B에 대하여, A값에 의해 B값이 유일하게 정해지는 관계를 말하며, “B는 A에 함수 종속이다”라고함
    • A→B의 기호로 나타냄
    • 이때, A를 결정자(Determinant)라고 하고, B를 종속자(Dependant)라고 함
    • 완전 함수 종속 : 기본키를 구성하는 모든 속성에 종속되는 경우
    • 부분 함수 종속 : 기본키를 구성하는 속성의 일부에 종속되거나, 기본키가 아닌 다른 속성에 종속되는 경우
    • 이행적 함수 종속 : A, B, C 세 속성이 있고 A→B, B→C 종속 관계가 있을 때, A→C가 성립하는 경우

image

  • 위 그림에서, 학년과 이름은 (학번, 과목번호)에 대해 부분 함수 종속이고, 성적은 완전 함수 종속


이상현상

  • 이상현상이란, 테이블 내의 데이터들이 불필요하게 중복되어 테이블을 조작할 때 발생되는 데이터 불일치 현상을 말함
    • 삽입 이상 (insertion anomaly) : 원하지 않는 자료가 삽입된다든지, key가 없어 삽입하지 못하는(불필요한 데이터를 추가해야 삽입할 수 있음) 문제점
    • 삭제 이상 (deletion anomaly) : 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점
    • 갱신 이상 (update anomaly) : 일부만 변경하여 데이터가 불일치하는 모순, 또는 중복되는 튜플이 존재하게 되는 문제점


정규화

  • 정규화 과정이란, 이상 현상을 해결하기 위한 과정
  • 정규화 3원칙
    1. 정보의 무손실 : 분해된 릴레이션이 표현하는 정보는 분해되기 전의 정보를 모두 포함해야 한다.
    2. 최소 데이터 중복 : 이상 현상을 제거, 데이터 중복을 최소화
    3. 분리의 원칙 : 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리해서 표현
  • 시스템의 성능 향상을 위해 의도적으로 정규화 원칙을 위배하여 모델을 통합하는 반정규화(De-normalization)도 있음


정규형

  • 정규형은 정규화된 결과를 의미
  • 제1 정규형, 제2 정규형, 제3 정규형, BCNF, 제4 정규형, 제5 정규형이 있음
  • 제1 정규형 (1NF)
    • 릴레이션에 속하는 속성의 속성 값이 모두 원자값(Atomic Value)만으로 구성
  • 제2 정규형 (2NF)
    • 제1 정규형이면서, 기본키(primary key)에 속하지 않은 속성 모두가 기본키에 완전 함수 종속인 정규형
  • 제3 정규형 (3NF)
    • 제2 정규형이면서, 이행적 함수 종속성을 제거한 정규형
  • BCNF
    • BCNF (Boyce and Codd Normal Form)은 제3 정규형을 조금 더 강화시킨 개념
  • 제4,5 정규형은 실무에서 잘 사용 안된다고 하니깐 생략!😉





N413 : Note 03 : SQL (02)





🏆ㅤ 학습 목표

🌱 Level 1 : Lecture Note 에 있는 주요 개념을 정의할 수 있으며 예제 코드를 이해하고 재현할 수 있다.

  • 트랜잭션에 대해서 설명할 수 있고, COMMIT 과 Rollback 예제를 재현할 수 있다.
  • ACID의 특징에 대해서 각각 설명할 수 있다.
  • SQL 내장함수와 서브쿼리에 대해서 설명할 수 있다.

🔝 Level 2 : 예제 코드를 해석하고 응용할 수 있으며 과제를 수행할 수 있다.

  • SQL 내장 함수와 CASE문을 활용하여 SQL 다중 테이블 쿼리를 할 수 있다.
  • SELECT 실행 순서에 대해 설명할 수 있다.

🔥 Level 3 : Lecture Note 에 있는 주요 개념과 코드를 연결하여 설명할 수 있으며 도전 과제를 수행할 수 있다.

  • 서브쿼리를 활용하여 원하는 데이터를 쿼리 해올 수 있다.
  • 서브쿼리를 포함한 SELECT 쿼리문의 실행 순서를 설명할 수 있다.

🚀 Level 4 : Lecture Note 에 있는 개념 중 자신이 모르는 것을 구분해 낼 수 있으며 스스로 목표를 세우고 추가 학습을 진행할 수 있다.

  • 슈퍼 키, 후보 키, 기본 키, 대체 키, 외래 키에 대해서 설명할 수 있다.
  • 데이터베이스의 옵티마이저의 종류와 그 특징에 대해 설명할 수 있다.
  • 데이터베이스의 인덱스에 대해 간단하게 설명할 수 있다.



오늘의 키워드

  • 트랜잭션, ACID



공부한 내용

트랜잭션

  • 트랜잭션(transaction)
    • 데이터베이스의 ACID이 보장되는 데이터베이스 작업의 기본 단위
    • 쪼갤 수 없는 업무 처리의 최소 단위
    • 데이터베이스의 상태를 변화시키는 작업의 모음
    • commit으로 트랜잭션이 마무리 됨
    • rollback 은 commit하기 전 작업을 취소


ACID

  • 원자성 Atomicity
    • 하나의 트랜잭션을 구성하는 작업들은 전부 성공하거나 전부 실패해야 되어야 한다는 것
  • 일관성 Consistency
    • 하나의 트랜잭션 이전과 이후 데이터베이스 상태는 이전과 같이 유효해야 한다는 것
    • 각종 제약과 규칙에 따라야 한다는 것
  • 고립성 Isolation
    • 하나의 트랜잭션은 다른 트랜잭션과 독립되어야 한다는 것
  • 지속성 Durability
    • 하나의 트랜잭션이 성공적으로 수행되었다면 해당 트랜잭션에 대한 로그가 남고 런타임 오류나 시스템 오류가 발생해도 해당 기록은 영구적이어야 한다는 것


SELECT 문 실행 순서

  • 예시 쿼리
      SELECT CustomerId, AVG(Total)
      FROM invoices                   
      WHERE CustomerId >= 10
      GROUP BY CustomerId
      HAVING SUM(Total) >= 30
      ORDER BY 2
    
    1. FROM invoices : invoices 테이블에 접근
    2. WHERE CustomerId >= 10 : ‘CustomerId’ 필드가 10 이상인 레코드들을 조회
    3. GROUP BY CustomerId : ‘CustomerId’ 를 기준으로 그룹화
    4. HAVING SUM(Total) >= 30 : ‘Total’ 필드의 값들의 합이 30 이상인 결과들만 필터
    5. SELECT CustomerId, AVG(Total) : 조회된 결과에서 ‘CustomerId’ 필드와 ‘Total’ 필드의 평균값을 가져옴
    6. ORDER BY 2 : AVG(Total) 필드를 기준으로 오름차순 정렬


슈퍼 키, 후보 키, 기본 키, 대체 키, 외래 키

  • 슈퍼키(Super Key) : 각 행을 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합
    • 유일성을 만족해야 함
  • 후보키(Candidate Key) : 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합
    • 속성하나, 하나의 column이 슈퍼키역할을 해야 함
    • 유일성 + 최소성
  • 기본키(Primary Key)
    • 후보키들 중에서 하나를 선택한 키로 최소성과 유일성을 만족하는 속성
    • NOT NULL , UNIQUE 제약
  • 대체키(Alternate Key)
    • 후보키가 두개 이상일 경우 그 중에서 어느 하나를 기본키로 지정하고 남은 후보키들을 대체키라 함
  • 외래키(Foreign Key)
    • 다른 테이블의 데이터를 참조할 때 없는 값을 참조할 수 없도록 제약
    • 참조될 테이블의 속성은 참조될 테이블에서는 기본키(Primary Key)로 설정되어 있어야 함


옵티마이저

  • 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 실행 계획
  • 규칙 기반 옵티마이저 / 비용 기반 옵티마이저
  • 오라클10 이후 최근에는 비용 기반 옵티마이저 사용
우선순위 설명
1ROWID를 사용한 단일 행인 경우
2클러스터 조인에 의한 단일 행인 경우
3유일하거나 기본키를 가진 해시 클러스터 키에 의한 단일 행인 경우
4유일하거나 기본키에 의한 단일 행인 경우
5클러스터 조인인 경우
6해시 클러스터 조인인 경우
7인덱스 클러스터 키인 경우
8복합 칼럼 인덱스인 경우
9단일 칼럼 인덱스인 경우
10인덱스가 구성된 칼럼에서 제한된 범위를 검색하는 경우
11인덱스가 구성된 칼럼에서 무제한 범위를 검색하는 경우
12정렬 - 병합(Sort Merge) 조인인 경우
13인덱스가 구성된 칼럼에서 MAX 혹은 MIN을 구하는 경우
14인덱스가 구성된 칼럼에서 ORDER BY를 실행하는 경우
15전체 테이블을 스캔(FULL TABLE SCAN)하는 경우


인덱스

  • 검색 속도를 높이기 위해 사용하는 하나의 기술
  • 인덱스의 장점
    • 키값을 기로초 하여 테이블에서 검색과 정렬 속도를 향상
    • 질의나 보고서에서 그룹화 작업의 속도를 향상
    • 테이블행의 고유성을 강화할 수 있음
    • 여러 필드로 이루어진 인덱스를 사용하면 첫 필드 값이 같은 레코드도 구분할 수 있음
  • 인덱스의 단점
    • .mdb 파일 크기가 늘어남
    • 여러 사용자 응용 프로그램에서의 여러 사용자가 한 페이지를 동시에 수정할 수 있는 병행성이 줄어듦
    • 인덱스 된 필드에서 데이터를 업데이트하거나, 레코드를 추가 또는 삭제할 때 성능이 떨어짐
    • 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요해짐
    • 인덱스를 생성하는데 시간이 많이 소요될 수 있음





N414 : Note 04 : DB API





🏆ㅤ 학습 목표

🌱 Level 1 : Lecture Note 에 있는 주요 개념을 정의할 수 있으며 예제 코드를 이해하고 재현할 수 있다.

  • DB API를 사용하는 이유에 대해서 설명할 수 있다.
  • 로컬과 클라우드 데이터베이스를 분류하여 설명할 수 있다.
  • 클라우드 데이터베이스를 생성하고 DBeaver를 통해 연결할 수 있다.
  • Python DB API의 객체와 메서드를 설명할 수 있으며, 노트 예제인 sqlite3 활용을 재현할 수 있다.

🔝 Level 2 : 예제 코드를 해석하고 응용할 수 있으며 과제를 수행할 수 있다.

  • sqlite3를 통해 SQLite을 다룰 수 있다.
  • 여러 형태의 자료구조를 가진 데이터를 데이터베이스에 적재할 수 있다.

🔥 Level 3 : Lecture Note 에 있는 주요 개념과 코드를 연결하여 설명할 수 있으며 도전 과제를 수행할 수 있다.

  • 클라우드 데이터베이스를 생성하고 DB API를 활용하여 데이터베이스와 소통할 수 있다.
  • psycopg2를 통해 PostgreSQL을 다룰 수 있다.
  • DB API를 활용하여 주어진 스키마에 따라 테이블을 생성하고, csv 형태의 데이터를 적재할 수 있다.

🚀 Level 4 : Lecture Note 에 있는 개념 중 자신이 모르는 것을 구분해 낼 수 있으며 스스로 목표를 세우고 추가 학습을 진행할 수 있다.

  • Pandas를 사용하지 않고 csv 데이터를 다룰 수 있다.
  • 파일형, 서버형, 인메모리형 데이터베이스를 구별하여 설명할 수 있다.
  • 데이터베이스의 인덱스와 B-Tree 자료구조를 이해하고 연관지어 설명할 수 있다.



오늘의 키워드

  • DB API, SQLite, postgreSQL



공부한 내용

PEP 249

  • 파이썬에서 명시하는 DB API v2.0 에 대한 문서


SQLite

  • 파이썬과 함께 설치되는 가벼운 파일형 관계형 데이터베이스
  • sqlite3 모듈로 파이썬에서 사용할 수 있음
import sqlite3
conn = sqlite3.connect('test.db')

# 파일을 생성하지 않고 메모리에서 작업이 가능함
conn = sqlite3.connect(':memory:')


postgreSQL

  • psycopg2 모듈로 파이썬에서 사용할 수 있음
    import psycopg2
    conn = psycopg2.connect(
      host        ="satao.db.elephantsql.com",
      database    ="{데이터베이스 이름}",
      user        ="{사용자 이름}",
      password    ="{사용자 암호}")
    
  • URI, URN, URL 차이


B-Tree

  • 인덱스를 위한 대표적인 데이터 구조

image



Reference





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

</center>



댓글남기기