HTTP는 어떤 방식으로 동작할까?

Life is ninanino·2023년 4월 4일
0
post-thumbnail

코드를 실행하면 WebServer.java에서 main문이 실행된다.

스크린샷 2023-04-03 오후 4 05 13

포트는 디폴트로 8080으로 int값이 설정되었다.
포트 번호를 서버 소켓에 넣어서 소켓을 연결한다.
그리고 new Thread를 생성해서 RequestHandler를 실행하고 시작한다
여기서 RequestHandler는 클라이언트로부터의 HTTP요청을 처리한다

스크린샷 2023-04-03 오후 4 13 51

여기서 RequestHandler는

public RequestHandler(Socket connectionSocket) {
        this.connection = connectionSocket;
    }

소켓을 생성자로 받고있다.

근데 궁금한 점은 run() 메소드는 아무곳에서도 호출하지 않았는데 어떻게 돌아갈까?
위로 올라가보니
스크린샷 2023-04-03 오후 4 19 03
RequestHandler는 Runnable 인터페이스를 구현하고 있다.

Thread 클래스의 생성자에서 객체를 생성할 때 Thread 클래스 내부에서는 Runnable 객체의 run() 메소드를 호출한다.

Thread와 Runnable은 좀 생소한 개념인 것 같다
Thread와 Runnable에 대한 이해 및 사용법
oracle 공식문서

RequestHandler 클래스의 run()은
HTTP 요청이 들어오면 요청을 처리하고 응답을 클라이언트에게 전송한다.

logger.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(),
                connection.getPort());

이 부분에서 로그를 출력하고 클라이언트와 연결된 소켓에서 InputStream과 OutputStream을 생성하여 요청 데이터를 읽고 응답 데이터를 전송한다

DataOutputStream은 응답 메세지를 전송하기 위해 사용된다.

byte[] body = Files.readAllBytes(new File(PATH + url).toPath());

이 부분을 이용해서 URL에 해당하는 파일의 내용을 바이트 배열로 읽는다
PATH는 상수로 파일 경로를 지정해주었다

response200Header(dos, body.length);

이 메소드는 HTTP 응답 메시지의 헤더를 작성하는 역할을 하는데, 이 헤더에는 HTTP의 상태 코드, 컨텐츠 타입, 컨텐츠 길이 등의 정보가 포함된다.

responseBody(dos, body);

이 메소드는 HTTP 응답 메세지의 바디를 작성하는 역할이다.

이렇게 HTTP 응답헤더와 바디를 생성하여 클라이언트에게 전송하게된다.

profile
백엔드 프로그래밍을 공부하고 있습니다. AWS, 클라우드 환경에 대해 관심이 많습니다.

0개의 댓글