본문 바로가기
Server

10. 데이터베이스(1)

by Doromi 2018. 1. 12.
728x90
반응형

5-1. 데이터베이스란

 

관계형 데이터베이스는 관계형 모델을 기초로 한 데이터베이스

데이터를 표의 형태, 즉 테이블 형태로 표현하는 것

데이터 베이스를 설계하는 정규화 과정에서 E-R(개체-관계) 모델과 이것을 그림으로 표현한 다이어그램은 필수적으로 만들어야 하는 문서이다.

 

NoSQL은 관계형 모델을 쓰지 않고 분산 처리가 용이하여 클러스터로 동작이 가능한 오픈소스 데이터베이스이다.

 

5-1-1. ACID 트랜잭션

 

ACID 트랜잭션은 관계형 데이터베이스에서 여러 개의 SQL 연산을 하나의 단일 트랜잭션으로 처리하는 것을 의미한다.

여러 개의 테이블에 대해서 읽고 쓰고 하는 행동을 하나의 연산처럼 사용하는 것이다.

 

Atomicity 원자성 : 여러 개의 SQL 연산이 하나의 연산처럼 동작해야 한다.

Consistency  일관성 : 같은 시점에서 접속하는 클라이언트들은 항상 같은 데이터를 보고 있어야 한다.

Isolation 고립성 : 트랜잭션이 수행되는 동안에 다른 연산이 끼어들지 못한다.

Durability 영속성 : 트랜잭션이 완료된 이후의 데이터는 업데이트된 상태 그대로 영원히 반영되어 있다.

 

예로, ets:insert() 함수는 Atomicity와 Isolation을 지원한다.

중간 단계를 분해할 수 없다. 100프로 완료되서 insert되었거나 실패하거나 둘 중 하나 (Atomicity)

함수가 종료될 때까지 다른 누구도 insert되는 중간에 끼어들 수 없다(Isolation)

 

NoSQL 데이터베이스는 대부분 ACID 트랜잭션을 지원하지 않는다.

 

5-1-2. CAP 정리

 

CAP 정리에 의하면 시스템은 일관성, 가용성, 분단 허용성 세가지 속성 중에서 두 가지만 가질 수 있다는 것이다.

CA,CP,AP

세가지 속성을 모두 포함한 시스템은 존재할 수 없다는 것이 CAP정리이다.

 

5-1-3. 얼랭과 데이터베이스

 

얼랭은 어떤 데이터베이스든 연동이 가능하다.

데이터베이스와 연동을 위해서는 ODBC를 사용해도 되고, 관련된 데이터베이스 라이브러리들을 다운받아서 이용해도 된다.

사실 얼랭은 딱히 외부의 데이터베이스 프로그램을 찾지 않아도 된다.

4장에서 배운 ETS나 Dets를 사용해도 되고, 얼랭에 내장되어 있는 Mnesia라는 데이터베이스를 사용해도 된다.

 

5-2. Mnesia

 

이것은 얼랭에 내장되어 있는 분산형 데이터베이스

이는 기하급수적으로 증가하지 않는 데이터, 즉 모바일 게임에서 유저의 기본 데이터라던지, 고정되어 예상이 가능하고,

데이터의 크기가 크지 않을 때에 사용하는 것이 적합하다.

 

가장 큰 장점은 개발자의 입장에서 어플리케이션에 데이터 베이스를 쉽게 내장할 수 있다는 것이다.

ACID 트랜잭션을 지원하는 점도 장점이다.

 

관계형 데이터베이스와 비슷하게 데이터 저장 공간은 테이블을 기반으로 한다.

그리고 테이블에 저장하는 데이터는 얼랭의 record 형식을 가지고 있어야 한다.

 

5-2-1. Record

 

4장에서는 아이디와 패스워드를 저장하는 튜플을 {Id, Password} 이렇게 만들어서 사용했었다.

