[N314] TIL 및 회고

Sea Panda·2022년 12월 14일
0

부트캠프 TIL

목록 보기
28/46

화이트 모드 권장!!

0. 학습목표

  • DB API를 사용하는 이유에 대해서 설명할 수 있다.
  • DB API를 활용할 수 있다.
  • 로컬 VS 클라우드 데이터베이스에 대해서 설명할 수 있다.

1. 주요개념

1. API

API란 "Application ProgrammingInterface"의 줄임말로 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성요소가 서로 통신할 수 있게 하는 메커니즘이다. API의 맥락에서 애플리케이션이라는 단어는 고유한 기능을 가진 모든 소프트웨어를 나타낸다.

인터페이스는 두 애플리케이션 간의 서비스 계약, 즉 소통 방식의 약속이라고 할 수 있다. 이 계약은 요청과 응답을 사용하여 두 애플리케이션이 서로 통신하는 방법을 정의한다.

2. DB(파일형, 서버형, 인메모리형, 클라우드)

2-1. 파일형 DB

파일형 데이터베이스란 "Flat file Database"라고도 하며 하나의 데이터 모델(보통 하나의 테이블)을 플레인 텍스트 파일로 인코딩하는 방법 및 그런 방법을 쓴 일종의 데이터베이스를 총칭한다. 다시 말하면 플랫 파일 데이터베이스는 순수 텍스트 파일(그래픽 표현, 사진 등이 아닌) 형태로 데이터를 저장한 데이터 베이스를 일컫는다.

일반적으로 플랫 파일은 내부 한 줄마다 레코드를 하나씩 기록한다. 각 필드(혹은 column)에 대해서 공백, 탭, 쉼표 같은 공백문자나 기타 지정한 문자로써 각 필드를 구분하는 경우도 있다. 그리고 이 경우에는 추가로 형식을 지정하여 구분자가 실제 데이터 안에 쓰이는 구분자 충돌을 방지할 수 있다.

플랫 파일 내에서는 구조적 관계가 없다. 플랫 파일은 관계형 DB와 같이 복잡한 모델이 아니라 종이 한 장 같은 '정형화'된 데이터를 가질 뿐이다. 이런 플랫 파일은 엑셀이나, MySQL 등 여러 DBMS에서 그래도 입력되어 활용될 수가 있고, 또한 데이터베이스의 내용이 플랫 파일 형태로 출력될 수도 있다. 대표적인 예시가 CSV 파일로 DBMS에 불러와 편집할 수 있고, 다른 일반적인 텍스트 편집기로도 간단히 편집 가능하다는 장점이 있다. 또한 하나의 파일에 모든 데이터들이 들어가 있기 때문에 간편하다는 장점 역시 존재한다.

대표적인 예시로는 SQLite3가 있다. 이는 파이썬 설치와 함께 설치되며 import명령어를 통해서 사용할 수 있다. 이름에서도 알 수 있듯이 가벼운 SQL DB로 다른 데이터베이스 서버를 사용하는 관계형 데이터베이스들에 기능이 제한적이다. 즉, PostgreSQL와 같이 데이터베이스 서버를 띄우고 작업하지 않고, SQL을 사용할 때 기능적 제한으로 고급 쿼리 등은 실행하기 어렵다. 또한 실행 중인 프로그램의 메모리에 상주할 수 있기 때문에 파일을 삭제하거나 프로세스 종료등으로 인한 데이터 손실에도 주의해야 한다. 하지만 이러한 단점이 장점이 되기도 하는데, 간단하고 빠르게 DB를 구축하거나 개발 단계에서 단순한 실험 등을 진행하기에는 큰 무리가 없다.

2-2. 서버형 DB

가장 흔하게 사용되는 형식의 DB이다. 실제 IT서비스에서 자주 사용되는 DB이며, 파일형 DB에 비하여 큰 규모의 데이터들도 쉽게 처리할 수 있고, 하나의 파일 형태로 존재하는 것이 아닌 하나의 컴퓨터에서 지속적으로 실행되고 있는 형태의 프로그램으로 존재한다.

따라서 그 컴퓨터와 네트워크 연결이 가능한 다른 컴퓨터에서 원격으로 데이터를 조회하거나 다룰 수 있으며 여러명의 사용자가 동시에 사용하는 것 역시 가능하다. 이에 따라서 인증 및 권한과 동시성과 관련된 다양한 복잡한 기능들도 제공한다.

