SQL이란?
관계형 Database 관리 시스템(RDBMS)의 데이터를 관리하기위한 언어
SQL 명령어
- DDL: 데이터베이스 or 테이블의 생성/변경/삭제 작업
- DML: 데이터의 검색, 삽입, 변경,삭제 작업 실질적 데이터 처리
- DCL: 데이터 접근 권한
- TCL: 트랜재견을 다룸
Data Type
- VARCHAR(size): 우리가 알고있는 String 타입이 이에 해당됨(MAX:255)
- INT(m): 표준 Integer [m은 자리수 개수]
- BIGINT(m)
- Float
- Date
- Time 이외에도 여러 타입들이 있다
Data CRUD
Create,Read,Update,Delete
본인이 설계한 데이터베이스의 각각 테이블에서 CRUD가 발생하는지 확인하기!
SQL vs NoSQL
관계형 DB vs 비관계형 DB
주로 사용하는 DataBase -> Relation DB
저장해야할 데이터가 많아지면서 도입되는 DB -> Non-relational DB
Scalability: 데이터의 확장
SQL - Vertical Scaling(수직적 확장)
HW Upgrade -> 성능 향상
하나의 서버에는 향상의 한계 존재
NoSQL - Horizontal Scaling(수평적 확장)
Add Server -> 성능 향상
서버의수를 늘리면 DB 증설(= 한계 X)
Schema: DB에 어떤 구조로, 어떤 제약조건으로 저장되어야 하는지 정의하는 것
SQL - strict schema
테이블 구조(Field & Record)
Field를 정의하지 않으면 데이터 저장 불가
NoSQL - no schema
Document 구조(key-value)
Document -> Collection -> Database (Field 정의 X)
Property
SQL - ACID
ACID: DB의 Transaction의 안전성
-
Atomicity(원자성) Transaction 작업이 부분 실행 or 중단 X
-
Consistency(일관성) 미리 정의된 규칙에서만 수정 가능
-
Isolation(고립성) Transaction 수행시 다른 작업 껴들지 X
-
Durability(영구성) 수행된 Transaction은 영원히 반영
NoSQL - CAP Theorm CAP: 분산 시스템은 CAP의 3가지 속성을 모두 만족시키는 것 불가능 (오직 2가지)
- Consistency(일관성) 모든 요청은 최신 데이터 or 에러 응답 (분산된 DB의 하나의 특정 데이터 수정시 다른 DB에서도 수정된 데이터를 응답받음)
- Availability(가용성) 모든 요청은 정상 응답 (특정 DB가 장애가 나도 서비스는 가능)
- Partitions Tolerance(분리 내구성) DB간 통신 실패하는 경우에도 시스템 정삭 작동
ORM이란?
ORM(Object Relational Mapping)
객체 - 관계 매핑 OOP(Object Oriented Programming)의 객체와 RDB(Relational Database)의 테이블을 자동으로 연결
- Class와 Table은 호환가능성을 두고 만들어진 것이 아니기 때문에 불일치 발생 가능 -> SQL문으로 해결 가능
ORM 장점
- 완벽한 객체 지향적 코드 (SQL없이 프로그래밍 메서드로만 조작 가능)
- 재사용, 유지보수, 리팩토링 용이성
- DMBS 종속성 하락
ORM 단점
- ORM이 모든 것을 해결 불가 프로그램이 커지면 SQL 튜닝이 필요
객체-관계 불일치
- Granularity(세분성) 경우에 따라 DB Table보다 Class가 더 많은 모델이 생길 수 있음
- Inheritance(상속성) RDBMS는 PK를 이용해 동일성 정의 But Java 객체 식별 & 동일성 모두 정의
- Associations(연관성) OOP reference를 통해 연관성 표시 RDBMS 방향성없는 FK 사용
- Navigation(탐색) Java & RDB 객체 접근 방법 상이
- ORM Framework
JPA/Hibernate(JAVA), Sequelize(Node.js), Django ORM(Django)
GraphQL vs RESTful
Server API (혹은 Server-side web API): 는 적절한 요청을 하였을 때, 그에 맞는 응답을 되돌려주는 창구 (Endpoint) 를 Web 을 통해 노출한 것 정보를 요청하고 수정하기위해 만들어지는 것 다양한 방법론
- REST
- GraphQL
REST(REpresentational State Transfer): 모든 Resource (자료, User, …) 들을 하나의 Endpoint 에 연결해놓고, 각 Endpoint 는 그 Resource 와 관련된 내용만 관리하게 하자는 방법론
EX) 어떤 API 가 Community site 용 API 이며, 이 API 를 사용해 사용자들이 글을 작성/수정/삭제 할 수 있고, 각 글에 댓글을 작성/수정/삭제 가능 이때, API 의 Endpoint 를 다음과 같이 구성하면 REST 의 조건을 간략히는 만족하게 된다.
- 글 관련 API = /posts
- 글 작성 = POST /posts
- 글 수정 = PATCH /posts/[postid]
- 글 삭제 = DELETE /posts/[postid]
- 댓글 관련 API = /posts/[postid]/comments
- 댓글 작성 = POST /posts/[postid]/comments
- 댓글 수정 = PATCH /posts/[postid]/comments/[commentid]
- 댓글 삭제 = DELETE /posts/[postid]/comments/[commentid]
이런 REST 의 조건을 만족하는 API 를 RESTful API라고 함
GraphQL(Graph Query Language): GraphQL 은 이런 Query Language 중에서도 Server API 를 통해 정보를 주고받기 위해 사용하는 Query Language 이다.
(Query Language 는 정보를 얻기 위해 보내는 질의문(Query)을 만들기 위해 사용되는 Computer 언어의 일종)
GraphQL 방법론 도입 이유
RESTful API 로는 다양한 기종에서 필요한 정보들을 일일히 구현하는 것이 어려움 -> iOS 와 Android 에서 필요한 정보들이 조금씩 달랐고, 그 다른 부분마다 API 를 구현하는 것이 어려움 -»정보를 사용하는 측에서 원하는 대로 정보를 가져올 수 있고, 보다 편하게 정보를 수정할 수 있도록 하는 표준화된 Query language 탄생
GraphQL 장점
- HTTP 요청횟수 감소
- HTTP 응답사이즈 감소
선택 기준
GraphQL
서로 다른 모양의 다양한 요청들에 대해 응답할 수 있어야 할 때 대부분의 요청이 CRUD(Create-Read-Update-Delete) 에 해당할 때
RESTful
HTTP 와 HTTPs 에 의한 Caching 을 잘 사용하고 싶을 때 File 전송 등 단순한 Text 로 처리되지 않는 요청들이 있을 때 요청의 구조가 정해져 있을 때
그러나 더 중요한 것은, 둘 중 하나를 선택할 필요는 없다는 것이다.