Amazon AWS, MS Azure, Google GCP, Oracle OCI, IBM Cloud, Naver NCP 등등
기본용어
가상화
물리적 컴퓨터 하드웨어를 보다 효율적으로 활용할 수 있도록 해주는 프로세스이며, 이는 클라우드 컴퓨팅의 기반을 제공하는 기술
가상머신
- 가상 머신(VM)은 소프트웨어 형식으로 물리적 컴퓨팅을 시뮬레이션하는 가상 환경이다. - 이들은 일반적으로 VM의 구성, 가상 하드 드라이브의 스토리지, 그리고 특정 시점에 해당 상태를 유지하는 VM의 일부 스냅샷을 포함한 다수의 파일들로 구성되어 있다.
스냅샷
- 마치 사진 찍듯이 특정 시점에 스토리지의 파일 시스템을 포착해 보관하는 기술 - Windows OS의 복원 지점과 같이 장애나 데이터 손상 시 스냅샷을 생성한 시점으로 데이터를 복구 - 스냅샷은 원본 데이터를 그대로 복사해 다른 곳에 저장하는 백업과 달리 초기 생성 시 혹은 데이터의 변경이 있기 전까지는 스토리지의 공간을 차지하지 않는다. - 메타데이터(데이터에 대한 부가적인 정보)의 복사본에 해당하기 때문에 생성하는 데 오랜 시간이 걸리지 않고, 장애 상황이 발생해도 빠르게 데이터를 복원
Region(지역)
- Data Center가 위치한 지역 - IT 리소스를 생성할 Region은 선택 가능 - 대상 고객의 지역과 자원 생성할 Region이 최대한 가까워야 함 - 국가마다 자원사용 비용이 다름
Availability Zone(가용 영역)
- 하나의 Region은 두 개 이상의 Availability Zone으로 구성됨. - 줄여서 AZ로 표시
EC2
서버를 할당해주는 AWS 서비스
기능
인스턴스: 가상 컴퓨팅 환경
Amazon 머신 이미지(AMI) : 서버에 필요한 운영체제와 소프트웨어들이 적절히 구성된 상태로 제공되는 템플릿
인스턴스 유형 : 인스턴스를 위한 CPU, 메모리, 스토리지, 네트워킹 용량의 여러 가지 구성 제공
키 페어를 사용하여 인스턴스 로그인 정보 보호(AWS는 퍼블릭 키를 저장하고 사용자는 개인 키를 안전한 장소에 보관하는 방식)
인스턴스 스토어 볼륨 : 임시 데이터를 저장하는 스토리지 볼륨으로 인스턴스 중단, 최대 절전 모드로 전환 또는 종료 시 삭제됨
Amazon Elastic Block Store(Amazon EBS), 즉 Amazon EBS 볼륨을 사용해 영구 스토리지 볼륨에 데이터 저장
보안 그룹을 사용해 인스턴스에 연결할 수 있는 프로토콜, 포트, 소스 IP 범위를 지정하는 방화벽 기능
탄력적 IP 주소(EIP) : 동적 클라우드 컴퓨팅을 위한 고정 IPv4 주소
태그 : 사용자가 생성하여 Amazon EC2 리소스에 할당할 수 있는 메타데이터
Virtual Private Clouds(VPC) : AWS 클라우드에서는 논리적으로 격리되어 있지만 원할 때 마다 고객의 네트워크와 간편히 연결할 수 있는 가상 네트워크
EC2 구성도
사용법
고정적 IP를 사용하고 싶으면 탄력적 IP 설정
탄력적 IP 주소 할당 방법
Elasticbeanstalk
Elastic Beanstalk를 사용하면 애플리케이션을 실행하는 인프라에 대해 자세히 알지 못해도 AWS 클라우드에서 애플리케이션을 신속하게 배포하고 관리할 수 있습니다.
Elastic Beanstalk를 사용하면 선택 또는 제어에 대한 제한 없이 관리 복잡성을 줄일 수 있습니다. 애플리케이션을 업로드하기만 하면 Elastic Beanstalk에서 용량 프로비저닝, 로드 밸런싱, 조정, 애플리케이션 상태 모니터링에 대한 세부 정보를 자동으로 처리합니다.
Elastic Beanstalk는 Go, Java, NET, Node js, PHP, Python 및 Ruby에서 개발된 애플리케이션을 지원합니다. 애플리케이션을 배포할 때, Elastic Beanstalk가 선택된 지원 가능 플랫폼 버전을 구축하고 Amazon EC2 등의 AWS 리소스를 하나 이상 프로비저닝하여 애플리케이션을 실행합니다.
DB
RDS
DB 인스턴스는 클라우드에서 실행하는 격리된 DB 환경. 여러 사용자가 만든 DB가 포함될 수 있으며, 독립 실행형 DB 인스턴스에 엑세스할 때 사용하는 도구 및 어플리케이션을 사용해 엑세스할 수 있음.
AWS 명령줄 도구, Amazon RDS API 작업 또는 AWS Management Console을 사용해 간단히 DB 인스턴스를 만들고 수정할 수 있음.
직접 시스템 로그인 불가능.
RDS는 서버리스(serverless)가 아님.
Document DB
MongoDB API 워크로드의 완전 관리 및 유연한 확장이 가능한 문서전용 DB.
스토리지 및 컴퓨팅이 분리되어 각각을 독립적으로 조정.
개발자는 데이터 크기에 관계없이 지연 시간이 짧은 읽기 전용 복제본을 몇 분 내에 최대 15개까지 추가하여 읽기 용량을 초당 수백만 개의 요청으로 늘릴 수 있음.
99.99%의 가용성을 위해 설계되었으며 6개의 데이터 복사본을 3개의 AWS 가용 영역(AZ)에 복제
JSON 데이터 이용
유연한 인덱싱
EC2에 구축도 가능
MongoDB
MongoDB는 Document 지향 Database.
데이터 중복이 발생할 수 있지만 접근성과 가시성이 좋음.
스키마 설계가 어렵지만 스키마가 유연해서 Application의 요구사항에 맞게 데이터를 수용할 수 있다.
분산에 대한 솔루션을 자체적으로 지원해서 Scale-out이 쉽다.
확장시 Application을 변경하지 않아도 된다.
Dynamo DB
Amazon DynamoDB는 완전관리형 Key-Value 기반 NoSQL DB 서비스.
Auto-Scaling 제공(용량의 유연함)
유휴 시 암호화를 제공하여 중요한 데이터 보호와 관련된 운영 부담 및 복잡성을 제거.
원하는 양의 데이터를 저장 및 검색하고 어느 수준의 요청 트래픽도 처리할 수 있는 DB 테이블 생성 가능.
AWS Management Console을 사용하여 리소스 사용률 및 성능 지표를 모니터링할 수 있음.
온디맨드 백업 기능을 제공.
테이블 생성 시 스키마 생성 필요 없음.
RDBMS와 MongoDB의 구조적 차이
Document DB vs Dynamo DB
Network
Route53
가용성, 확장성이 뛰어난 DNS(Domain Name System) 웹 서비스
도메인 등록, DNS 라우팅, 상태 확인을 조합하여 실행할 수 있음.
public host zone과 private host zone이 존재.
DNS + monitoring + L4 + GSLB
Route53의 과정
AWS에서 도메인 등록하는 방법.외부 도메인 사용 방법
Certification Manager
AWS Certificate Manager(ACM)를 사용하면 AWS 서비스 및 연결된 내부 리소스에 사용할 공인 및 사설 SSL/TLS 인증서를 프로비저닝, 관리 및 배포할 수 있음. ACM은 SSL/TLS 인증서를 구매, 업로드 및 갱신하는 데 드는 시간 소모적인 수동 프로세스를 대신 처리해줌. SSL/TLS 인증서는 다른 곳에서 발급한 프라이빗 키 사용 가능.
사용법
사용할 SSL/TLS 인증서를 AWS 계정으로 요청하거나 가져온다.
DNS 또는 이메일 검증을 통해 요청된 인증서의 도메인 소유권을 검증하여 인증서 발급을 완료한다.
Elastic Load Balancing(ELB), Amazon CloudFront 등과 같은 다양한 AWS 서비스에서 새로 발급되거나 가져온 인증서를 사용한다.
특징
ACM 통합 서비스를 위한 무료 퍼블릭 인증서
관리형 인증서 갱신
손쉽게 인증서 받기
CloudFront
Amazon CloudFront는 뛰어난 성능, 보안 및 개발자 편의를 위해 구축된 콘텐츠 전송 네트워크(CDN) 서비스.
CDN은 데이터 사용량이 많은 어플리케이션의 웹 페이지 로드 속도를 높이는 상호 연결된 서버 네트워크
정적 콘텐츠 & 동적 콘텐츠
캐싱 / 동적 가속 / 엣지 로직 계산
특징
대기 시간 감소
보안 향상
비용 절감
사용자 정의 전송
IP 차단을 위해서는 WAF를 이용하면 됨.
Cloud Frond 작동 과정
Elastic Load Balancing(ELB)
로드 밸런싱은 애플리케이션을 지원하는 리소스 풀 전체에 네트워크 트래픽을 균등하게 배포하는 방법. 로드 밸선서(Load Balancer)는 서버에 가해지는 부하(로드)를 분산(밸런싱)해주는 장치 또는 기술
대상 그룹에 대상을 등록한다.
기본적으로 로드 밸런서는 대상 그룹에 대해 지정한 프로토콜과 포트 번호를 사용하여 등록된 대상으로 요청을 전송한다.
대상 그룹에 각 대상을 등록할 때 이 포트를 재정의할 수 있다.
ELB 작동 과정 / 로드 밸런서 종류
VPC(Virtual Private Cloud)
Amazon Virtual Private Cloud 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작할 수 있다. 이 가상 네트워크는 AWS의 확장 가능한 인프라를 사용한다는 이점과 함께 고객의 자체 데이터 센터에서 운영하는 기준 네트워크와 유사하다.
Peering Connection : 각각의 VPC를 연결할 수 있게 해줌
VPC 내에 여러가지 서브넷을 나눠서 운용 가능
기능
자체 데이터 센어테어 운영하는 기존 네트워크와 유사한 가상 네트워크.
서브넷 : VPC의 IP 주소 범위이다. 서브넷은 단일 가용 영역에 상주해야 한다. 서브넷을 추가한 후에는 VPC에 AWS 리소스를 배포할 수 있다.
VPC와 서브넷에 IPv4, IPv6 주소 할당 가능. 또한 퍼블릭 IPv4 및 IPv6 GUA 주소를 AWS에 가져오고 VPC 리소스에 할당할 수 있다.
라우팅 테이블을 사용하여 서브넷 또는 게이트웨이의 네트워크 트래픽이 전달되는 위치를 결정한다.
게이트웨이는 VPC를 다른 네트워크에 연결한다. 엔드포인트를 사용하여 인터넷 게이트웨이 또는 NAT 장치를 사용하지 않고 AWS 서비스에 비공개로 연결.
VPC의 간략한 구성 / VPC 생성 과정 / VPC 구성
CIDR(Classless Inter-Domain Routing)
클래스 없는 도메인 간 라우팅 기법
초록색(빨간 선 오른쪽부분) : 호스트 영역(내가 할당할 수 있는 IP 대역) 파랑, 분홍, 주황색: 네트워크 영역(네트워크 주소 범위) 빨간색 / : 사이더
IAM(Identity and Access Management)
AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹서비스. IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어한다. AWS 계정을 생성할 때는 완전한 액세스 권한이 있는 단일 로그인 ID로 시작(루트 사용자) 일상적인 작업에는 IAM을 사용하도록 권장.
특징
AWS 계정에 대한 공유
세분화된 권한
EC2에서 실행되는 어플리케이션을 위한 보안 AWS 리소스 액세스
멀티 팩터 인증(MFA)
ID 페더레이션
보장을 위한 자격 증명 정보
PCI DSS 준수
많은 AWS 서비스와의 통합
최종 일관성
무료 사용
IAM의 구성 및 흐름도
정책 : 어떤 리소스들에 접근할 수 있고 허가를 하는 지에 대해 기술한 것 역할 : 정책을 모아 놓은 것이며 각각의 서비스들에 대한 접근 권한을 줌.
S3
Amazon Simple Storage Service(Amazon S3) 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 모든 규모와 업종의 고객은 S3를 사용하여 데이터 레이크, 웹사이트, 모바일 어플리케이션, 백업 및 복원, 아카이브 등 다양한 사용 사례에서 원하는 양의 데이터를 저장하고 보호할 수 있다. 특정 비즈니스, 조직 및 규정 준수 요구 사항에 맞게 데이터에 대한 액세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공함.
기능
스토리지 클래스
스토리지 관리
액세스 관리
데이터 처리
스토리지 로깅 및 모니터링
분석 및 인사이트
강력한 일관성 준수
정적 웹사이트 호스팅 - 개별 웹 페이지는 정적 콘텐츠를 포함함. - 클라이언트 측 스크립트를 포함할 수 있음. - 동적 웹사이트는 PHP, JSP 또는 .NET 등 서버 측 스크립트를 포함한 서버 측 처리에 의존함.
S3 구성
CI/CD
CI(Continuous Integration) 모든 개발자가 코드를 공유 레포지토리에 하루에도 여러번 코드를 커밋하고 병합하는 것
CD(Continuous Delivery) 개발팀이 짧은 주기로 소프트웨어를 개발하고 운영 환경으로 안정적으로 배포하는 것
CI/CD 활동 CI/CD가 구성 될 경우 구성도
CodeCommit
소스에 대한 레포지토리의 형상 관리 도구.(Github 같은 것) 클라우드에서 자산(문서 소스코드, 바이너리 파일 등)을 비공개로 저장하여 관리하는 데 사용할 수 있도록 AWS 서비스에서 호스팅되는 버전 관리 서비스
특징
Benefit from a fully managed service hosted by AWS
Store your code securely
Work collaboratively on code
Easily scale your version control projects
Store anything, anytime
Integrate with other AWS and third-party services
Easily migrate files from other remote repositories
Use the Git tools you already know
CodeBuild
클라우드 상의 완전 관리형 빌드 서비스 소스코드를 컴파일하고 단위 테스트를 실행하여 배포 준비가 완료된 아티팩트를 생성 CodeBuild에서는 자체 빌드 서버를 프로비저닝, 관리 획장할 필요는 없음. Apache Mavern, Gradle 등과 같은 프로그래밍 언어 및 빌드 도구에 맞게 사전 패키지된 빌드 환경 제공 빌드 환경을 사용자 지정하여 사용자 고유의 빌드 도구를 사용 최대 빌드 요청 수에 맞게 자동으로 확장.
Code Build 작동방식
CodeDeploy
EC2 인스턴스, 온프레미스 인스턴스, 서버리스 Lambda 함수 또는 ECS 서비스로 어플리케이션 자동 배포 서비스 코드, 웹 및 구성파일, 패키지, 스크립트 등 어플리케이션 콘텐츠를 거의 무제한으로 배포 가능. 서버에서 실행되고 S3 버킷, Github 레포지 또는 Bitbucket 레포지에 저장되는 어플리케이션 콘텐츠, 서버리스 Lambda 함수 배포 가능.
CodePipeline
빠르고 안정적인 어플리케이션 및 인프라 업데이트를 위해 릴리스 파이프라인을 자동화하는 데에 도움이 되는 완전관리형의 지속적 전달 서비스 CI/CD 전 과정을 자동화.
특징
SW 릴리스 프로세스를 모델링하고, 서버를 설정하거나 프로비저닝할 필요성을 줄일 수 있음.
AWS Management Console 또는 AWS CLI(command line interface)를 사용하여 SW 릴리스 프로세스 단계를 정의할 수 있음.
피드백을 반복하고 각 코드 변경을 테스트하여 버그를 포착하는 새로운 기능을 신속하게 릴리스할 수 있음.
릴리스 프로세스의 모든 단계에서 자체 플러그 또는 사전 구축된 플러그인을 사용하여 필요에 맞추어 조정할 수 있음.
SELECT
channel,
COUNT(1) AS session_count,
COUNT(DISTINCT userId) AS user_count
FROM raw_data.user_session_channel
GROUP BY 1 -- GROUP BY channel
ORDER BY 2 DESC; -- ORDER BY session_count DESC
CTAS(CREATE TABLE table_name AS SELECT TABLE A)
간단하게 새로운 테이블을 만드는 방법. 자주 조인하는 테이블들이 있다면 CTAS를 사용해서 조인해두면 편리함
DROP TABLE IF EXISTS adhoc.joonghyeon_session_summary;
CREATE TABLE adhoc.joonghyeon_session_summary AS
SELECT B.*, A.ts FROM raw_data.session_timestamp A
JOIN raw_data.user_session_channel B ON A.sessionid = B.sessionid;
CTE
중복된 레코드 체크하기
SELECT COUNT(1)
FROM adhoc.joonghyeon_session_summary;
-- code A
SELECT COUNT(1)
FROM (
SELECT DISTINCT userID, sessionID, ts, channel
FROM adhoc.joonghyeon_session_summary
);
-- code B
-- 두개 결과 확인하기
with ds AS (
SELECT DISTINCT userID, sessionID, ts, channel
FROM adhoc.joonghyeon_session_summary
)
SELECT COUNT(1)
FROM ds;
-- CTE를 사용해서 중복제거 후 카운트(code B와 결과는 완전 같지만 CTE를 사용하면 ds 테이블을 계속 사용 가능)
최근 데이터의 존재 여부 체크하기(freshness)
SELECT MIN(ts), MAX(ts)
FROM adhoc.joonghyeon_session_summary
-- 타임스탬프 필드를 찾아보는 방법
Primary Key uniqueness가 지켜지는지 체크하기
SELECT sessionID, COUNT(1)
FROM adhoc.joonghyeon_session_summary
GROUP BY 1
ORDER BY 2 DESC
LIMIT(1)
-- sessionID를 그룹핑하여 COUNT를 해주고 COUNT된 값으로 내림차순으로 해주는 방법
값이 비어있는 컬럼들이 있는지 체크하기
SELECT
COUNT(CASE WHEN sessionID is NULL THEN 1 END) sessionid_null_count,
COUNT(CASE WHEN userID is NULL THEN 1 END) userid_null_count,
COUNT(CASE WHEN ts is NULL THEN 1 END) ts_null_count,
COUNT(CASE WHEN channel is NULL THEN 1 END) channel_null_count,
FROM adhoc.joonghyeon_session_summary;
-- NULL일 때 1을 리턴 아니면 0 리턴
데이터 엔지니어 : 내-외부 원천 데이터를 수집, 가공, 적재하여 데이터가 흐르는 파이프라인을 설계 및 구축하는 역할
파이썬, 자바/스칼라
SQL, DB
ETL/ELT (Airflow, DBT)
Spark, Hadoop
데이터 분석가 : 데이터를 분석 및 처리하여 의미 있는 비즈니스 결과를 창출하는 역할
SQL, 비즈니스 도메인에 대한 지식
통계 (AB 테스트 분석)
데이터 과학자 : 비즈니스 문제를 정의하고, 문제를 해결하기 위해서 데이터 분석 모델(e.g. ML/DL)을 만드는 역할
머신러닝
SQL, 파이썬, 자바/스칼라
통계
관계형 데이터베이스(RDB)
정의
구조화된 데이터를 저장하고 질의할 수 있도록 해주는 스토리지
엘셀 스프레드시트 형태의 테이블로 데이터를 정의하고 저장
테이블에는 컬럼(열)과 레코드(행)이 존재
대표적인 RDB
프로덕션 데이터베이스 : MySQL, PostgreSQL, Oracle
OLTP(OnLine Transaction Processing)
빠른 속도에 집중, 서비스에 필요한 정보 저장
서비스에 필요한 정보가 저장되어 있기에 쿼리문을 실행하면 서비스에 영향을 줄 수 있음.
데이터 웨어하우스 : Redshift, Snowflake, bigQuery, Hive
OLAP(OnLine Analytical Processing)
처리 데이터 크기에 집중, 데이터 분석 혹은 모델 빌딩등을 위한 데이터 저장
보통 프로덕션 데이터베이스를 복사에서 데이터 웨어하우스에 저장
구조
2단계로 구성됨
가장 밑단에 테이블들이 존재(엑셀의 시트에 해당)
테이블들은 데이터페이스(스키마)라는 폴더 밑으로 구성(엑셀의 파일에 해당)
스키마 : DB의 구조와 제약조건에 관해 전반적인 명세를 기술한 것 개체의 특성을 나타내는 속성(Attribute), 속성들의 집합인 개체(Entity) 그리고 개체 사이에 존재하는 관계(Relation)에 대한 정의와 이것들이 유지해야 하는 제약조건으로 이루어져 있음.
테이블의 구조(테이블 스키마)
레코드 들로 구성(행)
레코드는 하나 이상의 필드(열)으로 구성
필드(컬럼)은 이름과 타입 속성(primary key)로 구성
SQL(Structured Query Language)
관계형 데이터베이스에 있는 데이터(테이블)를 질의하거나 조작해주는 언어
DDL(Data Definition Language)
테이블의 구조를 정의하는 언어
DML(Data Manipulation Language)
테이블에서 원하는 레코드들을 읽어오는 질의 언어
테이블에 레코드를 추가/삭제/갱신할 때 사용하는 언어
단점
비구조화된 데이터를 다루는 데에 제약이 심함(Spark, Hadoop 같은 분산 컴퓨팅 환경이 필요)
RDB마다 SQL 문법이 조금씩 상이함.
Data Modeling
Star Schema
Production DB용 RDB 에서는 보통 해당 스키마를 사용해 데이터 저장
데이터를 논리적 단위로 나눠 저장하고 필요시 조인. 스토리지의 낭비가 덜하고 업데이트가 쉬움
Denormalized Schema
데이터 웨어하우스에서 사용하는 방식. 단위 테이블로 나눠 저장하지 않음.
스토리지를 더 사용하지만 조인이 필요 없기에 빠른 계산 가능
Star Schema / Denormalized Schema
데이터 웨어하우스
회사에 필요한 모든 데이터를 저장
SQL 기반의 RDB
프로덕션 DB와는 별도여야 함
데이터 웨어하우스는 고객이 아닌 내부 직원을 위한 DB
ETL 혹은 데이터 파이프라인 외부에 존재하는 데이터를 읽어서 데이터 웨어하우스로 저장해주는 데에 필요해지고 이를 ETL 혹은 데이터 파이프라인이라고 함.
데이터 인프라
데이터 엔지니어가 관리
더 발전하면 Spark와 같은 대용량 분산처리 시스템이 일부로 추가됨.
클라우드
정의
컴퓨팅 자원(하드웨어, 소프트웨어 등)을 네트워크를 통해 서비스 형태로 사용하는 것
No Provisioning(내가 준비할 필요 X), Pay As You Go(사용한 만큼 지불)
자원을 필요한 만큼 실시간으로 할당하여 사용한 만큼 비용 지불
장점
초기 투자 비용이 줄어듦 CAPEX(Capital Expenditure) vs OPEX(Operating Expenditure)
PrimaryKeyRelatedField : 기본 키를 사용하여 관계의 대상을 나타내는 데에 사용
StringRelatedField : str 메서드를 사용하여 관계의 대상을 나타내는 데에 사용
SlugRelatedField : 특정 대상의 필드를 사용하여 관계의 대항을 나타내는 데에 사용 사용법 : SlugRelatedField(slug_field="특정 필드명")
HyperlinkedRelatedField : 하이퍼 링크를 제공할 수 있는 RelatedField 사용법 : HyperlinkedRelatedField(view_name='urls에서 지정해준 name속성 값')
UNION(합집합)
여러개의 테이블들이나 SELECT 결과를 하나의 결과로 합쳐줌
UNION vs UNION ALL
UNION은 중복을 제거
EXCEPT(MINUS)
하나의 SELECT 결과에서 다른 SELECT 결과를 빼주는 것이 가능
INTERSECT(교집합)
여러 개의 SELECT문에서 같은 레코드들만 찾아줌
COALESCE(Expression1, Expression2, ...)
첫번째 Expression부터 값이 NULL이 아닌 것이 나오면 그 값을 리턴하고 모두 NULL이면 NULL을 리턴.
NULL 값을 다른 값으로 바꾸고 싶을 때 사용
NULLIF(Expression1, Expression2)
Expression1과 Expression2의 값이 같으면 NULL을 리턴한다.
LISTAGG
GROUP BY에서 사용되는 Aggregate 함수 중의 하나
ex) 사용자 ID별로 채널을 순서대로 리스트
SELECT
userid,
LISTAGG(channel, '구분자') WITHIN GROUP (ORDER BY ts) channels FROM raw_data.user_session_channel usc
-- userid 값으로 기준으로 channel을 각 레코드의 ts값 기준 오름차순으로 나열하라!(채널과 채널 사이에 구분자를 넣을 수 있다)
JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
GROUP BY 1
LIMIT 10;
WINDOW
Syntax
function(expression) OVER ( [ PARTITION BY expression] [ ORDER BY expression ] )
Useful function
ROW_NUMBER, FIRST_VALUE, LAST_VALUE, LAG
Math functions: AVG, SUM, COUNT, MAX, MIN, MEDIAN, NTH_VALUE
LAG
SELECT usc.*, st.ts,
LAG(channel,1) OVER (PARTITION BY userId ORDER BY ts) prev_channel
FROM raw_data.user_session_channel usc
JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
ORDER BY usc.userid, st.ts
-- 이전 채널 찾기(ts를 내림차순으로 하면 다음 채널 찾기도 가능)
JSON PARSING Functions
JSON의 포맷을 이미 아는 상황에서만 사용가능한 함수
JSON String을 입력으로 받아 특정 필드의 값을 추출가능 (nested 구조 지원)
>>> from django.contrib.auth.models import User
>>> User
<class 'django.contrib.auth.models.User'> # User의 타입
<QuerySet [<User: admin>]>
# Question 모델에 user 필드 추가 후
>>> from polls.models import *
>>> user = User.objects.first()
>>> user.questions.all()
>>> print(user.questions.all().query)
SELECT "polls_question"."id", "polls_question"."question_text", "polls_question"."pub_date", "polls_question"."owner_id" FROM "polls_question" WHERE "polls_question"."owner_id" = 1
#related_name을 지정해 줌으로써 user의 question을 불러올 때 questions로 가져올 수 있게 해줌
관리하기
1. serializer에 추가
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
questions = serializers.PrimaryKeyRelatedField(many=True, queryset=Question.objects.all())
# User은 여러 question을 가질 수 있음.
class Meta:
model = User
fields = ['id', 'username', 'questions']
# id, username, questions 필드
2. view에 추가
from django.contrib.auth.models import User
from polls_api.serializers import UserSerializer
class UserList(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(generics.RetrieveAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
3. url 추가
from django.urls import path
from .views import *
urlpatterns = [
path('question/', QuestionList.as_view(), name='question-list'),
path('question/<int:pk>/', QuestionDetail.as_view()),
# 유저 url 추가
path('users/', UserList.as_view(),name='user-list'),
path('users/<int:pk>/', UserDetail.as_view()),
serialize : Model Instance나 QuerySet과 같은 데이터를 JSON 형식의 파일로 변환 deserialize : JSON 형식의 데이터를 다시 Model Instance로 변환 API 서버에서는 JSON 형식으로 데이터를 주고받기 때문에 해당 작업이 필요하다.
# serializers.py
from rest_framework import serializers # pip install djangorestframework 필요
from polls.models import Question
class QuestionSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
question_text = serializers.CharField(max_length=200)
pub_date = serializers.DateTimeField(read_only=True)
# serialize를 할 때는 모델의 각 필드를 다 입력하여야 한다.
# serializer은 생성을 할 때 유효성 검사를 하며 통과한 데이터는 validated_data로 주어짐.
def create(self, validated_data):
return Question.objects.create(**validated_data)
def update(self, instance, validated_data):
# validated_data.get('question_text', instance.question_text) question_text를 가져오고 못가져 온다면 instance.question_text로 유지해라.
instance.question_text = validated_data.get('question_text', instance.question_text)
instance.save()
return instance
class Meta:
model = Question
fields = ['id','question_text', 'pub_date']
# 일일이 create, update를 정의할 필요 없이 위 코드를 이용하면 자동으로 생성됨.