RDB(Relational Database)와 NoSQL(Not Only SQL)의 차이
모든 데이터를 2차원 테이블로 표현하며, 각 테이블의 단위는 row(record, tuple)과 column(field, item)으로 이루어져있습니다. sql을 사용해 Join 등의 관계형 연산을 하며, 하나의 고성능 머신에 데이터 저장하는 수직적 확장 방식
테이블 간 관계를 정의하지 않으며, 데이터 모델 자체가 독립적으로 설계 따라서 데이터를 여러 서버에 분산시키는 분산형 구조에 용이하고, 대용량 데이터 처리에 적합
Update가 많이 이루어지지 않는 시스템이 좋으며 또한 막대한 데이터를 저장해야 해서 Database를 Scale-Out를 해야 되는 시스템에 적합
따라서 "데이터가 자주 수정되는 경우", 혹은 "스키마가 변경될 여지가 없고, 명확한 스키마가 중요한 경우" 사용되는 것이 좋다 (sns 같은 서비스)
DB 인덱스 사용 시 장점
db에서 인덱스를 사용하는 이유는 검색 성능 향상이다.
데이터베이스 인젝션(Database Injection)
SQL 인젝션은 웹 사이트의 보안상 허점을 이용해 특정 SQL 쿼리문을 전송하여 공격자가 원하는 데이터베이스의 중요한 정보를 가져오는 해킹 기법을 말한다. 대부분 클라이언트가 입력한 데이터를 제대로 필터링하지 못하는 경우에 발생한다.
ORM이란? 왜쓰는가?
Object-Relational Mapping 으로 관계형db 엔티티 접근시 js 객체(oop) 다루듯이 취급할 수 있다.즉, 통역사, 중개자 역할을 한다. 원래, 클래스와 테이블은 서로가 호환가능성을 두고 만들어진것이 아니라 불일치가 발생하는데, ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다. ORM을 이용하면 SQL문을 짤 필요 없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있게 된다.
매핑하게 되면 정보가 명확해지기 때문에 ERD를 보는 것에 대한 의존도를 낮출수 있다. 대량의 SQL Query를 쓰지 않고도 객체간의 관계를 풀어낼 수 있기 때문에 개발자가 좀 더 직관적으로 객체간의 관계를 파악할 수 있다.
ODM이란? 왜쓰는가?
Object Document Mapping의 약자이다. ORM과 비슷하다. 객체와 문서를 1대 1로 매칭해준다.
즉, MongoDB에 있는 데이터를 NodeJS에서 JS 객체로 사용할 수 있도록 해준다.
스키마가 없는 nosql에 데이터 형식을 미리 정의해 코드 작성, 프로젝트 관리에 유용하다. 기본적으로 join을 제공하지 않는데, join과 유사한 기능인 aggregate라는 복잡한 쿼리대신 popultae를 사용하여 간단하게 구현할 수 있다.
RDBMS와 NoSQL은 언제 사용하는 것이 좋을까?
rdbms는 상대적으로 읽기 속도 가빠르기 때문에 읽기 작업이 많은 경우 사용하기 용이할것이고 NoSQL은 쓰기 작업에 유리 하기때문에 관련작업에 사용하기 용이할 것이다.
DB ACID란?
은행에서 계좌이체를 트랜잭션이라고 할때 계좌이체는 전체적으로 송신자 금액 감소, 수신자 금액 증가가 한동작으로 이루어져야 한다는 것을 의미한다.
원자성 작업들이 실행되다가 중단되지 않는 것을 보장하는 능력, 이체가 성공할 수도 실패할 수도 있지만, 돈을 빼 는 작업에만 성공하고 받는 쪽에 돈을 넣는 작업을 실패해서는 안된다.
일관성 트랜잭션이 실행을 성공적으로 완료하면, 언제나 일관성있는 db 상태로 유지하는 것을 의미 한다. 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단
독립성 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미 이것은 트랜잭션 밖에 있는 어떤 연산도 중간 단게의 데이터를 볼수 없음을 의미 => 은행 관리자는 이체 작업을 하는 도중 쿼리를 실행하더라도 이체하는 양 쪽을 볼 수 없다.
지속성 성공적으로 수행된 트랜잭션은 영원히 반영 시스템문제, db 일관성 체크등을 하더라도 유지되어야 한다. 모든 트랜잭션은 로그로 남고, 시스템 장애 발생 전 상태로 되롤릴 수 있다.