영권's

20210809 - TIL (데이터베이스) 본문

데브코스 웹 백엔드/TIL

20210809 - TIL (데이터베이스)

ykkkk 2021. 8. 10. 04:13

데이터베이스가 왜 필요한가?

모든 IT서비스는 데이터를 만들어내고 이는 기록되어야 함

예) 쿠팡에서 회원 가입시 회정정보 저장 필요, 구매 관련 정보 저장 필요 등등

 

어디에 이런 데이터를 저장할까?

  • 프로덕션 관계형 데이터베이스
    • 어떤 서비스의 운영에 필요한 데이터를 저장하는 곳(MySQL, PostgreSQL ,... )
    • 빠른 처리속도가 중요함
      • vs 데이터 웨어하우스 관계형 데이터베이스
    • 데이터를 구조화된 테이블들의 집합으로 구성하여 저장하고 관리
    • 개발자라면 잘 알아야하는 기본 기술
      • 관계형 DB의 프로그래밍 언어가 SQL

 

데이터 분석을 위한 데이터베이스

  • 데이터 웨어하우스
    • 회사 관련 데이터를 저장하고 분석함으로써 의사결정과 서비스 최적화에 이용
      • BigQuery, Snowflake, MySQL ...
    • 처리속도 보다는 구조화된 큰 데이터를 처리하는 것이 중요
      • vs 프로덕션 관계형 데이터베이스
    • 데이터 직군이라면 반드시 알아야 함(SQL)
      • 데이터 엔지니어, 데이터 분석가, 데이터 과학자

 

데이터 순환 구조 : 프로덕션 데이터베이스와 데이터 웨어하우스

  1. 서비스 사이트나 앱에서 생성되는 구매정보와 같은 다양한 데이터를 프로덕션 데이터에 저장
    1. 빠른 처리속도가 중요
    2. 프로덕션용 데이터베이스에 저장한 내용과 외부 데이터 추출을 포함한 데이터 웨어하우스에 저장할 수 있음
  2. 데이터 웨어하우스의 데이터를 통해 지표를 설정을 하고 시각화를 통해 회사가 가는 방향이 제대로된 방향인지 설정할 수 있다.
  3. 데이터들을 통해 사용자가 선호하는 데이터들을 개인화하여 제품 서비스 개선을 할 수 있다.

 

다양한 데이터베이스의 종류

  • 관계형 데이터베이스 : 구조화된 데이터
    • 프로덕션용 데이터베이스
    • 데이터 웨어하우스용 관계형 데이터베이스
  • 비관계형 데이터베이스 : 비구조화 데이터도 다룸
    • 흔히 NoSQL 데이터베이스라고 부르기도 함
    • 보통은 프로덕션용 관계형 데이터베이스를 보완하기위한 용도로 많이 사용됨
    • 크게 4가지가 존재
      • key/Value Storage : Redis, Memcache...
      • Document Store : MongoDB
      • Wide Column Storage : Cassandra, HBase, DynamoDB
      • Search Engine : ElasticSearch

 

시스템 구성의 변화 

 

2 tier

  • 보통 데스크탑 응용프로그램에서 사용되는 아키텍쳐
  • 클라이언트와 서버 두 개의 티어로 구성
    • 클라이언트는 사용자가 사용하는 UI가 됨(front-end)
      • 비즈니스 로직은 보통 클라이언트에 위치
    • 서버단이 데이터베이스가 됨(back-end)

그림 출처 : https://m.blog.naver.com/limoremo/220073573980

 

3 tier

  • 보통 웹 서비스에서 많이 사용되는 아키텍쳐
    • 프리젠테이션 티어(Presentation Tier) : 프론트엔드
    • 애플리케이션 티어(Application Tier) : 백엔드
    • 데이터 티어(Data Tier) : 백엔드

그림 출처 : https://m.blog.naver.com/limoremo/220073573980

 

시스템 구성의 예 : Spring Boot

  • 기본적으로 3tier 구조
  • 파이썬의 경우 Django/Flask, JS는 Node.js, 자바는 Spring Boot 
  • 프론트엔드로 가장 많이 쓰이는 옵션은 React

Spring boot 와 React를 이용한 3tier 예시

 

 

