1. DBMS / DBS / FS
MariaDB는 데이터베이스 매니지먼트 시스템(DBMS)으로, DBS(데이터베이스 시스템)에 의해 관리된다. (MariaDB를 사용하려면 데이터베이스 시스템(DBS)을 설치하고 관리해야하는 것!)
DBMS
DBMS는 데이터베이스 시스템을 관리하고, 테이블과 같은 데이터 구조를 관리 DBMS는 하드 디스크의 일부 공간을 할당받아 데이터베이스 파일을 저장하고 관리 그니까, DBMS가 하드디스크에 할당된 DBS를 관리
DBS
데이터의 구조화된 표 형태인 테이블을 관리하고, 데이터의 SELECT, INSERT, UPDATE, DELETE 등의 작업을 수행 즉, DBS에는 table이 들어있어서 table space라고 부름. 테이블이 모여있는 공간!!
FS (File System)
FS(File System) = 파일을 관리하는 시스템. os가 관리하며 파일의 생성, 읽기, 쓰기, 삭제 등의 작업을 수행한다. 하드디스크는 FS의 저장장치 중 하나이다.
일반적으로 DBMS가 설치되면 하드 디스크는 자기를 잘라서(?) 데이터베이스 시스템(DBS)을 할당해 준다. DBMS가 FS를 관리하진 않음. DBMS는 DBS의 테이블을 관리한다 그래서 나머지는 FS로 HDD가 관리하고, 저 쪼갠 파란 부분은 DBMS가 관리한다. (자기의 살을 내주는구나...)
CPU도 HDD도… 모두 OS가 관리
APP은 소프트웨어 관리 ㅎㅎ
MariaDB = DBMS = 데이터베이스 매니지먼트 시스템(그러니 메모리에 떠있는 거겠지 프로세스니까)
즉, 데이터베이스를 관리하는 프로세스다!!
MariaDB의 리스너 포트는 3306번!
즉, 3306번 포트를 사용하는 서버 소켓으로 작동하며
클라이언트는 3306번 포트를 통해 MariaDB에 연결할 수 있다는 것
(3306은 서버 소켓이구나~ while을 도는 리스너구나.)
만약, 3명의 클라이언트가 통신할 때, 3명 다 3306으로 때려서 연결을 하겠지?
그럼 스레드는 4개가 있는 것. (소켓 수는 클라이언트 +1, 그러니 스레드도 +1)
2. 마리아DB 작동 원리 (+쿼리문)
버퍼에 SELECT 쿼리문을 넣고 flush를 한다. 그럼 br이 받음
[ HeidiSQL이란? ]
원격 접속 툴. MariaDB 데이터베이스에 접속하기 위해 사용 HeidiSQL을 사용하여 MariaDB에 접속하기 위해서는 'IP 주소, 포트 및 프로토콜'을 입력
[ select 쿼리문 ]
SELECT 쿼리문은 데이터베이스에서 데이터를 조회할 때 사용한다. 쿼리문을 클라이언트에서 데이터베이스 서버로 전송할 때, 보통 버퍼에 담겨서 전송된다. 데이터베이스 서버는 받은 쿼리문을 실행하여 해당 조건에 맞는 데이터를 찾고, 그 결과를 테이블 형태로 구성하여 버퍼에 저장, 그 결과 테이블을 테이블 형태로!! 클라이언트로 전송(반환)한다.
마리아DB는 HeidiSQL에게 SELECT 쿼리문을 통해
조회된 결과값을 반드시 제공!! 결과를 테이블로 줌!!
select를 잘못하면 캐싱 구조가 변경되서 성능에 영향을 줄 수 있다.
= I/O로 들어가서 속도가 느려짐 (해당 사항 아래쪽에서 자세히 설명)
[ insert, update, delete 쿼리문 (애네는 write) ]
write들은 (insert, update, delete 쿼리문) 마리아DB가 돌려줄 결과값이 없다!!
해당 작업이 성공적으로 수행되었는지를 확인하고 결과를 반환하지만,
수정된 데이터의 내용은 반환하지 않는다.
즉, 내가 직접 select * from 이런걸 해봐야 수정된 데이터 조회가 가능
insert, update, delete = 변경된 행의 개수를 리턴 해 준다.
write는 쓰는 것 뿐만 아니라 수정, 변경도 해당 (read는 그냥 읽는 것)
a란 폴더에 사진이 있다고 가정하자.
write를 통해 기존 사진을 수정, 삭제, 추가 할 수 있는 것… 정도로 이해하면 될 듯?
데이터 베이스 프로토콜 [ -1, 0, 1 등]
insert, update, delete 처럼 결과로 건네줄게 없으면 보통 숫자를 반환한다. 한 번에 insert 쿼리를 3번 날리면, row가 3건이 생기겠지? 2건은 성공, 1건은 실패했다고 가정하자 그러면 DBMS가 숫자 2를 응답함 > 즉, 2개만 성공하고 1개가 안들어왔다는 것! insert를 1건 요청 했을 때, 1을 반환 > 성공! 0을 반환하면, insert가 안됐다는 의미! (인서트가 안 됐다고해서 오류가 아님.) DBS에 id = 1이 없는데. id가 1인걸 delete 요청하잖아? 이건 오류가 아니다. 못 찾아서 삭제가 안 된 것 뿐! 그래서 0을 리턴! 진정한 오류는 -1 deeleete 뭐 이렇게 적으면 쿼리 자체(문법)가 틀린 것! 이런걸 쿼리문으로 날리면 -1을 던진다. 너 오류야! 틀렷어! 하고.
이런 식으로 뜨는 듯 하다.
[ update 쿼리문은 많은 자원이 소모된다 ]
select 쿼리문은 요청할 때, select 쿼리문만 날리면 마리아db에서 결과를 응답해 준다. insert도 똑같이 insert문만 날리면, 마리아db가 받아서 DBS에 쓸 것! 근데 update문은 수정하는 행위다. (수정 = select하고, delete하고, insert를 한다는 것!) 그래서 업데이트할때 많은 자원이 소모된다.
0. 내가 a를 b로 변경한다는 update 쿼리문을 날리면 1. UPDATE 쿼리문에 해당하는 데이터를 찾기 위해 내부적으로 select가 일어남 (수정할 데이터 검색) 2. 찾은 데이터(수정 할 데이터)를 메모리에 보관하여 수정 작업을 수행. (수정 전 데이터를 유지하기 위해 필요) 3. DELETE 쿼리문을 내부적으로 실행하여 이전 데이터를 제거 4. INSERT 쿼리문을 사용하여 변경된 데이터 삽입 즉, 업데이트란 select delete insert문이 다 일어나는 것 = 자원소모 많음
수정 전 데이터 유지는 왜 하나?
1. 롤백 (문제 발생 대비)
2. 데이터 변경 이력 추정 등의 이유로
select, insert, update, delete는 프로토콜!
3. DBMS는 데이터베이스 프로토콜이 적용된 소켓 통신
과정 설명 ✓
데이터베이스 프로토콜이 적용된 소켓 통신은 동기적이다 (일의 순서가 있음) 그래서 그림에 순서를 적어놨죠 1. '바나나' 라는 데이터를 select 했다고 가정해보자. 우선 캐싱을 먼저 한다. RAM에 데이터가 있어서 바로 찾는걸 캐싱이라고 한다. (=상대적으로 가까운 곳에서 데이터를 찾는 것) 만약, RAM에 캐싱되어 있다면 HDD까지 안가고 4번에서 7번으로 가겠지 > 그럼 I/O가 없어진거잖아? 좋은거임! 2. RAM이 꽉 찼을 때, '딸기' 라는 걸 SELECT 하고 싶다! 캐싱을 못하니, RAM 공간 확보를 먼저 한다. (안 쓰는 데이터를 버려버림) 애네들이 쓰는 알고리즘(LRU)을 통해 버릴 데이터를 구분한다. 즉, 가장 오랫동안 사용되지 않은 데이터를 우선적으로 제거한다. 제거한다고 해서 완전히 삭제하는게 아니라, DBS에 기록해둔다. (I/O가 일어난다는 말) 만약, 삭제 타겟이 된 그 데이터가 DBS에 있으면 저장할 필요가 없으니 삭제함. 3. 만약, 버린 데이터가 토마토다. 그럼 다시 토마토를 찾을 때, RAM에서 오랫동안 사용하지 않은 데이터를 버리고 다시 토마토를 찾아서 RAM에 올림
때문에 SELECT를 잘못하면 캐싱 구조가.. 바뀌어버린다. I/O로 들어가서 속도가 느려진다! (자주 쓰는 데이터 RAM을 바꿔버렸으니까 … HDD에서 끌어와야...) 캐싱이 날아갔을 때, 캐싱을 빠르게 하기위해서 캐싱 자체를 백업해두는 회사도 있다 개발 단계에선 이 권한을 신입한테 좀 주는데, 서비스 단계에선 안 줌.
근데 DBSM은 아이피와 포트 번호만으로 연결(접근)이 안된다.
[ IP, PORT, ID, PASSWORD, 프로토콜명 ] 총 5가지가 필요하다!!
인증된 사용자만 접근할 수 있게! > 민감한 개인정보가 들어있기 때문!
인증이 필요한 어떤 시스템들은 전부 id, pass가 필요하다.
그게 없으면 아무나 다 들어가서 다 보겠지..
그래서 브라우저는 자바를 통해서 DBSM에 접근하는 것!
이렇게 하지 않으면 브라우저에 모든 개인정보가 다 등록될 것이다.
[ 데이터가 RAM에 올라가면 메모리에 계속 남아있다 ]
데이터가 RAM에 올라가면 프로그램이나 운영 체제에 의해
명시적으로 메모리에서 해제되지 않는 한, 데이터는 RAM에 그대로 유지된다.
즉, 데이터에 빠르게 접근하기 위해서 안 내려가고 유지되는 것!
데이터베이스 프로토콜이 적용된 소켓 통신은 데이터베이스 관리 시스템(DBMS)과 클라이언트 간의 데이터베이스 서버에 접속하고 데이터를 주고받기 위해 사용되는 통신을 위한 방식! 이 방식은 일반적으로 TCP/IP 기반의 소켓 통신을 사용한다. 참고로, 쿼리 요청이 있을 때만 연결하고, 용건이 끝나면 연결을 끊어버리니 반이중이다. (+웹은 http프로토콜이 적용된 소켓 통신)
데이터베이스 프로토콜이 적용된 소켓 통신은 일반적으로
"request-response" 방식으로 동작
* 리스너 포트 = 리스너만을 위한 스레드가 있어야 함. 단일 스레드. 리스너는 데몬
* 우린… 그림에 보이는 저 클라이언트를 자바로 만들 것이다.
프로토콜
프로토콜 = 표를 준다. 이 표를 준 이후에 원활하게 통신이 되는 것 (1을 준다 = 나와 / 2를 준다 = 달려라 뭐 이런 식으로 표를 주는 것.) 약속하지 않으면 통신할 수 없다!!
3-1. 요청 시 발생할 수 있는 오류
3-2. session
클라이언트가 서버에 접속하여 인증을 성공적으로 마치면 생성되며, 클라이언트와 서버 간의 통신에서 중요한 역할을 한다. (연결되는 순간 session이 만들어졌다!!! ★) 세션은 일반적으로 서버 측에서 관리되며, 클라이언트에 대한 고유한 식별자(세션ID)를 부여하고 클라이언트의 상태 정보를 저장한다. 즉, 세션은 클라이언트와 서버가 계속해서 서로를 '기억'하고 있도록 돕는 것! 세션이 있어서 클라이언트와 서버 간의 상태 정보를 유지하면서, 원활한 대화를 가능하게 한다. (ex. 로그인 상태 유지 시간!)
세션은 일정 시간이 지나거나 클라이언트가 로그아웃을 하면 종료된다.
그리고 다시 접속할 때에는 새로운 세션이 생성된다.
(클라이언트와 서버 간의 소통이 원활하도록 도움 + 보안 상의 중요한 역할도 함!)
세션 식별자는 보통 쿠키(Cookie)라는 형태로 클라이언트의 웹 브라우저에 저장된다.
클라이언트는 이후 요청을 보낼 때 쿠키를 함께 전송하여
서버가 해당 클라이언트를 식별할 수 있게 한다.
(세션 ID는 쿠키를 통해 전달되는 경우가 많다)
네트워크 통신의 기본 5가지 !! (인증 받아야 하는 경우에)
★ IP, PORT, ID, PASSWORD, 프로토콜 ★ 을 넣어준다!
인증이 필요한 네트워크 통신에서는 사용자의 신원을 확인하고 인증 절차를 거쳐야 하기 때문에 ID, PASSWORD도 함께 필요하다.
테이블 데이터는 자바 오브젝트가 아니니 파싱해야함.
다른 세상의 데이터를 받아왔으니, 내 세상에서 쓰기 위해 파싱 해야함
TIP!
버퍼를 다는 코드는 언어마다 이름이 다 다르다. 때문에 버퍼를 다는걸 아는게 중요한 것!! 다른 언어를 할 때, '파이썬 키보드에 버퍼달기 코드 알려줘' 이런 식으로 뤼튼한테 물어봐라 코드가 다 다르기 때문에 코드는 중요하지 않다. 개념을 아는게 중요!! 코드는 절대 외워서 못쓴다. 다 보면서 써라
Share article