이 글에서 말하는 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 작업이 완료되기 전까지 자바 프로세스가 다른 작업을 수행할 수 없다...
스프링 프레임워크와 스프링 부트의 차이점 중 하나는 AutoConfiguration의 기능으로 알고 있었지만, 이 기능이 어떤 방식으로 동작하는지 궁금했고 이번 기회에 스프링 부트의 AutoConfiguration의 동작 과정에 대해 포스팅해보았다. 본론으로 들어가기 앞서 Spring과 Spring Boot의 차이점에 대해 알아보자. Spring과 Spring Boot의 가장 큰 차이점은 '의존성의 버전 관리'와 '간편한 자동 설정'이다. Spring - 필요한 dependency를 모두 직접 빌드 툴에 등록해줘야 한다. - Dependency의 버전을 직접 명시해줘야 한다. - 필요한 설정 파일을 작성하고 빈으로 등록해야 한다. Spring Boot - 필요한 dependency의 묶음을 제공하고 추가..
기본적으로 톰캣은 쓰레드 풀에 200개의 쓰레드를 두고 요청 당 할당한다고 알고 있었지만 여기서 의문점이 생겼다. 그렇다면 동시에 최대 200개의 요청만 처리할 수 있는 것일까? 이번을 기회로 지금까지 스프링 부트 개발을 하면서 사용해왔던 톰캣의 기능과 톰캣이 요청을 받아 서블릿 컨테이너로 위임하는 과정 / 톰캣의 I/O 방식을 주제로 작성했다. Tomcat이란? 톰캣은 아파치 재단에서 관리되며 Java 표준 인터페이스인 서블릿을 지원하기 위한 미들웨어이다. 톰캣은 OS로부터 네트워크 요청 정보를 받아와 자바 객체로 만들고 이를 서블릿 컨테이너로 위임한다. 톰캣은 웹 애플리케이션의 다양한 스펙 사항(서블릿 스펙, JSP스펙, '웹소켓' 스펙 등)을 준수하며 개발되었다. 링크(https://tomcat.a..
아파치 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..
ICMP(Internet Control Message Protocol) ICMP는 TCP/IP에서 IP 패킷을 처리할 때 발생되는 문제를 알려주는 프로토콜로 네트워크 계층에 속한다. IP에는 오로지 패킷을 목적지에 도달시키기 위한 내용들로만 구성되어 있기 때문에 정상적으로 목적지 호스트에 도달하는 경우에는 IP에서 통신이 성공하고 종료되므로 아무런 문제가 없다. 만약 전달해야 할 호스트가 꺼져 있거나, 선이 단절된 경우와 같은 비정상적인 경우에 이 패킷 전달을 의뢰한 출발지 호스트에 이러한 사실을 알려야 하지만, IP에는 그러한 에러에 대한 처리 방법이 명시되어있지 않다. 이러한 IP의 부족한 점을 메꾸기 위하여 사용되는 것이 ICMP 프로토콜이다. ICMP는 해당 호스트가 없거나, 해당 포트에 대기중에..
최근 MockMvc 기반으로 컨트롤러 단의 테스트 코드를 작성하다가 핸들러가 호출되지 않는 문제를 마주했고 이를 해결하기 위해 컨트롤러까지 요청이 들어오기까지 어떤 과정을 거치는지 알아야 할 필요성을 느껴 포스팅을 준비했다. 서블릿이란 과거에는 거의 동적인 컨텐츠만 다루는 웹 시스템이었으나 동적인 컨텐츠를 다루면서 웹 서버에 프로그램을 붙여 동적인 페이지를 제공하도록 변화했다. 그래서 등장한 것이 서블릿과 WAS이고 서블릿은 자바 Interface로 정의된 명세사항(specification)이다. (servlet은 javax 패키지에 정의된, 자바에서 정의한 스펙 사항이며 다른 플랫폼에서는 사용되지 않는다) 서블릿의 스펙사항을 기반으로 만들어진, 서블릿을 관리하는 서블릿 컨테이너가 WAS에서 구동된다. ..
이번 포스팅의 목적은 네트워크 흐름의 overview를 그려보고는 것이다. 대략적인 흐름을 이해하는 것에 중점을 두었고 너무 자세한 내용은 생략했다. 1 계층 Physical Layer 컴퓨터가 다루는 / 주고받는 모든 데이터는 0과 1의 나열이다. Physical Layer에서는 0과 1의 나열로 구성된 데이터를 지정된 주파수에 맞게 흘려보내고 수신자는 이를 받아 디지털 신호로 디코딩한다. 주로 신호를 주고받는 역할을 담당하기 때문에 하드웨어 레벨에서 처리된다. 2 계층 Data-Link Layer 같은 네트워크 상에 존재하는 다양한 단말 중에 목적지로 보내기 위한 역할을 담당한다.(목적지를 연산한다는 것은 아님) 주로 Framing 작업을 수행하는데, 원본 데이터를 frame이라는 단위로 묶어 다음 ..
디폴트 메소드 도입 자바 8부터 인터페이스의 기능이 개선되었다. 그중 하나가 인터페이스가 구현체를 가지게 된 것인데 이것이 인터페이스의 디폴트 메소드이다. 인터페이스는 모든 메소드가 추상 메소드로만 이루어진 클래스를 의미한다. 하지만 자바 8부터 디폴트메소드가 인터페이스에 들어갈 수 있게 되면서 추상 클래스와의 차이가 거의 없어졌다. 예시 default void say() { // 디폴트 메소드의 구현 몸체부 // 디폴트 메소드의 구현 몸체는 이를 구현하는 클래스가 아닌, // 인터페이스가 자체적으로 가지고 있음 } 디폴트 메소드를 사용하는 이유 - 어뎁터의 기능 사용 - 디폴트 메소드 등장으로 인해 static 메소드도 가질 수 있게 됨. - default, static 메소드들은 implements를..
- Total
- Today
- Yesterday
- Kubernetes
- 카프카
- go
- kafka
- helm
- 컨트롤러
- spring
- docker
- container
- Stream
- argocd
- GitOps
- LFCS
- golang
- Java
- Non-Blocking
- 쿠버네티스
- K8s
- 코틀린
- 우분투
- jvm
- ci/cd
- Controller
- db
- github actions
- ubuntu
- Linux
- CICD
- rolling update
- RDB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |