개요
데이터 조회 속도를 개선하기 위해 집계테이블을 추가하면서 기존에 하나의 테이블에서만 가져오던 데이터를 조회 시 기간타입에 따라 각각 다른 집계 테이블에서도 조회되도록 수정해야 했습니다.
팩토리 패턴
어떤 클래스에서 생성하는 객체를 서브 클래스로 분리하는 디자인 패턴
관제값을 가져올때 팩토리 클래스에서 조회 기간에 맞는 서비스를 가져온다.
적용
팩토리 클래스 코드
import org.springframework.stereotype.Service;
import ai.energyx.bems.common.enums.PeriodQueryDateFormat;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class ControlValuesServiceFactory {
private final ControlValueService controlValueService;
private final ControlValueDailyAggregateService controlValueDailyAggregateService;
private final ControlValueMonthlyAggregateService controlValueMonthlyAggregateService;
public ControlValueProvider<?> getService(PeriodQueryDateFormat primaryDateFormat) {
return switch (primaryDateFormat) {
case DAY_MINUTE, DAY_HOUR -> controlValueService;
case WEEK, MONTH, DATE_RANGE -> controlValueDailyAggregateService;
case YEAR, YEARS -> controlValueMonthlyAggregateService;
};
}
}
팩토리 서비스 호출 코드
private List<ControlValueQuery> getControlValues(PeriodQueryDateFormat primaryDateFormat, LocalDate startDate,
LocalDate endDate, List<Long> controlPointIds) {
ControlValueProvider<?> controlValueProviderService = controlValuesServiceFactory.getService(primaryDateFormat);
List<? extends ControlValueInterface> controlValues = controlValueProviderService.getControlValues(
controlPointIds,
startDate, endDate);
return controlValues.stream()
.map(controlValue -> ControlValueQuery.from(controlValue, primaryDateFormat))
.toList();
}
- controlValuesServiceFactory.getService(primaryDateFormat);
- 기간타입에 따른 controlValueProviderService를 가져오기 때문에 서비스 로직에 더 집중 할 수 있다.
결론
한 서비스 메소드에서 서브객체를 생성할수도 있지만 팩토리패턴으로 클래스를 분리함으로써 얻는 장점들이 있다.
- 서비스 로직과 클래스 생성 로직을 분리하여 서로간에 결합도가 낮아진다.
- 집계테이블 종류가 추가될때 팩토리 클래스에 추가만 해주면 되기때문에 유지보수가 용이해진다.
'트러블슈팅' 카테고리의 다른 글
연관관계 매핑 (0) | 2024.10.15 |
---|---|
어노테이션 기반 권한 관리 (0) | 2024.10.14 |
그래프 조회 속도 개선 (1) | 2024.10.13 |
배치 리팩터링 (3) | 2024.10.10 |
요금 계산 리팩터링 (0) | 2024.10.10 |