인기 글
-
개발 쿠폰 발급 부하테스트 진행 (1) - Locust와 레디스 쿠폰 발급 서비스 부하 테스트 경험기최근 진행하고 있는 쿠폰 발급 서비스에서 특정 시간대 트래픽 집중과 빠른 재고 소진 상황을 가정해 동시성 처리, 락, 부하 테스트 구조를 점검해봤습니다.왜 부하 테스트를 했을까?서비스를 운영하다 보면 쿠폰 오픈 시점에 트래픽이 폭주하고 재고가 빠르게 소진될 수 있죠.이때 RPS가 선형적으로 올라가서 스케일아웃만으로 대응이 가능한 구조인지, 아니면 병목이 생기는지를 확인하는 것이 이번 테스트의 핵심이었습니다. 🔧 기술 스택 & 도구부하 테스트: Locust 백엔드: Spring Boot동시성 제어: Redis + Redisson 데이터 동기화: 배치 프로세스 (DB ↔ Redis 동기화)Locust를 사용한 이유는 파이썬 기반으로 사용자 시나리오 작성이 쉽고, step..
-
Java [Java] 진짜 Stream Stream은 흐름 입니다.물 줄기가 상위에서 아래로 내려간다고 생각하면 누군가가 데이터를 밀어 넣어줘야 합니다. 하지만 자바에서의 스트림은 단순히 컬렉션이나 데이터소스를 Pull 받아서 중간의 연산자들이 조립하고 결과를 만들어 냅니다. 중간의 연산들이 CPU Bound인 경우에는 병렬화되어 ParallelStream()으로 성능을 올릴 수 있습니다.반대로 I/O Bound 작업을 하는 경우에는 I/O작업에 의존되어 결국 연산이 끝이 날때까지 Blocked 됩니다. 자바의 Stream은 진짜 Stream이라고 할 수 없습니다. public class JavaStreamExample { public static void main(String[] args) { // 메모리에 있는 1~10 .. -
Java [Java] String으로 + 연산으로 할당하면 정말로 느릴까? String으로 + 연산을 하면 정말로 느릴지 JVM 메모리 내에서는 어떻게 돌아갈지 궁금해졌다. 1. String += 연산자로 더하고 할당 더하고 할당 반복하기2. String = "a" + "a" 해서 5만번 할당하기 (65555byte 64KB가 JVM 메모리가 허용하는 문자열 리터럴 상수 풀의 크기로 65535밖에 안되었습니다.)3. StringBuilder 이용4. StringBuffer 이용public class StringPerformanceTest { private static final int ITERATIONS = 10000; public static void main(String[] args) { testStringConcat(); testFast.. -
Spring [Spring] DI, IoC, AOP 파헤치기 스프링의 DI는 특정 객체의 의존되어있는 다른 객체를 외부에서 주입받는 것을 말합니다. 이 객체는 빈이라고 불리며 기본 범위는 싱글톤하게 생성됩니다. 의존성을 개발자가 아닌 스프링컨테이너가 관리함으로써 new() 를 Configuration 객체를 통해 직접 생성하지 않아도 되어 DI를 통한 의존 객체를 외부에서 꼭 필요한 시점에 주입하거나 미리 주입해줌으로써 싱글톤 패턴에 강결합되는 문제도 해결합니다.ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);public class Main { public static void main(String[] args) { // 스프링 컨테이너 초기화..
-
Java [Java] 람다식에서 final처럼 쓰인 지역변수만 사용 가능한 이유와 전략패턴 람다식은 길게 쓰면 결국 익명 클래스입니다.객체이기 때문에 람다식의 인자는 변수 값을 스택 영역에 복사해두기 때문에 public void test() { int num = 10; Runnable r = () -> System.out.println(num); r.run();}void foo() { int num = 10; Runnable r = () -> System.out.println(num); num = 20; // 컴파일 오류! num이 final처럼 안 쓰이니까} 람다식을 풀어서쓰면 아래처럼 작동하는데 어차피 클래스 내부에서 복사된 값을 생성하기 때문에 외부에는 영향을 끼치지 않습니다.public class LambdaTest { public static vo.. -
개발 [오픈소스] Apache Gravitino DTO equals Issue 해결 Equals in common/src/main/java/org/apache/gravitino/dto/messaging/TopicDTO.java uses Topic in an instanceof check when it should use TopicDTO. Apahce Gravitino 오픈소스의 DTO 관련 이슈가 올라와 해결해보려고 한다.우선 문제는 TopicDTO.java가 Topic 인터페이스를 구현하고 있는데 다른 DTO 클래스와 다르게 lombok@EqualsAndHashcode를 사용하고 있지 않다. By default, @EqualsAndHashCode uses getClass() comparisons.Lombok은 기본적으로 getClass()로 타입 비교한다. @Override pu..
-
개발 [오픈소스] Apache Gravitino 다중 바이트 문자 처리할 수 있도록 수정하기 https://github.com/apache/gravitino/issues/7685 [Improvement] Fix table format so it handles multi-byte characters · Issue #7685 · apache/gravitinoWhat would you like to be improved? In clients/cli/src/main/java/org/apache/gravitino/cli/outputs/TableFormat.java this code doesn't consider multi-byte characters: osw.write(LineUtil.getSpaces(min...github.com Apache Gravitino 라이브러리에 개선 Issue가 들어왔다.다..