본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

VirtualThread 아는 체하기 (1) Virtual Thread이란?JDK 21에 추가된 경량 쓰레드이다. OS 쓰레드를 사용하지 않고 JVM 내부 스케줄링을 통해 쓰레드를 생성한다.수십만~수백만개의 쓰레드를 동시에 사용할 수 있다.(2) 일반 Thread이란?기존의 일반 Thread는 OS Thread를 그대로 매핑한 것이다. 이를 Platform Thread라고 한다.Java Thread는 실제로 OS Thread를 사용한 것이다. Thread를 생성할 때 커널 영역에 접근하기 위해, 시스템 콜을 해야한다. 이로 인하여 오버헤드가 발생한다.이러한 배경으로 생성 갯수가 제한적이고, 생성하고 유지하는 비용이 크다.그래서 Thread를 무한히 생성할 수 없기 때문에 Thread Pool으로 관리해왔다.미리 Thread를 만들어두고, 재..
spring boot 3.2에서 HTTP 통신하는 방법 아는 체하기 RestClientRestclient가 등장했다. https://docs.spring.io/spring-framework/reference/integration/rest-clients.html#rest-restclient restclient와 virtual thread 조합을 사용하면, non blocking 통신을 쉽게 구현할 수 있다.  RestClient와 ClientRequestFactoryRestClient는 HttpClient를 사용한다. 그리고 이 값은 ClientRequestFactory으로 조정할 수 있다.ClientRequestFactory와 관련 클라이언트 정보는 다음과 같다. JdkClientHttpRequestFactory: Java’s HttpClientHttpComponents..
[Spring] 유틸리티 클래스에 빈 생성자를 만들어야하는 이유 public final class AmericanoUtils { public static boolean isEmpty(String source) { return source == null || source.length() == 0; } } 위와 같은 유틸리티 클래스를 만들면, 소나큐브에서 "add a private constructor to hide the implicit public one" 워닝이 뜬다. 유틸리티 클래스에는 기본 생성자가 만들어져있어야하기 때문이다. 유틸리티 클래스에 왜 기본 생성자를 만들어야할까? 컴파일러는 생성자 코드가 없으면, 자동으로 기본 생성자를 생성한다. new AmericanoUtils(); 이 경우, 예상치 못한 방식대로 코드가 구현될 수 있다. 그래서 소나큐브는 기본..
12월의 추천 서적: 마이크로서비스 아키텍처 구축 가이드 실무에서 고민했던 것들이 축약되어 쓰여있는 책이다. MSA 뿐만 아니라, 외부 시스템을 연동할 때 고민해야 하는 요소들이 포함되어 있다. 이 책을 통해 실무에서 사용했던 패턴들이 무엇이었는지 제대로 인지할 수 있어서 좋았다. MSA 패턴을 경험해본 적이 없거나, 초기 적용 단계라면 이 책이 많이 유용할 것 같다. 애플리케이션 패턴의 장/단점들이 꼼꼼히 작성되어 있고, 예제 사례가 실무와 똑같은 경우도 있다. (낯익은 코드가 나타나서 흠칫했다.) MSA 패턴 혹은 외부 시스템 연동이 많은 시스템을 운영하고 있는 개발자라면, 이미 아는 내용들일 것이다. 그런데 가볍게 리마인드 하면서 훑어보기 좋을 것 같다. (후루룩 읽으면 2주 이내에 읽을 수 있다.) 나의 경우에는 책의 이론/예제와 내가 경험했던 실무 사..
개발자를 위한 최소한의 DNS 지식 (1): 기초편 DNS resolver이란?Dns의 원리를 사용해 IP를 찾아내는 역할을 하는 클라이언트로 볼 수 있다. hosts.conf 파일이란?특정 도메인에 대한 IP를 찾을 때, 주소 값을 어디에서 찾을지 결정하는 파일이다.  resolve.conf 파일이란?OS에서 DNS resolver를 구성할 때 사용하는 파일이다. 사용하고자 하는 네임서버를 기록해둔다. resolv 파일이 다음과 같이 구성되어있다고 상상해보자. $cat /etc/resolv.confsearch americano.com cafelatte.com cappuccino.com여기서 search는 순차적으로 조회해볼 name server를 말한다. name server는 도메인에 맞는 ip 주소를 찾을 때 사용하는 서버를 말한다. resolv 파..
개발자를 위한 최소한의 JVM 메모리 트러블 슈팅 사전 지식 한 눈에 JVM 메모리 구조 살펴보기 인텔리제이로 메모리 디버깅하기 (1) 로컬 서버 애플리케이션 상태를 실시간으로 확인하기 Intellij > Profiler > Cpu and Memory Live Charts 로컬에서 현상을 재현했을 때, 메모리 사용량이 증가하고 있는지 확인할 수 있다. 특정 조건에서 가비지 컬렉션이 어떻게 실행되었는지 확인하고 싶을 때에는, GC를 직접 실행할 수 도 있다. 2. Heapdump 파일 분석하기 Shallow Size: 객체를 저장하는 데에 사용된 메모리 Retianed Size: 이 객체를 유지하는 데에 사용된 메모리 크기이다. 객체를 저장하는 데에 사용된 메모리 + 객체가 사용하고 있는 다른 객체를 저장하는 데에 사용된 메모리의 합으로 보면 된다. 이 크기는, G..
[ChatGPT] Function calling Function Calling이란? Chatgpt Chat Completions API를 사용하면, 질문을 하고 답변을 얻을 수 있다. Function Calling을 사용하면, 질문에 적합한 애플리케이션 함수와 매개변수를 추천받을 수 있다. 즉, 애플리케이션에서 어떤 함수를 호출하는게 좋을지 gpt에게 물어볼 수 있는 기능이라고 볼 수 있다. 예제코드 open ai에서 가져온 파이썬 예제 코드이다. 한줄한줄 읽어보면, 어떤 방식으로 사용하는 건지 쉽게 감이 온다. import openai import json # 항상 같은 날씨를 리턴하는 예시용 더미 함수이다. # 실제 개발환경에서는 상황에 맞는 코드를 구현해야한다. def get_current_weather(location, unit="fahrenh..
ChatGPT에게 IfNecessary, IfNeeded 함수명의 차이를 물어보다. 함수명의 접미사로 xxxIfNecessary, xxxIfNeeded를 사용하는 경우가 있다. 이는 특수한 조건에 해당하는 경우에만 함수를 실행하게 하는 경우 사용한다. 그러나 두 함수의 차이점이 무엇인지 궁금해져 chatgpt에게 물어보았다. 둘다 필요한 경우에 작업을 수행하도록 할 때 사용된다. 그러나 둘은 미묘한 차이가 있다. xxxIfNecessary 작업이 항상 실행되지는 않는다. 특정한 조건에 해당하는 경우에만 실행한다. // 필요한 경우에만 파일에 값을 쓰는 함수 writeToFileIfNecessary() // 필요한 경우에만 이메일을 발송하는 함수 sendEmailIfNecessary() xxxIfNeeded 작업이 항상 실행되는 경우에 사용한다. 항상 작업을 해야하지만, 프로그램 연산 비..