개인적으로 백엔드 개발자는 데이터 베이스를 얼마나 잘 전달 할지에 대해 항상 많은 고민을 해야한다고 생각한다.
그래서 데이터베이스 튜닝 패턴이니, 관계형 혹은 비관계형이 좋은지 orm이 좋은지 쿼리를 직접 쓰는 것이 좋은지 어떻게 잘 쓸지 고민해보며 정리해 보았다.
근본부터 시작해보자.
데이터베이스다! 라고 말 할 수 있으려면 다음의 규칙을 지키고 있어야한다.
- 무결성
데이터가 처리되는 과정에서 변경되거나 손상되지 않는 것- 안전성
- 인증/인가되지 않은 사용자로부터 데이터를 보호함, 고장이 나면 안된다.
- 확장성
- 데이터 양이나 사용자가 늘어날 때 대처 가능
MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, Oracle Database등이 해당딘다.
relational의 앞글자를 따서 RDB 즉, 관계형 데이터 베이스라고 부른다.
그냥 엑셀창과 비슷하다고 생각하면 된다.

CustomerID는 CUSTOMER Table의 기본키로 외래키를 사용해서 ORDER Table과 관계를 맺을 수 있다.
아이디처럼 동일한 값을 가지지 않는 값을 기본키로 정해주고 외래키를 기반으로 테이블을 공유 할 수 있다.
그치만 테이블간의 관계를 명확히 알 수 있는 외래키는 개발 시 개발자를 자유롭게 하지 못하기도 한다.
성능 측면
외래키는 참조 무결성 제약조건을 통해 데이터 정합성을 유지한다. 그러기 위해서 추가적인 쿼리를 실행시키는데 오버헤드 비용이 크진 않다고 하지만 아무튼 컴퓨터의 리소스를 잡아먹긴 한다고 한다.
그래서 성능이 중요한 경우 외래키를 달지 않는 것이 나을 것이다.레거시 데이터와의 정합성
외래키를 추가하려고 해도 기존 데이터들의 제약조건때문에 추가가 힘든 경우도 있다. 이 경우엔 Enable Novalidate 옵션을 사용하면 해결이 가능하다.개발시 불편함
외래키의 참조 무결성 제약사항으로 인해 부모 - 자식 관계에서 자식 테이블의 row를 추가 할시 자식이 외래키로 참조 하고있는 부모 테이블의 row 가 있어야 DML 작업이 가능하다.
이 경우엔 Deffered 옵션을 사용해 해결 할 수 있다
값을 조작하거나 조회할 때는 SQL 쿼리문을 사용한다.
💡참고자료이 외에도 서버 확장 관점에서 관계를 끊어주는 것이 좋다.
스케일 아웃은 서버 확장 방식 중 서버를 추가하여 확장하는 것이다.
DDD방식에서 테이블별로 각각 하나의 데이터 베이스를 만들어 관리한다. 즉 서버 별로 데이터를 각각 관리 할 수 있게되며 확장도 쉬워진다.개발 난이도가 증가될 수 있지만 확장을 위해서는 기본키만으로 설계를 하는 것이 개인적으로 좋다고 생각한다.
키-값 메소드를 사용하는 비관계형 데이터 베이스로 redis가 대표적이다.

캐시는 요청결과를 저장해두어 빠른 서비스가 가능하게 해준다.

위 그림을 보자.
(1)클라이언트로 요청을 받으면 (2) 서버는 캐시 작업을 먼저 한다.
(3)그 후, DB 작업을 한 후 (4) 캐시작업을 다시 한다.
하지만 캐시는 메모리를 사용하기 때문에 용량부족에 주의해야한다.
따라서 캐시에 어느 데이터를 저장할 언제까지 저장하고 제거할 지 고려가 필요하다.
자주 조회되는 데이터, 결과값이 자주 변동되지 않고 일정한 데이터, 조회하는데 연산이 필요한 데이터를 캐싱해두면 좋다.
캐시의 자세한 내용에 대해선 다음 포스팅에 작성해 두었다.
메세지 브로커는 송신 측과 수신을 나눠 정보를 교환 할 수 있게 해준다.
발행/구독(pub/sub)로 나눠 발행된 메세지를 구독한 애플리케이션에 분배를 해준다.
레디스에선 이 구조를 채팅이나 알람기능 등에 사용한다.
발행자는 일방적으로 구독자들에게 메세지를 보내므로 수신 확인이 필요 없는 구조에서 사용하는 것이 좋다.
웹 소켓은 네트워크 통신이 필요한 방면 레디스는 메모리 기반이므로 빠르게 메세지를 전달 할 수 있다.
Neo4j, OrientDB등이 해당된다.
그래프 형태로 데이터가 저장되므로 node와 edge를 사용해서 관계를 나타낸다.
ex) 알고리즘에서 노드와 노드의 거리 이런 것을 떠올리면 된다.
SNS등 관계가 복잡한 것들이 많은 상황에서 사용된다.
MongoDB, CassandraDB, Couchbase 등이 해당되는 것으로 구조가 매우 자유로운 것이 특징이다.
일반적으로 JSON형태를 띄고 있다.
형식이 자유로워야 하는 기능을 개발 할때 사용한다.
ex) 템플릿이 다 다른 게시글

consistency(일관성)
availability(가용성)
partition-tolerance(분산처리)
위 이미지를 보다시피 세 가지를 모두 다 가질 수는 없다
다만 특징이 명확하니 서비스의 특성에 따라 올바른 데이터 베이스를 선택해서 사용하도록 하자
화이팅