
기술 면접에서 들었던 질문에 대해서 정리해보는 시간을 가져보겠습니다.
DB에서 데이터를 더 빠르게 찾을 수 있도록 도와주는 데이터 구조다.

이진트리에서 발전되어 모든 리프노드들이 같은 레벨을 가질 수 있도록 자동으로 밸런스를 맞추는 트리
인덱스의 자료구조는 여러가지가 있지만, 제일 보편적인 것이 B-Tree index이다. 정렬된 순서를 보장한다는 특징이 있다.



인덱스는 또 다른 기존 테이블외에 인덱스 테이블을 가지고 있기에 검색속도가 빨라진다. 그러나, DML(insert, update, delete)이 자주 일어나는 테이블의 경우에는 오히려 성능이 떨어진다.
기본적으로 인덱스는 데이터를 삭제하더라도 사용안함 표시를 해주고 실제로 사라지는 것이 아니다. 또한, update 문으로 수정하는 경우에도 내부적으로는 delete 후에 다시 insert 하는 로직을 따르고 있다.
따라서 DML이 자주 일어나는 테이블에는 오히려 인덱스 테이블이 원래 테이블보다 크기가 커지는 경우가 발생하고, 사용하는 의미가 사라진다.
동일한 연산을 반복적으로 적용해도 결과가 달라지지 않는 특성이다.
HTTP 메서드의 GET, PUT, DELETE가 해당된다. 이러한 멱등성은 네트워크의 불안정성이나 장애로 인해 동일한 요청을 여러 번 보내야 하는 상황에서, 멱등성을 보장하는 요청은 시스템의 부작용 없이 안전하게 처리가 가능하다.
코드, 런타임, 시스템 툴, 시스템 라이브러리 및 설정을 포함한 애플리케이션과 그 종속성을 하나의 패키지로 묶어주는 가벼운, 격리된 환경을 통해 다양한 환경에서 동일하게 실행되도록 해주는 오픈소스 플랫폼이다.
이터레이터, 데코레이터, 제너레이터, 정규표현식, 클래스, 등등 배웠지만 실제로 사용해본 것은 중급 문법에서 클래스 정도라고 대답했었다.
Object-Oriented Programming 즉, 객체 지향 프로그래밍으로 프로그램을 객체 단위로 구성하여 개발하는 방식이다. 여기서 객체란, 데이터(속성)와 이 데이터를 처리하는 데 사용하는 함수(메서드)를 하나로 묶은 것이다.
Java, C++, Python, Ruby 등이 이를 지원한다.
각 노드가 최대 두 개의 자식 노드를 가질 수 있는, 계층적으로 조직된 데이터 구조이다. 데이터의 효율적인 검색, 정렬, 삽입, 삭제 등을 위해 사용된다.
대량의 데이터를 다루는 경우 상당한 성능 향상을 기대할 수 있다.
키와 값 쌍으로 데이터를 저장하는 자료구조 중 하나로, 효율적인 검색, 삽입, 삭제가 가능하다.
파이썬의 딕셔너리와 집합이 해당된다.
그래프나 트리를 탐색할 때 사용되는 기본적인 알고리즘
모든 노드를 방문할 때까지 깊이 들어가 탐색하며, 마지막 분기점에서 더이상 갈 곳이 없을 때 이전 분기점으로 돌아가 새로운 경로를 찾는다.
주로 스택, 재귀 호출을 사용한다. 미로 찾기, 퍼즐 게임 등에 활용할 수 있다.
시작 노드에서 가까운 노드부터 차례대로 모든 노드를 탐색하고자 할 때 사용된다.
큐를 사용하여 시작 노드에 인접한 노드를 모두 방문한 후, 그 인접 노드들의 인접 노드를 차례로 방문하는 형식이다.
최단 경로 찾기, 소셜 네트워크 친구 찾기 등에 유용하다.
리스트나 다른 구조로도 구현이 가능하지만 큐의 선입선출을 모방하는 과정에서 비효율적이다. 따라서 탐색의 명확성과 효율을 위해 주로 큐를 사용한다.
Open Systems Interconnection의 약자로, 서로 다른 시스템 간의 통신을 가능케 하는 표준화된 모델이다.
데이터가 전송 과정에서 상위 계층에서 하위 계층으로 순차적으로 내려가며 각 기능을 수행하고, 수신 측에서는 하위 계층에서 상위 계층으로 순차적으로 올라가며 처리된다.