관계형 데이터베이스

  • 구조화된 데이터를 저장하고 질의할 수 있도록 해주는 스토리지
    • 엑셀 스프레드시트 형태의 테이블로 데이터를 정의하고 저장
      • 테이블에는 컬럼(열)과 레코드(행)이 존재.
      • 컬럼마다 타입이 존재.

 

구조화된 테이블에 레코드 추가, 읽기, 수정들을 어떻게 할것인가?

 

그런 행위를 해주는 것이 바로 SQL

 

관계형 데이터베이스를 조작하는 프로그래밍 언어가 SQL

  • 테이블 정의를 위한 DDL(Data Definition Language)
    • 앞서 보여준 테이블의 포맷을 정의해주는 언어
  • 테이블 데이터 조작/질의를 위한 DML (Data Manipulation Language)
    • DDL로 정의된 테이블에 레코드를 추가, 삭제, 수정, 읽어들이기 위해 사용하는 언어

 

대표적인 관계형 데이터베이스

프로덕션 데이터베이스 : MySQL, PostgreSQL, Oracle

  • OLTP(OnLine Transaction Processing)
  • 빠른 속도에 집중. 서비스에 필요한 정보를 저장.

데이터 웨어하우스 : RedShift, Snowflake, BigQuery, Hive

  • OLAP(OnLine Analytical Processing)
  • 처리 데이터 크기에 집중. 데이터 분석 혹은 모델 빌딩등을 위한 데이터 저장
    • 보통 프로덕션 데이터베이스를 복사해서 데이터 웨어하우스에 저장
    • 만약 데이터 분석과 같은 일을 하기위해 질의를 날렸을 때 프로덕션 DB에 지장을 안주기 위해

 

관계형 데이터베이스의 구조

  • 관계형 데이터베이스는 2단계로 구성됨.
    • 가장 밑단에는 테이블들이 존재(테이블은 엑셀의 시트에 해당)
    • 테이블들은 데이터베이스(혹은 스키마)라는 폴더 밑으로 구성(엑셀에서는 파일)

예시

  • 테이블의 구조(테이블의 스키마라고 부르기도 함)
    • 테이블은 레코드들로 구성(행)
    • 레코드는 하나 이상의 필드(컬럼)로 구성(열)
    • 필드(컬럼)는 이름과 타입과 속성(primary key)로 구성됨.

테이블 스키마와 테이블 레코드 예시

 

SQL(Structured Query Language)

  • 관계형 데이터베이스에 있는 데이터(테이블)를 질의하거나 조작해주는 언어
  • SQL은 1970년대 초반에 IBM이 개발한 구조화된 데이터 질의 언어
  • 두 종류의 언어로 구성
    • DDL(Data Definition Language)
      • 테이블 구조를 정의하는 언어
    • DML(Data Manipulation Language)
      • 테이블에서 원하는 레코드들을 읽어오는 질의 언어
      • 테이블에 레코드를 추가/삭제/갱신해주는데 사용하는 언어

 

SQL은 빅데이터 세상에서도 중요!

  • 구조화된 데이터를 다루는한 SQL은 데이터 규모와 상관없이 쓰임
  • 모든 대용량 데이터 웨어하우스는 SQL 기반
    • Redshift, Snowflake, BigQuery, Hive
  • Spark나 Haddop도 예외는 아님
    • SparkSQL 과 Hive라는 SQL언어가 지원됨.
  • 백엔드 / 프론트엔드/ 데이터분야에서 반드시 필요한 기본 기술

 

SQL의 단점

  • 구조화된 데이터를 다루는데 최적화가 되어있음
    • 정규표현식을 통해 비구조화된 데이터를 어느정도 다루는 것은 가능하나 제약이 심함
    • 많은 관계형 데이터베이스들이 플랫한 구조만 지원함(no nested like JSON)
      • 구글 빅쿼리는 nested structure를 지원함
    • 비구조화된 데이터를 다루는데 Spark, Hadoop과 같은 분산 컴퓨팅 환경이 필요해짐
      • 즉, SQL만으로는 비구조화된 데이터를 처리하지 못함
  • 관계형 데이터베이스마다 SQL 문법이 조금씩 상이함

 

