251117 책리뷰 이것이 취업을 위한 컴퓨터과학
17 Nov 2025
p66 CPU
p66 레지스터
- WinDbg, gdb
- 프로그램카운터(PC, Program Counter)
- 메모리에서 다음으로 읽어들일 명령어 주소
- 명령어레지스터(IC, Instruction Register)
- 해석할 명령어
- CPU는 IC속 명령어를 해석한뒤, ALU(산술 논리 연산 장치)에게 연산시킴.
- 범용레지스터(GPR, General Purpose Register)
- 일반적인 상황에서 자유롭게 사용할 수 있는 레지스터
- 데이터, 명령어, 주소 모두 저장.
- 플래그 래지스터(FR, Frag Register)
- 연산의 결과
- CPU 상태인 플래그값을 저장하는 레지스터
- 플래그 종류
- 부호플래그
- 제로플래그
- 캐리플래그
- 오버플로우플래그
- 인터럽트플래그
- 인터럽트가 가능한지
- 슈퍼바이져플래그
- 커널모드인지 사용자모드인지
- 스텍포인터
p70 인터럽트
- 동기인터럽트
- 비동기인터럽트 = 하드웨어 인터럽트
- 입출력장치
- 세탁기의 세탁완료알림
- 프린터 알림
- 키보드 마우스 알림
하드웨어 인터럽트
- CPU가 인터럽트 처리하는 순서
- 입출력장치 -> CPU : 인터럽트 요청신호
- CPU : 명령어인출전, 인터럽트 여부 확인
- CPU : 인터럽트 플래그를 통해 인터럽트 입력받을 수 있는지 확인
- CPU : 지금까지 작업을 백업
- CPU : 인터럽트 서비스 루틴 실행
- CPU : 백업된 작업을 복구하여 실행
p76 예외
- 인터럽트
- 동기 인터럽트(=예외)
- 폴트
- 트랩
- 중단
- 소프트웨어 인터럽트
- 비동기 인터럽트(=하드웨어 인터럽트)
- 동기 인터럽트(=예외)
- 폴트
- 예외를 처리한 직후, 예외가 발생한 명령어부터 실행
- 페이지 폴트
- 트랩
- 예외를 처리한 직후, 예외가 발생한 다음 명령어부터 실행
- 디버깅의 브레이크 포인트
- 중단
- 프로그램을 강제로 중단
- 심각한 오류
p78 CPU 성능향상을 위한 설계
- 클럭
- 코어
- 스레드
- 동시성, 병렬성
p78 CPU 클럭속도
p79 멀티코어 멀티스레드
- $ cat /proc/cpuinfo
- 병렬성
- 작업을 물리적으로 동시에 처리
- 하드웨어 스레드가 4개인 CPU가 4개의 명령어를 동시 실행
- 같은 시점에 여러 작업을 동시 처리
- 동시성
- 동시에 작업을 처리하는 것
- CPU가 빠르게 작업을 번갈아 처리
p85 파이프라이닝을 통한 명령어 병렬처리
- 명령어 병렬 처리 기법
- ILP
- Instruction Level Parallelism
- 여러 명령어를 동시에 처리하여 CPU 성능을 높이는 기법
- 명령어 파이프라이닝
- 하나의 명령어가 처리되는 과정
- 명령어 인출 : Instruction Fetch
- 명령어 해석 : Instruction Decode
- 명령어 실행 : Execute Instruction
- 결과 저장 : Write Back
- 슈퍼스칼라
- CPU내부에 여러 명령어 파이프라인을 포함하는 구조 = 슈퍼스칼라
- CISC, RISC
p90 메모리
p90 RAM
- DRAM
- Dynamic RAM
- 시간이 지나면 데이타가 점차 사라지는 RAM
- 데이타의 소멸을 막기 위해 일정 주기로 데이타를 재활성화(다시 저장) 필요
- 소비전력이 작고, 저렴, 집적도 높음.
- SRAM
- Static RAM
- 시간이 지나도 저장된 데이타가 사라지지 않는 RAM
- 비휘발성은 아님.
- 전원이 공급되지 않으면 저장된 내용이 소실.
- DRAM보다 속도 빠름, 소비전력 높음, 고가, 집적도 낮음.
- 캐시메모리
- SDRAM
- Synchronized DRAM
- DDR SDRAM
- Double Data Rate SDRAM
p93 빅엔디안, 리틀엔디안
- 빅엔디안
- 낮은 번지에 상위바이트 저장
- 상위바이트는 가장큰값
- 1A2B3C4D -> 1A 2B 3C 4D
- 일상적인 숫자체계를 읽는 순서와 동일
- 디버깅 편함
import struct
print(struct.pack(">f", 123.456).hex())
- 리틀엔디안
- 낮은 번지에 하위 바이트 저장
- 1A2B3C4D -> 4D 3C 2B 1A
- 수치계산 편리
import sys
print(sys.byteorder)
p97 캐시메모리
p107 보조기억장치와 입출력장치
107 RAID
- 하드 디스크 드라이브
- 플래시 메모리 기반 저장장치
- USB 메모리
- SD 카드
- SSD (Solid State Drive)
- RAID
- Redundant Array Independant Disk
- RAID0
- 단순하게 나누어 저장하는 구성방식
- 저장된 정보가 안전하지 않음.
- RAID1
- 완전한 복사본 저장
- 미러링
- 복구가 간단 안전성 높음
- 사용가능한 용량이 적어짐
- RAID4
- 패리티 정보를 저장하는 디스크를 따로 구성
- 패리티 디스크가 병목
p113 입출력기법
- 인터럽트 기반 입출력
- PIC
- Programmable Interrupt Controller
- IRQ
- 인터럽트 요청
- DMA 입출력
- Direct Memory Access
- CPU를 거치지 않음.
p123 GPU 용도와 처리방식
- GPGPU
- General Purpose GPU
- CUDA
- host code
- CPU가 실행할 코드
- device code
- GPU가 실행할 코드
- host code
p134 운영체제
p135 운영체제의 역할
p138 시스템콜과 이중모드
- 커널영역
- 사용자영역
- 프로세스 관리
- fork()
- execve()
- exit()
- waitpid()
- …
p144 프로세스와 스레드
- 포그라운드 스레드
- 백그라운드 스레드
- 서비스
- 데몬
- 메모리
- 커널영역
- PCB : Process Control Block
- 유저영역
- 스택
- 힙
- 데이타
- 코드
- 커널영역
p150 프로세스의 상태
- 생성
- 준비
- –> 실행 : 디스패치
- 실행
- –> 준비 : 타이머인터럽트
- –> 대기 : 입출력요청
- 대기
- –> 준비 : 입출력완료
- 종료
p152 멀티프로세스와 멀티스레드
p158 프로세스간 통신
- 공유메모리
- 마치 자신의 메모리 영역을 읽고 쓰는것 처럼 통신
- 커널의 개입이 없음.
- 통신속도 빠름.
- 레이스 컨디션 발생 여지.
- 메시지전달
- 파이프, 시그널, 소켓, RPC
- 파이프
- unnamed pipe
- named pipe
- 시그널
- SIGILL
- 허용하지 않은 명령어 실행
- 코어덤프후 종료
- SIGINT
- 키보드 인터럽트
- 종료
- SIGKILL
- 프로세스 종료
- 핸들러 재정의 불가능
- SIGSEGV
- 잘못된 메모리 접근
- 코어덤프 생성후 종료
- SIGTERM
- 프로세스 종료
- 핸들러 재정의 가능
- SIGILL
import ctypes
ctypes.string_at(0)
$ coredumpctl info
PID ...
UID ...
Signal : 11 SEGV
Command Line : python ...
...
p165 동기화와 교착상태
p170 동기화 기법
- 뮤텍스 락
- lock.acquire()
- lock.release()
include <pthred.h>
pthread_mutex_t mutex
pthread_mutex_init(&mutex)
pthread_mutex_lock(&mutex)
pthread_mutex_unlock(&mutex)
pthread_mutex_destroy(&mutex)
lock = new ReenterantLock()
lock.lock()
lock.unlock()
p174 세마포
p189 교착상태
- 교착상태 발생조건
- 상호 배제
- 한번에 하나의 프로세스만 해당자원을 이용가능
- 점유와 대기
- 한 프로세스가 점유한 상태에서 다른 자원할당을 대기
- 비선점
- 해당 자원을 이용하는 프로세스의 작업이 끝나야 자원이용가능
- 원형 대기
- 프로세스와 프로세스가 요청한 자원이 원의 형태를 이루는 경우
- 상호 배제
p193 CPU 스케줄링
p193 우선순위
- CPU 버스트
- 입출력 버스트
- 입출력 집중 프로세스를 가능한 빨리 실행시키고, CPU집중 프로세스에 집중적으로 CPU를 할당.
p202 리눅스 CPU 스케줄링
- 리눅스에서는 프로세스마다 vruntime(virtual runtime, 가상 실행 시간)이라는 정보를 유지
- CFS(Completely Fair Scheduler) 는 vruntime이 가장 작은 프로세스부터 스케줄링함.
- vruntime은 실제실행시간이 아닌 가중치를 고려한 가상의 실행시간.
- vruntime = CPU시간 * 평균가중치 / 프로세스가중치
- vruntime, 가중치 정보 확인
- /proc/
/sched
- /proc/
- vruntime 최소값 빠르게 골라내기
- RB트리 사용
p205 가상메모리
- 논리주소
- 물리주소
- 가상메모리
- 페이징
p205 물리주소 논리주소
- 메모리관리장치 (MMU)
- CPU와 메모리 사이에 위치
p206 스와핑과 메모리 연속 할당
- 스와핑
- 오랫동안 사용되지 않는 프로세스를 스왑영역이라는 보조기억장치로 이동시킴.
- 메모리의 빈자리에 다른 프로세스를 적재 하여 실행.
p209 페이지을 통한 가상메모리 관리
- 가상메모리 관리 기법
- 페이징
- 페이징이 외부단편화를 어떻게 해결하는지?
- 세그멘테이션
- 페이징
p210 페이징
- 프로세스의 논리주소공간을 페이지로 분할
- 물리주소공간을 페이지와 동일한 크기의 프레임으로 분할
- 페이지를 프레임에 할당
- 가상메모리 관리기법
- 스와핑
- 스왑아웃 : 페이지아웃
- 스왑인 : 페이지인
p211 세그멘테이션
- 프로세스를 일정한크기의 페이지가 아닌 세그먼트단위로 분할
- 세그먼트의 크기가 일정하지 않아서 외부 단편화가 발생할 수 있음.
p213 페이지테이블
- 프로세스의 페이지와 실제의 프레임을 연결해주는 페이지 테이블
- 페이지테이블
- 페이지번호
- 프레임번호
- 유효비트
- 해당페이지에 접근가능한지 여부
- 1 : 페이지가 메모리에 적재되어 있음.
- 보호비트 rwx
- 참조비트
- 수정비트
- 메모리 접근 횟수
- 모든 프로세스의 페이지 테이블이 메모리에 적재 되어 있을경우
- CPU는 페이지테이블에 접근, 실제프레임에 접근하기위해 총 2번 메모리에 접근
- 이를 해결하기위해 TLB(Translation Look-aside Buffer)라는 페이지테이블의 캐시메모리 사용.
- TLB 히트, 미스
p221 페이지 교체 알고리즘
- 요구페이징
- 메모리에 필요한 페이지만 적재하는 방법
- 기본동작순서
- 특정페이지에 접근
- 해당페이지가 메모리에 있을경우(유효비트1)
- 페이지가 적재된 프레임에 접근
- 해당페이지가 메모리에 없을경우(유효비트0)
- 페이지폴트 발생
- 페이지폴트 처리루틴 수행
- 해당 페이지를 메모리로 적재
- 유효비트1로 설정
- 종류
- 순수요구페이징
- 첫명령어를 수행하는 순간, 페이지폴트 발생
- 언젠가는 메모리가 가득참
- 일부페이지는 스왑
- 메모리의 페이지를 보조기억장치로 내보냄
- 페이지교체 알고리즘
- FIFO
- LRU
- 순수요구페이징
p223 파일시스템
p223 파일과 디렉터리
- 파일 디스크립터
- 0 : stdin
- 키보드 입력
- 1 : stdout
- 모니터 출력
- 2 : stderr
- 표준 에러
- 0 : stdin
- 파일 핸들
p244 기술면접질문
- 코드의 문제
- 공유데이타가 동시에 수행되는 과정에서 발생하는 레이스 컨디션 문제
- 임계구역에서 연산이 하나씩 수행되지 않음.
- 데이타의 일관성 보장 안됨.
- 코드의 문제 해결
- pthread_mutex_t mutex
- pthread_mutex_lock(&mutex)
- pthread_mutex_unlock(&mutex)
- mutex를 활용해 공유자원에 대한 접근 동기화
- 공유메모리기반 IPC가 소켓통신보다 빠른 이유
- 공유메모리는 메모리공간에 직접접근하기 때문에
- 마치 자신의 메모리 공간을 읽고 쓰는 것처럼 IPC가 발생
- 소켓통신은 커널을 통하므로 추가적인 오버헤드 발생
- 운영체제가 메모리에 적재되기까지 과정(부팅의 과정)
- CPU : ROM에 저장된 BIOS 실행
- BIOS : 하드디스크의 MBR을 읽고, 부트로더 로드
- 부트로더 : 커널위치를 RAM에 적재
- 커널
- 하드웨어와 응용프로그램간의 중재자 역할
- 프로세스, 스레드 실행
- CPU, 메모리, 스토리지 등의 하드웨어를 공정하게 할당
- 커널모드, 유저모드
- thread unsafe 문제
- 다중스레드에서 레이스 컨디션 발생
- 데이타 일관성 깨짐
- 리눅스에서 일반적인 사용자프로세스가 CPU를 할당받는 과정
- 각 프로세스가 가상 실행시간인 vruntime을 유지
- vruntime이 가장 작은 프로세스부터 스케줄링
- vruntime은 실제실행시간과 우선순위에 따른 가중치를 고려하여 계산
- 지나친 문맥 교환의 문제
- 문맥저장과 복구에 CPU시간을 사용해서 효율성 떨어짐
- 캐시메모리 데이타를 반복적으로 무효화
- 캐시미스율이 증가
- 4GB 이상의 프로그램을 물리메모리에서 실행하는 방법
- 운영체제는 프로세스가 필요한 메모리 공간을 가상주소로 할당
- 물리메모리에는 필요한 부분만 적재
- 불필요한 부분은 디스크의 스왑영역에 적재
- 가상메모리 기술
- 페이지폴트를 처리하는 과정
- CPU : 기존 작업을 백업
- 페이지폴트 처리루틴 진행
- 원하는 페이지를 메모리의 프레임으로 가져와서 유효비트를 1로 변경
- 이제 CPU가 해당 페이지에 접근가능
- 파일디스크립터
- 운영체제에서 파일을 식별하기 위한 저수준 정보
- IPC(파이프, 소켓)도 파일
- 표준입력0 표준출력1 표준에러2 도 파일
- EXT4 에서 디렉토리에서 내 파일의 데이타를 찾는 과정
- 파일이 속한 디렉터리에서 파일이름에 해당하는 디렉토리 엔트리를 찾음.
- 해당파일의 inode를 얻음.
- inode번호로 inode테이블에서 inode찾음.
- inode에는 파일속성, 데이타저장위치 포함.
- inode
- 파일이 저장된 위치, 속성
- 파일이름은 제외
- 공장초기화된 보조기억장치가 있음, 파일시스템을 만들고, 텍스트파일 저장.
- 파티션 생성
- 포매팅 : 파일시스템 생성
- 파일시스템 마운트
- 파일생성, 저장
- 메모리누수
- 할당받은 메모리를 해제하지 않아 지속적으로 점유
- 명시적인 해재
- 가비지 컬렉션
- 스레드 join
- 생성된 스레드가 완료될때까지 대기하는 메서드
- 멀티프로세스, 멀티스레드
- 차이점 : 자원공유여부
- 멀티스레드는 메모리, 파일을 공유함.
- hello라는 문자열 입력후 저장, 이 과정을 커널모드로 설명
- 응용프로그램 : 운영체제 open() 호출
- CPU : 유저모드 -> 커널모드
- 커널 : 파일생성
- CPU : 커널모드 -> 유저모드
- 응용프로그램 : 운영체제 write() 호출
- CPU : 유저모드 -> 커널모드
- 커널 : 파일기록
- CPU : 커널모드 -> 유저모드
- 응용프로그램 : 운영체제 close() 호출
- CPU : 유저모드 -> 커널모드
- 커널 : 파일닫기
- CPU : 커널모드 -> 유저모드
- 교착상태
- 2개이상의 프로세스가 상대방의 자원을 기다리며 무한정 대기
- 4조건
- 상호배제
- 한번에 하나씩 사용
- 상호대기
- 자원점유 프로세스가 다른자원 대기
- 비선점
- 자원을 점유하지 못하는 경우
- 원형대기
- 상호배제
- 블로킹 입출력, 논블로킹 입출력
- 디버깅시 주소는 물리메모리주소 or 가상메모리주소
- 가상메모리 주소
- 이 가상메모리 주소는 MMU에 의해 물리주소로 변환
- 메모리가 부족하다면
- 디스크에 메모리페이지를 저장
- 필요할때 다시 불러오기
- 스와핑
- 슬래싱
- 스와핑이 계속 발생해서 실제 작업이 일어나지 않는 상황.
p256 자료구조
p257 시간복잡도 공간복잡도
- 시간복잡도
- 입력에 따른 시간의 점근적 상향
- 공간복잡도
- 입력에 따른 메모리의 점근적 상향
p300 트리의 종류
- 이진트리
- 편향된 이진트리
- RB트리
- 균형을 맞추는 트리
- 이진트리의 문제
- 삽입 삭제 연산을 반복하면 트리가 한쪽으로만 자라나는 편향.
- 탐색속도가 O(n)으로 연결리스트와 다를바 없음.
- 색상규칙
- 루트노드 : 블랙
- 리프노드 : 블랙
- 레드노드의 자식은 블랙
- 트리의 회전
- 왼쪽회전
- 오른쪽회전
- B트리
- 대용량입출력
- 균형을 유지하는 트리
- 다진탐색트리
- 한블록은 여러데이타를 포괄
- 이진탐색트리에 비해 입출력 연산을 줄일수 있음.
- B+트리
- 실질적인 데이타가 모두 최하위 리프노드에 있음.
p322 깊이우선탐색 vs 넓이우선탐색
p327 최단경로 알고리즘
- 시작점에서 목적지까지 가중치합이 최소가 되는 경로
- 지도서비스에서 목적지까지 이르는 최단거리
p336 기술면접질문
- 시간복잡도와 빅오표기법 차이
- 시간복잡도
- 입력크기에 따른 프로그램 실행시간관계
- 실행시간은 연산횟수에 비례
- 연산횟수
- 빅오표기법
- 함수의 점근적 상향
- 시간복잡도
- 해시테이블의 장단점
- 장점
- 빠르다
- O(1)
- 단점
- 메모리를 많이 사용
- 장점
- 연결리스트 장단점
- 장점
- 삽입 삭제 빠름.
- 단점
- 순차탐색 느림.
- 장점
p501 기술면접질문
- 브로드캐스트
- 네트워크내 모든 호스트에게 패킷전송
- ARP 요청
- 캡슐화
- 상위계층에서 하위계층으로 내려갈때 헤더가 덧붙는 과정
- MAC주소, IP주소
- MAC주소
- 네트워크 인터페이스의 물리적 주소
- 로컬 네트워크내에서 장치를 식별
- IP주소
- 호스트를 식별하는 논리적주소
- MAC주소
- 서브네팅 필요
- IP주소를 토대로 네트워크를 더 작은 서브네트워크로 나누기 위함.
- IP주소와 네트워크를 효율적으로 관리
- NAT
- IP주소를 변환하는 기술
- 사설IP+포트와 공인IP+포트를 변환하는데 사용
- TCP 연결수립과정
- 3way handshake
- 클라->서버 : SYN
- 서버->클라 : SYN-ACK
- 클라->서버 : ACK
- 3way handshake
- 도메인네임을 웹사이트에 연동하는 과정
- DNS서비스 제공업체에 DNS 자원 레코드를 추가
- HTTP 1.1, HTTP 2.0 차이점
- 1.1
- 평문 메시지
- 2.0
- 바이너리 메시지
- 헤더압축
- 서버푸시
- 멀티플랙싱
- HOL블로킹 문제를 완화
- 1.1
p514 서버로서 DBMS
- SQL
- DDL(Data Definition Language)
- CREATE
- 데이타베이스, 테이블, 뷰, 인덱스 생성
- ALTER
- DROP
- 데이타베이스 삭제
- TRUNCATE
- 테이블구조유지, 모든레코드 삭제
- CREATE
- DML(Manipulation)
- SELECT
- INSERT
- UPDATE
- DELETE
- DCL(Control)
- COMMIT
- ROLLBACK
- SAVEPOINT
- TCL(Transaction Control Language)
- GRANT
- 권한 부여
- REVOKE
- 권한 회수
- GRANT
- DDL(Data Definition Language)
p516 파일대신 데이타베이스 필요성
- 데이타 일관성 무결성
- 레이스컨디션 문제
- 중복저장
- 변경시 연관변경 문제
- 정교한 검색
- 백업, 복구
p523 트랜젝션과 ACID
- ACID
- Atomicity(원자성)
- all or nothing
- 모두 성공하거나 모두 실패
- 일부 성공이나 일부 실패는 불허
- Consistency(일관성)
- 트랜젝션 전후로 데이타베이스가 일관된 상태를 유지
- 일관된 상태는 데이타베이스가 지켜야 하는 일련의 규칙을 모두 지키고 있는 상태
- Isolation(격리성)
- 여러트랜젝션이 간섭받지 않는 상태
- 레이스컨디션 방지
- Durability(지속성)
- 트랜젝션이 성공후 그 결과가 영구히 반영
p539 무결성 제약 조건
- 도메인 제약조건
- 키 제약조건
- 엔티티 무결성 제약조건
- 참조 무결성 제약조건
p544 DDL
- 데이타베이스 생성
CREATE TABLE mydb;
SHOW DATABASES;
USE mydb;
- 테이블 생성
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
birth_date DATE,
registration_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
...
FOREIGN KEY (user_id) REFERENCES users(id)
...
DESCRIBE users;
- 테이블 변경
ALTER TABLE users ADD COLUMN HOBBY VARCHAR(50) NOT NULL;
... CHANGE
... DROP
... MODIFY
- 테이블, 데이타베이스 삭제
DROP DATABASE mydatabase;
DROP TABLE users;
- 테이블의 모든 레코드 삭제
TRUNCATE TABLE users;
- INSERT
INSERT INTO users(name)
VALUES ("hhd")
- UPDATE
UPDATE users
SET name = "hhd"
WHERE id = "hhd"
- DELETE
DELETE FROM users
WHERE id = "hhd"
- 외래키 제약조건
- CASCADE
- 참조하는 데이타도 함께 수정/삭제
- SET NULL
- 참조하는 데이타를 NULL로 변경
- SET DEFAULT
- RESTRICTED
- NO ACTION
- CASCADE
CREATE TABLE posts (
id PRIMARY KEY AUTO_INCREMENT,
user_id INT,
...
FOREIGN KEY (user_id) REFERENCES users(user_id),
ON UPDATE CASCADE,
ON DELETE SET NULL
)
- SELECT
SELECT 필드1, 필드2
FROM 테이블
WHERE 조건식
GROUP BY 그룹화할_필드
HAVING 필터_조건
ORDER BY 정렬할_필드
LIMIT 레코드_제한
SELECT COUNT(*), AVG(gpa), MAX(gpa), MIN(gpa)
FROM STUDENTS;
p563 GROUP BY
SELECT major, COUNT(*), AS student_count
FROM students
GROUP BY major;
p564 HAVING
SELECT major, AVG(gpa)
FROM students
GROUP BY major;
SELECT major, AVG(gpa)
FROM students
GROUP BY major
HAVING AVG(gpa) >= 3.6
p566 ORDER BY
SELECT first_name, last_name, gpa
FROM students
ORDER BY gpa DESC;
p568 TCL(Transaction Control Language)
START TRANSACTION;
UPDATE ACCOUNTS
SET blance = balance - 100
WHERE account_id = 1;
COMMIT;
START TRANSACTION;
UPDATE ACCOUNTS
SET blance = balance - 100
WHERE account_id = 1;
ROLLBACK;
START TRANSACTION;
SAVEPOINT sp1;
UPDATE ACCOUNTS
SET blance = balance - 100
WHERE account_id = 1;
ROLLBACK TO SAVEPOINT sp1;
p573 서브쿼리와 조인
- inner join
SELECT c.name, c.age, c.email, o.id, o.product_id, o.quantity, o.amount
FROM customers AS c
INNER JOIN orders AS o
ON c.id = o.customer_id;
- left outer join
SELECT c.name, c.age, c.email, o.id, o.product_id, o.quantity, o.amount
FROM customers AS c
LEFT OUTER JOIN orders AS o
ON c.id = o.customer_id;
p584 뷰
CREATE VIEW myview AS
SELECT u.name, u.email, p.title
FROM users AS u, posts AS p
WHERE u.id = p.user_id
p587 인덱스
CREATE INDEX 인덱스_이름 ON 테이블_이름(필드);
SHOW INDEX FROM 테이블_이름;
DROP INDEX 인덱스_이름 FROM 테이블_이름;
CREATE INDEX idx_nickname
ON users(nickname);
p597 1정규형
- 모든속성은 원자값을 갖음.
- 필드데이타가 더이상 쪼개질수 없음.
- before
- 수강과목
- 운영체제, 데이타베이스
- 컴퓨터구조, 운영체제
- 수강과목
- 문제점
- 수강과목의 세부 데이타가 원자값이 아닌 배열.
- after
- 수강과목
- 운영체제
- 데이타베이스
- 컴퓨터구조
- 운영체제
- 수강과목
p600 2정규형
- 1정규형을 만족함
- 기본키가 아닌 모든필드가 기본키에 종속
- before
- 구매
- id
- 이름
- 구매항목
- 가격
- 결제수단
- 구매
- 문제점
- 구매id
- after
- 회원
- id
- 이름
- 상품
- id
- 상품명
- 구매
- id
- 회원id
- 상품id
- 결제수단
- 회원
p602 3정규형
- 1 2 정규형 만족
- 기본키가 아닌 모든키에 이행적 종속성이 없는 상태
- before
- 학생
- id
- 학과
- 학과사무실위치
- 학생
- after
- 학과
- id
- 이름
- 사무실위치
- 학생
- id
- 학과id
- 학과
p603 보이스/코드 정규형
- 1, 2, 3 만족
- 모든결정자가 후보키
- 즉 결정자는 유일해야 함.
- before
- 수강
- 학생id
- 과목id
- 교수id
- 수강
- 문제점
- 과목코드로 담당교수 특정 가능
- 담당교수로 과목코드 특정 가능
- 결정자가 2개로 보이스 코드 정규형 위반
- after
- 수강
- 학생id
- 과목id
- 과목
- id
- 교수id
- 수강
- 정규형 정리
- 1정규형
- 모든속성이 원자값
- 컬럼에 배열값이 들어가면 안됨
- 2정규형
- 부분함수 종속성 제거
- id값으로 특정할 수 없는 컬럼이 있으면 안됨
- 3정규형
- 이행함수 종속성 제거
- 레코드의 모든 컬럼이 id와 관련 있어야 함.
- 보이스코드 정규형
- 후보키 아닌 결정자 제거
- FK만 있어야 하는데, FK의 주변컬럼이 함께 포함되면 안됨.
- professor_id 만 있어야 하는데, professor_주민번호 는 유일하더라도 함께 있으면 안됨.
- 1정규형
p609 MongoDB
- 데이타베이스 생성, 컬렉션 생성
```
use mydb
db.createCollection(“mycollection”)
show dbs
show collections
- 단일 레코드 삽입
db.mycollection.insertOne({name:”kim”, age:30})
db.mycollection.find()
db.mycollection.find({name:”kim”})
db.mycollection.find({age:{$gt:20}})
db.mycollection.find({
$and
[
{name:”kim”},
{age:12}
]
})
- 여러 레코드 삽입
db.mycollection.insertMany(
{name:”kim”, age:30},
{name:”kim”, age:30},
{name:”kim”, age:30},
{name:”kim”, age:30},
)
- 단일 도큐먼트 갱신
db.mycollection.updateOne(
{name:”kim”},
{$set: {age:30} }
)
- 여러 도큐먼트 갱신
db.mycollection.updateMany(
{age:{$gt:20}},
{$set:{status:”active”}}
)
- 삭제
db.mycollection.deleteOne( {name:”kim”} )
# p616 Redis
- 문자열타입 명령어
- SET
- SETNX
- 키가 존재하지 않을때만 문자열 저장
- GET
- MGET
- 여러 문자열 조회
- DEL
SET k1 “hello”
SETNX k1 “hello2”
SETNX k2 “hello3”
GET k1
GET k2
DEL k2
# p626 기술면접 질문
- DB의 필요성
- 일관성, 무결성
- 레이스 컨디션
- 중복저장
- ACID
- A : 원자성
- all or nothing
- C : 일관성
- 트랜젝션 전후에 상태 일관
- I : 독립성
- 트랜젝션간 독립적
- D : 지속성
- 트랜젝션 이후 결과가 영원히 저장
- 정규화가 필요하지 않은 상황
- 테이블이 너무 많으면 빈번한 조인연산으로 성능저하
- 하나의 테이블로 역정규화 필요
- 인덱스로 인한 성능저하
- 인덱스는 SELECT 고성능, INSERT UPDATE DELETE 저성능
- 조회가 빈번한 테이블만 인덱스 필요
- 인덱스에 B+트리가 사용되는 이유
- 대용량 데이타에 대한 빠른 탐색
- 균형잡힌 트리라서 검색이 빠름
- 노드가 여러 자식을 갖아서 탐색 횟수가 적음
- 참조 무결성 제약조건
- 외래키를 통해 테이블간 참조 관계에서 데이타의 일관성을 유지하기 위한 조건
- 외래키는 테이블의 기본키 or NULL
- INNER JOIN, OUTER JOIN
- INNER JOIN
- 공통된 데이타가 있는 경우만 데이타 추출
- OUTER JOIN
- 공통된 데이타가 없는 행도 빈값으로 반환
- 모든직원의 이름 조회
SELECT name
FROM employees;
- 전직원 급여 10% 인상
UPDATE employees
SET salary = salary * 1.1;
- 부서ID를 추가
ALTER TABLE employees
ADD FOREIGN KEY (dept_id)
REFERENCES departments(id)
ON DELETE CASCADE
ON UPDATE SET NULL;
- 재무부서의 모든직원이름, 부서이름
SELECT e.name, d.name
FROM employees AS e
INNER JOIN departments AS d
ON e.dept_id = d.id
WHERE d.name = “finance”;
```
- SQL에서 뷰의 필요성
- 복잡한 쿼리 단순화
- 보안
- RDBMS, NoSQL 차이
- 스키마고정, 스키마유연
- 수평확장용이
- NoSQL 장점
- 높은확장성
- 빠른 읽기/쓰기
- 엄격한 트랜젝션, 일관성 나쁨
- Redis 장점
- 인메모리 데이타베이스라서 디스크접근시간 단축
- 빠른 입출력
- DB샤딩
- 샤드라는 여러 데이타베이스 서버에 테이블을 분할
- 부하분산효과