네트워크의 가장 낮은 계층으로, 데이터를 전기적 신호로 변환하여 전송하는 기능을 담당한다.
물리 계층에서 송수신된 정보의 오류를 감지하고, 프레임 단위로 데이터를 전송한다. MAC 주소를 사용한다.
다양한 경로를 통해 패킷을 목적지까지 전송한다. IP 주소를 사용하며, 라우팅 기능도 수행한다.
End-to-End 신뢰할 수 있는 데이터 전송을 보장하기 위한 계층이다. TCP/UDP 프로토콜이 작동하며, 세그먼트나 데이터그램 단위로 데이터를 관리한다.
통신 세션을 구성, 관리, 종료하는 기능을 담당한다.
데이터 표현 형식을 관리한다. 서로 다른 시스템 간에 데이터를 교환할 수 있도록 형식을 변환하는 역할을 수행한다.
네트워크 소프트웨어와 사용자 간의 인터페이스를 제공한다. HTTP, FTP 같은 프로토콜이 작동한다.
인터넷에서 데이터를 전송하는 데 사용되는 두 가지 주요 프로토콜이다.
웹 페이지와 웹 서버 간의 데이터를 교환하는 데 사용되는 프로토콜
데이터를 암호화하지 않고 평문으로 전송한다. 80번 포트가 기본이다.
SSL, TLS을 추가한 HTTP이다. 443포트가 기본이며, 신뢰성을 보장하기 위해 디지털 인증서를 사용한다.
네트워크상에서 장치들을 식별하는 데 사용되는 두 가지 주소 유형이다.
인터넷과 같은 TCP/IP 네트워크에서 데이터의 목적지를 지정하는 데 사용된다. 장치나 네트워크의 위치를 기반으로 할당된다.
네트워크 인터페이스 카드에 고유하게 할당된 물리 주소이다. 6개의 16진수 쌍으로 표시되며 (01:23:45:67:89:ab) 전 세계적으로 고유하며, 일반적으로 변경이 불가능하다.
IPv4는 32비트 주소(192.168.0.1)를 사용하며 v6는 128비트 주소(2001:0db8:85a3:0000:0000:8a2e:0370:7334)를 사용한다. 또한, v6는 보안이 기본적으로 포함된다.
Domain Name System의 약자로 사람이 읽을 수 있는 도메인 이름을 기계가 읽을 수 있는 IP 주소로 변환하는 시스템이다.
네트워크 상에서 통신을 하기 위해 사용되는 가상의 접점을 의미한다.
IP 주소와 함께 사용되어, 특정한 IP 주소의 특정한 서비스나 어플리케이션에 데이터가 전송될 수 있도록 한다.
Network Address Translation의 약자로 로컬 네트워크 상의 개별 기기가 인터넷과 같은 외부 네트워크상의 리소스와 통신하도록 IP 주소를 변환해주는 기능이다.
주로, 개인 IP 주소를 공용 IP 주소로 변환하는데 사용되며, 내부 네트워크를 외부로부터 보호하는 데 중요한 역할을 한다.

고성능 웹 서버, 리버스 프록시, 이메일 프록시 등 다양한 기능을 제공하는 오픈 소스 소프트웨어이다.
파이썬 WSGI(Web Server Gateway Interface) 애플리케이션을 위한 HTTP 서버이다. 동적 컨텐츠를 처리한다.

코드를 분석해서 프로그래밍 오류, 버그, 스타일 오류, 의심스러운 구조 등을 찾아내는 도구이다.
JS의 ESLint, 파이썬의 Pylint, Java의 Checkstyle 등이 있다.
코드의 스타일을 일관되게 유지하기 위해 포맷을 자동으로 조정하는 도구이다.
등의 기능을 하며, JS의 Prettier, 파이썬의 Black, Java의 Google Java Format 등이 있다.
파이썬으로 작성된 풀스택 프레임워크로, 빠른 개발과 깔끔하고 실용적인 디자인을 목표로 한다.
저렴한 가격에 간편하게 가상 서버를 설정하고 운영할 때 사용한다.
순차적으로 작업이 이루어 진다.
한 작업이 완료될 때까지 다음 작업이 대기 상태에 있다. 그러나 리소스 활용 측면에서 비효율적일 수 있다.
작업이 동시에 진행된다.
리소스를 효율적으로 활용할 수 있고, 전체적인 응답 시간을 단축할 수 있다. 이는 복잡한 로직을 필요로 하며, 콜백 함수나 프로미스, async/await 같은 기술이 사용된다.
소셜 미디어 피드 로딩, 챗봇 등에 사용된다.
TestCase 클래스를 사용하여 테스트한다.
TestCase 클래스: 파이썬의 unittest.TestCase를 확장한 것으로, 테스트가 끝나면 변경사항은 롤백되어 다른 테스트에 영향을 주지 않는다.
Client 객체: django.test.Client 객체를 사용하여 Get, Post 요청을 생성하고, 응답을 검사하는 등의 작업 수행
SimpleTestCase 및 TransactionTestCase: 데이터베이스를 사용하지 않는 테스트