본문 바로가기
반응형

개발 지식
반응형
60

[MongoDB] Building a Real-Time, Dynamic (Aggregate pipeline) MongoDB 조회에 Aggregations pipeline을 이용하면 단계별 쿼리 적용으로 다양한 조회 결과를 뽑아 낼 수 있다. https://www.mongodb.com/developer/products/atlas/building-real-time-dynamic-seller-dashboard/?utm_source=Iterable&utm_medium=email&utm_campaign=campaign_7536282 Sample Data를 이용해서 대시보드를 만들어보자. (https://github.com/neelabalan/mongodb-sample-dataset/blob/main/sample_supplies/sales.json) (예시 데이터) { "_id": { "$oid": "5bd761dcae3.. 2023. 12. 18.
[Kotest] 클래스 프로퍼티 Value NULL 여부 한번에 검증하기 많은 개발자분들이 실무 및 개인 프로젝트 개발 시에 Test 파일을 작성한다. 내부 로직 검증 그리고 통합 테스트 검증등 여러가지 이유가 있겠지만 나 같은 경우 json 데이터를 내가 원하는 Object로 변환시에 그 값이 잘 매핑 되어 있는지 확인하고 싶을 때가 있다. 하지만, Kotest에서는 내부 필드값 검증과 shouldBeSameInstanceAs, shouldBeEqualToComparingFields와 같은 메소드들은 단순히 클래스 인스턴스의 동일 여부만 판단할 수 있었다. 이에 클래스 프로퍼티 Value NULL 여부 한번에 검증할 수 있는 메소드를 구현하고자 했다. 카프카 데이터 컨슈밍 -> 데이터 클래스 매핑 -> 추가 필드값에 대한 매핑 로직 place.json // place.jso.. 2023. 11. 25.
[Redis] All keys must map to the same slot for MSETNX command 실무 개발 레디스 활용 중 값이 없을 경우 set하는 부분이 있었다. ReactiveRedisTemplate를 활용하여 MSETNX (multiSetIfAbsent) 을 하는 경우를 적용하여 테스트 진행 했는데 다음과 같은 오류가 발생하였다. All keys must map to the same slot for MSETNX command 해당 오류는 Redis Cluster에서는 MSET이 지원하지 않는 command라 발생한 상황이었다. 이에 반복분을 통해 SET하는 것으로 수정했는데 그 이유가 궁금했다. 예를 들어 Redis Cluster를 4개로 구성했다고 하였을 때 각각 Cluster당 hash slot를 배정 받게 된다. A-Node : 1 ~ 800 B-Node : 801 ~ 1600 C-No.. 2023. 11. 17.
[Spring] Coroutine Suspend Cache Hit 가 되지 않다. https://erjuer.tistory.com/131 [Spring] Caffeine Cache Config 설정하기 Caffeine Cache Config값은 두가지의 방법으로 설정할 수 있다. 1) application.yml -> yml에 등록만 해주면 spring이 알아서 cache 등록을 해준다. 2) Config Custom Bean 생성 -> 캐시가 여러개 일 경우 각각의 Config Poli erjuer.tistory.com 에서 Caffeine 캐시를 등록하고 이제 캐시를 활용해보고자 하였다. 실무 개발을 진행하며서 Spring Boot에서 제공하는 어노테이션 @Cacheable("")를 사용해여 DB 조회를 매번 하는 것이 아니라 캐시를 통해서 조회 쿼리를 최소화 하려고 하였으나 hi.. 2023. 2. 11.
[Spring] Caffeine Cache Config 설정하기 Caffeine Cache Config값은 두가지의 방법으로 설정할 수 있다. 1) application.yml -> yml에 등록만 해주면 spring이 알아서 cache 등록을 해준다. 2) Config Custom Bean 생성 -> 캐시가 여러개 일 경우 각각의 Config Policy(정책) 설정 가능 일단 들어가기에 앞서 gradle을 등록해두자. (https://github.com/ben-manes/caffeine) //caffeine cache 설정 implementation("com.github.ben-manes.caffeine:caffeine:3.1.2") 1. application.yml spring: data: mongodb: database: mser # username: # pa.. 2023. 2. 5.
[Spring] 구글 smtp 서버를 활용한 메일 보내기 사이드 프로젝트 중 메일 인증을 통한 유저 회원가입 구현이 필요하여 구글 메일 서버를 이용한 메일 발송에 대해 적어보고 후에 잊어버렸을 경우 다시 보기 위해 정리하고자 한다. 회원 인증에는 실명인증 및 인증서 인증 여러가지가 있는데 소규모 프로젝트에서는 메일 인증이 제일 간단한 것 같다. Spring을 활용하면 다음과 같이 간단히 설정을 진행할 수 있다. 1. Application yml 작성하기 (https://support.google.com/a/answer/176600?hl=en) spring: mail: protocol: smtp host: smtp.gmail.com port: 587 username: ${user.name} password: $[user.password} default-encod.. 2023. 1. 15.
[Coroutine] 코루틴 빌더 간단 정리 runBlocking -> 코루틴을 생성하는 코루틴 빌더 runBlocking으로 감싸진 코드는 수행이 끝날 때까지 해당 쓰레드가 Blocking된다. (main쓰레드는 아니다!) 비동기로 동작하는 것이 아니라서 자주 쓰이진 않는다. 꼭 사용해야 하는 경우 라이브러리 또는 프레임워크에서 코루틴을 지원하지 않을 때 launch -> 쓰레드 차단 없이 새 코루틴을 생성하고 결과를 job이라는 객체로 반환, 비동기로 동작한다. job은 lauch 내 상태를 확인하거나 시작 취소 시킬 수 있다 Ex. job.start(), job.cancel()을 통해 해당 비동기 로직을 제어할 수 있다. lauch는 동작을 뒤로 미룰 수 있다. launch(start=CoroutineStart.LAZY) { } -> 실행하는.. 2023. 1. 12.
[Mapstruct] Protobuf repeated와 Kotlin List 매핑이 되지 않는 문제 개발하면서 약 일주일간의 삽질을 통해 해결했던 경험을 쓰려고 한다. 결론부터 이야기하자면 protobuf repeated와 코틀린 프로퍼티 또는 자바 객체간 변환을 mapstruct로는 완벽히 커버할 수 없으며 추가 라이브러리(https://github.com/entur/mapstruct-spi-protobuf)를 설정해야 한다. 최초 문제: protobuf와 kotlin 객체변환을 위해 mapstruct를 활용하고자 하였다. (보일러플레이트 코드를 지양하기 위해서) 그래서 다음과 같은 proto, kt를 작성하였다. base.proto message BaseResponse { string query = 1; int32 page_number = 2; int32 result_per_page = 3; str.. 2023. 1. 9.
[Cache] Ehcache vs Caffeine Cache 서비스 플랫폼을 개발 운영하면서 가끔 사용자가 급작스럽게 늘어났을 때 DB Transaction Thread Dead Lock 또는 Collection Lock로 인하여 Exception이 터져 빨간 오류가 모니터링 페이지에 가득한 것을 볼 수 있습니다. Local Cache와 Global Cache로 주로 쓰고 있는 Redis Cache로 나뉘어 소개하고(예정..?) 이번 장에서는 Local Cache의 Caffeine Cache와 Ehcache와의 차이점에 대해서 서술해보려고 합니다. 현재 통합API에서 쓰고 있는 local Cache는 ehcache 입니다. Ehcache는 in memory 캐시로써 빠르고 컴팩트하며 Hibernate 및 MyBatis에서 제공하는 기본 캐시입니다. 1) Ehcac.. 2022. 9. 7.
[Coroutine] Composing Suspending Functions 이번에는 suspending 함수의 구성에 대해 정리하고자 한다. 1) 비동기함수의 순차적 실행 fun main() = runBlocking { val time = measureTimeMillis { val one = doSomethingUsefulOne() val two = doSomethingUsefulTwo() println("The answer is ${one + two}") } println("Completed in $time ms") } suspend fun doSomethingUsefulOne() : Int { println("doSomethingUsefulOne") delay(2000L) // 뭐 어떤 DB 호출이나 외부 통신에 걸리는 로직이 들어갈 것이다. return 13 } suspe.. 2022. 9. 2.
[Coroutine] Coroutine Cancellation And Timeout 지난번 장에서는 코루틴은 Builder로 생성해보는 것까지 진행하였다. 이번장에서는 코루틴 종료하는 2가지 방법 1) Cacellation 2) Timeout 에 대해 정리해보고자 한다. Cacellation 즉 코루틴이 종료 되기 위해서는 다음과 같은 세가지 조건을 만족해야 한다. 코루틴이 취소 되기 위해서는 다음과 같이 협조적이어야 한다. 코루틴 코드가 cancellable 해야 한다 suspend 함수는 취소 가능하다 이에 다음과 같은 예시를 코드로 작성해보고 테스트 해보자. join 객체의 cacel 함수 호출 join 객체의 cacel 함수 호출, But suspend 함수가 없다면? suspend 함수가 아닌 상태체크로 Cancel finally로 코루틴 종료 NonCancellable로 종.. 2022. 8. 29.
[Coroutine] CoroutineBasic 인프런에 코루틴을 검색해보니 다음과 같은 강좌가 있어 공부겸해서 블로그에 정리해보려고 한다. https://www.youtube.com/c/%EC%83%88%EC%B0%A8%EC%9B%90 새차원 새차원의 코틀린 강좌 입니다. http://blog.naver.com/cenodim www.youtube.com 1. 코루틴 (Co+ routine) 으로 루틴의 일종이다. (안드로이드 앱 개발은 kotlin으로 진행되는데 안드로이드 앱 쓰레드 개념을 보면 UI Thread가 메인 쓰레드이며 이 쓰레드 외에는 UI를 제어 할 수 없다. UI Thread 외 다른 기능이 동시에 필요하다면 AsynTask를 이용하거나(Deprecated 된 것으로 알고 있음) Sub Thread 또는 Handler를 활용하여 이 .. 2022. 8. 23.
[Reactive Mongo] Reactive MongoDB QueryDSL 버전 충돌 22.08.22 기준 latest version querydsl-mongodb (5.0.0) -> mongo-java-driver (3.12.11) org.mongodb:mongodb-driver-reactivestreams (4.7.1) -> mongodb-driver-core (4.7.1) MongoDB 3.X -> org.mongodb:mongo-java-driver 사용 MongoDB 4.X -> org.mongodb:mongodb-driver-core 사용 reactiveMongo로 QueryDSL 사용은 mongoclient 버전이 맞지 않아 쓸 수 없다. https://github.com/querydsl/querydsl/issues/3134 Legacy MongoDB driver includ.. 2022. 8. 22.
[Kotlin] Kotlin 기초 - 05 (문자열) 이번장 에서는 문자열과 객체의 동일성에 대해 정리 해보고자 한다. length : 문자열 길이 수 lowerCase() : 소문자 변환 upperCaste() : 대문자 변환 var test = "Er.Ms.Kotlin.String" pritnln(test.length) println(test.lowerCase()) println(test.upperCase()) // 결과 // 19 // er.ms.kotlin.string // ER.MS.KOTLIN.STRING split (String args) : args 기준으로 나누기 joinToString() : String 리스트의 합 joinToString(String args) : args로 String list를 합 substring(beginInde.. 2022. 8. 21.
[Kotlin] Kotlin 기초 - 04 (스코프 함수) 스코프 함수 함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수이다. 인스턴스를 스코프 함수 내에서 활용하게 되면 인스턴스 내의 속성이나 함수를 깔끔하게 쓸 수 있다. (Framework와 유사기능) 스코프 함수에는 apply run with also let .... 과 같이 다양한 함수가 있다. 예시 코드로 하나씩 살펴보자. 1) apply : 인스턴스를 생성 한 후 변수에 담기 전 초기화 과정을 수행할 때 많이 쓰인다. 보통 코틀린에서 클래스 및 클래스 객체 및 함수를 활용할 경우에는 다음과 같이 쓰인다. public inline fun T.apply(block: T.() -> Unit): T { contract { callsInPlace(block, InvocationKin.. 2022. 7. 17.
[Test] MongoDB 단위 테스트(Unit Test) 작성해보기 Spring Boot 프레임워크에서 Test 파일을 작성하다보면 다음과 같은 어노테이션을 붙여서 작성하곤 한다. @SpringBootTest 하지만 해당 어노테이션은 프로젝트 내에서 선언하거나 사용하고 있는 Spring Context를 모두 IoC에 등록하기 때문에 비용 및 시간이 많이 소모 된다. 통합 테스트 시나리오에서는 적절할지 모르겠으나 Repository 또는 DB간 트랜잭션 단위 또는 서비스 레이어 내에서의 단위 테스트에는 적절하지 않다고 생각한다. 이에 이번에 Repository 테스트 즉 MongoDB 조회를 하는 단위테스트 작성 및 정리하고자 한다. 1. @SpringBootTest 사용하기 우선 SpringBootTest 어노테이션을 붙여 테스트 진행시 Spring Context를 전부.. 2022. 6. 6.
[Kafka] 카프카는 어떻게 구성 되어 있는가 (feat. 디자인) 최근 국내외 많은 서비스들이 MSA(Micro Service Architecture)를 설계하면서 Kafka를 도입하고 있습니다. MSA에서의 동기성 데이터 처리는 API를, 대용량의 비동기 데이터 처리 시에는 Kafka를 활용하고 있습니다. 또한 Kafka는 Producer와 Consumer 단순히 데이터 파이프 라인 흐름 뿐만 아니라 ksql, Kafka Streams 그리고 하둡등 3rd Party 빅데이터 플랫폼 연동을 통해 그 확장성이 커지고 있습니다. 1) Kafka의 도입 배경 Kafka는 2011년 LinkedIn에서 처음 출발... (생략) ... Kafka가 도입 배경은 크게 두가지 이유가 있습니다. 실시간 트랜잭션 처리와 비동기 처리가 동시에 이루어지지만 통합된 전송 영역이 없었다. .. 2022. 5. 24.
[Kotlin] Kotlin 기초 - 03 (스코프 /고차 람다 함수) 2022.04.27 - [개발 지식/Kotlin] - [Kotlin] Kotlin 기초 - 02 [Kotlin] Kotlin 기초 - 02 2022.04.24 - [개발 지식/Kotlin] - [Kotlin] Kotlin 기초 -01 [Kotlin] Kotlin 기초 -01 1. 변수 선언 : var , val - var : 선언 후 수정 가능 - val: 선언 후 수정 불가능 (Java에서 final과 같은 역할을 한다.).. erjuer.tistory.com 1. 코틀린의 프로젝트 구조 1) 코틀린은 클래스명과 파일명이 일치하지 않아도 된다. 2) 하나의 파일에 여러개의 클래스를 넣어도 알아서 컴파일이 가능하다. 파일이나 폴더를 기준으로 하지않고 파일내에 있는 패키지 단위로 구분하기 때문이다. 2. .. 2022. 5. 16.
[WebFlux] WebFlux Kotlin MapStruct 적용 entity(document) -> DTO 로 변환시 mapStruct를 자주 활용한다. WebFlux kotlin 환경에서는 다음과 같은 설정으로 활용할 수 있다. // build.gradle.kts implementation("org.mapstruct:mapstruct:1.5.0.RC1") kapt("org.mapstruct:mapstruct-processor:1.5.0.RC1") plugins { ... kotlin("kapt") version "1.6.21" ... } mapper 인터페이스에서 toBaseDto 함수를 선언하였다 . BaseDocument -> BaseDTO로 변경할 것이다. // Mapper 인터페이스 import reactor.core.publisher.Flux @Mapper.. 2022. 5. 10.
[RPC] gRPC 프레임 워크 적용기 MSA 아키텍처 그리고 API 개발에서 주로 Rest API를 활용했지만 서버와 클라이언트간 더 작은 payload값을 가지고 더 빠른 성능을 보여줄 수 있는 gRPC를 적용해보고자 한다. gRPC와 Rest API의 자세한 사항은 다음 페이지 참고 https://docs.microsoft.com/ko-kr/aspnet/core/grpc/comparison?view=aspnetcore-6.0 gRPC 서비스와 HTTP API 비교 gRPC와 HTTP API를 비교한 방법과 권장 시나리오를 알아봅니다. docs.microsoft.com Armeria grpc-spring-boot-starter 두가지를 모두 고려하였으나 내가 구현하고 싶은 범위는 단순히 gRPC를 활용하여 client에서 proto Ser.. 2022. 5. 9.