관제값 조회 디자인 패턴 적용

2024. 10. 13. 23:30·트러블슈팅

개요

데이터 조회 속도를 개선하기 위해 집계테이블을 추가하면서 기존에 하나의 테이블에서만 가져오던 데이터를 조회 시 기간타입에 따라 각각 다른 집계 테이블에서도 조회되도록 수정해야 했습니다.

팩토리 패턴

어떤 클래스에서 생성하는 객체를 서브 클래스로 분리하는 디자인 패턴

관제값을 가져올때 팩토리 클래스에서 조회 기간에 맞는 서비스를 가져온다.

적용

팩토리 클래스 코드

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
'트러블슈팅' 카테고리의 다른 글
  • 연관관계 매핑
  • 어노테이션 기반 권한 관리
  • 그래프 조회 속도 개선
  • 배치 리팩터링
jamin
jamin
  • jamin
    jamin
    jamin
  • 전체
    오늘
    어제
    • 전체 (83)
      • 트러블슈팅 (31)
      • 개념 저장소 (19)
        • coroutine (10)
        • spring reactive (9)
        • network (0)
      • 코딩 테스트 (32)
  • 태그

    다익스트라
    대용량 데이터
    코딩테스트
    JPA
    누적합
    그리디
    DP
    Kotlin
    백준 23758
    수학
    mirroring mode
    instancio
    log
    다이나믹 프로그래밍
    error alram
    spring reactive
    분리집합
    reactive
    코테
    백준
    spring boot
    sinks
    coroutine
    정렬
    cluster mode
    그리디 알고리즘
    경로압축
    BFS
    batch
    dfs
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jamin
관제값 조회 디자인 패턴 적용
상단으로

티스토리툴바