DEV
-
Virtual Thread & Structured Concurrency & CoroutineDEV 2023. 12. 3. 12:34
2023년 9월 JDK21에 적용되는 virtural thread에 대한 글입니다. virtural thread가 추가된 배경을 살펴보고, 멀티스레드 사용 시 생기는 동시성, 동기화 이슈는 어떻게 해결하려 하는지(Structured Concurrency, 구조화된 동시성), 그리고 코루틴과는 무엇이 다른지 알아보았습니다. Project Loom https://wiki.openjdk.org/display/loom/Main purpose of supporting easy-to-use, high-throughput lightweight concurrency and new programming models on the Java platform. Project Loom의 결과물 중 하나 → Virtual Thre..
-
LangChain에 대하여DEV 2023. 12. 3. 12:06
LangChain의 component소개, 테스트 코드, 그리고 LangChain과 관련된 그 외 프로젝트들... LangChain LangChain is a framework for developing applications powered by language models. 언어 모델이 API를 통해 호출하는 것뿐 아니라 아래의 기능도 수행할 것이라고 믿는다. 1. 외부 데이터 인식 2. 외부 환경과 상호작용 Lang + Chain - LLM에 프롬프트를 채이닝하여 한번에 복잡한 명령을 내릴 수 있는 기능이 핵심인 것 같다. Component Schema, Models, Prompts, Indexes, Memory, Chains, Agents…. Model, Prompts, Output Parsers ..
-
JIT compiler & GraalVM in javaDEV 2023. 12. 3. 09:28
자바 성능향상을 위한 시도들. JIT compiler부터 GraalVM까지 JIT(Just-In-Time) Compiler JVM의 일부, 자바를 고성능으로 만드는데 큰 역할 java는 byte code로 컴파일, 컴파일 한 byte code를 JVM이 런타임시 native code로 변환하여 실행 처음에는 인터프린터 방식으로 바이트 코드 실행 인터프린터 사용 → 초기 실행 속도는 빠를 수 있지만, 컴파일러 보다 성능 ⬇️ JIT compiler 두 가지 방식을 모두 사용 JVM에서 처음 호출되자마자 컴파일되는 것은 아니고, 메서드 호출마다 횟수를 기록, 특정 수치를 초과하면 컴파일(warm up → C1, C2 컴파일 이후) C1, C2 컴파일러 C++로 작성 C1: 초기 실행 속도에 중점, 빨리 코드..
-
Spring batch jobScope, stepScopeDEV 2023. 12. 2. 21:21
Spring batch의 jobScope, stepScope를 알아가기 위한 흐름 jobScope, stepScope → bean scope → application context → IoC, DI IoC부터 시작해 보자. IoC (Inversion of Control) 제어의 역전 - 객체 생명주기, 메서드 호출 외부에서 관리 일반적인 의존성에 대한 제어 → 객체 내에서 제어 public class Mundo { private FrostfireGauntlet frostfireGauntlet; private BerserkerShoes berserkerShoes; private DoranShield doranShield; public Mundo(){ this.frostfireGauntlet = new Fr..
-
Elasticsearch에서의 relationDEV 2023. 12. 2. 20:50
반복되는 일정을 검색하는 방법에 대한 이야기 Elasticsearch에서 어떻게 RDB처럼 relation을 만들어 join검색을 할 수 있을까? radio_progaram의 방송시간 데이터 Data { "program_name": "TBS 기상정보", "channel_name": "TBS FM", .... "routine": [ { "days": [ "MON", "TUE" ], "start_time": 658, "end_time": 700 }, { "days": [ "MON", "TUE" ], "start_time": 958, "end_time": 1000 } ] } User Query 이번주 월요일 라디오 월요일 밤 10시 라디오 오늘 아침 라디오 이번 주말 라디오 How to search on ES..
-
Spring batch integration test (feat.Elasticsearch)DEV 2023. 12. 2. 20:10
Purpose of Integration Test 여러 컴포넌트 간 상호작용이 정상적으로 수행되는지 DAO가 올바르게 연결돼 있어서 원하는 데이터를 저장, 읽을 수 있는지? Test Environment Setup 멱등성(idempotent) 유지 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질 멱등성이 깨지기 쉬운 구간 → 외부 모듈 → DB 개발 DB로 테스트를 하기엔 좀 그렇고, 테스트만을 위한 DB를 세팅하기도 좀.. DB 테스트 환경 구축 방법 local DB 설치 in-memory DB - H2, 빠르지만 특정 DB에 특화된 기능 지원 x 사용하는 DB의 Embedded Library 사용 - in-memory DB 이슈 해결 - embedded를 지원하지 않거나 특정 버전, OS지원 ..
-
K8S, DNS 간헐적 5~15초 지연DEV 2023. 12. 2. 19:54
Background k8s 일부 pod에서 간헐적으로 5초 단위의 타임아웃 발생 5*x초의 지연이 DNS조회로 인한 이슈라는 문서를 찾음 DNS Domain Name System 도메인명(www.daum.net) → IP주소(12.34.56.67) In Linux Linux 환경에서 DNS를 사용하는 방법 크게 2가지 /etc/hosts 도메인명으로 IP를 찾을 때 가장 먼저 열어보는 파일 /etc/resolv.conf DNS resolver, DNS 서버 목록을 기록한 파일 /etc/hosts 파일에 도메인명이 존재하지 않을 경우 /etc/resolv.conf에서 도메인명을 검색할 도메인 서버의 주소를 찾는다. DNS in K8S CoreDns v.1.12 이후로 k8s에서 사용을 권장하고 있는 도메인..
-
Test DoubleDEV 2023. 12. 2. 19:33
테스트 대역 = Test Double 개발하다 보면 여러 객체들 간 의존성이 발생 → 의존성이 단위 테스트를 어렵게 만듦 → 진짜 객체는 느리고 자원을 많이 사용하기 때문에 → 실제 객체를 대신할 수 있는 객체가 필요 → 가짜객체 생성 ⇒ test double (테스트 대역) 💡 test double을 mock이라고 말하는 경우도 있지만, mock은 좁은 의미로 test double의 한 종류, 넓게는 테스트 더블을 의미하기도 한다. 대역(test double)의 종류 stub, fake, spy, mock 역할을 명확히 나누는 것이 애매할 경우가 있고, 서로의 특성을 조금씩 포함 input & output 입력 → 논리 → 출력 모든 프로그램은 입력 → 출력의 흐름으로 이어지는데, 입출력의 종류에는 직..