학습 기록/CS : 전공지식 노트

CS : DB / 트랜잭션 / 키

서버관리자 페페 2024. 4. 27. 14:09

#separator:tab
#html:false
쓰레드 : 실행 상태란? running은 CPU 소유권과 메모리를 할당받고  인스트럭션 수행중임을 의미 CPU burst가 일어났다고도 표현


쓰레드 : 종료 상태란? 메모리와 CPU 소유권을 모두 놓고 가는 상태 자연스러운 종료 + 부모가 자식 프로세스를 강제시키는(abort) 비자발적 종료 자식 프로세스에 할당된 자원의 한계치를 넘어서거나 부모 프로세스가 종료 or 사용자가 process.kill 등 여러 명령어로 프로세스를 종료할때 발생

 

프로세스의 메모리 구조 4가지를 말하라 동적 : 힙 / 스택 정적 : 데이터  / 코드

 

프로세스의 키워드 : cpu 소유권 + 메모리

 

트랜잭션이란? DB에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 DB에 query로 작업되므로, 여러 개의 query를 하나로 묶는 단위를 말합니다

 

트랜잭션의 4원칙을 설명하시오 ACID 원자성 일관성 격리성 지속성  + 무결성

 

일관성이란? 허용된 방식으로만 데이터를 변경해야 하는것을 의미하며  DB에 기록된 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져야 합니다. 예를들어 통장 엔티티가 송금 후 잔고를 마이너스 시키는 메서드를 가진다면, 현재 금액과 송금 금액에 따라 Exception이 작성되고 0원 이하의 송금은 불가합니다.

 

원자성이란? all or nothing으로 해당 트랜잭션 단위 내 일이 모두 수행되었거나 수행되지 않았거나를 보장합니다 예를들어 트랜잭션을 커밋했는데 문제가 발생하여 롤백하는경우, 그 이후에 모두 수행되지 않음을 보장하는 것을 말합니다

 

