데이터베이스 7

[개발] SQL vs NoSQL

SQL과 NoSQL의 차이가 무엇인가요? 누군가가 위와 같은 질문을 한다면 무엇이라고 답하나요? 질문한 사람은 면접관, 친구 또는 동료가 될 수 있습니다.관계형 DB vs 비관계형 DB스키마가 정적임 vs 동적임MySQL, PostgreSQL이 있음 vs MongoDB, DynamoDB가 있음등등.. 각자 자신만의 방식으로 답변을 할 것 같습니다.  최근에 저는 이러한 질문을 받으면 그 히스토리에서 답을 찾는 방법에 감동을 받아서 해당 내용으로 답변해보고자 합니다.SQL데이터베이스는 언제부터 필요했을까요? 아마 컴퓨터가 사용되기 시작하고 데이터가 많아짐에 따라 관리되기 시작했을겁니다. 더 이상 파일만으로 관리하기 힘들고 복잡한 join연산과 집계를 위해 데이터베이스에 대한 수요가 나타나기 시작했습니다. ..

[개발] RDB에서 Incremental PK와 UUID PK

나는 요즘 관계형 데이터베이스로 개발을 진행하고 있다. 근데 최근 들은 내용이 꽤 흥미로워서 기록으로 남겨보려고 한다. 관계형 데이터베이스에서의 PK 관계형 데이터베이스에는 여러가지 키라는 개념이 존재한다. 기본키, 수퍼키, 후보키 등이 존재하는데 여기서는 기본키(Primary Key)에 집중하려고 한다. 데이터베이스 교과서를 보면 PK를 다음과 같이 정의한다. 릴레이션 안에서 튜플을 구별하기 위한 수단으로 주 키(primary key)라는 용어를 사용한다. 릴레이션은 테이블을 튜플은 row를 의미하므로 PK는 곧 테이블 안에서 unique한 컬럼을 의미하게 된다. 그 중에서 가장 흔하게 사용되는 PK는 아마 auto_increment옵션이 붙어있는 integer일 것이다. 이는 데이터베이스 내부에서 자..

[개발] 샤딩이란 것을 해보자! (3)

샤딩 1 샤딩 2 조건이 포함된 조회 쿼리 특정 이름이 들어간 유저를 찾고싶다고 하자. # datasource.py class DataSource: ... def select_by_name_exact(self, name): ix = insert_route(name) query = f"SELECT * FROM user WHERE name = '{name}'" cursor = self.cursors[ix] cursor.execute(query) result = cursor.fetchall() return result 삽입과 유사하게 사용하면 된다. 범위 조건이 포함된 조회 쿼리 이제 살짝 복잡해지기 시작한다. aa ~ bb를 찾는다고하면 1번 인스턴스에서 끝나지만 aa ~ zz를 찾는다면 1~4번 인스턴스를..

[개발] 샤딩이란 것을 해보자! (2)

지난시간에 이어 샤딩을 사용해보자. 라우터 생성 우리는 이름을 기준으로 라우팅을 할 것이다. 영어 소문자만 들어온다고 가정하자. 데이터베이스가 4개이니까 a~g로 시작하는건 1번, h~n은 2번, o~u는 3번, v~z는 4번 데이터베이스에 넣도록 하자. # router.py def insert_route(name: str): assert len(name) > 0 ch = name[0] return (ord(ch) - ord('a')) // 7 정말 간단하다. 위 라우터는 삽입할 때 사용하는 라우터이다. 삽입쿼리 추가 # datasource.py from router import insert_route class DataSource: ... def insert(self, name: str, age: in..

[개발] 샤딩이란 것을 해보자! (1)

데이터베이스 샤딩(Sharding)이란 동일한 스키마의 데이터베이스를 여러 인스턴스에 나누어 저장하는 것을 말한다. 이중화와는 다른 개념이다. 이중화는 하나의 데이터를 여러 곳에 저장하지만 샤딩은 하나의 데이터를 하나의 인스턴스에 골라서 저장을 한다. 보통은 잘 사용하지 않고 데이터가 억수로 많은 경우에 사용한다. 샤딩을 사용하면 데이터가 많은 경우에 단일 인스턴스보다 성능이 빨라지고 단일 인스턴스에 저장할 수 없는 만큼의 데이터를 가지고 있다면 샤딩을 사용해야만 할 것이다. 샤딩에는 여러 종류가 있지만 여기에서는 Range Sharding이란 것을 사용해 볼 예정이다. Range Sharding 유저테이블을 샤딩한다고 생각하자. 인스턴스를 4개(개발자가 정하면 된다.) 두고 1~3월 생일은 1번, 4~..

[스프링] 8. JPA

JPA (Java Persistence API) 현재 자바에서 ORM기술 표준으로 알려져 있다. 스프링만을 위한 것은 아니고 자바 전반적으로 사용되는 듯 하다. 지난 시간 도메인 객체를 만들 때 Id, GeneratedValue, Entity 어노테이션이 그 예이다. 메소드명 의미 save 객체 하나를 삽입한다. saveAll 여러개의 객체를 동시에 삽입한다. findById 특정 Id를 가진 객체를 검색한다.(Optional로 반환) findAll 테이블에 존재하는 모든 객체를 검색한다. deleteById 해당하는 Id를 가진 객체를 삭제한다. deleteAll 모든 객체를 삭제한다.(위험) delete 해당 객체를 삭제한다. deleteAllInBatch 모든 객체를 삭제하는데 한번의 SQL만 호출..

[스프링] 7. Object Relational Mapping

지난시간에 DTO를 위해 Object Mapping이 자동적으로 적용된다는 사실을 알게 되었다. Object Mapping은 데이터 전송을 위한 객체를 json으로 변환해주는 작업이었는데 이번엔 데이터베이스에 자동으로 매핑해주는 Object Relational Mapping(ORM)을 알아보려고 한다. Object Mapping : Object $\leftrightarrow$ Json Object Relational Mapping(ORM) : Object $\leftrightarrow$ Relation(Table) ORM을 모르는 상태라면 데이터베이스를 조작하기 위해 SQL문법을 배우고 직접 사용하며 해당 언어와 데이터베이스를 연결하는 라이브러리를 알아야 한다. (실제로 내가 ORM을 몰라서 School..