본문 바로가기

개발44

JMH benchmark 동기 대량의 데이터를 쪼개어 처리할 일이 있어, stream 보다는 parallelStream을 사용해보려고 했다. 당연히 parallelStream이 훨씬 빠르겠거니 하고 테스트를 해본 결과 stream이 더 빠른 결과가 나왔다. 대체 어떤 상황인지 이해가 되지 않아 구글링을 해보니, 해당 글을 발견했다. 짧게 수행한 벤치마킹은 JIT 컴파일러가 동작하는 중간에 혹은 동작하기 전에 끝나버리기 때문에, 최대 처리량 측정하지 않게 된다. 즉, 내가 테스트한 결과가 정확하지 않다는 것이다. JVM에서 성능테스트를 하기란 쉽지 않기 때문에 JMH같이 잘 만들어진 벤치마킹 프레임워크로 테스트하는 것을 추천하여 접하게 됐다. 적용 gradle plugins { id "me.champeau.jmh" version .. 2023. 3. 12.
Java Atomic Atomic 이란? Java에서 동시성을 보장해주는 자료형이다. Java docs에서 AtomicInteger에 대해 아래와 같이 설명하고 있다. An int value that may be updated atomically. (생략) An AtomicInteger is used in applications such as atomically incremented counters, and cannot be used as a replacement for an Integer. However, this class does extend Number to allow uniform access by tools and utilities that deal with numerically-based classes. 원자적으.. 2022. 12. 3.
Java Closure Closure란? MDN에서는 Closure를 아래와 같이 설명하고 있다. A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). 클로저는 주변 상태에 대한 참조와 함께 묶인(포함된) 함수의 조합입니다. 네..? 무슨 말인지 잘 모르겠다. 간단한 예시로 closure에 대해 이해해보자. public int lambda() { BiFunction function = (x, y) -> x + y; return function.apply(1, 2); } public int closure() { int z = 3; BiF.. 2022. 12. 3.
@Transactional 사용시 주의점(feat.AOP,Proxy) 트랜잭션은 ACID를 보장하기 위한 중요한 요소이다. 스프링에서는 @Transactional 을 메서드, 클래스 단에 지정하면 쉽게 트랜잭션을 적용할 수 있게 한다. 그런데 이렇게 쉽게 사용할 수 있는 @Transactional에도 주의할 점이 필요하다. 스프링으로 웹 개발을 한지 꽤나 되었다고 생각했는데, 지금까지 이러한 주의점을 모르고 있었다. 왜냐하면 이 주의점은 꽤나 깊은 지식을 이해해야 파악할 수 있는 부분이기 때문이다. 일단 시나리오를 두 가지 준비해 보았다. Scenario 1. 같은 클래스 내에서 트랜잭션이 적용되지 않은 메서드 A가 트랜잭션이 적용된 메서드 B를 호출하고 있다. 외부에서 A를 호출했다면 B는 트랜잭션이 제대로 동작할까? @Service public class Product.. 2022. 11. 13.