프로그래밍 299

잊고 있던 Generic Super type token 정리 (with GPT)

Generic Super Type Token은 Java의 Type Erasure 때문에 런타임에 사라지는 Generic 타입 정보를 복원하기 위한 패턴입니다.처음 보면 굉장히 어려워 보이는데, 사실 "List인지 List인지 런타임에도 알고 싶을 때" 사용하는 기법이라고 생각하면 됩니다.먼저 왜 필요한가?예를 들어 Java Generic은 컴파일이 끝나면 타입이 지워집니다(Type Erasure).List list1 = new ArrayList();List list2 = new ArrayList();System.out.println(list1.getClass());System.out.println(list2.getClass());출력class java.util.ArrayListclass java.util..

Kotest 6.x + Spring Boot 3.x에서 @Transactional 롤백이 안될 때

Kotest 6.x + Spring Boot 3.x에서 @Transactional 롤백이 안될 때문제 상황Spring Boot 3.5.15와 Kotest 6.2.1 환경에서 Repository 통합 테스트를 작성하던 중, 테스트 데이터가 롤백되지 않고 실제 DB에 계속 쌓이는 문제가 발생했습니다.@Tags("test")@SpringBootTest@ActiveProfiles("local", "test")@Transactional@ApplyExtension(SpringExtension::class)class ProductRepositoryTest( private val productRepository: ProductRepository,) : BehaviorSpec() { init { ..

Kafka Transaction - Lag 1 Gap issue

Kafka Transaction Commit Marker로 인한 Phantom Lag 현상들어가며Kafka 기반의 이벤트 드리븐 시스템을 운영하다 보면, 모니터링 대시보드에서 consumer lag이 0이 되지 않는 현상을 마주할 때가 있습니다. 메시지를 모두 처리했는데도 lag이 1씩 남아있는 이 현상을 Phantom Lag이라고 부릅니다.이 글에서는 실제 서비스에서 Phantom Lag을 만나게 된 과정, 원인 분석, 그리고 해결 방안을 공유합니다.시스템 구성CDC(Change Data Capture) 기반으로 검색 엔진 인덱싱을 수행하는 스트림 처리 시스템입니다.[MongoDB CDC] → [Indexer] → (delete-request 토픽) → [Deleter] → [Search Engine]..

Vue - 일본어 입력의 경우, 오류 발생시 처리 (feat. antd-vue)

회사의 어드민을 Antd-vue를 이용해 개발 하고 있습니다.그런데, 한글, 영어는 입력이 잘 되는데, 이상하게도 일본어의 경우는 오류가 발생합니다.https://ko.vuejs.org/guide/essentials/forms#basic-usage Vue.jsVue.js - 프로그래시브 자바스트립트 프레임워크ko.vuejs.orgVue docs에도 IME의 경우 따로 바인딩을 해야 한다고 가이드 하고 있습니다.이런 경우, 아래 처럼 해결 하면 됩니다. // 기존 // 변경 처음에는 그냥, @input 함수를 통해서 빈값인지 체크 하는 로직을 넣었고, input value는 model 바인딩을 했었습니다.그런데, 일본어가 계속 제대로 바인딩..

Kotlin + JPA 의 val id 이슈

kotlin을 이용해 아주 잘 쓰고 있었다. 그런데, jpa를 만나기 전까지는 그랬다.Entity를 어떻게 구성 할까 하다 늘 고민이 있었다. Data class로 쓰다가, Class로 쓰다가~ 이것 저것 하다가 id만 불변으로 설정 하자. @Entity@Table(name = "target")class Target( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column val id: Long = 0,) { // 기타 코드}id를 불변으로 처리 하니, 바뀔 일은 없겠지! 하는 순간, 문제가 발생 한다. Jpa 관련 된 ItemReader의 경우에는 id를 정상적으로 잘 가져오지만,  @Bean @StepScop..

Rest API와 Grpc API 서버를 하나로 서비스 할 수 있다고?!

Rest API와 Grpc API 서버를 하나로 서비스 할 수 있다고?! - 부제 (armeria + kotlin + spring boot integration)결론적으로 내가 하는 게 아니라, armeria가 다 해줍니다. (킹왕짱 armeria의 아버지 이희승님 찬양 합니다.) 요즘은 armeria를 붙여서 써 보고 있는 중인데, armeria의 장점은 크게 보면, 아래와 같다.비동기 웹 프레임워크grpc, graphql, thrift 동시 지원 가능 (한 서버로 프로토콜 다르게 서빙이 가능한 최고의 장점)spring 과도 통합이 가능하다.spring은 크게 보면, 2가지가 있다.spring frameworkspring webfluxarmeria는 spring webflux와도 연동이 가능하고, sp..

kotlin - jackson 관련 이슈 (토비의 스프링 6 강의)

토비님의 스프링 6 강의를 듣다가, 아래와 같은 코드를 입력 했었다. (자바로 안하고, 코틀린으로 작성 했을때의 문제이다)data class Payment( val orderId: Long, val currency: String, val foreignCurrencyAmount: BigDecimal, val exchangeRate: BigDecimal, val convertedAmount: BigDecimal, val validUntil: LocalDateTime,)import com.fasterxml.jackson.annotation.JsonIgnorePropertiesimport java.math.BigDecimal@JsonIgnoreProperties(ignoreUnknown = true)..

ktlint lint 적용

ktlint 정상혁님이 써주신, kotlin lint를 위한 가이드 문서가 잘 소개되어 있습니다. https://blog.benelog.net/ktlint 해당 방식에서는 크게 보면 총 2가지의 방식을 설명하고 있습니다. gradle 빌드 설정 IntelliJ 설정 위와 같은 방식 중에서 review repo, point repo에 도입한 방식은 첫번째 방식인 gradle build 설정을 통한 kotlin lint를 도입하였습니다. https://kotlinlang.org/docs/coding-conventions.html kotlin 언어의 coding convention은 kotlin official로 정의를 하고 있는 특정한 규약들이 있습니다. (java의 경우, Google style guide..

반응형