반응형

분류 전체보기

    Virtual thread pinning issue와 java 24에서 해소 방법

    virtual threadjava 21부터 virtual thread가 나온 것은 대부분의 알고 있는 사실이다. 간단하게 virtual thread는 기존 jvm에 사용하는 thread가 os kernal thread에 매핑되어 사용되던 걸 carrier thread (platform thread)에 virtual thread(향후 vt)를 사용하여 내부적 요청에 vt를 carrier thead에 mount, unmont하여 kernal os를 덜 사용하는 전략을 사용하는 thread를 말한다. 내부적으로 실행되는 로직을 확인해보자. openjdk에 있는 테스트용 VThreadRunner.java 코드를 이용해서 호출해보면서 내부적으로 VThread에서 사용되는 carrier thread 호출 sched..

    lettuce pipeline코드 사용시 커넥션 풀 사용 필요

    lettuce를 사용해서 레디스를 사용을 하고 있었는데 어느날 갑자기 아래처럼 레디스 커넥션을 못잡는 이슈가 발생했다.org.springframework.data.redis.RedisSystemException: Redis exception; nested exception is io.lettuce.core.RedisException: Master is currently unknown: [RedisMasterReplicaNode [redisURI=redis://xxx.xxx.com?timeout=20s, role=REPLICA]] 처음에는 aws 레디스쪽 이슈일것으로 의심했으나 레디스쪽에는 별다른 지표가 없었고 애플리케이션에서 커넥션을 사용하지 못하는 것 같았다. 이번에 배포 하면서 들어간 코드는 비동기 ..

    spring batch에서 파라미터 시 - 사용 주의

    spring batch에서 job param을 전달할 때 관용적으로 -를 붙여서 사용했다. 문제가 된 시점은 프로젝트에서 중복으로 돌면 안되는 배치에 preventrestart를 붙히고 돌리고 있는데 주기적으로 already job param으로 동작한 배치가 있다면서 배치가 자꾸 죽는 이슈가 발생했다. 원인을 파악하기 위해 디버깅을 하던 중 spring batch에서 job의 unique를 판단하는 부분에서 job param으로 전달하고 있는 값들을 job instance에 유니크로 확인하는데 사용을 못하고 있는 부분을 발견했다.  그림을 보면 알겠지만 실제 parameter는 push라는 형태로 전달 되지만 identifying이 false로 되어있는걸 확인할 수 있다. 이러다보니 job instan..

    gradle build시 파라미터 전달받아 사용하기

    beta에는 restdocs를 만들어서 static/index.html에 위치시키고 싶었고 운영에 경우에는 이로직을 빼고 싶었다.그러기 위해서는 build시점에 profile을 전달받아야했고 그것에 따라서 로직 분리가 필요했다. 그러기 위해서는 ./gradlew build 시 param으로 값을 전달하고 그 전달한 값을 사용하여 빌드 로직을 분리해야했다. 우선 build를 할 build.gradle에 argument를 받는코드와 분기로직을 작성했다.bootJar { enabled = true String activeProfile = project.findProperty('profiles') ?: '' println "zone: $activeProfile" if (activeProfi..

    elasticsearch routing 사용하기

    [기본구조] elasticserch에서 데이터는 index에 저장되고 index는 shard로 구성되어 있다. 기본적으로 데이터가 shard에 들어가는 기준은 document에 _id를 기준으로 들어가게 된다. 그렇기 때문에 index에 데이터를 조회할 때 어떤 샤드에 값이 저장되어 있는지 알수 없기 때문에 모든 shard에 값을 질의하고 그 값을 조합해서 값을 내려준다. 한번 일반적인 index를 만들고 조회해보자. 아래처럼 Index를 생성하고 "name"에 wedul을 넣고 조회해보겠다. PUT localhost:19200/before-route { "settings": { "number_of_shards": 4, "number_of_replicas": 0 }, "mappings": { "prope..

    shard reroute api 테스트

    elasticsearch에서는 들어온 요청에 대해서 primary shard, replica shard를 병렬로 요청을하기 때문에 replica가 있는게 좋긴하다. 하지만 replica shard나 primary shard가 제대로 노드에 분배되어 있지 않으면 조회가 특정노드에 몰리거나 인덱싱 시 노드에 부하가 심해질 수 있다. 분배를 위해서는 기본적으로 es cluster에 아래 옵션들이 제공된다. (링크) cluster.routing.allocation.balance.shard - 노드에 샤드를 균등하게 분배 (기본값 0.45f, 값이 높아질수록 노드들에 샤드들이 골고루 분배됨) cluster.routing.allocation.balance.index - 인덱스당 샤드 분배를 균등하게 (기본값은 0...

    elasticsearch cluster 구성 시 기본으로 생성되는 index확인

    elasticsearch cluster를 사용하기 위해서 cluster를 구성하기전에 꼭 추가해야하는 부분이 있는데 기본으로 생성되는 index에 대한 disable처리가 필요하다. geoip_databases 인덱스 기본적으로 cluster 구성 시 geoip_databases가 인덱스가 추가가 되어있는데 이게 hidden index여서 모르고 지나칠 수 있다. 만약 모르고 클러스터를 구성하고 노드를 조작할 경우 해당 인덱스의 primary shard가 unassigned되면서 cluster 상태가 red가 될 수 있다. 그럼 왜 geoip_databases가 기본적으로 생기는가? 생기지 않도록 할 수 없는가? 해당 인덱스가 생성되는 이유는 ingest.geoip.downloader.enabled 속성..

    오래된 ubuntu버전 사용 시 apt command 동작 안하는 이슈 수정

    라즈베리 파이에 예전에 설치한 우분투에 jdk를 설치하기 위해서 sudo apt-get update를 진행하였으나 계속 아래 에러를 내뱉고 실패했다. ㅜㅜ "/etc/apt/sources.list" 49L, 2861B 49,75 모두 # See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to 무시:1 http://ports.ubuntu.com/ubuntu-ports hirsute InRelease 무시:2 http://ports.ubuntu.com/ubuntu-ports hirsute-updates InRelease 무시:3 http://ports.ubuntu.com/ubuntu-ports hirsute-backports InRel..

    MapStruct의 mapping방식과 Lobmok 함께 사용 시 값이 mapping되지 않는 이유

    저번에 작성했던 MapStruct를 사용하면서 겪은 이야기를 정리해본다. MapStruct를 사용하면 값을 매핑해야하는 여러 경우에서 편리하게 값을 매핑할 수 있다. 특히 Entity값을 외부로 내보내려고 값객체에 값을 저장할 때 유용하게 사용된다. 객체 생성 및 값 주입 방법 기본적으로 MapStruct에 경우 setter, constructor, builder를 사용하여 객체를 생성하고 값을 넣는다. 먼저 setter를 사용하는 경우를 살펴보자. 1. setter package com.wedul.mapstructtest.entity; import lombok.Builder; import lombok.Getter; import java.util.List; @Getter public class Accou..

    Mapstruct 사용 시 collection 내부에 이름이 다른경우

    Mapstruct를 통해 편하게 응답값을 매핑할 수 있도록 도와주는 라이브러리를 살펴본적 있다. https://wedul.site/703 만들면서 배우는 아키텍처 그리고 매핑 프레임워크 MapStruct를 사용한 매핑 만들면서 배우는 아키텍처 (Get Your Hands Dirty on Clean Architecture) 요새 읽던 책중에 'Get Your Hands Dirty on Clean Architecture' 책이 인상 깊었다. 원서로 팀원들과 스터디 하고 나서 인상깊어서 '만들면서 배 wedul.site 값을 매핑할 때 필드의 이름이 다를 경우에는 아래 처럼 Mapping애노테이션을 사용해서 source, target에 이름을 명시하여 이를 해결 할 수 있었다. @Mapping(source =..

반응형