Record는 각각의 항목에 이름을 부여하는 기능이다.

예를 들어 {Id, Password}를 record 형식으로 만들면

-record(users, {Id, Password}).

이것은 users라는 record 데이터 구조를 정의한 것으로 id와 password 라는 필드를 가지고 있다.

users는 테이블 이름이라고 생각하면 쉽다.

 

#users{id=blue, password=sky}

 

#다음에 record  이름이 나오고 {}안에 필드와 데이터의 값을 적으면 된다.

 

 

src폴더에 새로운 파일 추가

header file을 선택해야 한다.

 

 

 

 

 

 

mon_record.hrl에 users record를 정의해주고 서버를 실행시킨다.

 

얼랭에서 record는 컴파일 타임에 적용되는 기능이라서 쉘에서 바로 사용할 수 없다.

얼랭 쉘에서 정의된 record 파일을 적용시키기 위해서는 rr(moduleName)을 이용

 

 

 

 

 

1. 리턴값으로 정의된 record들의 리스트가 보인다.

여기서는 [users] 리턴

이렇게 되면 쉘에서도 users란 record를 사용할 수 있다.

 

2.U에 users record의 데이터를 입력

3,4.필드를 따로따로 확인하기 위해서는 .필드이름 형식을 사용한다.

 

5,6.내용을 변경하고 싶다면 원래 있던 변수는 변경 불가

새로운 변수를 정의한다.

 

7,8,9.패턴 매칭을 이용해서 각각의 값만 따로 빼올 수도 있다.

 

10.record필드의 값에 record를 대입하는 것도 가능하다.

 

11.record 데이터 타입이 내부적으로는 튜플 형식

 

 

 

 

 

 

5-2-2. Schema와 얼랭 노드

 

Mnesia를 사용하려면 먼저 schema를 생성해야 한다.

이는 Mnesia 데이터베이스를 초기화하는 과정이다.

schema를 생성하기 위해서는 mnesia:create_schema(NodeList)를 실행하면 된다.

schema를 생성하면 Mnesia의 데이터를 저장하는 디렉토리가 자동으로 생성된다.

인자값으로 노드리스트는 초기화할 얼랭 노드들의 리스트를 의미한다.

 

얼랭 노드는 실행한 얼랭 런타임 시스템의 이름을 의미한다.

얼랭 시스템 하나하나가 얼랭의 노드라고 불린다.

node()를 실행하면 현재 자신의 노드 이름을 알 수 있다.

 

이름을 설정하기 위해서는 실행할 때에 -sname 노드이름 으로 설정을 해주면 된다.

 

vm.args파일을 수정한다.

마지막줄에

-sname node1

추가한다.

 

 

서버를 다시 실행하면 이 팝업창이 뜬다.

액세스 허용을 클릭하도록 한다.

이 exe는 얼랭 노드들 간의 TCP/IP 통신을 담당하는 역할

기본적으로 4369번 TCP 포트를 사용

 

 

 

 

 

 

 

이렇게 실행된 쉘은 예전 쉘과 차이점이 있다.

 

 

현재 노드의 주소가 쉘에 표기된다.

 

 

 

 

Mnesia를 초기화할 때에 mnesia:create_schema([node()])

mnesia:create_schema()를 직접 실행한 얼랭의 노드가 Master 노드가 되며,

NodeList에 적힌 자신을 제외한 다른 얼랭 노드들은 Slave 노드가 된다.

mnesia가 동작 중일 때는 schema를 생성할 수 없다.

이유는 schema의 생성이란 곧 mnesia를 초기화한다는 의미.

 

 

728x90
반응형

'Server' 카테고리의 다른 글

12. 유저 세션(1)  (0) 2018.01.15
11. 데이터베이스(2)  (0) 2018.01.13
9. 로그인(3)  (0) 2018.01.11
8. 로그인(2)  (0) 2018.01.11
7. 로그인(1)  (0) 2018.01.10