이에 해당하는 대표적인 DBMS는 MySQL, MariaDB, PostgreSQL, Oracle 등이 있다.

2-3. 인메모리형 DB

인메모리 데이터베이스는 데이터 스토리지의 메인 메모리에 설치되어 운영되는 방식의 DBMS이다.

인메모리 데이터베이스는 디스크에 최적화된 데이터베이스보다 더 빠른데 그 이유는 디스크 접근이 메모리 접근보다 느리기 때문이다. 일반적으로 컴퓨터 상에서 하드디스크와 메모리의 데이터 처리 속도는 100배 이상 차이가 난다. 따라서 인메모리 기술을 적용한 DBMS는 이전의 디스크 기반 모델에 비하여 수십 배에서 수백 배의 성능 향상을 이끌어 낸다. 대량의 데이터 이동, 상호 비교, 갱신이 경우 몇 초 안에 이루어지는 것이다.

그리고 하드디스크 기반의 데이터 베이스는 데이터 양이 많아지거나 트랜잭션 처리와 분석업무를 모두 진행할 경우 병목 현상으로 인하여 속도가 저하되고, 이를 방지하기 위해 데이터웨어하우스와 별도로 데이터 마트데이터 큐브를 따로 마련해 두어야 하며 트랜잭션 처리와 분석업무를 따로 처리해야 한다. 반면에 인메모리 DB는 디스크 기반의 DB보다 빠른 속도로 트랜잭션 처리와 분석 업무를 동시에 처리할 수 있고 데이터 양이 급증하더라도 문제없이 처리 및 분석이 가능하다.

초기 인메모리형 DB는 RAM의 휘발성으로 인한 기술적 문제가 존재하였다. 전원이 갑자기 꺼지거나하는 등의 상황에서 휘발성 RAM 안에 저장된 데이터는 손실되기 때문이다. 하지만 최근 인메모리형 DB는 비휘발성 RAM기술의 도입으로 인메모리 데이터베이스는 전력 손실에도 완전하게 데이터를 유지할 수 있도록 발전하였다. 이런 발전으로 인하여 예전에 나온 개념이지만 최근 클라우드 DB와 함께 주목받고 있는 기술이다.


1. 데이터 웨어하우스
Data 사용자의 의사결정에 도움을 주기위하여 다양한 시스템에서 데이터를 추출, 변환, 요약하여 능동적으로 사용자한테 제공할 수 있는 DB의 집합체를 의미한다.

2. 데이터 마트
데이터 마트는 데이터 웨어하우스 환경에서 정의된 접근계층으로, 데이터 웨어하우스에서 데이터를 꺼내 사용자에게 제공하는 역할을 한다. 데이터 마트는 데이터 웨어하우스의 부분이며, 대게 특정한 조직, 혹은 팀에서 사용하는 것을 목적으로 한다.

데이터 웨어하우스와는 형식적으로 다른 존재이다. 데이터 웨어하우스는 중앙 집중식 데이터 집합체(물리적으로 분산)를 뜻하며, 데이터 마트는 저장소의 역할을 한다.데이터 마트는(데이터 웨어하우스에서 상속여부를 떠나)사용 목적에 맞는 접근성과 사용성을 강조한다. 일반적으로 데이터 웨어하우스는 전략적인 성격을 띄지만, 명확하지 않은 개념이다. 반면 데이터 마트는 전술적이고 즉각적인 요구를 충족시킨다는 목표를 가지고 있다. 데이터 웨어하우스 서비스를 제공하는 일부 회사에서는 이 데이터 마트 서비스도 같이 제공한다.
3. 데이터 큐브

데이터 큐브는 데이터들이 다차원으로 배열된 형태를 의미한다. 일반적으로 데이터 큐부라는 용어는 이러한 배열이 호스팅 컴퓨터의 주 메모리보다 엄청나게 큰 경우에 적용된다.

