데이터베이스 시스템 소개
요즘 세상의 배움이란?
배움에는 시간과 노력이 걸림 * 어떻게 하느냐가 가장 중요하다. * 가장 중요한 것은 버티는 힘(즐겨야한다.) * 내가 뭘 모르는지 생각해봐야함.(구체적으로 질문할 수 있나?) * 잘 하는 사람 보고 기죽지 않기 * 나 자신과만 비교해라.
새로운 것을 처음 배울 때의 좋은 자세
- 자신이 아는것과 모르는 것을 분명히 이해하는지?
- 멍청한 질문이란 없다는 점을 명심하자. 대충 알거나 모르면서 안물어보는 것이 더 큰 문제
- 이는 피드백을 잘 받아들일 수 있는지와도 연계됨.
- 마음을 편하게 먹기
- 내가 이해하기 힘들다면 남들도 이해하기 힘듬
- 나보다 잘 하는 사람들은 그만큼 시간을 쏟았기 때문
새로운 것을 처음 배울 때의 좋은 자세2
- 배움의 발전은 tipping point를 거치면서 폭발하는 형태임.
- 발전이 더딘 기간을 즐기는 자세가 필요하다.
데이터베이스가 왜 필요할까?
모든 서비스는 데이터를 만들어내고 이는 기록되어야 한다.
- 모든 서비스는 데이터를 만들어내고 그 데이터의 저장을 필요로한다.
- (예) 카카오톡
- 사용자 등록시 사용자 정보(ID, 암호, 번호)의 저장이 필요
- 사용자 친구 리스트 관리 필요(친구의 id를 저장)
- 특정 사용자 혹은 단톡방에서의 채팅 기록을 저장해야함.
- (예) 쿠팡
- 구매 관런 정보의 저장이 필요
- 추천을 잘 하려면 사용자별로 검색기록과 보거나 클릭했던 상품정보 저장과 가공이 필요
어디에 이런 데이터를 저장해야 할까?
- 프로덕션 관계형 데이터베이스 (RDBMS)
- 어떤 서비스의 운영에 필요 데이터를 저장하는 곳(MySQL, PostgreSQL, …)
- 빠른 처리속도가 중요함
- vs. 데이터 웨어하우스 관계형 데이터베이스
- 데이터를 구조화된 테이블들의 집합으로 구성하여 저장하고 관리
- 백엔드 개발자이건 프론트 개발자이건 잘 알아야 하는 기본 기술
- 관계형 데이터베이스의 프로그래밍 언어가 SQL
데이터 웨어하우스
- 회사 관련 데이터를 저장하고 분석함으로써 의사결정과 서비스 최적화에 사용
- BigQuery, Snowflake, MySql, …
- 처리속도 보다는 구조화된 큰 데이터를 처리하는 것이 중요
- vs. 프로덕션 관계형 데이터페이스
- 데이터 직군이라면 반드시 알아야함 (SQL)
- 데이터 엔지니어, 데이터 분석가, 데이터 과학자
관계형 데이터베이스의 종류
- 관계형 데이터베이스 : 구조화된 데이터(테이블, 필드, 레코드)
- 프로덕션용 관계형 데이터베이스(처리속도가 중요, mysql, postgreSQL)
- 데이터 웨어하우스용 관계형 데이터베이스
- 비관계형 데이터베이스 : 비구조화 데이터도 다룸
- 흔히 NoSQL 데이터베이스라고 부르기도한다.
- 보통은 프로덕션용 관계형 데이터베이스를 보완하기위한 용도로 많이 사용됨
- 크게 4종류가 존재
- Key/Value : Redis, Memcache, …
- Document Store : MongoDB, …
- Wide Column Storage : Cassandra, HBase, DynamoDB
- Search Engine : ElasticSearch
백엔드 시스템 구성도 예제 보기
어떤 개발자 직군들이 있는지 / 관계형 데이터베이스가 전체 시스템에서 어떻게 사용되는지 몇가지 구성도를 알아보자.
프론트엔드와 백엔드
- 웹/앱 서비스를 간단하게 보면 크게 프론트 / 백엔드로 구성된다.
- 프론트엔드 : 사용자와 인터렉션을 하는 부분으로 보통 웹 브라우저 혹은 모바일 폰에 사용자에게 노출되는 서비스를 말함
- 백엔드 : 프론트엔드 뒤에 숨어서 사용자에게 보이지는 않지만 실제 데이터를 저장/추가하고 사용자가 요구한 일을 수행하는 부분으로 여기에 다양한 데이터베이스들이 사용된다.
- 초기에는 이렇게 크게 두 직군이 존재하게 되었다.

