데이터베이스가 왜 필요한가?
모든 서비스는 데이터를 만들어내고 이는 기록되어야 하고, 저장을 필요로 한다.
IT서비스는 고객을 대상으로 하는 것이고, 고객의 정보나 저장하는 기록장치로 쓰는 것이 데이터베이스이다.
이 데이터베이스를 프로그래밍해주는 언어가 SQL이다.
관계형 데이터베이스
서비스 운영에 필요한 정보를 테이블 형태로 나눠서 저장한다. 테이블은 다수가 존재한다.
프로덕션 관계형 데이터베이스
- 웹 서비스나 앱 운영에 필요한 정보를 저장하는 데이터베이스이다.
- 빠른 처리속도에 초점을 둔다.
- MySQL, PostreSQL 등
데이터 웨어하우스 관계형 데이터베이스
- 처리속도 보다는 구조화된 큰 데이터 처리에 초점을 둔 데이터베이스이다.
- 회사 관련 데이터를 저장하고 분석함으로써 의사결정과 서비스 최적화에 사용한다. (보통 사용자들이 회사의 내부 직원들이다.)
- Google Cloud BigQuery, Snowflake 등
데이터 순환 구조
- 웹 서비스나 모바일 앱에서 생성되는 다양한 데이터들을 프로덕션 관계형 데이터베이스에 저장한다.
- 서비스에서 생성된 데이터들과 외부에서 만들어지는 데이터(이메일 마케팅, 페이스북 광고 등) 등 모든 데이터를 추출하여 데이터 웨어하우스에 저장한다.
- 데이터 웨어하우스를 바탕으로 지표를 설정하고 시각화를 통해 회사가 올바른 방향으로 가고 있는지 확인한다.
- 데이터 웨어하우스에 저장된 데이터(수집된 데이터)를 기반으로 사용자의 경험을 개인화하여 제품 서비스를 개선한다.
비관계형 데이터베이스
비구조화 데이터를 다룬다. NoSQL 데이터베이스라고 부른다.
프로덕션용 관계형 데이터베이스를 보완하기위한 용도로 많이 사용된다.
크게 4종류가 존재한다.
| 종류 |
서비스 |
| Key/Value Storage |
Redis, Memcache, … |
| Document Store |
MongoDB |
| Wide Column Storage |
Cassandra, HBase, DynamoDB |
| Search Engine |
ElasticSearch |
백엔드 시스템 구성도 예제 보기
프론트엔드와 백엔드
웹/앱 서비스를 간단하게 보면 크게 프론트엔드와 백엔드로 구성된다.
- 프론트엔드 : 사용자와 인터랙션을 하는 부분으로 보통 웹 브라우저 혹은 모바일 앱에서 사용자에게 노출되는 서비스를 말한다.
- 백엔드 : 프론트엔드 뒤에 숨어서 사용자에게 보이지는 않지만 실제 데이터를 저장/추가하고 사용자가 요구한 일을 수행하는 부분이다. 다양한 데이터베이스들이 사용된다.
다른 직군
시스템 구성의 변화 : 2 tier
데스크탑 응용프로그램에서 사용되는 아키텍처이다. 클라이언트와 서버, 두 개의 티어로 구성된다.
응용프로그램이 웹 서비스, 모바일 앱으로 변환되면서 3 tier로 바뀌기 시작했다.
시스템 구성의 변화 : 3 tier
웹 서비스에 많이 사용되는 아키텍처이다.
- 프리젠테이션 티어(Presentation Tier) : 프론트엔드
- 애플리케이션 티어(Application Tier) : 백엔드
- 데이터 티어(Data Tier) : 백엔드
관계형 데이터베이스의 중요성
- 어떤 구조이건 데이터베이스는 꼭 필요한 컴포넌트이다.
- 데이터베이스를 잘 다루는 것은 좋은 개발자가 되기위해 필요하다.
-
백엔드 개발자로서 중요한 부분
- 데이터 모델을 잘 만들고 그것을 프론트 개발자와 공유/협업
- 속도 개선을 위한 쿼리 성능을 모니터링하고, 필요 시 성능 개선을 수행(최적화)
관계형 데이터베이스 소개
관계형 데이터베이스
- 구조화된 데이터를 저장하고 질의할 수 있도록 해주는 스토리지
- 액셀 스프레드시트 형태의 테이블로 데이터를 정의하고 저장한다. 테이블에는 컬럼(열)과 레코드(행)이 존재한다.
관계형 데이터베이스를 조작하는 프로그래밍 언어 : SQL
관계형 데이터베이스의 구조
2단계로 구성된다.
- 가장 밑단에는 테이블들이 존재한다.
- 테이블들은 데이터베이스(혹은 스키마)라는 폴더 밑으로 구성된다.
테이블의 구조 (테이블 스키마라고 부르기도 함)
- 테이블들은 레코드들로 구성된다. (행)
- 레코드는 하나 이상의 필드(컬럼)로 구성된다. (열)
- 필드(컬럼)는 이름과 타입과 속성(primary key)으로 구성된다.
SQL 소개
SQL(Structured Query Language) : 관계형 데이터베이스의 테이블을 질의하고 조작해주는 언어
- DDL : 테이블의 구조를 정의하는 언어
-
DML
- 테이블에서 원하는 레코드들을 읽어오는 질의 언어
- 테이블에 레코드를 추가/삭제/갱신해주는 데 사용하는 언어
SQL은 빅데이터 세상에서도 중요하다.
- 구조화된 데이터를 다루는 한 SQL은 데이터 규모와 상관없이 쓰인다.
- 모든 대용량 데이터 웨어하우스는 SQL 기반이다.
-
Spark이나 Hadoop도 예외는 아니다.
- SparkSQL과 Hive라는 SQL 언어가 지원됨
- 백엔드/프론트엔드/데이터 분야에서 반드시 필요한 기본 기술
SQL의 단점
Star schema
- Production DB용 관계형 데이터베이스에서는 스타 스키마를 사용해 데이터를 저장한다.
- 데이터를 논리적 단위로 나눠 저장하고 필요 시 조인한다.
- 스토리지의 낭비가 덜하고 업데이트가 쉽다.
- 조인 자체가 시간과 리소스를 필요로 하기 때문에 속도의 저하를 가져올 수 있다.
Denormalized schema
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)
SQL DML - 테이블 데이터 조작 언어(2)
-
레코드 추가/삭제/수정 언어
- INSERT INTO : 테이블에 레코드를 추가한다.
- UPDATE FROM : 테이블 레코드의 필드 값을 수정한다.
- DELETE FROM : 테이블에서 레코드를 삭제한다. (모두 삭제도 할 수 있고, 조건으로도 일부만 삭제 가능)
- vs TRUNCATE : 모든 레코드를 삭제