분류 전체보기(118)
-
[DB] Clustered / Non-Clustered Index
데이터베이스에 인덱스가 없다면 테이블에 데이터가 삽입되는 순서는 특정 제약이 없다. 또한 데이터 조회 시(일반적인 where절 사용) 테이블 풀스캔이 발생한다. 이때 match 되는 데이터를 찾더라도 데이터 순회를 끝내는 것이 아니라, 테이블의 끝까지 데이터를 '순차 탐색'하면서 match 되는 데이터를 '모두' 찾는다. 이러한 테이블 풀스캔이 항상 나쁘다고 할 순 없지만 데이터가 많아질수록 성능에 문제가 발생할 것이다. 물리적으로는 한 테이블의 데이터 record들이 위와 같은 페이지 구조로 저장된다. 만약 record들을 특정 컬럼 기준으로 정렬해서 저장한다고 하면 테이블 풀스캔을 하지 않고도 찾고자 하는 데이터를 찾을 순 있지만 순차 탐색을 해야 한다는 단점이 존재한다. 이를 해결하기 위한 가장 대..
2022.05.31 -
[DS] 방대한 자료를 담는 자료구조 B Tree (고급편)
Balanced Tree (불균형) 이진탐색트리의 문제점은 최악의 경우 O(N)이 발생한다는 것이다. Balanced Tree는 항상 균형을 맞추어진 상태로 유지함으로써 O(logN)의 성능을 보인다. 하지만 데이터의 삭제, 삽입, 갱신이 발생할 때 Balance를 유지하기 위한 연산이 추가로 필요하게 된다는 단점이 있다. Balanced Tree의 종류로 AVL Tree와 레드블랙트리, 2-3 Tree, 2-3-4 Tree, B Tree 등이 있다. B-Tree는 다차원트리 B-Tree는 Balanced Tree이면서 다차원 트리이다. 하나의 노드가 가질 수 있는 자식 노드의 개수(링크 개수)를 M이라고 했을 때 하나의 노드에 '최대' M-1개의 자료를 담을 수 있으며 이 경우 M차 다차원 트리라고 한..
2022.05.31 -
<추천>[OS] Context Switching, Cache Pollution / TLB, MMU
PCB(Process Control Block) 운영체제가 프로세스들을 관리하기 위해 사용하는 자료구조이다. 운영체제는 PCB 자료구조를 통해 프로세스 제어 및 관리(스케줄링, 종료, fork 등)를 한다. 아래 사진은 PCB가 갖는 데이터 구조이다. - process state : 프로세스의 상태(new ready waiting, running, terminated) - process number : PID - program counter : PC 레지스터 값(다음에 실행시킬 Instruction의 주소) - registers : 프로세스가 스케줄링되어 있던 CPU의 레지스터의 값(Context Switching시 사용됨) - memory-limits : 프로세스에 할당된 메모리 제한 정보(페이지 테이..
2022.05.28 -
[JAVA] Stream I/O vs Channel I/O
이 글에서 말하는 Stream I/O는 일반적으로 자바에서 말하는, 필더링, 리덕션 등의 고차 함수를 이용하는 Stream과 다르다. I/O라는 용어가 붙었기 때문에 file, device, socket I/O 등 운영체제의 도움을 받아 처리되는 데이터의 입출력을 말하는 것이다. Stream I/O 추상적으로 Stream은 '데이터의 흐름'이다. 좀 더 이해를 쉽게 하자면 '데이터가 이동하는 통로'라고 생각해도 좋다. 자바에서 Stream(java.io)은 단방향 통신만을 지원하기 때문에 InputStream과 OutputStream을 따로 둘 수밖에 없었다. 또한 Stream은 Blocking I/O 만을 지원하기 때문에 모든 I/O 작업이 완료되기 전까지 자바 프로세스가 다른 작업을 수행할 수 없다...
2022.05.01 -
[spring] SpringBoot의 AutoConfiguration 동작방식
스프링 프레임워크와 스프링 부트의 차이점 중 하나는 AutoConfiguration의 기능으로 알고 있었지만, 이 기능이 어떤 방식으로 동작하는지 궁금했고 이번 기회에 스프링 부트의 AutoConfiguration의 동작 과정에 대해 포스팅해보았다. 본론으로 들어가기 앞서 Spring과 Spring Boot의 차이점에 대해 알아보자. Spring과 Spring Boot의 가장 큰 차이점은 '의존성의 버전 관리'와 '간편한 자동 설정'이다. Spring - 필요한 dependency를 모두 직접 빌드 툴에 등록해줘야 한다. - Dependency의 버전을 직접 명시해줘야 한다. - 필요한 설정 파일을 작성하고 빈으로 등록해야 한다. Spring Boot - 필요한 dependency의 묶음을 제공하고 추가..
2022.04.25 -
[Tomcat] 톰캣의 소켓 I/O 방식 (Block/Non-Block, BIO/NIO)
기본적으로 톰캣은 쓰레드 풀에 200개의 쓰레드를 두고 요청 당 할당한다고 알고 있었지만 여기서 의문점이 생겼다. 그렇다면 동시에 최대 200개의 요청만 처리할 수 있는 것일까? 이번을 기회로 지금까지 스프링 부트 개발을 하면서 사용해왔던 톰캣의 기능과 톰캣이 요청을 받아 서블릿 컨테이너로 위임하는 과정 / 톰캣의 I/O 방식을 주제로 작성했다. Tomcat이란? 톰캣은 아파치 재단에서 관리되며 Java 표준 인터페이스인 서블릿을 지원하기 위한 미들웨어이다. 톰캣은 OS로부터 네트워크 요청 정보를 받아와 자바 객체로 만들고 이를 서블릿 컨테이너로 위임한다. 톰캣은 웹 애플리케이션의 다양한 스펙 사항(서블릿 스펙, JSP스펙, '웹소켓' 스펙 등)을 준수하며 개발되었다. 링크(https://tomcat.a..
2022.04.21 -
[Tomcat] 아파치 톰캣9 Socket I/O 동작방식 이해
아파치 Tomcat의 BIO Connector / NIO Connector 개념 1) BIO Connector - Response를 보내고 끝내는 것이 아니라 TCP Connection이 만료될 때까지 Thread가 활성 상태로 남아있으며 소켓이 닫히면 Pool로 반환되는 구조 - Connection이 만료되기 전까지 Thread가 활성상태로 남아 있기 때문에 Idle Thread 발생 - '최대 동시접속 클라이언트 수'와 '쓰레드 풀의 쓰레드 수'가 같음 2) NIO Connector - Java의 I/O 라이브러리인 NIO를 활용하여 Tomcat에서 만들어진 Connector - Poller라는 단일 쓰레드가 Selector를 이용하여 처리가 가능한 순간에만 Thread를 활성화시킴으로써 Idle T..
2022.04.20 -
외부 ping(ICMP 프로토콜) 차단 설정하기
ICMP(Internet Control Message Protocol) ICMP는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜로 네트워크 계층에 속한다. IP에는 오로지 패킷을 목적지에 도달시키기 위한 내용들로만 구성되어 있기 때문에 정상적으로 목적지 호스트에 도달하는 경우에는 IP에서 통신이 성공하고 종료되므로 아무런 문제가 없다. 만약 전달해야 할 호스트가 꺼져 있거나, 선이 단절된 경우와 같은 비정상적인 경우에 이 패킷 전달을 의뢰한 출발지 호스트에 이러한 사실을 알려야 하지만, IP에는 그러한 에러에 대한 처리 방법이 명시되어있지 않다. 이러한 IP의 부족한 점을 메꾸기 위하여 사용되는 것이 ICMP 프로토콜이다. ICMP는 해당 호스트가 없거나, 해당 포트에 대기중에..
2022.04.19 -
[spring] servlet부터 spring등장까지
최근 MockMvc 기반으로 컨트롤러 단의 테스트 코드를 작성하다가 핸들러가 호출되지 않는 문제를 마주했고 이를 해결하기 위해 컨트롤러까지 요청이 들어오기까지 어떤 과정을 거치는지 알아야 할 필요성을 느껴 포스팅을 준비했다. 서블릿이란 과거에는 거의 동적인 컨텐츠만 다루는 웹 시스템이었으나 동적인 컨텐츠를 다루면서 웹 서버에 프로그램을 붙여 동적인 페이지를 제공하도록 변화했다. 그래서 등장한 것이 서블릿과 WAS이고 서블릿은 자바 Interface로 정의된 명세사항(specification)이다. (servlet은 javax 패키지에 정의된, 자바에서 정의한 스펙 사항이며 다른 플랫폼에서는 사용되지 않는다) 서블릿의 스펙사항을 기반으로 만들어진, 서블릿을 관리하는 서블릿 컨테이너가 WAS에서 구동된다. ..
2022.04.18 -
<추천티비>OSI 7계층을 기반으로 네트워크 흐름 이해하기
이번 포스팅의 목적은 네트워크 흐름의 overview를 그려보고는 것이다. 대략적인 흐름을 이해하는 것에 중점을 두었고 너무 자세한 내용은 생략했다. 1 계층 Physical Layer 컴퓨터가 다루는 / 주고받는 모든 데이터는 0과 1의 나열이다. Physical Layer에서는 0과 1의 나열로 구성된 데이터를 지정된 주파수에 맞게 흘려보내고 수신자는 이를 받아 디지털 신호로 디코딩한다. 주로 신호를 주고받는 역할을 담당하기 때문에 하드웨어 레벨에서 처리된다. 2 계층 Data-Link Layer 같은 네트워크 상에 존재하는 다양한 단말 중에 목적지로 보내기 위한 역할을 담당한다.(목적지를 연산한다는 것은 아님) 주로 Framing 작업을 수행하는데, 원본 데이터를 frame이라는 단위로 묶어 다음 ..
2022.04.17