https://www.geeksforgeeks.org/what-is-the-difference-between-front-end-and-back-end-web-development/
다른 직군의 등장
- 데브옵스 : 주로 백엔드에 집중을 두고 서비스의 운영을 책임지는 팀으로 회사가 작을 때는 보통 백엔드 팀이 이 일을 담당한다.
- 풀스택 : 개발속도를 내기위해 프론트/백엔드 모두 할 수 있는 개발자로 작은 회사에서 선호하는 형태의 직군
- 데이터 직군 : 데이터의 중요성이 증대되면서 3가지 데이터 직군이 등장
- 데이터 엔지니어 : 사실상 소프트웨어 개발자로 데이터 웨어하우스와 관련일을 담당
- MLOps라는 직군이 나타나기 시작
- 데이터 분석가 : 데이터 웨어하우스를 기반으로 다양한 지표설정과 분석을 수행
- 데이터 과학자 : 수집된 과거 데이터를 기반으로 미래를 예측하는 모델링 혹은 개인화 작업으로 서비스의 만족도를 높이고 프로세스의 최적화를 수행
시스템 구성의 변화 : 2tier
- 보통 데스크탑 응용 프로그램에서 사용되는 아키텍쳐
- 클라이언트와 서버 두개의 티어로 구성
- 클라이언트는 사용자가 사용하는 UI가 됨(front-end)
- 비즈니스 로직은 보통 클라이언트에 위치
- 서버단이 데이터베이스가 됨(back-end)
시스템 구성의 변화 : 3tier
- 웹 서비스 / 앱 서비스에서 많이 사용되는 아키텍쳐
- 프레젠테이션 티어 : 프론트엔드
- 애플리케이션 티어 : 백엔드
- 데이터 티어 : 백엔드
관계형 데이터베이스의 중요성
- 어떤 구조이건 데이터베이스는 꼭 필요한 컴포넌트
- 이 데이터베이스를 잘 다룬 것이 좋은 개발자가 되기 위해 필요
- 기본은 SQL을 잘 아는 것
- 백엔드 개발자로써 중요한 부분
- 데이터 모델을 잘 만들고 그걸 프론트 개발자와 협업/공유
- 속도 개선을 위한 쿼리 성능 모니터링하고, 필요시 성능 개선 수행
- 어떤 경우에는 이를 전담하는 사람이 존재(DBA - DataBase Administrator)

