Kotlin에서 Mockito 대신 MockK를 사용하자 Kotlin 표준 라이브러리와 호환되어 Kotlin 기능을 완전히 수행 할 수 있다 ㄴ Null-Safety, Extension Function, Coroutine, Data class every { ... }와 같은 람다 식을 사용하여 목 객체의 동작을 설정 Kotlin의 Inline Function 및 Inline Class 기능을 사용하여 런타임 오버헤드를 최소화하고,빠른 속도로 테스트가 가능하다 테스트 작성을 위해서는 spring-boot-starter-test 모듈을 불러와서 build.gradle.kts 에 추가해주면 된다. dependencies { testImplementation(kotlin("test")) testImplemen..
분류 전체보기
코틀린 장점을 익히 들어 사용해 보고 싶어 코어 모듈을 코틀린으로 작성하려고 한다. IntelliJ 에서 new -> Module 언어 선택에 Kotlin이 없었다. https://youtrack.jetbrains.com/issue/IDEA-296699/New-module-wizard-There-is-no-option-to-create-Kotlin-module https://youtrack.jetbrains.com/issue/KTIJ-20957/Decide-whether-to-fix-or-disable-New-module-functionality-for-new-project-wizard-for-Kotlin 찾아보니 유트랙에 이미 이슈로 등록 되어 있었는데, 뭔가 문제가 많아서 비활성화해 두었다고 한다. ..
결과 10만건 데이터 > JPA 27분 , addBatch 28초 problem 엔터티 indexes 를 설정하고 검색최적화를 위해 더미데이터를 DB에 저장 하려고 하는데 10만건의 데이터를 넣는데 굉장히 많은 시간이 걸렸다. 어떻게 하면 데이터를 더 빠르게 db에 저장 할 수 없을까 ? JPA를 통해 데이터를 DB에 보내면 save() 또는 saveAll() 해주면 엔터티마다 트랜젝션을 생성하고 커밋한다. 즉 건당 오버헤드(overhead)가 발생한다. solution 오버헤드가 일어나는곳을 한번에 묶어서 처리하면 되지 않을까 ? (중복제거) addBatch로 한번에 묶어서 커밋을 해보자. addBatch는 쿼리 실행을 하지 않고 쿼리 구문을 메모리에 올려두었다가, 실행 명령(executeBatch)이..
시나리오 A사용자가 B사용자에게 메세지 / 멘션 / 댓글 을 달면 B사용자에게 알림이 가는 API를 만들려고 한다. FLOW 웹을 열때 각 사용자는 SSE로 자기 이름으로 구독을 시작한다. A사용자가 B사용자에게 메세지 보냄 > 카프카에 메세지를 보냈다고 프로듀싱 > 카프카 컨슈머가 토픽을 Listen > SSE로 구독하고 있는 B사용자의 알림 메서드 보냄 > B사용자 종에 빨간불 ON 서버는 클라이언트에게 요청을 스스로 보낼 수 없다. 그렇기 때문에 중간에 소통을 해줄 기술이 따로 필요하다. Poling / WebSoket / SSE (Server Sent Events) 등이 있다. 이 세가지 기술을 모두 설명하진 않고 SSE를 채택한 이유는 알림 서비스는 [ 새로운 알림이 있는지 , 실시간성 보장 ..
CountDownLatch 숫자세는 걸쇠 CountDownLatch 는 언제 사용 할까 쓰레드를 N개 실행했을 때, 일정 개수의 쓰레드가 모두 끝날 때 까지 기다려야지만 다음으로 진행할 수 있거나 다른 쓰레드를 실행 시킬 수 있는 경우 사용한다. 예를들어서 리스트에 어떤 자료구조가 있고, 각 자료구조를 병렬로 처리한 후 배치(batch)로 데이터 베이스를 업데이트 한다거나 다른 시스템으로 push하는 경우가 있다. CountDownLatch 어떻게 사용 할까 ? CountDownLatch latch = new CountDownLatch(N); // 횟수 차감 latch.countDown(); //모든 작업이 끝난 후 실행시켜 주세요 latch.await(); CountDownLatch를 초기화 할 때 정..
https://soobysu.tistory.com/127 [Spring] 선착순 이벤트 구현 ( 동시성 Pessimistic Lock) 문제 발급 가능 수량은 100장의 쿠폰이 있다. 10000명이 동시 접근 할때 쿠폰 발급을 정상적으로 수행 가능하게 하려면 어떻게 해야 할까 ? 냅다 코드를 짜버리면 이런식으로 100개 이상의 쿠폰이 soobysu.tistory.com 쿠폰갯수를 10개를 설정해 둔 상태에서 순차적으로 발급 되어서 스레드의 번호가 1~10 까지만 찍힐줄알았다... @Test @DisplayName("쿠폰 발급 테스트 (멀티 스레드)") void couponIssuanceForMultiThreadTest() throws InterruptedException { AtomicInteger su..
문제발급 가능 수량은 100장의 쿠폰이 있다. 10000명이 동시 접근 할때 쿠폰 발급을 정상적으로 수행 가능하게 하려면 어떻게 해야 할까 ?냅다 코드를 짜버리면 이런식으로 100개 이상의 쿠폰이 발급되곤 한다.이에 많은 답변으로 싱글스레드인 Redis 분산 락을 사용하는데필자는 환경에 제한을 두어 In-memory와 RDB를 사용하여 해결하려고 한다. 쿠폰의 갯수 제한을 두는 방법을 2가지로 생각해 보았다.- 발급된 쿠폰갯수를 카운트 하기쿠폰을 발급할때마다 데이터 베이스에 조회를 따로 해야 하므로 네트워크 비용 , 부하가 발생할 수 있다.- 엔터티에 갯수를 넣어 카운트 하기 쿠폰 발급 시 전체 쿠폰 수를 조회하지 않아도 되므로 성능면에서 이점이 있다.하지만 추가 수량에 대한 대응 관리 기능을 추가..
문제 String 타입의 필드를 특정 형식으로 받아오고 싶은데 .... 이 문제를 Controller 에서 처리 하기엔 코드가 복잡해 졌다. @Constraint 어노테이션을 활용하여 커스텀 Validatation을 만들자 Controller 에서 dto를 요청으로 받아올때 String 값을 yyyy-MM-dd HH:mm 이런 형식으로 받아오고 싶었다. 1. 어노테이션 만들기 // CustomDateTimeFormat.java @Constraint(validatedBy = DateTimeFormatValidator.class) @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface CustomDateTimeForma..