자바, 코틀린 사용시 Object <-> JSON 변환간에 ObjectMapper를 많이 사용한다.
// Object -> JSON
User user = new User("John", 25);
String json = objectMapper.writeValueAsString(user);
// JSON -> Object
User user = objectMapper.readValue(json, User.class);
성능이 중요한 애플리케이션에서 ObjectMapper는 조심해서 사용해야 한다.
왜냐하면 내부적으로 자바의 리플렉션을 사용하여 변환해주기 때문이다.
리플렉션이 안좋은 이유는 두가지 문제가 있다
1. JIT(Just-In-Time) 컴파일러의 최적화를 제대로 활용할 수 없다.
JIT 컴파일러는 실행 시간을 단축하기 위해 다양한 최적화 전략을 사용하는데 이 중 하나가 정적 타입 분석을 통한 메서드 인라이닝이다.
메서드 인라이닝은 호출 비용을 줄이고 컴파일러가 더 많은 컨텍스트를 파악하여 추가적인 최적화를 한다
그러나 리플렉션을 사용하면 코드의 정적 구조는 런타임에만 완전히 파악할 수 있어 컴파일러가 최적화를 수행하기 어렵게 된다. 결국 리플렉션을 사용하는 코드가 더 느리게 실행된다.
2. 리플렉션으로 로딩되는 추가적인 클래스 정보와 생성되는 JsonString이 모두 힙(Heap)에 할당된다.
힙에 생성되고 DTO가 만들어진 후에는 참조가 사라져 GC(Garbage Collection)의 대상이 된다. 즉, DTO를 생성하기 위해 클래스 정보가 매번 런타임에 로딩되고 JsonString이 생성되면 빈번한 GC가 성능을 저하 시킨다
성능이 중요할 경우 해결책
1. 직접 코드를 작성해서 매핑한다.
2. MapStruct를 사용한다.
https://tech.socarcorp.kr/dev/2023/07/22/member-service-performance-tuning-01.html
'Language > Java' 카테고리의 다른 글
early return이란? (0) | 2021.03.13 |
---|---|
[자바 스터디 15주차 번외] 스트림 & Optional (0) | 2021.03.07 |
[자바 스터디 15주차] 람다식 (0) | 2021.03.05 |
[자바 스터디 14주차] 제네릭 (0) | 2021.02.27 |
[자바 스터디 13주차] IO (0) | 2021.02.20 |