개발하면서 이정도는 알고가볼까?
기초 지식을 학습하며 기록용으로 사용하고 있어서 구조가 난잡할 수도 있습니다.
네트워크
www.naver.com을 입력하면 무슨일이 발생하는가?
1. https://www.naver.com 해당 도메인네임의 IP 주소를 찾는다
1. 브라우저에 www.naver.com 으로 IP 주소 저장되어있는지 확인한다.
2. 없으면 OS 에서 확인한다.
3. 없으면 DNS로 질의한다.
4. 이렇게 IP 주소를 찾아서
2. 프로토콜, IP 주소, 포트 번호(기본 80) 으로 분해해서 HttpRequest를 만든다.
3. 직렬화하고
4. HTTP > TCP > IP > 거쳐 그 하위 레이어 까지 본인들이 필요한 정보를 붙이고
5. 전송한다.
6. LAN 어댑터를 거쳐서 허브/스위치를 통해 > 라우터로 이동하고 >>> 프로바이더를 통해 WWWeb 으로 이동한다 다시 > 라우터 > 허브/스위치 > LAN 어댑터를 통해
7. 서버 쪽에 방화벽을 통과하면
8. 서버에 도착한다.
HTTP 란 무엇인가요?
HyperText Transfer Protocol 의 약자로 서버/클라이언트 통신 모델의 프로토콜입니다.
HTTP 의 큰 특징은 stateless 하다는 무상태성입니다.
무상태성은 각 요청 간에 문맥을 교환하지 않는다는 의미이고 그말은 각 요청이 완결성을 가지고 있어야 한다는 뜻을 가지고 있습니다. 각 요청이 완결성을 가지고 있습니다.
HTTPS 란 무엇인가요?
HTTPS 는 HyperText Tranfser Protocol, 또는 HTTP over TLS로 불리는 프로토콜입니다.
이름그대로 HTTP 와 TCP/IP 사이에 메시지 암호화 기능을 담당하는 TLS(Transport Layer Security) 가 추가된 프로토콜입니다.
HTTP 에서는 TCP handshake 으로 연결했다면 HTTPS 에서는 TCP handshake 으로 연결 후, TLS Handshake 로 암호키를 주고받은 후 암호화된 통신을 구성합니다.
기본포트는 443 입니다.
TCP 3-way hand shake 와 4-way handshake
TCP 커넥션의 연결과 연결 해제를 위해 사용합니다.
HTTP 또는 HTTPS 가 연결 TCP 의 handshake 를 통해 장치들 사이에 논리적인 접속을 성립하는 것을 의미합니다.
3-way 는 연결, 4-way 는 연결 해제에 사용됩니다.
TCP/IP란 무엇인가요?
TCP/IP 는 클라이언트/서버 모델의 프로토콜입니다.
TCP/IP 는 패킷 분할방법, 주소 지정, 데이터 전송방법, 라우팅 가공방법 등을 정의합니다.
TCP 는 연결과, 데이터의 가공, 등을 담당하고 IP 는 더미 레이어로 장치간의 데이터 전송을 담당합니다.
DNS란 무엇인가요? Domain Name Sever
domain name server의 약자로 인터넷 도메인 주소를 IP 주소로 매칭 해주는 시스템입니다.
TCP 와 UDP 의 차이점은?
IP는 비연결형, 비신뢰성 전송 프로토콜이다.
IP 의 역할은 Host to Host 데이터 전달이다.
데이터가 어떻게 갔는지, 제대로 갔는지 전부 갔는지 등을 보장해주지 않기 때문에 전송 계층에서 TCP 와 UDP를 통해 해소한다.
TCP 는 데이터의 분실, 중복, 순서를 관리한다.
UDP 는 TCP 와는 달리 데이터의 오류가 발생하는 것이 가능하기 때문에 어플리케이션 레벨에서 해결해줘야한다.
UDP 는 빠른데, TCP 처럼 3-way handshake, 4-way handshake를 UDP에서는 하지 않고 1-way 로 데이터 전송만 하기 때문에 빠를 수 밖에 없는 구조라 빠른것이다.
TCP 는 HTTP, HTTPS 와 같은 곳에 쓰이며 UDP 는 실시간 스트리밍, VoIP 와 같은 곳에 쓰인다.
OSI 7 계층
가장 로우레벨인 장비부터 사용자까지의 순으로
`Physical > Datalink > Network > Transport > Session > Presentation > Application`
OSI 7 Layer 네트워크 아키텍처로, 반드시 따라야하는 것은아니다.
실제로 HTTP 는 `Network Access > Network\(IP) > Transport\(TCP) > Application(HTTP)` 로 구성한다.
HTTP 메소드들은 무엇이 있고 어떻게 사용되나요?
메소드명 | 데이터의 안전여부 | 멱등여부 | 리소스여부 |
---|---|---|---|
GET | 안전 | 멱등 | 리소스를 달라 |
POST | 비안전 | 비멱등 | 리소스를 추가한다 |
DELETE | 비안전 | 멱등 | 리소스를 삭제한다 |
PUT | 비안전 | 멱등 | 리소스를 대체한다 (보내는 것으로) |
PATCH | 비안전 | 비멱등 | 리소스를 수정한다. |
OPTIONS | 특정 URL 에 대한 옵션들을 알려달라.(보통 사용가능한 메소드) | ||
HEAD | GET 요청의 응답헤더를 반환, GET 과 달리 res body 가 없다. | ||
CONNECT | SSH 터널링 과같은 특수 용도에 사용 | ||
TRACE | 서버까지 어떤 프록시들을 거치는지 |
CORS 란 무엇인가요?
Cross-Origin Resource Sharing 요청 대상 리소스에 접근가능한 ORIGIN 을 명시하는 헤더이며 응답에 실어보낸다.
CORS 가 확인되는 방식은 3가지
1. preflight request 라고 실제 요청을 전송하기전에 하기전에 OPTIONS 메소드로 먼저 전송해서 확인하는것
2. simple request 라고도 하는데 본 요청을 바로 보내고 응답을 받으면서 브라우저가 CORS 정책 위반 여부를 검사하는 방식이다. 사용가능한 헤더, HTTP 메소드, content-type이 제한
적이어서 번거롭다.
3. Credentialed Request 로 인증된 요청을 사용하는 방식이다. CORS 적용 방식이라기 보다는 보안 강화 방식으로 생각하면 된다.
쿠키와 세션의 차이를 설명해주세요
HTTP 는 프로토콜 자체가 stateless , 무상태성을 가지고 있습니다.
서비스를 운영하는 입장에서 매번 사용자의 요청을 검증하는 것에는 자원 효율이 떨어집니다.
클라이언트가 누구인지, 로그인-로그아웃의 개념을 적용하기 위해 쿠키와 세션을 통해서 요청의 상태를 관리합니다.
쿠키는....
쿠키는 클라이언트 쪽에 저장되는 key-value pair 로 이루어진 작은 데이터 파일입니다.
쿠키의 지속 범위에 따라 세션쿠키는 브라우저 종료와 함께 사라지고 퍼시스턴트 쿠키는 로컬 스토리지에 저장되서 재사용됩니다.
세션은 ...
세션은 쿠키에 기반하지만 서버에서 관리하는 것입니다.
사용자가 많아질수록 서버의 메모리를 많이 차지합니다.
동접자 수가 많은 경우 서버에 과부하를 주게됩니다.
웹소켓의 동작원리는?
웹소켓은 단방향 프로토콜이 가진 문제점을 해결하기 위한 양방향 프로토콜입니다.
웹소켓은 HTTP 와 같이 Application Layer Protocol 입니다.
통신에 필요한 TCP 커넥션을 생성하기 위해 HTTP 또는 HTTPS 에 업그레이드 헤더를 추가해 주고 받으면서 핸드쉐이크하고 서로 합의 완료시 TCP 커넥션를 남겨두고 재사용합니다.
웹소켓은 프레임기반 프로토콜로, opcode를 통해 연결 지속여부를 협의합니다.
RESTful 하다는 것은? REpresentational State Transfer
- 유니폼 인터페이스 : 어떠한 플랫폼에서도 사용가능한 인터페이스 스타일을 추구한다. HTTP + JSON 이 대표적인 예
- 무상태성 (Stateless) : 각 요청에 상태를 부여하지 않으면서 구현을 단순화시킨다.
- 캐싱가능 (Cacheable) :해야한다.
- 자체표현(self-descriptive) : 메서드와 리소스를 보고 API 를 이해할 수 있어야한다.
- 클라이언트 서버 구조를 유지한다.
개발상식
데드락이 무엇인가요?
데드락은 교착상태라고도 하며 한정된 자원을 여러곳에서 사용하려고 할떄 발생합니다.
데드락이 발생하는 경우?
1. 상호배제 : 한 자원은 하나의 프로세스에서만 사용 가능함
2. 비선점 : 이미 사용중인, 필요한 자원을 가로챌 수 없어야함
3. 점유대기 : 프로세스가 이미 점유된 자원을 선점하려고 함
4. 대기순환 : 프로세스들이 순환적으로 대기 상태가 지속
데드락 해결방법
#회피법 : 은행원 알고리즘
안정된 상태가 될때까지 자원을 내어주지 않는 것
단점 : 자원과 프로세스의 수가 일정해야한다.
#회복법 : 교착상태의 프로세스를 부분/전체 종료한다.
암달의 법칙이란
CPU 갯수 증가와 속도 상승 그래프가 프로그램의 병렬로 실행가능한 비중에 따라 어떻게 달라지는지를 나타낸다.
데이터베이스
데이터베이스 Replication 과 Sharding 에 대해 설명해주세요
Replication 은 복제, Sharding 은 분리를 뜻 합니다.
복제를 통해서 데이터베이스의 가용성을 높이고, 부하를 분산할 수 있습니다.
샤딩은 데이터 자체를 해시 또는 특정 값 기준으로 나눠서 저장하고 검색하는 것을 의미합니다.
데이터베이스 무결성이 무엇이며 지켜야하는 이유는 무엇인가요?
데이터베이스의 유효성을 의미하며 ACID 한 특징을 가지고 있다.
Atomcity
Consistency
Isolation
Durability
개체 무결성
참조 무결성
도메인 무결성
무결성 규칙
개발상식
웹서버와 웹 어플리케이션 서버(WAS) 차이에 대해 말해주세요
웹서버는 정적인 컨텐츠를 서빙하는데에 쓰이며 WAS 는 사용자의 요청에 따라 동적으로 컨텐츠를 생성해서 반환합니다.
OOP 란 무엇인가요?
현실세계를 적절히 반영해서 비즈니스 복잡성을 해결하기 위한 프로그래밍 기법으로
캡슐화, 상속, 다형성, 추상화가 있습니다.
Java / Spring
GC 에 대해 아는대로 설명하시오.
GC란 프로그램이 사용하지 않는 데이터를 메모리에서 해제하는 것을 의미합니다.
여기서 사용되지 않는다는 것의 의미가 JVM 에서는 실행 목적으로 참조되고 있지 않다는 것을 뜻합니다.
GC는 가비지 컬렉션이 동작하는 범위에 따라 young genenration 에서 발생하는 minor gc 그리고 old generation 에서 발생하는 major gc 두 가지가 있습니다.
GC가 발생하면서 young gen 에서 old gen 으로 넘어가기전 서바이벌간 이동 가능한 최대 횟수를 지정할 수 있습니다.
GC 에서 가장 중요한 포인트는 STOP THE WORLD 인데요. STW 가비지 컬렉션을 위해 프로그램이 멈추는 현상을 의미하고 객체들의 포인터 이동이 발생하기 때문에 STW 현상은 아직까지는 불가피 한것으로 보입니다.
백엔드, 서버 어플리케이션으로 많이 개발하는 자바에서 STW 시간은 곧 latency 의 증가로 이어지기 때문에, 자바 버전이 올라갈 수록 STW 시간을 최적화하는 GC 종류가 생겨나고 잇습니다.
GC의 종류를 생각해보면 유일하게 serial, parallel, G1GC, 그리고 ZGC 가 있습니다.
시리얼 GC는 유일하게 싱글스레드로 동작합니다.
페럴렐 GC는 멀티스레드로 동작을 하는 것이 특징입니다.
G1GC는 메모리에서 데이터들이 물리적으로 움직이는 시스템 비용을 최소화하기 위해서 좀 다르게 동작하는데요,
메모리 영역을 바둑판처럼 목적과 상황에 맞게 나누어 in-place 방식으로 GC를 발생시킵니다.
ZGC는 G1GC와 메모리 영역을 분할하는것은 동일한데 여기에 추가로 색상을 부여해서 참조를 관리합니다.
ZGC는 객체 포인터와 색상 부여까지 변수 포인터에 64비트를 사용하기 때문에... 64bit 운영체제에서만 동작합니다.
ZGC는 서버 애플리케이션을 염두에 두고 메가 바이트에서 많게는 테라바이트까지의 메모리에서 GC 시간을 10ms 까지 단축시켰다고 합니다.
스프링 프레임워크의 특징에 대해 설명해주세요
스프링에는 다음 4가지 철학이 있습니다.
- AOP
- Ioc/DI
- PSA
- POJO
스프링의 AOP
AOP 관점 지향 프로그램의 약자입니다.
이름의 의미는 애플리케이션 곳곳에 흩어져있는 공통적인 관심사를 OOP 컨셉을 활용해서 해결하기 어려울 때 사용합니다.
스프링은 AOP에서도 최대한 비침투적으로, 선언적인 AOP 기능을 제공합니다.
AOP 의 사용은 대표적으로 로깅, 보안, 트랜잭션 관리가 있습니다.
제 생각에 데이터베이스가 가장 많이 쓰이고 오래된 기술이기 때문에 트랜잭션의 일관적인 핸들링을 위해 AOP 가 가장 많이 발전하지 않았나... 하고 생각해봅니다.
스프링의 AOP 프록시 패턴을 사용하고 런타임에 동적으로 프록시 객체를 생성합니다.
여기서 타겟 클래스가 인터페이스의 구현체면 리플렉션을 활용한 JDK Dynamic Proxy 를 생성한다.
인터페이스의 구현체가 아닌 경우 바이트코드를 조작해서 타겟 클래스를 상속한 프록시를 생성하는 CGLib(Code Generator Library)를 사용한다.
CGLib 은 final 클래스에 적용 불가하고 private 메소드 또한 상속이 불가하므로 적용되지 않는다.
IoC/DI
IoC 는 제어의 역전을 의미합니다.
사용자가 어플리케이션 코드에 집중할 수 있도록 객체 관리, 생성, 의존관리 등을 사용자가 아닌 스프링 컨테이너로 위임하고 이를 역전됬다고 합니다.
IoC 컨테이너/ 스프링 컨테이너는 DI 를 위주로 구현하는 BeanFactory 에 부가적인 기능을 추가한 ApplicationContext 기능을 수행한다.
DI 는 의존관계 주입을 의미하는데 IoC 컨테이너가 수행하는 기능입니다.
객체에서 필요한 컴포넌트들을 직접 초기화하거나 로드하는 것이 아니라 생성자, setter, 필드주입 등 선언적으로 명시하면서 IoC 컨테이너에게 위임합니다.
자바의 메모리 영역에 대해서 설명해보세요.
자바의 메모리 영역은 Method 영역, 힙, 스택, PC Register, Native Method Stack 으로 이루어져 있습니다.
여기서 힙영역은 다시 young generation, old generation, 자바 8 버전 이후부터 Metaspace로 나누어집니다.
<----- Java Heap -----> <--------- Native Memory --------->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Metaspace | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+
자바의 실행 과정에 대해서 설명해주세요
> .java 확장자를 가진 클래스파일이 있습니다.
> javac 컴파일러를 통해서
> .class 자바 바이트코드로 컴파일합니다.
> 애플리케이션 실행되면서
> 클래스로더가 Java.lang 라이브러리부터 javax extension 라이브러리를 거쳐서 사용자 클래스까지 찾아서 런타임에 전달합니다.
JVM 이란 무엇인가요?
JVM 자바를 실행하는 가상 머신입니다.
자바 바이트 코드는 .class 라는 자바 파일로 생성이 됩니다.
자바 바이트코드는 기계어가 아니기 때문에 바로 실행이 불가능하고, 플랫폼에 맞는 JVM 이 런타임에서 프로그램들을 실행시킵니다.
JVM 은 클래스로더, 런타임 데이터 영역, 실행엔진, 네이티브 메소드 인터페이스와 자바 네이티브 라이브러리로 구성되어있습니다.
클래스로더는 .class 파일로 컴파일된 자바 클래스들을 동적으로 메모리에 로드하는 역할을 수행합니다.
런타임 데이터 영역은 자바 프로그램 실행에 필요한 데이터들을 가지고 있는 부분입니다.
런타임 데이터 영역은 메소드 영역, 힙 영역, 스택 영역, PC Register, 네이티브 메소드 스택으로 구성되어있습니다.
메소드 영역은 클래스 관련정보들과 상수들을 저장합니다.
힙 영역은 객체들이 저장되는 곳이며 스택은 실행되는 스레드 별로 생성되는 영역입니다.
PC Register 는 Current Method 에 대한 정보를 가지고 있으며 스택처럼 각 스레드 별로 소유하게 됩니다.
자바에서 new 를 했을때 일어나는 일은?
new 는 객체 생성을 위한 키워드 입니다. 객체의 데이터는 힙 영역에 저장되고 new 키워드를 실행한 스레드에서는 참조주소를 반환받습니다.
자바 파일을 작성합니다.
컴파일 합니다.
.class 파일이 생성됩니다.
.class 자바 바이트코드로 컴파일합니다.
자바의 equals 와 hashcode 에 대해서 설명해주세요
equals 는 동등성을 표현하기 위해 사용하며 hashcode는 동일성을 판별하기 위해 사용한다.
String, StringBuilder, StringBuffer 의 차이는?
StringBuffer 와 StringBuilder는 불변 객체인 String 의 연산으로 발생하는 비용을 최적화하기 위해 사용합니다.
어떤 String 의 연산을 최적화하는가를 설명해보겠습니다.
String은 메모리에서 MetaSpace 에 존재하는 상수풀에 저장되는데요...
String 변수 a에 100만번의 루프를 돌면서 특정 문자열을 추가하면 100만개의 String 객체가 메타스페이스에 계속들어갑니다.
많은 경우에 루프 다 돌고난 결과 값에만 관심이 있을 수 있는데 그러면 메모리는 불필요하게 N^2의 공간 복잡도가 발생하는 거죠.
그래서 메모리에서만 관리합니다.
StringBuffer 와 Stringbuilder 모두 String 과 같이 CharSequence 로 구성되어잇어서. 같은 연산들이 가능합니다. length(). charAt 과 같은...
Thread Safety란?
쓰레드 세이프티는 멀티 쓰레드 / 병렬 프로그래밍 환경에서 여러 쓰레드가 하나의 자원을 동시에 접근했을 때 부작용 없이 동작하는 것을 의미합니다.
Thread-Safe 한 클래스, 또는 메소드는 100개 1000개의 스레드가 동시에 접근해도 항상 올바르게 동작합니다.
어떻게 Thread Safe 한 구현을 할 수 있을까요?
1. 불변객체를 사용합니다.
2. read-only 한 final 필드를 사용합니다.
3. Locking 을 구현합니다.
4. Static 인스턴스 변수들은 thread-safe 하지 않습니다.
5. 대표적으로 Java.util.concurrent 패키지의 ConcurrentHashMap, CopyOnWriteArrayList 등을 사용합니다. 예전 버전에서는 Vector, HashTable
6. Atomic 변수 사용하기 (멀티스레드 환경에서 락과 synchronization 을 이용한 thread-safety 비용흘 해결하기 위해 만듬, CAS 알고리즘)
7. Local( method-scoped) 변수는 스레드 세이프하다.
8. synchrnoized 키워드로 메소드를 동기화하고 volatile 키워드는 변수를 캐시하지 않고 메인 메모리에서 가지고 와야한다는 것을 명시해줍니다.
데이터베이스
데이터베이스 무결성이 무엇이며, 무결성 유지의 이유를 이야기해주세요.
데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미합니다.
여기서 정확성이란 중복이나 누락이 없고 일관성은 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태를 뜻합니다.
개체 무결성 : 기본키
참조 무결성 : 도메인 무결성
Null 무결성 :
Key 무결성
관계 무결성
데이터베이스 트랜잭션과 트랜잭션의 특징을 이야기해주세요.
데이터베이스에서 트랜잭션이란 데이터베이스의 작업 수행 단위를 의미합니다.
작업의 단위는 대부분 SQL 한문장이고, 여러개로도 구성할 수 있다.
트랜잭션의 특징은 ACID 4가지이다.
Atomicity 원자성, Consistency 일관성, Isolation 독립성, Durability 일관성 이 네 가지를 지켜줘야 한다.
데이터베이스 트랜잭션 격리 레벨에 대해 말해주세요
격리 수준은
READ UNCOMMITED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE 이 있다.
데이터베이스의 격리 수준으로 해결하려는 문제는...
1. DIRTY READ : 커밋되지 않은 데이터를 읽게 되는 현상
2. NON-REPEATABLE READ : 같은 쿼리를 반복했을때 값이 달라져있는 현상
3. PHANTOM READ : 없던 데이터가 생겨나는 현상
데이터베이스 AutoCommit과 롤백의 원리를 이야기해주세요
Commit 과 Rollback
데이터베이스의 전파레벨이 무엇인가요?
데이터베이스에서 전파레벨이란 하나의 트랜잭션에서 다른 트랜잭션에 참여하는 것을 의미합니다.
데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명해주세요
- 검색성능
- 전화번호부
- 정렬
- 정렬비용 2가지
- 인덱스 세 가지 기준별 종류
- 저장 및 활용 위치
검색성능
검색성능을 높히기 위해, 빠르게 데이터를 조회하기 위해 사용하는 자료구조라고 생각하면 될것이다.
전화번호부
전화번호부의 색인으로 많이 비유를 한다.
전화번호부의 목차에 비유하면서 생각해야할 것이 전화번호부의 색인은 정렬되어 있다는 점.
정렬
자료구조로 따지면 SortedList 로 비유할 수 있다.
인덱스도 저장되는 값을 기준으로 정렬되어있다.
정렬비용 2가지
삽입, 수정시 정렬을 유지해야하기 때문이 조회(SELECT)를 제외한 부분(UPDATE, DELETE, INSERT)에서 추가적인 연산이 발생하고 이는 성능 저하로 이어진다.
그래서 인덱스는 where 절에 포함된다고 전부 인덱스로 만들어서 데이터 저장 성능을 떨어뜨리고 인덱스 크기를 비대하게 만들어서 역효과를 불러올 수 있다.
인덱스 3가지 기준별 종류
인덱스는 데이터 관리방식(알고리즘)과 중복 값의 허용 여부 등에 따라 여러가지로 나눌 수 있다.
#역할
> 역할별로 구분해보자면 프라이머리 키와 보조키로 구분 할 수 있다. 제외한 모든 인덱스는 세컨더리 인덱스로 분류한다.
#데이터 관리방식(알고리즘)
> 저장방식(알고리즘)으로 구분하자면 B-Tree와 해시가 있다.
> B-Tree
> 항상 정렬된 상태를 유지한다.
> B-Tree 인덱스의 키 값과 리프노드는 정렬되어있고 항상 레코드의 주소 값을 가지고 있고 레코드는 정렬되어있지 않다.
> **순서대로 저장하면 당연히 정렬되겠지만 중간에 삭제된 레코드 위치에 다시 레코드를 넣으며 공간을 재활용하기 때문에 사실상 정렬되어있지 않다고 본다.
> 기존 컬럼 값을 그대로 사용해서 인덱싱한다. 그래서 prefix 로도 검색이 가능하다.
> Hash
> 인덱스의 원래 값의 해시값을 계산해서 인덱싱 하는 알고리즘
> prefix 일치와 같이 인덱스의 부분만 가지고 검색할 때는 전혀 다른 연관지을 수 없는 해시가 나오기 때문에 사용할 수가 없다.
#중복 허용 여부
> 인덱스의 중복 허용 여부로 분류하면 유니크와 non-유니크 한 인덱스로 구분할 수 있고 옵티마이저에게는 정말 중요하다.
인덱스의 저장 및 활용 위치
> 인덱스는 디스크에 저장되고 메모리의 버퍼 풀에서 테이블 데이터와, 인덱스를 캐싱한다.
> 버퍼풀에서는 위치 기반으로 age를 체크하는 LRU 캐시로 정렬한다.
> 보통 DBMS의 물리적 메모리 80%를 buffer pool 에서 관리한다.
데이터베이스의 실행계획에 대해 설명해주세요
실행계획은 옵티마이저가 사용자의 쿼리를 최적화시키는 것으로 EXPLAIN 키워드로 확인이 가능하다.
오래전에는 테이블과 인덱스에 대한 정보만 가지고 실행 계획을 수립했다.
> 이 경우 테이블의 규모에 따라서 성능에 치명적인 실행계획을 세울 수 있다.
현재는 테이블과 인덱스의 통계정보도 추가해서 실행계획을 수립한다.
Cost Model
MySQL 서버는 사용자의 쿼리에 대해 이러한 다양한 작업이 얼마나 필요한지 예측하고 전체작업 비용을 계산한 결과를 바탕으로 최적의 실행 계획을 찾는다.
코스트 대상 | 설명 | 코스트 이름 | 기본값 |
---|---|---|---|
engine_cost | 디스크로부터 데이터 페이지 읽기 | io_block_read_cost | default_value |
engine_cost | 메모리(InnoDB 버퍼 풀)로부터 데이터 페이지 읽기 | memory_block_read_cost | default_value |
server_cost | 인덱스 키 비교 | key_compare_cost | default_value |
server_cost | 레코드 비교 | row_ | default_value |
server_cost | 메모리 임시 테이블 생성 작업 | memory_temptable_create_cost | default_value |
server_cost | 메모리 임시 테이블 읽기 작업 | memory_temptable_row_cost | default_value |
server_cost | 디스크 임시 테이블 읽기 작업 | disk_temptable_create_cost | default_value |
server_cost | 디스크 임시 테이블 생성 작업 | disk_temptable_reaiiiiid_cost | default_value |
쿼리 실행순서
- Query 파싱
- 쿼리 분해
- 쿼리 검증
- Optimization
- Storage Engine 디스크로부터 Read or Write
- Buffer Pool (InnoCB)
실행계획 개선 방향
- select_type
- 좋음
- Simple
- Primary
- Derived
- 나쁨
- Dependent.*
- Uncacheable.*
- 좋음
- type
- 좋음
- system
- const
- eq_ref
- 나쁨
- index
- all
- 좋음
- extra
- 좋음
- using index
- 나쁨
- using filesort
- using temporary
- 좋음
데이터베이스의 조인
데이터베이스의 락
데이터베이스의 전파레벨
'개발상식' 카테고리의 다른 글
버그 발생 비용의 세부 요소 분석 (1) | 2023.11.24 |
---|---|
더 빨리 움직이면서 느려지는 우리를 위해서, 클린코더의 교훈 (0) | 2023.11.11 |
성능과 메모리 효율 관점에서 JDK 의 ArrayDeque, Stack, LinkedList 비교 (0) | 2023.07.15 |
“테스트의 사실과 오해” 컨퍼런스 발표 내용 (0) | 2023.07.04 |
[Scratch.md] 웹소켓 WebSocket 에 대해서 알아보자 (0) | 2022.02.17 |