☕ Java

    [Java] Garbage Collection의 STW(Stop The World) 부하 테스트

    목표 Java의 가장 대표 격인 GC인 G1GC에서의 Stop The World를 빈번하게 유도해보고 초저지연 GC도 사용해보겠습니다.얕게 배워본 초저지연 GC로 일단 테스트부터 해보며 어떤 상황일 때 ZGC를 사용해볼 법한지 알아보겠습니다.JDK 17에서의 G1GC 테스트우선 JDK 17에서 아무 설정도 건드리지 않으면 G1GC로 선택이 되니 바로 테스트해 보겠습니다.일단 10MB를 배열에 지속적으로 할당과 해제를 반복하는 것을 1000번 진행합니다.private static final int SIZE = 10 * 1024 * 1024 * 10; // 100MB씩 할당public void createMemoryPressure() { // 메모리를 빠르게 할당하고 해제하면서 GC를 유도 for (in..

    [Java] JMH(Java Microbenchmark Harness)를 이용한 성능 테스트

    개요테스트 소스는 깃헙에 있습니다.JMH(Java Microbenchmarking Harness)는 Java 애플리케이션에서 작은 코드 조각, 즉 "마이크로벤치마크"의 성능을 정확하고 신뢰성 있게 측정할 수 있습니다. 예를 들어 문자열을 +로 결합하는 방식과 StringBuilder의 속도 차이 등을 벤치마크 해볼 수 있습니다.그 외에도 synchronized, Lambda와 반복문. hashCode() & equals(), 배열 처리 방식(병렬, 순차), 기본 타입과 객체 타입 간 변환 성능 차이 등 작은 코드 조각에 대한 성능을 확인해볼 수 있습니다.요즘에는 컴퓨터 성능이 다 좋아서 웬만하면 신경을 쓰지 않아도 된다고 주장하는 경우도 있습니다.하지만 클라우드 환경에 대한 성능을 최소한으로 사용해서 비..

    [Spring] DTO는 어디서 변환할까? (feat. DDD)

    MVC와 헥사고날일반적으로 규모가 작은 MVC 개발 방식(도메인 중심이 아닌 경우)은 일반적으로 모든 서비스 레이어에서 DTO를 파라미터로 받고 return도 DTO로 합니다.헥사고날에서는 계층 간의 시스템적인 완벽한 분리를 추구하기 때문에 서비스 레이어에서는 일반적으로 도메인 객체만을 담당하게 됩니다. 비교는 MVC와 헥사고날로 한 것이지만 더 넓게 보자면 SQL 중심의 개발 방식 vs DDD 개발 방식 을 두고 얘기한 것 이기도 합니다.헥사고날의 코드 구조와 장점이제 헥사고날 코드를 잠깐 구경하겠습니다.Member라는 도메인 객체가 있고 해당 객체를 서비스 레이어에서 다루는 코드 입니다.public class Member { private Long id; private String name; ..

    [Java] Apache Commons Library에서의 올바른 압축 해제 방법

    최근 사내 프로젝트에서 압축 파일 해제 코드가 올바르게 처리 되고 있지 않아 컨플루언스에 올린 내용을 블로그에도 올려보겠다. 개요 특정 압축 파일을 업로드하여 자바 코드 내에서 압축 해제하는 경우 코드 동작이 정상적으로 진행되지 않는 현상 압축 대상 파일 zip, tar, tar.gz 압축 파일의 실제 포맷은? file resource.tar.gz 리눅스 계열에서 file 명령어를 통해 파일이 어떤 포맷인지 확인할 수 있다. file에 대한 포맷을 확인하는 이유는 가령 사용자가 zip으로 압축 한 뒤에 임의로 확장자를 .tar.gz로 바꾸는 경우가 있기 때문이다. 물론 이 경우에도 압축 파일로서의 동작은 잘 된다. 하지만 문제는 이 파일의 실체는 zip이다! 압축된 zip 파일을 .tar.gz로 강제로 ..