
안녕하세요 ! 오늘은 Java에서 제공하는 강력한 기능 중 하나인 리플렉션에 대해서 알아보겠습니다.예제에 쓰인 모든 코드는 깃허브 에서 확인하실 수 있습니다. 리플렉션이란?리플렉션이란, 런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능입니다. 리플렉션을 이해하기위해서 먼저 JVM의 동작 방식에 대해 살펴볼 필요가 있습니다.1. Java 컴파일러(javac)가 소스코드를 바이트 코드(.class)로 변환합니다.2. 컴파일된 바이트 코드를 클래스 로더에게 전달합니다.3. 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 링크하여 런타임 데이터 영역에 올립니다. 여기서 Method Area의 클래스 정보들을 조작할 수 있는 기능이 바로 리플렉션입니다. 어떻게 Method Area에 접근하는가..

java로 개발을 하다보면 비동기적으로 처리를 해서 성능을 높여야 하는 경우가 생깁니다. 저 또한 이런 경우가 많았는데요, 이럴 때 Java에서 제공하는 CompletableFuture를 이용하면 쉽게 해결할 수 있습니다. CompletableFuture에 관하여 검색을 해보니, 박우빈님이 작성하신 CompletableFuture 톺아보기 가 가장 정리가 잘 되어 있어서 한번 따라해보고, 해당 글을 기반으로 저 또한 정리를 해두고자 합니다! CompletableFuture란?CompletableFuture는 Java에서 비동기 프로그래밍을 지원하는 강력한 클래스입니다. Java 8부터 도입되었으며, 사용하기에 따라서 Async-Blocking, Async-Non-Blocking 하게 사용할 수 있습니다..
Util클래스 또는 상수형 클래스는 객체생성을 막자 어플리케이션 개발을 진행하다보면 자주 쓰이는 성격이 비슷한 메소드들을 묶어 Util성 클래스로 만들거나, 상수값들을 모아놓은 클래스를 만들 일이 있습니다. 이러한 클래스들은 static 메소드와 static 변수들을 제공해주기 때문에, 객체생성은 의미가 없습니다. 따라서 기본생성자를 private로 지정하여 객체생성을 막는것이 바람직합니다. public final class StringUtils { public static String utilmethod(String str) { // util 로직... return result; } // 객체생성 금지! private StringUtils() { }; } Lombok 라이브러리를 사용한다면 @NoArg..

Heap Dump 분석 튜토리얼 IntroSpring으로 개발한 웹 애플리케이션을 운영하다 보면, 메모리 누수가 발생하거나 많은 트래픽이 몰리는 현상 또는 구현 상의 버그로 인해 Heap의 사용량이 순간적으로 크게 증가할 수 있습니다.이 경우 GC가 과도하게 일어나면서 애플리케이션의 성능을 저해할 수 있고, 심한 경우에는 OOM(Out Of Memory) 에러가 발생하여 애플리케이션이 다운될 수 있습니다.해당 에러가 발생하면 코드 상으로 어떠한 객체가 원인인지 찾아내기 상당히 어렵기 때문에OOM이 발생한 시점 혹은 그 근방에 시점에 대해 Heap Dump를 분석해야 합니다. OutOfMemoryError API 호출먼저 OOM을 내기 위한 Api를 하나 간단하게 만들어보겠습니다.@Data@Builderp..

Garbage Collection(GC) 이란?프로그램을 개발 하다 보면 더이상 쓰이지 않는(참조되지 않는) 메모리인 Garbage가 발생하게 됩니다.C언어에서는 free()라는 함수를 통하여 개발자가 직접 메모리를 해제해주어야 하지만, Java나 Kotlin 에서는 Garbage Collector가 알아서 불필요한 메모리를 정리해주기 때문에 개발자의 실수로 memory leak이 발생하는 일을 막아줍니다.그런데 GC는 어떻게 알아서 똑똑하게 불필요한 메모리를 판단하여 정리하고, 또 언제 정리를 할까요?이를 알기 위해선 먼저 Java의 컴파일 과정과, JVM 메모리구조, GC의 여러가지 방식들에 대하여 살펴볼 필요가 있습니다.Java 컴파일 과정 자바 프로그램을 실행하면, JVM은 OS로부터 메모리를 할..