본문 바로가기

전체 글

(225)
소켓(Socket) 소켓(Socket)소켓은 네트워크에서 프로세스 간 통신을 가능하게 하는 연결부이다. 그리고 네트워크에 연결하기 위해 정해진 규약, 즉 프로토콜에 맞게 여러 종류의 소켓이 있다(TCP 소켓, UDP 소켓 등).  운영체제는 소켓 API를 제공한다. 소켓 API는 네트워크 통신을 처리하기 위해 운영체제에서 제공하는 표준화된 함수의 집합이다. 즉, 애플리케이션이 네트워크 통신을 할 때는 반드시 소켓 API를 사용하게 된다. 애플리케이션에서 socket(), bind() 등의 소켓 API를 호출하면 해당 함수들은 내부적으로 시스템 콜을 통해 운영체제 커널에서 처리된다.  소켓을 맥락에서 이해하면 다음과 같다.소켓은 네트워크 통신을 위한 인터페이스로, 애플리케이션 계층에서 TCP 프로토콜 스택에 접근하기 위해 추..
애플리케이션 계층: DNS DNS, 네임서버DNS는 Domain Name System의 약자로 도메인 이름과 IP 주소를 변환하는 역할을 하는 시스템이다. DNS가 필요한 이유는 무엇일까? 사용자가 복잡한 IP 주소를 기억하는 것은 어렵기 때문이다. 따라서 사용자가 도메인 이름을 입력하면, DNS를 통해 그에 해당하는 IP 주소를 알아오는 것이다.네임서버는 도메인 이름과 그에 상응하는 IP 주소 간의 매핑 정보를 저장하고 관리하는 서버이다. 계층 구조그런데 만약 DNS를 운영하는 네임서버가 1개라면? 모든 트래픽이 하나의 서버로 몰려 IP 주소 반환 과정이 느릴 것이고, 이 서버가 다운되면 전세계 사람들이 이용하지 못하게 될 것이다. 따라서 DNS를 운영하는 네임서버는 여러 개로 구성되고, 이 서버들은 계층적인 구조로 되어 있다...
애플리케이션 계층: HTTP HTTP(Hypertext Transfer Protocol) 전 세계의 웹브라우저, 서버, 웹 애플리케이션은 모두 HTTP(Hypertext Transfer Protocol)를 통해 서로 통신한다. HTTP는 전 세계의 웹 서버로부터 대량의 정보를 사람들의 PC에 설치된 웹브라우저로 옮겨준다. HTTP는 Hypertext Transfer Protocol의 약자이다. 이때 하이퍼텍스트란, 텍스트인데 링크들을 포함한 텍스트를 의미한다(ex, 이미지 참조 링크, 동영상 참조 링크). 따라서 HTTP는 여러 링크들이 포함된 하이퍼텍스트를 전송하는 프로토콜이다. HTTP의 특징 TCP/IP 따라서 신뢰성 있는 데이터 전송이 보장된다. 클라이언트-서버 구조 클라이언트는 서버에게 필요한 데이터를 요청하고, 서버는 요..
소수인지 판단할 때 시간 복잡도 줄이기 https://school.programmers.co.kr/learn/courses/30/lessons/92335 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 위 문제를 풀 때 소수인지 판단하는 메소드를 다음과 같이 구현했었다. 그런데 시간 초과가 났다. public boolean isPrime(long num) { for (int i = 2; i < num; i++) { if (num % i == 0) { return false; } } return true; } 만약 100이 소수인지 판단한다고 가정하자. 100의 약수는 [1, 2, 4, 5, 10..
[Real MySQL] 9. 옵티마이저와 힌트 옵티마이저 옵티마이저는 가장 효율적인 방법으로 SQL을 수행할 최적의 처리 경로를 생성해주는 DBMS의 핵심 엔진이다. MySQL 서버로 요청된 쿼리는 결과는 동일하지만 내부적으로 그 결과를 만들어내는 방법은 매우 다양하다. MySQL의 옵티마이저는 쿼리를 최적으로 실행하기 위한 실행 계획을 수립하는 작업을 진행한다. EXPLAIN이라는 명령으로 쿼리의 실행 계획을 확인할 수 있다. 그리고 실행 계획을 제대로 이해하려면 MySQL 서버 옵티마이저가 실행하는 최적화에 대해 어느 정도 지식을 갖추고 있어야 한다. 쿼리 실행 절차 MySQL 서버에서 쿼리가 실행되는 과정은 다음과 같다. SQL 파싱: 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있도록 파싱하여 트리 형태(파스 트..
[Real MySQL] 8. 인덱스 - 클러스터링 인덱스 클러스터링 인덱스(클러스터링 테이블) 클러스터링 인덱스는 테이블의 PK에 대해서 적용되는 내용이다. 즉 PK 값이 비슷한 레코드끼리 묶어서 저장하는 것을 클러스터링 인덱스라고 표현한다. 참고로 MySQL에서 클러스터링 인덱스는 InnoDB 스토리지 엔진에서 디폴트로 설정된다. 클러스터링 인덱스, 즉 PK 값에 의해 레코드의 저장 위치가 결정된다. 따라서 PK 값이 바뀌면 그 레코드의 물리적 저장 위치가 바뀌어야 한다. 즉, PK 값으로 클러스터링된 테이블은 PK 값에 대한 의존도가 크기 때문에 신중히 PK 값을 설정해야 한다. 클러스터링 인덱스는 PK 값에 의해 레코드의 저장 위치가 결정되므로 사실 인덱스 알고리즘이라기보다 테이블 레코드의 저장 방식이라고 볼 수 있다. 그래서 "클러스터링 인덱스"와 "클..
[Real MySQL] 8. 인덱스 - B-Tree, B+Tree, Hash 인덱스 B-Tree 인덱스 B-Tree 인덱스에 대해 알기 전에 먼저 B-Tree 자료구조에 대해 알아보자. B-Tree는 자식을 2개만 갖는 이진 트리를 확장하여 N개의 자식을 갖는다. 그리고 좌우 자식 간의 균형이 맞지 않을 경우 비효율적이기 때문에 항상 균형을 맞춘다는 의미에서 균형 트리(Balanced Tree) 라고 한다. 즉, B-Tree의 B는 Binary(이진)의 약자가 아니라 Balanced(균형)의 약자이다. B-Tree는 데이터베이스의 인덱싱 알고리즘 중 가장 일반적으로 사용되고, 가장 먼저 도입된 알고리즘이다. B-Tree는 칼럼의 원래 값을 변형시키지 않으며 항상 정렬된 상태로 유지한다. 전문 검색과 같은 특수한 요건이 아닌 경우 대부분의 인덱스는 거의 B-Tree를 사용할 정도로 일반적..
[Real MySQL] 8. 인덱스 - 디스크 읽기 방식, 인덱스 디스크 읽기 방식 컴퓨터의 CPU나 메모리처럼 전기적 특성을 띤 장치의 성능은 짧은 시간 동안 매우 빠른 속도로 발전했지만, 디스크 같은 기계식 장치의 성능을 상당히 제한적으로 발전했다. 비록 최근에는 자기 디스크 원판에 의존하는 HDD(하드 디스크 드라이브)보다 SSD가 많이 활용되고 있지만, 여전히 데이터 저장 매체는 컴퓨터에서 가장 느린 부분이다. 따라서 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건일 때가 상당히 많다. 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD) 컴퓨터에서 CPU나 메모리 같은 주요 장치는 대부분 전자식 장치이지만 하드 디스크 드라이브(HDD)는 기계식 장치이다. 따라서 데이터베이스 서버에서 항상 디스크 장치가 병목이 된다. 이러한 기계식..