관계형 데이터베이스 소개
관계형 데이터베이스 1
- 구조화된 데이터를 저장하고 저장된 데이터를 질의할 수 있또록 해주는 스토리지
- 엑셀 스프레드시트 형태의 테이블로 데이터를 정의하고 저장
- 테이블에는 컬럼(열)과 레코드(행)이 존재한다.
관계형 데이터베이스 2
- 관계형 데이터베이스를 조작하는 프로그래밍 언어가 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)
- 처리 데이터 크기에 집중. 데이터 분석 혹은 모델 빌딩등을 위한 데이터 저장
- 보통 프로덕션 데이터베이스를 복사해서 데이터 웨어하우스에 저장
관계형 데이터베이스의 구조
- 관계형 데이터베이스는 2단계로 구성됨
- 가장 밑단에는 테이블들이 존재(테이블은 엑셀의 시트에 해당)
- 테이블들은 데이터베이스(혹은 스키마)라는 폴더 밑으로 구성(엑셀에서는 파일)
- 테이블의 구조
- 테이블은 레코드들로 구성(행)
- 레코드는 하나 이상의 필드(컬럼)로 구성(열)
- 필드(컬럼)는 이름과 타입과 속성(primary key)으로 구성됨
SQL 소개
- SQL : Structured Query Language
- 관계형 데이터베이스에 있는 데이터를 질의하거나 조작해주는 언어
- SQL은 1970년대 초반에 IBM이 개발한 구조화된 데이터 질의 언어
- 두 종류의 언어로 구성됨
- DDL : 테이블의 구조를 정의하는 언어
- DML : 테이블에서 원하는 레코드를 읽거나 추가/삭제/갱신 해주는데 사용하는 언어
SQL은 빅데이터 세상에서도 중요하다.구조화된 데이터를 다루는 한 SQL은 데이터 규모와 상관없이 쓰인다. 모든 대용량 데이터 웨어하우스는 SQL 기반 Spark나 Hadoop도 예외는 아니다. 백엔드/프론트엔드/데이터 분야에서 반드시 필요한 기본 기술이다.
SQL의 단점
- 구조화된 데이터를 다루는데 최적화가 되어있다.
- 정규표현식을 통해 비구조화된 데이터를 어느 정도 다루는 것은 가능하나 제약이 심함
- 만은 관계형 데이터베이스들이 플랫한 구조만 지원함
- 구글 빅쿼리는 nested structure를 지원함
- 비구조화된 데이터를 다루는데 Spark, Hadoop과 같은 분산 컴퓨팅 환경이 필요해짐
- 즉 SQL만으로는 비구조화 데이터를 처리하지 못함
- 관계형 데이터베이스마다 SQL 문법이 조금씩 상이하다.
Star schema
- Production DB용 관계형 데이터베이스에서는 보통 스타스키마를 이용하여 데이터를 저장
- 데이터를 논리적 단위로 나눠 저장하고 필요시 조인
- 스토리지의 낭비가 덜하고 업데이트가 쉬움
Denormalized schema
- NoSql이나 데이터 웨어하우스에서 사용하는 방식
- 단위 테이블로 나눠 저장하지 않음으로 별도의 조인이 필요없는 형태를 말함
- 이는 스토리지를 더 사용하지만 조인이 필요 없기에 빠른 계산이 가능하다.
SQL 기본
- 먼저 다수의 SQL 문을 실행한다면 세미콜론으로 구분이 필요하다.
- SQL문1; SQL문2; SQL문3;
- SQL 주석
- – : 인라인 한줄짜리 주석. 자바 //에 해당
- /* – */ : 여러줄에 걸쳐 사용 가능한 주석
- SQL 키워드는 대문자를 사용한다던지 하는 나름대로의 포맷팅이 필요함
- 팀 프로젝트라면 팀에서 사용하는 공통 포맷이 필요
- 테이블/필드이름의 명명규칙을 정하는 것이 중요
- 단수형 vs 복수
- User vs Users
- _ vs CamelCasing
- user_session_channel vs UserSessionChannel
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) )
DDL - 테이블 구조 정의 언어 (2)
- DROP TABLE
- DROP TABLE table_name;
- 없는 테이블을 지우려고 하는 경우 에러를 냄
- DROP TABLE IF EXISTS table_name;
- vs. DELETE FROM
- DELETE FROM은 조건에 맞는 레코드들을 지움(테이블 자체는 존재)
DDL - 테이블 구조 정의 언어 (3)
- ALTER TABLE
- 새로운 컬럼 추가
- ALTER TABLE 테이블 이름 ADD COLUMN 필드이름 필드타입;
- 기존 컬럼 이름 변경
- ALTER TABLE 테이블 이름 RENAME 현재 필드이름 to 새로운 필드이름
- 기존 컬럼 제거
- ALTER TABLE 테이블 이름 DROP COLUMN 필드이름
- 테이블 이름 변경
- ALTER TABLE 현재 테이블이름 RENAME to 새 테이블 이름
DML - 테이블 데이터 조작 언어 (1)
- 레코드 질의 언어 : SELECT
- SELECT FROM : 테이블에서 레코드와 필드를 읽어오는데 사용
- WHERE를 사용해서 레코드 선택 조건을 지정
- GROUP BY를 통해 정보를 그룹 레벨에서 뽑는데 사용하기도 함
- DAU, WAU, MAU 계산은 GROUP BY를 필요로함
- ORDER BY를 사용해서 레코드 순서를 결정하기도 함
- 보통 다수의 테이블의 조인애허 사용하기도 함
DML - 테이블 데이터 조작 언어 (2)
- 레코드 추가/삭제/수정 언어
- INSERT INTO : 테이블에 레코드를 추가하는데 사용
- UPDATE FROM : 테이블 레코드의 필드 값 수정
- DELETE FROM : 테이블에서 레코드를 삭제
- vs. TRUNCATE