개요 JVM은 .class파일의 정보를 클래스 로더를 통해 읽어오고, 이 정보는 메소드 영역(Method Area) 혹은 Java 8 이상에서는 메타스페이스(Metaspace)에 저장된다. 이러한 구조는 런타임 시 클래스의 내부 정보를 동적으로 분석하거나 조작할 수 있게 해주는 기반이 되며, 바로 이 기능이 리플렉션(Reflection)이다. Spring 프레임워크는 이 리플렉션 기능을 활용하여, 적절한 의존 객체를 찾아 자동으로 주입(Dependency Injection)해준다. 대표적으로 @Autowired 덕분에 클라이언트 코드는 구체 클래스가 아닌 추상화(인터페이스)에만 의존하게 되어 DIP(Dependency Inversion Principle) 를 만족하며, 새로운 구현체를 추가해도 기존 코..
개요 현재 프로젝트로 웹 애플리케이션 서버를 구현 중이며, Connector 구조는 BIO 기반으로 설계되어 있다. 이 구조는 기본적인 클라이언트 요청 처리, 서버 소켓 관리, 스레드풀 운용 등을 정상적으로 수행하고 있다.다만, 향후 다양한 I/O 모델(NIO 등)을 지원하도록 시스템을 확장하기 위해서는 현재 구조에 일부 한계가 존재한다. 특히 NIO Connector 구조를 추가하기에 앞서, 보다 확장성과 유연성을 갖춘 설계로 리팩토링을 진행하고자 한다. (Connector에 대해 궁금하면 링크 참고 바랍니다.) 오픈소스 분석 - Tomcat 소켓 I/O 동작 방식 파헤쳐보기(BIO, NIO Connector)개요 이전 글에서는 C10K 문제를 출발점으로 서버 아키텍처와 커널 I/O의 발전 과정(멀티 ..
개요 이전 글에서는 C10K 문제를 출발점으로 서버 아키텍처와 커널 I/O의 발전 과정(멀티 프로세스 → 멀티 스레드 → 멀티플렉싱)을 살펴보고, 자바의 멀티플렉싱 지원 컴포넌트인 Selector에 대해 알아보았다.이번에서는 Tomcat에 초점을 맞춰, 멀티플렉싱이 실제로 어떻게 적용되고 있는지를 살펴본다. Tomcat이 제공하는 I/O방식(BIO, NIO, NIO2, APR) 중 BIO와 NIO구조를 중심으로 비교 분석하고, Tomcat 9.0.80 버전의 소스 코드를 기반으로 NIO Connector의 내부 동작 흐름을 구체적으로 분석해본다. C10K 문제로 살펴보는 서버 아키텍처와 커널 I/O의 진화개요 C10K 문제란, 단일 서버가 동시에 10,000명(Concurrent 10K connecti..
개요 JDK1.4(Java 4)부터 새로운 입출력(New Input/Output, NIO)이라는 뜻에서 java.nio패키지가 포함되었다.기존 IO패키지가 단방향 스트림 기반이었다면, NIO는 채널과 버퍼 기반의 구조로 입출력을 처리하며, 논블로킹I/O와 멀티플렉싱을 지원하도록 설계되었다.스트림은 입력 스트림과 출력 스트림으로 구분되어 있기 때문에 데이터를 읽기 위해서는 입력 스트림을 생성해야했고, 데이터를 출력하기 위해서는 출력 스트림을 생성해야했다. 반면, NIO에서는 채널 기반으로 양방향 입출력 구조를 제공한다. 따라서 입력과 출력을 위해 별도의 스트림을 만들필요 없이 하나의 채널에서 처리 가능하다.또한 기존 IO는 내부적으로 1바이트 단위로 처리하는 구조에 가까워, 성능을 높이기 위해 보조 스트림..
개요 최근 웹 애플리케이션 서버의 URL 패턴 매핑 기능을 직접 구현하던 중, 접두사 매칭(Prefix match)에 대한 요구사항을 마주하게 되었다. 예를들어 사용자에게 /user/test/123로 URL 요청이 오면 /user/test/* 와 /user/* 중 더 구체적인 패턴, 즉 가장 긴 접두사인 user/test/* 가 매핑되어야 했다. 정확히 일치하는 URL을 찾는 것이라면 HashMap 자료 구조를 이용하여 O(1)로 처리할 수 있다. 하지만 와일드 카드(*)가 포함된 접두사 매칭은 일반적인 해시 기반 탐색만으로 해결하기 어려웠다. 때문에 순차 탐색으로 startsWith()와 longest 변수를 두어 요청 URL과 접두사가 일치하고 가장 긴 패턴이면 갱신하도록 구현하였다. 시간 복잡도는 ..
개요 오늘날 웹 프레임워크(Spring)의 대중화로 인해, 웹 프로그래머가 직접 서블릿 API를 사용하여 서비스를 구현하는 일은 점점 줄어들고 있다. 웹 애플리케이션 서버(예: tomcat)는 클라이언트와 서버 간의 소켓 통신에 필요한 TCP/IP 연결관리, HTTP 프로토콜 해석 등 전반적인 과정을 추상화하는 환경을 제공하기 때문에 웹 애플리케이션 프로그래머는 이러한 저수준 작업을 신경 쓰지 않고, 비즈니스 로직 구현에 집중할 수 있다. 그러나, 웹 애플리케이션 서버와 프레임워크가 제공하는 추상화된 API만을 사용하면 내부 동작 원리를 깊게 이해하기 어렵다. 자바 웹 프로그래밍에서 서블릿은 HTTP 요청에 대한 로직수행의 최초 진입점일 뿐만아니라, 웹 프레임워크를 사용해 구현되는 서비스도 결국 내부적으..
개요 멀티 스레드는 하나의 프로세스 내에 여러 개의 코드 실행흐름(스레드)이 동작하는 방식을 말한다. 멀티 프로세스가 프로그램 단위의 멀티 태스킹이라면 멀티 스레드는 프로그램 내부에서의 멀티 태스킹이라 볼 수 있다. 멀티 스레드는 동일한 메모리 공간(코드, 데이터, 힙 영역)을 공유하므로 프로세스보다 더 가볍고, 빠른 데이터 공유가 가능하다. 이러한 이유로 멀티 프로세스보다 멀티 스레드가 자원을 보다 효율적으로 사용할 수 있다. 그러나, 스레드 개수가 지나치게 많아지면 오히려 CPU가 스레드 간의 작업을 전환하는 데 많은 시간을 소비하게 된다. 이를 컨텍스트 스위칭 비용이라고 하며, 스레드 수가 증가할수록 이 비용이 누적되어 성능 저하를 유발할 수 있다. 따라서, 효율적인 병렬 처리를 위해 적절한 개수의..