커밋에 대해 말하시오 """커밋이 수행되었다""는 ""하나의 트랜잭션이 성공적으로 수행되었다"" 라는 말과 동일합니다.   여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어입니다. 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것을 말합니다."

 

롤백에 대해 말하시오 에러나 여러 이슈 때문에  트랜잭션이 일어나기 전 시점으로 돌리는 것을 의미합니다.

 

트랜잭션 전파에 대해 말하시오 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 말합니다. 트랜잭션은 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 합니다. 하지만 이를 매번 정확하게 넘겨주기가 어려워,

 

격리 수준에 대해 말하시오 SERIALIZABLE REPEATABLE_READ READ_COMMITTED READ_UNCOMMITED

 

격리 수준에 따라 나타나는 현상에 대해 말하시오 팬텀 리드 반복 가능하지 않은 조회 더티 리드

 

격리성이란? DB내부의 데이터에 여러 사용자가 접근할 수 있어야 합니다. 트랜잭션 수행 시 서로 끼어들지 못하는 것을 말합니다.  복수의 병렬 트랜잭션은 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어야 하고,

 

트랜잭션의 무결성은 어떻게 보장되나 커밋과 롤백으로 보장됩니다

 

무결성이란? 데이터의 정확성, 일관성, 유효성을 유지하는 것을 말하며 무결성이 유지되어야 DB에 저장된 값과 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생깁니다

 

무결성에 종류에 대해 말씀해주세요 개체 무결성 참조 무결성 고유 무결성 NULL 무결성 등이 있습니다

 

1 : 개체 무결성이란? 기본키로 선택된 필드는 빈 값을 허용하지 않습니다

 

참조 무결성이란? 서로 다른 두 테이블이 참조 관계에 있을 때  데이터는 항상 일관된 값을 유지해야 합니다.

 

2 : 고유 무결성 특정 속성에 대해 고유한 값을 가지도록 조건된 경우 그 속성 값은 모두 고유한 값을 가집니다

 

NULL 무결성 특정 속성 값에 NULL이 올수 없다는 조건이 주어진 경우  그 속성값은 NULL이 될 수 없다는 제약 조건입니다

 

무결성의 키워드 속성 값

 

키워드 2 속성 : {속성값1, 속성값2}

 

지속성? 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는것을 의미합니다.  이는 DB에 시스템 장애가 발생해도 원래 상태로 복구하는 기능이 있어야 함을 뜻하며,    DB는 이를 위해 체크섬 / 저널링 / 롤백 등의 기능을 제공합니다.

 

체크섬? 중복 검사의 한 형태로,  오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법입니다.

 

저널링? 파일 시스템 or DB 시스템에 변경 사항을 반영(commit)하기 전에 로깅하는 것,  트랜잭션 등 변경 사항에 대해 로그를 남기는 것입니다.

 

SERIALIZABLE 특정 행에 격리를 두어 순차적으로 진행시키는 제일 엄격한 격리 수준을 말합니다. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없고, 이후의 트랜잭션이 진행되려면 기다려야 합니다. 교착 상태가 일어날 확률이 높고 성능이 떨어지는 단점이 있습니다.

 

READ_COMMITED 가장 많이 사용되는 격리 수준이며, MYSQL8.0, PostgreSQL, SQL서버, 오라클에서 디폴트로 설정되어 있습니다. 작업중에 다른 트랜잭션이 데이터를 변경했다 하더라도, 커밋이 되지 않은 정보는 읽을 수 없습니다. 즉 커밋 완료된 데이터에 대해서만 조회를 허용합니다.

 

READ_COMMITED에 단점을 말해주세요 트랜잭션 A가 접근한 행을 트랜잭션 B가 수정할 수 있습니다. 이 때문에 A는 정상 작업을 완료했더라도, 같은 행을 리드할때 다른 내용이 발견될 수 있습니다.

 

READ_UNCOMMITED에 대해 말해주세요 격리 수준은 가장 낮고 동시성은 제일 높으며, 하나의 트랜잭션이 커밋되기 전에 다른 트랜잭션에 노출되는 문제가 있습니다. 데이터 무결성을 위해 되도록이면 사용하지 않는것이 좋으나, 거대한 양의 데이터를 어림잡아 집계할때는 사용이 권고됩니다.

 

REPEATABLE_READ에 대해 말해주세요 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만, 새로운 행이 추가되는 것은 막지 않습니다. 따라서 이후에 새로운 행이 발견될 수 있습니다.

 

팬텀 리드? 한 트랜잭션 내에서 동일한 쿼리를 보냈을때 해당 조회 결과가 다른 경우를 의미합니다.  예를 들어 사용자 A가 회원 테이블에서 age가 12 이상인 회원들을 조회하는 쿼리를 보낸 뒤 세 개의 테이블이 조회되었습니다. 그런데 사용자 B가 age가 15인 회원 레코드를 삽입했다면  3개가 아닌 4개 테이블이 조회됩니다.

 

반복 가능하지 않은 조회는? 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우를 의미합니다.  팬텀 리드와 헷갈릴 수 있는데, 반복 가능하지 않은 조회는 동일한 행 자체의 데이터의 변경, 그리고 팬텀 리드는 아예 다른 행이 선택될 수도 있습니다.

 

더티 리드에 대해 말해주세요 더티 리드는 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행중일때 다른 트랙잭션에 대해 수정되었지만 uncommited 상태에 데이터를 읽을 수 있을 때 발생합니다.  실제 값은 사용자 A가 이미 변경했으나, 사용자 B가 접근할때 아직 커밋되지 않은 미갱신 상태의 값을 가져옵니다.

 

NoSQL에 대해 말하라 Not Only SQL이라는 슬로건을 따르는 DB이며 몽고DB와 redis가 있습니다.  몽고DB는 JSON을 통해 데이터에 접근하고, Binary JSON 형태로 데이터가 저장됩니다.  redis는 인메모리 DB이자 key-value 데이터 모델 기반의 DB입니다. 레디스는 다른 DB 앞단에 두어 캐싱 계층, 세션 정보 관리, 순위표 서비스 등에 사용합니다.

 

인덱스? 테이블 내부 데이터를 빠르게 찾을 수 있는 장치입니다.  B-트리라는 자료 구조로  이루어져 있으며, 이는 루트 노드, 브랜치 노드, 리프 노드로 나뉩니다.  균형 잡힌 트리 구조와 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 대수 확장성을 가지고 있기 때문입니다. 기본적으로 인덱스가 한 깊이씩 증가할 때마다 인덱스 항목 수는 4배씩 증가합니다

 

Join에 대해 말해주세요 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것입니다.  조인에는 이너 조인 레프트 아우터 조인 라이트 아우터 풀 아우터가 있습니다   몽고 DB를 사용할때 lookup에 대해 RDB보다 성능이 떨어진다고 여러 테이블을 조인하는 작업이 많을 경우, MongoDB보다는 관계형 DB를 사용해야 합니다.    조두이테

 

내부 조인 두 테이블 간에 교집합을 나타냅니다.

 

왼쪽 조인 테이블 B의 일치하는 부분의 레코드와 함께 테이블A를 기준으로 완전한 레코드 집합을 생성합니다.

 

오른쪽 조인 테이블 A에서 일치하는 부분의 레코드와 함께 테이블 B를 기준으로 완전한 레코드 집합을 생성합니다. 만약 테이블 A에 일치하는 항목이 없으면 해당 값은 null이 됩니다

 

합집합 조인 양쪽 테이블에서 일치하는 레코드와 함께 테이블A와 B의 모든 레코드 집합을 생성합니다. 이떄 일치하는 항목이 없으면 누락된 쪽에 null값이 포함되어 출력됩니다.

 

앞의 4가지 조인은 조인의 원리를 기반으로 조인 작업이 이루어집니다. 원리들을 말해주세요 중첩 루프 조인 정렬 병합 조인 해시 조인   조인 : 증정해

 

중첩 루프 조인? 이중 for문과 같은 원리로 조건에 맞는 조인을 하는 방법이며, 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않습니다.  첫 번째 테이블에서 row를 한 번에 하나씩 읽고, 그 다음 테이블에서도 row를 하나씩 읽어 조건에 맞는 레코드를 찾아 결과값을 반환합니다.

 

정렬 병합 조인? 각각의 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인입니다.  조인할때 쓸 적합한 인덱스가 없고, 대용량의 테이블들을 조인하고 조인 조건으로 범위 비교 연산자가 있을때 씁니다.

 

해시 조인? 해시 테이블을 기반으로 조인하는 방법입니다. 두 개의 테이블을 조인한다고 했을떄 하나의 테이블이 메모리에 온전히 들어간다면 보통 중첩 루프 조인보다 더 효율적입니다.  동등 조인에서만 사용할 수 있으며 MySQL8.0.18 릴리즈와 함께 이 기능을 사용할 수 있게 되었습니다.  해시 조인 단계는 빌드 단계, 프로브 단계로 나뉩니다.

 

인덱스를 매 필드마다 설정하는게 좋나? 인덱스는 인덱스 리스트, 컬렉션 두 번 탐색을 강요하기 때문에 읽기 관련 비용이 더 들게 될수 있습니다.  또한 테이블이 수정되면 인덱스도 수정되어야 합니다. 그리고 단일 값만 수정하는게 아닌 b-트리의 균형도 조절하는 비용에다 데이터를 분산시켜서 효율적으로 조회할 수 있도록 구축하는 비용도 듭니다.  또 컬렉션에서 가져와야 하는 양이 많을수록 인덱스를 사용하는 것은 비효율적입니다.  그렇기 때문에 필드에 인덱스를 무작정 다 설정하는 것은 답이 아닙니다.

 

DB와 DBMS 그리고 응용프로그램의 관계에 대해 말하라 DB는 일정한 규칙을 통해 구조화되어 저장되는 데이터 모음입니다. 특

정 DBMS 마다 정의된 query language를 통해 CRUD를 작업하며, 응용프로그램은 이 DBMS를 끼고 DB에 접근합니다. DB의 특징으로는 실시간 접근과 동시 공유가 가능합니다.

 

엔티티와 릴레이션 엔티티 자체는 사람 장소 물건 사건 등 여러 개의 속성을 지닌 명사를 의미합니다. 회원 엔티티는 이름 id 주소 전화번호 등을 가집니다. 주로 서비스에 요구 사항에 필요한 속성만 가지게 됩니다.  릴레이션은 DB에서 정보를 구분하여 저장하는 기본 단위이며, 엔티티에 관한 데이터가 DB에서는 릴레이션에 대응됩니다.  RDB에서는 테이블 / NoSQL에서는 컬렉션이라고 합ㄴ디ㅏ

 

MySQL의 구조와 Mongo의 구조에 대해 말해라 MySQL은 레코드-테이블-DB로 이루어져 있고 MongoDB는 도큐먼트-컬렉션-DB로 이루어져 있습니다

 

레코드 테이블 DB에 대해 말하라 레코드가 쌓여서 테이블이 되고, 테이블이 쌓여서 DB가 된다
레코드는 실제 값 한줄

 

속성 : attribute에 대해 말하라 속성은 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보입니다.  차라는 엔티티에 색깔 바퀴 수 차종 등 서비스의 요구사항 기반으로 속성의 일부만 정해집니다

 

도메인? 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합을 말합니다. 예를 들어 성별이라는 속성이 있다면 이 속성이 가질 수 있는 값은 {남, 여} 라는 집합입니다.  릴레이션 -> 속성 -> 도메인

 

필드와 레코드? ㅁ회원이란 엔티티는 멤버라는 테이블로 속성인 이름 아이디 등을 가지고 있으며 name ID adress 등의 필드를 가집니다(테이블의 제목)  그리고 이 테이블에 쌓이는 row(행) 단위의 데이터를 레코드(튜플) 이라고 한다

 

테이블에 넣을떄는 필드 타입을 정의해야 한다. 아는대로 말하시오 CHAR와 VARCHAR가 있습니다 고정 길이 / 가변 길이에 따라 저장할 수 있습니다  TEXT / BLOB이 있습니다 두 개 모두 큰 데이터를 저장할떄 사용합니다. TEXT는 큰 문자열 저장에 쓰며 주로 게시판의 본문에 사용됩니다. BLOB은 이미지 동영상 등 큰 데이터 저장에 씁니다. 보통은 아마존 이미지 호스팅 서비스인 S3응ㄹ 이용하는 등 서버에 파일을 올리고 경로를 VARCHAR로 저장합니다.  ENUM과 SET이 있습니다

 

관계에 대해 말하고 N:M 관계에 대해 말하시오 학생과 강의의 관계라고 할 수 있습니다 이 떄 두 테이블을 직접적으로 연결하지는 않고 1:N 1:M 각 테이블의 id를 가지는 테이블 두 개로 나눠서 중간에 설정

 

키? 테이블 간의 관계를 조금 더 명확하게 하고 테이블 자체의 인덱스를 위해 설정된 장치로,  기본키,  외래키,  후보키,  슈퍼키,  대체키  가 있습니다

 

기본키에 대해 말해줘 기본키는 PK라고 주로 부르며, 유일성과 최소성을 만족하는 키입니다. 기본키는 자연키 혹은 인조키 중에 골라 설정합니다

 

자연키 유저 테이블로 예를 들면 주민번호, 이름, 성별 등의 설정이 있습니다. 이 때 남자나 동명이인은 얼마든지 있으므로 그런 중복된 값들을 소거하다가 중주민번호를 자연스럽게 뽑게 됩니다. 이를 자연키라고 합니다. 자연키는 언젠가 변하는 속성을 가집니다.

 

인조키 MySQL에서 auto increment로 설정됩니다. 유저 테이블, 회원 테이블 생성 시 주민번호, 성별, 이름 등의 속성과 별도로 user_id를 부여합니다. 이를 통해 고유 식별자가 생성됩니다. 이렇게 인위적으로 생성된 키를 인조키이므로 자연키와는 대조적으로 변하지 않으며, 이런 특성을 통해 PK는 보통 인조키로 설정합니다.

 

FK에 대해 말해주세요 연관 관계가 있을때 다른 테이블의 PK를 그대로 참조하는 값으로 개체와의 참조 관계를 식별하는데 사용됩니다.  FK 중복되어도 괜찮습니다.  또 client의 PK인 ID 값이 product user_id 중복된다

 

후보키 유일성과 최소성을 동시에 만족하며 기본키의 후보들입니다

 

대체키 후보키가 두개 이상일떄, PK로 선택되지 않은 것

 

슈퍼키 각 레코드를 유일하게 식별할 수 있는 유일성을 갖춘 키

 

팬텀 리드가 처음 발생하는 격리 수준은? REPEATABLE_READ에서 왜냐면 행 자체는 락을 걸지만, 새 행을 추가하는 것은 막지 않기 때문에  엉뚱한 곳에서 조회를 하고 있을수도 있기 때문