(W2D1) 데이터베이스(1)

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

모든 서비스는 데이터를 만들어내고 이는 기록되어야 하고, 저장을 필요로 한다.

IT서비스는 고객을 대상으로 하는 것이고, 고객의 정보나 저장하는 기록장치로 쓰는 것이 데이터베이스이다.

이 데이터베이스를 프로그래밍해주는 언어가 SQL이다.

관계형 데이터베이스

서비스 운영에 필요한 정보를 테이블 형태로 나눠서 저장한다. 테이블은 다수가 존재한다.

프로덕션 관계형 데이터베이스

  • 웹 서비스나 앱 운영에 필요한 정보를 저장하는 데이터베이스이다.
  • 빠른 처리속도에 초점을 둔다.
  • MySQL, PostreSQL 등

데이터 웨어하우스 관계형 데이터베이스

  • 처리속도 보다는 구조화된 큰 데이터 처리에 초점을 둔 데이터베이스이다.
  • 회사 관련 데이터를 저장하고 분석함으로써 의사결정과 서비스 최적화에 사용한다. (보통 사용자들이 회사의 내부 직원들이다.)
  • Google Cloud BigQuery, Snowflake 등

데이터 순환 구조

  1. 웹 서비스나 모바일 앱에서 생성되는 다양한 데이터들을 프로덕션 관계형 데이터베이스에 저장한다.
  2. 서비스에서 생성된 데이터들과 외부에서 만들어지는 데이터(이메일 마케팅, 페이스북 광고 등) 등 모든 데이터를 추출하여 데이터 웨어하우스에 저장한다.
  3. 데이터 웨어하우스를 바탕으로 지표를 설정하고 시각화를 통해 회사가 올바른 방향으로 가고 있는지 확인한다.
  4. 데이터 웨어하우스에 저장된 데이터(수집된 데이터)를 기반으로 사용자의 경험을 개인화하여 제품 서비스를 개선한다.

비관계형 데이터베이스

비구조화 데이터를 다룬다. NoSQL 데이터베이스라고 부른다.

프로덕션용 관계형 데이터베이스를 보완하기위한 용도로 많이 사용된다.

크게 4종류가 존재한다.

종류 서비스
Key/Value Storage Redis, Memcache, …
Document Store MongoDB
Wide Column Storage Cassandra, HBase, DynamoDB
Search Engine ElasticSearch

백엔드 시스템 구성도 예제 보기

프론트엔드와 백엔드

웹/앱 서비스를 간단하게 보면 크게 프론트엔드와 백엔드로 구성된다.

  • 프론트엔드 : 사용자와 인터랙션을 하는 부분으로 보통 웹 브라우저 혹은 모바일 앱에서 사용자에게 노출되는 서비스를 말한다.
  • 백엔드 : 프론트엔드 뒤에 숨어서 사용자에게 보이지는 않지만 실제 데이터를 저장/추가하고 사용자가 요구한 일을 수행하는 부분이다. 다양한 데이터베이스들이 사용된다.

다른 직군

  • 데브옵스(DevOps) : 주로 백엔드에 집중을 두고 서비스의 운영을 책임지는 팀으로, 회사가 작을 때는 보통 백엔드 팀이 이 일을 담당
  • 풀스택(Fullstack) : 개발속도를 내기위해 프론트엔드/백엔드를 모두 할 수 있는 개발자로 보통 작은 회사에서 선호하는 형태의 직군
  • 데이터 직군 : 데이터의 중요성이 증대되면서 3가지 데이터 직군이 등장

    • 데이터 엔지니어 : 사실상 소프트웨어 개발자로, 데이터 웨어하우스와 관련 일을 담당
    • 데이터 분석가 : 데이터 웨어하우스를 기반으로 다양한 지표설정과 분석 수행
    • 데이터 과학자 : 수집된 과거 데이터를 기반으로 예측하는 모델링 혹은 개인화 작업으로 서비스의 만족도를 높이고 프로세스의 최적화를 수행

시스템 구성의 변화 : 2 tier

데스크탑 응용프로그램에서 사용되는 아키텍처이다. 클라이언트와 서버, 두 개의 티어로 구성된다.

  • 클라이언트는 사용자가 사용하는 UI가 된다. (front-end)

    • 비즈니스 로직은 보통 클라이언트에 위치한다.
  • 서버단이 데이터베이스가 된다. (back-end)

응용프로그램이 웹 서비스, 모바일 앱으로 변환되면서 3 tier로 바뀌기 시작했다.

시스템 구성의 변화 : 3 tier

웹 서비스에 많이 사용되는 아키텍처이다.

  • 프리젠테이션 티어(Presentation Tier) : 프론트엔드
  • 애플리케이션 티어(Application Tier) : 백엔드
  • 데이터 티어(Data Tier) : 백엔드

관계형 데이터베이스의 중요성

  • 어떤 구조이건 데이터베이스는 꼭 필요한 컴포넌트이다.
  • 데이터베이스를 잘 다루는 것은 좋은 개발자가 되기위해 필요하다.
  • 백엔드 개발자로서 중요한 부분

    • 데이터 모델을 잘 만들고 그것을 프론트 개발자와 공유/협업
    • 속도 개선을 위한 쿼리 성능을 모니터링하고, 필요 시 성능 개선을 수행(최적화)