데이터 웨어하우스에서 데이터 큐브는 보통 OLAP 큐브를 의미한다. 매우 빠른 데이터 분석을 위하여 최적화된 데이터 구조로 차원별로 분류된 측정값이라는 숫자 팩트로 구성된다. 일반적으로 데이터 작업 및 분석은 2차원 형식의 스프레드 시트와 같은 방식을 사용하여 수행된다. 하지만 OLAP큐브는 일반적으로 관련이 없는 다른 소스에서 얻은 데이터와 함께 다차원 데이터가 포함되게 된다.

데이터 웨어하우스로 부터 여러 데이터 소스 및 형식에서 정보를 추출하여, 이 정보를 정리하여 변환 시켜준 후에, 변환된 정보를 추가 분석하기 위하여 정보가 미리 계산되는 OLAP서버(또는 큐브)에 데이터가 로드되게 된다.

데이터 큐브는 솔직히 아직 무슨 말인지 모르겠다.

2-4. 클라우드 DB

클라우드 DB는 그 이름에서도 알 수 있듯이 클라우드 플랫폼에 배포된 데이터 베이스이다. 일반적으로 두가지 형태로 배포된다. 첫 번째는 사용자가 가상 머신 공간을 사용하여 클라우드에서 독립적으로 데이터베이스를 실행하는 방법이다. 두 번째로는 클라우드 DB 공급자가 유지 관리하는 데이터베이스 서비스(DBaaS,서비스형 데이터베이스)에 대한 엑세스 권한을 구매하는 방식이다.

클라우드 DB는 설치가 매우 빠르고 그 해제도 그만큼 빠르기 때문에 간단하고 빠르게 DB를 구축하고 이를 시험하고 검증 및 운용할 수 있다. 그리고 필요가 없어지면 그 즉시 해제할 수도 있다. 또한 사용자가 언제 어디서나 장치에 상관없이 DB에 접근할 수 있다는 장점이 있다.(간편한 엑세스) 연결이 단순하여서 옵션 수를 제한해야하는 기존의 LAN엑세스 방식보다 훨씬 효율적으로 데이커 쿼리를 전송할 수 있다. 그리고 사용자의 컴퓨터가 날씨 또는 장비고장, 정전 등 다양한 이유로 인해서 갑자기 중단되었을 때도 클라우드 DB가 호스팅된 정보를 원격 서버를 통해 백업하기 때문에 정보를 안전하게 유지하고 이를 다시 확보하는데 용이하다. 또한 클라우드 서버가 내부 및 외부 사용자로부터 격리되고 보안이 철처한 오프사이트의 웨어하우스에 보관되어 있고, 데이터 자체가 암호화되어 있기 때문에 해킹에 더 강건하다.

3. B-Tree

정리하려 했는데 생각보다 B-Tree에 대해서 양이 많은 것 같다. 아래의 Velog가 정리를 매우 잘해두었으니 추후 B-Tree에 대해 학습할 일이 생기면 챙겨보자.

💡 B-Tree

1. Python DB API

파이썬에서는 PEP 249라는 DB API에 관련된 문서를 명시하고 있다. 데이터 베이스와 파이썬을 연결하여 주는 모든 파이썬 모듈들은 이 PEP 249라는 권장된 가이드 라인을 따라서 제작되었다. 이 문서에는 어떤 함수들, 메소드, 파라미터, 키워드 등을 어떻게 해야 하는지 나와있다. 이러한 가이드라인 덕분에 파이썬을 통하여 다양한 데이터베이스를 동일한 형식의 API를 이용하여 다룰 수 있다. 물론 사용하는 DBMS에 따라서 입력 기호 등의 사소한 차이가 있지만, 소통하는 방식 자체는 동일하다.

대표적인 예시로 SQlite DBMS와 상호작용할 수 있게 해주는 sqlite3모듈과 PostgreSQl과 상호작용하게 해주는 psycopg2모듈이 있다.

1-1. connect: DB파일 혹은 클라우드 DB와 연결

# SQlite3
import sqlite3

conn = sqlite3.connect('test.db')  # test.db파일과 연결(없으면 생성 후 연결)
conn = sqlite3.connect(':memory:') # local 메모리에 DB생성

#######################################################
# PostgreSQL
import psycopg2

# 클라우드 서버 연결 시
conn = psycopg2.connect(
    host="서버 호스트 주소",
    database="데이터베이스 이름",
    user="유저 이름",
    password="유저 비밀번호")

