반응형
문제 상황
Repository에서 (1) 문자열의 값을 특정 date 타입으로 변경하거나 (2) 현재 시간을 특정 date로 변경하기 위해서 DateTimeFormatter를 사용했습니다.
쿼리에 그대로 DateTimeFormatter.ofPattern()을 사용하면 DateTimeFormatter 객체가 여러 번 생성되고 날짜 패턴이 중복으로 하드코딩되는 문제가 있었습니다.
그래서 이를 Util 클래스에 static으로 만들어 둔 다음 하나의 DateTimeFormatter를 사용하려고 했습니다.
public static DateTimeFormatter hmFormatter() {
return DateTimeFormatter.ofPattern("HH:mm");
}
public static DateTimeFormatter ymdFormatter() {
return DateTimeFormatter.ofPattern("yyyy-MM-dd");
}
하지만 static을 통해 객체 하나를 생성하고 공유하려고 했는데, 메서드 형식으로 DateTimeFormatter를 호출하고 있어서 함수를 호출할 때마다 datetimeformatter를 생성하고 있는 문제가 있었습니다.
해결 방법
함수가 아닌 변수에 저장하여 사용합니다.
public static DateTimeFormatter hmFormatter = DateTimeFormatter.ofPattern("HH:mm");
public static DateTimeFormatter ymdFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
📌 hmFormatter가 한 번만 생성된 것을 알 수 있음!
함수로 선언하여 사용할 경우, 해당 함수가 호출될 때마다 새로운 DateTimeFormatter 객체가 생성됩니다. 함수 내부에서 선언된 모든 변수는 지역 변수로, 함수가 호출될 때마다 생성되고, 함수가 종료되면 메모리에서 해제됩니다.
이를 함수 → 변수로 변경하여 메모리 최적화를 진행했습니다.
느낀점
DateTimeFormatter 객체를 한 번만 생성해서 사용해야 하는 이유
- 비용이 큰 객체 초기화
- DateTimeFormatter 객체는 생성 시 내부적으로 복잡한 초기화 과정이 이루어집니다. 예를 들어 지정한 패턴 분석, 지역화 정보, 시간대 등을 처리해야 하므로 매번 새로 생성하면 높은 비용이 요구됩니다.
- 불필요한 객체 생성
- DateTimeFormatter 객체는 불변 객체로 설계되어 있어, 같은 패턴을 가진 포매터를 여러 번 생성할 필요가 없습니다.
- 불필요한 객체가 많아지면 JVM의 Garbage Collection 빈도가 높아져, 성능 저하로 이어질 수 있습니다.
반응형