관계형 데이터베이스 소개

관계형 데이터베이스

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

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

  • 테이블 정의 - DDL(Date Definition Language)

    • 테이블의 포맷을 정의해주는 언어
  • 테이블 데이터 조작/질의 - DML (Data Manipulation Language)

    • DDL로 정의된 테이블에 레코드를 추가, 수정, 삭제 혹인 읽어들이기 위해 사용하는 언어

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

2단계로 구성된다.

  • 가장 밑단에는 테이블들이 존재한다.
  • 테이블들은 데이터베이스(혹은 스키마)라는 폴더 밑으로 구성된다.

테이블의 구조 (테이블 스키마라고 부르기도 함)

  • 테이블들은 레코드들로 구성된다. (행)
  • 레코드는 하나 이상의 필드(컬럼)로 구성된다. (열)
  • 필드(컬럼)는 이름과 타입과 속성(primary key)으로 구성된다.

SQL 소개

SQL(Structured Query Language) : 관계형 데이터베이스의 테이블을 질의하고 조작해주는 언어

  • DDL : 테이블의 구조를 정의하는 언어
  • DML

    • 테이블에서 원하는 레코드들을 읽어오는 질의 언어
    • 테이블에 레코드를 추가/삭제/갱신해주는 데 사용하는 언어

SQL은 빅데이터 세상에서도 중요하다.

  • 구조화된 데이터를 다루는 한 SQL은 데이터 규모와 상관없이 쓰인다.
  • 모든 대용량 데이터 웨어하우스는 SQL 기반이다.
  • Spark이나 Hadoop도 예외는 아니다.

    • SparkSQL과 Hive라는 SQL 언어가 지원됨
  • 백엔드/프론트엔드/데이터 분야에서 반드시 필요한 기본 기술

SQL의 단점

  • 구조화된 데이터를 다루는 데 최적화가 되어있다.

    • 정규표현식을 통해 비구조화된 데이터를 어느정도 다루는 것은 가능하지만 제약이 심하다.
    • 많은 관계형 데이터베이스들이 플랫한 구조만 지원한다.
    • 구글 빅쿼리는 nested structure를 지원한다.
    • 비구조화된 데이터를 다루는데 Spark, Hadoop과 같은 분산 컴퓨팅 환경이 필요하다.
    • SQL만으로는 비구조화 데이터를 처리하지 못한다. - 가장 큰 단점
    • 관계형 데이터베이스마다 SQL 문법이 조금씩 다르다.

Star schema

  • Production DB용 관계형 데이터베이스에서는 스타 스키마를 사용해 데이터를 저장한다.
  • 데이터를 논리적 단위로 나눠 저장하고 필요 시 조인한다.
  • 스토리지의 낭비가 덜하고 업데이트가 쉽다.
  • 조인 자체가 시간과 리소스를 필요로 하기 때문에 속도의 저하를 가져올 수 있다.

Denormalized schema

  • NoSQL이나 데이터 웨어하우스에서 사용하는 방식이다.

    • 데이터 웨어하수는 다수의 컴퓨터로 구성이 된다. (클러스터 형태의 구조)
    • 단위 테이블로 나눠 저장하지 않음으로 별도의 조인이 필요없는 형태를 말한다.
  • 스토리지를 더 사용하지만 조인이 필요 없기에 빠른 계산이 가능하다.

    • 스토리지의 낭비가 심하다.

SQL 기본

  • 다수의 SQL 문을 실행한다면 세미콜론으로 분리 필요하다.

    • SQL문1; SQL문2; SQL문3;
  • SQL 주석

    • — : 인라인 한 줄 짜리 주석
    • /* — */ : 여러 줄에 걸쳐 사용 가능한 주석
  • SQL 키워드는 대문자를 사용한다던지 하는 나름대로의 포맷팅이 필요하다.
  • 필드 이름의 명명규칙을 정하는 것이 중요하다. (네이밍 규칙)

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)
    );

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

  • DROP TABLE

    • DROP TABLE table_name;
    • 없는 테이블을 지우려고 하는 경우 에러가 난다.
    • -> DROP TABLE IF EXISTS table_name;
    • vs DELETE FROM
    • DELETE FROM은 조건에 맞는 레코드들을 지운다. (테이블 자체는 남아있음)

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

  • ALTER TABLE

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

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

  • 레코드 질의 언어 : SELECT
  • SELECT FROM : 테이블에서 레코드와 필드를 읽어오는 데 사용한다.
  • WHERE를 사용해서 레코드 선택 조건을 지정한다.
  • GROUP BY를 통해 정보를 그룹 레벨에서 뽑는데 사용하기도 한다.

    • DAU, WAU, MAU 계산은 GROUP BY를 필요로 한다.
  • ORDER BY를 사용해서 레코드 순서를 결정하기도 한다.
  • 보통 다수의 테이블을 조인해서 사용하기도 한다.

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

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

    • INSERT INTO : 테이블에 레코드를 추가한다.
    • UPDATE FROM : 테이블 레코드의 필드 값을 수정한다.
    • DELETE FROM : 테이블에서 레코드를 삭제한다. (모두 삭제도 할 수 있고, 조건으로도 일부만 삭제 가능)
    • vs TRUNCATE : 모든 레코드를 삭제

Written by@Myunghwan
Nothing changes if nothing changes

GitHub