connect명령어는 말 그대로 DB와 연결하여 주는 명령어이다.

1-2. cursor: DB와의 소통 채널

# sqlite3와 psycopg2 동일
cur = conn.cursor()

connect을 사용하면 데이터베이스와 연결된 하나의 세션을 보관하게 된다. 이 세션을 통해서 DB와 소통하기 위해서는 cursor를 만들어 주어야 한다.

1-3. execute(+ executemany): Query문을 바로 넘겨주는 execute의 method

cur.execute("""CREATE TABLE test_table (
				name VARCHAR(32),
				age INT);
			""")

cur.execute("INSERT INTO test_table (name, age) VALUES ('spongebob', 12);")

# 아래와 같은 방법도 사용 가능합니다.

name = 'banana'
age = 13

cur.execute("INSERT INTO test_table (name, age) VALUES (?, ?)",(name,age))

# 아래와 같은 방법도 사용 가능합니다.

users = [('lemon', 10),
         ('apple', 15)]
# sqlite3
for user in users:
    cur.execute("INSERT INTO test_table (name, age) VALUES (?, ?);", user)
# psycopg2
for user in users:
    cur.execute("INSERT INTO test_table (name, age) VALUES (%s, %s);", user)
    
# 위에 for 문을 이용하지 않고 한 번에 많은 데이터를 입력하고 싶을 때
cur.executemany("INSERT INTO test_table (name, age) VALUES (%s, %s);", user)

가장 기본적인 DB와의 소통 방식으로 cursorexecute메소드를 사용하는 것이다. 이를 통해서 SQL쿼리문을 인수로 바로 넘겨줄 수 있다.

마지막에 데이터 입력시에 파이썬 자체의 포메팅 방법이 아닌 ?%s 등의 문자를 사용하는 것을 볼 수 있는데 이는 SQL Injection을 방지하기 위해서 사용하는 방식이다.

1-4. commit: 현재 트랜잭션 커밋

이 메서드는 현재 트랜잭션을 커밋한다. 이를 호출하지 않으면, 마지막 commit()호출 이후에 수행한 작업은 DB에 반영되지 않는다.

commit은 데이터베이스 연결에 대한 connection객체를 통해서 사용한다.

conn.commit()

1-5. fetch: 호출된 데이터 보기

cur.execute("SELECT * FROM test_table;")

# 호출된 모든 결과 확인
cur.fetchall()
# 호출된 결과 중 원하는 만큼 확인
cur.fetchmany('원하는 갯수')
# 호출된 결과 한개 확인
cur.fetchone()

fetch는 조회된 데이터를 출력해주는 명령어이다. 이때 특이한 점은 fetch는 row by row로 조회된 데이터를 출력해준다는 것이다.

위와 같은 테이블에 fetch를 사용하면 다음과 같은 결과를 볼 수 있다.

fetchmany의 경우 조회할 수 있는 데이터보다 더 많이 요구할 때는 조회 가능한 데이터만 담아서 출력한다.

3. 회고

Section3의 Sprint1도 끝났다. 베우면 배울수록 배워야할 영역이 기하급수적으로 늘어나는 느낌이다. 머신러닝도 뭔가 겉만 쓰윽 훑고 지나간 느낌이였는데, SQL도 그런거 같다. 이번 Section에서는 혼공SQL책을 끝내고 데이터 과학을 위한 통계 책 2권의 책을 끝내보는 걸로 내 나름대로 목표를 세웠다. 그리고 벨로그에 학습 내용을 정리하신 선배기수의 벨로그를 우연치 않게 발견했다. 보다보니까 조금 더 요약적이고, 깔끔하게 정리를 진짜 잘하신 거 같아서 그 분 방식을 좀 빌려서 최대한 짧게 작성할려고 노력해봐야겠다. 근데 성격상 될란가는 잘 모르겠지만, 요즘 뭔가 과제를 해결하는 시간이 점점 뒤로 딜레이 되면서 Velog정리 하는 시간은 동일하지만 끝내고 나면 자야할 시간이 되어버리는 그런 상황이라서 요약하는 것을 중심으로 좀 해야겠다.

참고자료 및 좋은 자료
1. SQLite
2. 부트캠프 윗기수 선배님의 Velog

0개의 댓글