전체 글 (40) 썸네일형 리스트형 [Java] http 요청과 응답 구현하기 - 2(apache tomcat의 http 처리) 개요 지난 글에서 library를 이용하지 않고 Socket을 이용해 'http' 프로토콜 요청을 구현해보았다. 이 때 apache tomcat 기반의 타겟 서버가 http message 규칙에 맞는 요청을 적절히 처리하여 응답한 것을 확인할 수 있었다. 그렇다면 apache tomcat은 어떻게 http 요청을 해석할 수 있었을까? http 응답을 위한 call stack 뜯어보기 yourkit 이라는 툴을 활용해 health check 서버가 SocketClient의 요청을 어떻게 처리했는지 콜스택을 살펴보자. call stack 특성상 가장 하위의 메서드부터 실행되어 응답되는 구조다. Thread가 실행되고, NIO를 통해 socket 연결 수립 후 실행된다. 이후 AbstractProtocl의 s.. [Java] http 요청과 응답 구현하기 - 1(socket으로 http 요청하기) 네트워크 - 요청과 응답 네트워크를 이용하면 멀리 떨어진 대상과도 자료를 주고 받을 수 있다. 가령 이 블로그 글의 정보를 얻기 위해 사용자는 개인 PC 서버에서 웹브라우저를 통해 tistory 서버 어딘가에 저장된 글이라는 데이터를 받고 있다. 네트워크는 OSI 7계층이나 TCP/IP 4계층 등으로 분류되는 개념으로 동작한다. 전기 신호를 직접 전달하는 하드웨어가 위치한 계층에서부터 실제 데이터를 주고 받는 주체인 'application'까지 계층적으로 각 역할을 수행한다. 요청을 주고 받는 과정을 TCP/IP 4계층의 용어로 설명하면, 'Network Access Layer'의 하드웨어를 이용해 'Internet Layer'에서 통상 IP로 목적지 네트워크 주소를 판별한다. 이후 'Transport.. [Java] Reference Type(feat. strong, soft, weak) 하나의 프로세스에서 JVM heap memory는 할당량이 제한된다. 할당할 수 있는 데이터의 크기가 한정적이므로 사용하지 않을 데이터를 계속 메모리에 올려서 사용하는 것은 비효율적이고, 만약 데이터를 무한정 할당하게 된다면 메모리 공간이 부족해져 OOME가 발생할 것이다. 이를 관리해주는 것이 Garbage Collector다. 가비지컬렉터가 사용하지 않는 메모리 참조를 해제함으로써 메모리의 여유 공간을 확보하는 것이다. GC는 현재 참조하고 있지 않은 대상을 수집하여 메모리 공간을 확보하는데, 만약 크기가 큰 객체를 지속적으로 참조해야 상황이 생긴다면 어떻게 될까? 모두 GC 대상에서 제외될까? 만약 현재 참조하여 활용되고 있는 데이터는 모두 GC의 대상이 되지 못한다는 가설이 맞다면 다음의 문.. [Java] Dynamic Proxy란? n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까? 부가적인 기능을 추상화하여 공통 코드로 만들어야 한다. 서로 다른 클래스의 Proxy 클래스 구현을 추상화해야 한다. 마치며 이전 글 Proxy란?에서 Proxy를 만들어 구현 코드를 수정하지 않고 부가적인 기능을 추가시켰다. 부가적인 기능을 추가시키고 싶은 클래스의 Proxy 클래스를 직접 만들어 클라이언트가 proxy 클래스를 호출하도록 했다. 이 때 이런 문제가 있었다. 'n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까?' 이 문제를 해결하기 위해 문제를 추상화해보자. 1. 부가적인 기능을 추상화하여 공통 코드로 만들어야 한다. (단순 Proxy 클래스 구현에서는 모든 Proxy 기능에 부가 기능 코드를 구현해야 했다) .. [Java] Proxy란? Proxy와 @Transactional '구현 코드를 수정하지 않고 부가적인 기능을 어떻게 수행할 것인가?' 'n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까?' 다음 글 - Dynamic Proxy Proxy란 개념을 공부하게 된 계기는 Spring에서 @Transactional annotation이 어떻게 동작하는가를 알기 위해서였다. @Transactional annotation이 붙은 코드를 열심히 디버깅하여 따라가보니 다음과 같은 흐름을 볼 수 있었다. 클래스와 메서드에 집중하기 위해 메서드 파라미터나 기타 시그니처 코드들은 생략하였다. package org.springframework.aop.framework; class CglibAopProxy implements AopPr.. [Java] JNI(Java Native Interface)란? JNI란? JNI는 native code(C, C++, assembly 등)의 상호 운용을 위해서 만들어진 인터페이스다. JNI를 이용하면 JVM 내에서 실행되는 Java 코드로 native code 기반 애플리케이션이나 라이브러리를 상호 호출하여 사용할 수 있다. JNI의 장점은 native code로 작성된 코드를 활용하고자 할 때, 기존 Java로 제한된 코드의 구현에 영향을 미치지 않는다는 것이다. 이미 작성된 native code가 있다면, JNI를 이용하여 JVM 내에서 해당 코드가 정상적으로 작동하는 것을 보장하는 것이다. JNI 장단점 장점 - 하드웨어에 대한 동작을 native code로 제어할 수 있다 - 이미 native code를 사용해 구현한 라이브러리가 있을 때 Java에서 사용.. File Descriptor 제한 테스트(feat. ulimit, JMeter, VisualVM) 이전 글 테스팅 툴 - JMeter와 모니터링 툴 - VisualVM에서 어플리케이션을 테스트하고 어플리케이션이 사용하고 있는 자원을 모니터링하였다. JMeter 문서에 나오는 best practices에서 정확한 테스트를 위해 thread 수를 적절히 설정해야 할 필요가 있다고 나와 있었는데, 당시에는 그러면 얼마만큼의 thread 수가 적절한가? 하는 의문이 들었다. File Descriptor, ulimit을 공부하며 어떤 영향이 있는지 알 수 있는 테스트를 할 수 있었다. 이번 글은 그 테스트에 대한 글이다. Spring Boot Application Server SlowController를 하나 만들어 각 루트 요청이 Thread를 5초간 sleep 하도록 만들었다. @RestController.. File Descriptor란? "하나의 서버 컴퓨터가 요청을 몇 개나 맺을 수 있을까요?" 답변을 하지 못했다. 아마 성능이 매우 좋은 cpu, ram, disk를 쓰면 요청을 많이 맺을 수 있지 않을까 생각했다. 물론 하드웨어적인 요소들이 서버가 맺을 수 있는 요청의 수에 영향을 주겠지만, Unix-like OS 관점에서 볼 때 모든 요청이 파일로 관리되기 때문에 '파일을 얼마나 생성해낼 수 있는가?'가 하나의 지표로 활용될 수 있을 것이다. 여기서 요청이라 하면 sockets, network I/O, disk I/O 등 다양한 인터페이스를 가리킨다. 소켓을 열거나 네트워크 연결을 수립할 때, 파일을 열거나 디스크 장치에 접근할 때도 file descriptor가 생성된다. 현재 사용하고 있는 노트북이 macOS이므로 file de.. 이전 1 2 3 4 5 다음