
아래의 내용은 해외의 다음 포스팅을 변역 및 정리한 내용입니다. 1. 리플렉션(Reflection)을 포함한 다양한 코드 접근 방식들의 성능 [ 코드 접근 방식의 성능 요구사항 ] 우리는 특정 클래스를 요청/응답에 사용하거나 혹은 ORM에 사용하는 등의 많은 경우에 직렬화/역직렬화 과정을 거쳐야 하며, 이를 위해 특정 클래스의 Getter에 접근해야 할 때가 있다. 제네릭 혹은 Object 등을 사용하면 컴파일 타입이 존재하지 않으므로 어떤 클래스에 대한 직렬화/역직렬화를 하는지 모르는데, 이때 특정 클래스에서 Getter를 읽는 가장 빠른 방법은 무엇일까?예를 들어 다음과 같은 Person 클래스가 있다고 하자.public class Person { ... public String get..

1. 공식문서로 Kotest에 대해 알아보기 [ Kotest란? ] 코틀린에서 사용 가능한 언어의 특징을 이용함으로써, Kotest는 더욱 강력하지만 간단한 테스트 정의 방법을 제공한다. KoTest에서 테스트는 테스트 로직을 담고 있는 단순한 함수일 뿐이며, 이제 자바 파일에 테스트를 메서드로 정의하는 시대는 끝난 것이다. Kotest에서 테스트 메서드는 번거롭게 수동으로 정의하는 것이 아니라 Kotest의 DSL을 사용해서 정의한다. class MyFirstTestClass : FunSpec({ test("my first test") { 1 + 2 shouldBe 3 } }) 테스트를 중첩시키는 것 역시 간결해졌다. JUnit에서 테스트를 중첩시키려면 다음의 번거로운 작업이 필요했다. class Ne..

1. JIT 컴파일러(Just-In Time Compiler)의 최적화 과정 자세히 살펴보기 [ Inlining(인라인) ] 앞선 포스팅에서 살펴보았듯 Inlining은 호출되는 메서드를 본문으로 인라인하여 메서드 호출에 대한 오버헤드를 줄일 수 있고, 이를 통해 다른 최적화를 적용할 수도 있다. 하지만 인라인은 코드 크기를 늘리기 때문에 신중하게 적용되어야 한다. 왜냐하면 컴파일된 코드는 제한된 코드 캐시라는 힙 공간에 저장되는데, 공간이 부족해지면 더 이상 코드를 컴파일 할 수 없기 때문이다. 따라서 JVM은 휴리스틱하게 메서드의 인라인 여부를 결정하는데, 대표적으로 자주 호출되는 메서드나 Getter와 Setter 같은 간소한 메서드들을 인라인하려고 시도한다. 인라인 정책은 JVM 매개변수로 변경할..

1. JIT 컴파일러(Just-In Time Compiler)란? [ JIT 컴파일러(Just-In Time Compiler)란? ] 자바 컴파일러(javac)는 자바 파일을 읽고 클래스 파일로 컴파일한다. 바이트코드는 모든 연산 코드가 단일 바이트로 표시되며 플랫폼에 종속되지 않는(portable) 명령어 집합으로 구성된다. 이들은 자바 가상 머신(JVM)에서 실행되며 실행 시점에 기계어로 번역한다. 덕분에 특정 아키텍처에 종속적되지 않지만 성능은 훨씬 떨어진다. JVM 초기에는 실행 시점에 모든 바이트코드를 직접 기계어로 해석했기 때문에 성능 문제가 있었다. 이를 위해 JDK 1.3에 HotSpot VM이 도입되어 런타임에 바이트코드를 느리게 해석하는 대신 최적화된 코드를 실행할 수 있는 JIT(Ju..

1. 예시로 살펴보는 IntelliJ 프로파일링 결과 분석 및 성능 최적화 방법 [ 샘플 코드 작성 및 프로파일링하기 ] IntelliJ Ultimate를 사용하고 있다면, 손쉽게 프로파일링을 진행하고 결과를 확인할 수 있다. 예를 들어 다음과 같은 컨트롤러와 서비스가 있다고 하자. @RestController @RequiredArgsConstructor class BoxingController { private final BoxingService boxingService; @GetMapping("/boxing") int boxing() { int result1 = boxingService.max1(100000000L); int result2 = boxingService.max2(100000000L); ..