Star schema

  • Production DB용 관계형 데이터베이스에서는 보통 스타 스키마를 사용해 데이터를 저장
  • 데이터를 논리적 단위로 나눠 저장하고 필요시 조인
  • 스토리지의 낭비가 덜하고 업데이트가 쉬움
  • 조인을 사용해야 하므로 시간과 리소스를 사용 해야하는 단점이 있을 수 있다.

 

Denormalized schema

  • NoSQL이나 데이터 웨어하우스에서 사용하는 방식
    • Star schema를 사용해도 되지만 데이터 웨어하우스는 사이즈에 제약을 덜 받는 구조다.
    • 프로덕션 DB는 보통 컴퓨터 1대에 들어가는 DB라서 메모리나 디스크의 크기가 한정적이라 넘어가면 처리를 못함
    • 데이터 웨어하우스는 다수의 컴퓨터 형태기 때문에 메모리나 디스크가 부족하면 다른 컴퓨터를 더 붙이면 된다. 이런 형태를 클러스터라고 한다.
    • 단위 테이블로 나눠 저장하지 않음으로 별도의 조인이 필요 없는 형태를 말함
  • 이는 스토리지를 더 사용하지만 조인이 필요 없기에 빠른 계산이 가능

 

SQL 기본

  • 먼저 다수의 SQL문을 실행한다면 세미콜론으로 분리 필요
    • SQL문1; SQL문2; SQL문3;
  • SQL 주석
    • -- : 인라인 한줄짜리 주석.
    • /*-- */ : 여러 줄에 걸쳐 사용 가능한 주석
  • SQL 키워드는 대문자를 사용한다던지 하는 나름대로의 포맷팅이 필요 
    • 팀 프로젝트라면 팀에서 사용하는 공통 포맷이 필요 (SQL 뿐만 아니라 프로그래밍 코딩 컨벤션은 굉장히 중요하다.)
  • 테이블 / 필드 이름의 명명 규칙을 정하는 것이 중요 
    • 단수형 vs 복수형
      • User vs Users
    • _ vs . CamelCasing
      • user_session_chaanel vs UserSessionChannel

 

SQL DDL - 테이블 구조 정의 언어 (1)

 

CREATE TABLE

  • Primary key 속성을 지정할 수 있음
    • Primary key uniqueness : 유일키 보장
  • 성능향상을 위해 인덱스를 지정할 수 있음
-- 예
CREATE TABLE raw_data.user_session_channel
(
	userid int,
	sessionid varchar(32) primary key,
	channel varchar(32)
);

 

 

DROP TABLE

  • DROP TABLE TABLE_NAME;
    • 없는 테이블을 지우려고 하는 경우 에러를 냄
  • DROP TABLE IF EXISTS TABLE_NAME;
  • vs DELETE FROM
    • DELETE FROM은 조건에 맞는 레코드들을 지움(테이블 자체는 존재)

 

ALTER TABLE

  • 새로운 컬럼 추가
    • ALTER TABLE 테이블명 ADD COLUMN 필드이름 필드타입;
  • 기존 컬럼 이름 변경
    • ALTER TABLE 테이블명 RENAME 현재필드명 TO 새필드명;
  • 기존 필드 제거
    • ALTER TABLE 테이블명 DROP COLUMN 필드이름;
  • 테이블 이름 변경
    • ALTER TABLE 현재테이블이름 RENAME TO 새테이블이름;

 

SQL DML - 테이블 데이터 조작 언어 

 

레코드 질의 언어 : SELECT

  • SELECT FROM : 테이블에서 레코드와 필드를 읽어 오는데 사용
  • WHERE를 사용해서 레코드 선택 조건 지정
  • GROUP BY를 통해 정보를 그룹 레벨에서 뽑는데 사용하기도 함
    • DAU, WAU, MAU 계산은 GROUP BY를 필요로 함
  • ORDER BY를 사용해서 레코드 순서를 결정하기도 함
  • 보통 다수의 테이블의 조인해서 사용하기도 함.

 

레코드 추가/삭제/수정 언어

  • INSERT INTO : 테이블에서 레코드를 추가하는데 사용
  • UPDATE FROM : 테이블 레코드의 필드 값 수정
  • DELETE FROM : 테이블에서 레코드를 삭제 (테이블은 존재)
    • VS TRUNCATE : 조건 없이 테이블의 레코드를 모두 삭제

 

Comments