-
Notifications
You must be signed in to change notification settings - Fork 1
Closed
Labels
Description
📋 이슈 개요
프랑스어 Aggregators 등에서 aggregatorTemplates.sum(usFmt)()와 같이 빈 괄호로 잘못 호출하는 패턴이 발견되었습니다. 이 패턴은 속성 정보([attr]) 없이 인스턴스를 생성하여, 집계 대상 필드가 없는 잘못된 집계기가 만들어지는 문제를 유발합니다.
sum(attrs)() 패턴이 잘못된 이유와 근거 (상세 설명)
1. AggregatorTemplate의 함수 구조
- aggregatorTemplates의 각 함수(예: sum)는 다음과 같은 구조를 가집니다.
- 첫 번째 함수: 포맷터 등 옵션을 받음
- 두 번째 함수: 실제 집계할 속성 배열([attr])을 받음
- 세 번째 함수: AggregatorInstance(집계기 객체)를 반환
예시:
const sumAggTemplate = aggregatorTemplates.sum(usFmt) // 1단계: 포맷터 적용
const sumAgg = sumAggTemplate(['value']) // 2단계: 속성명 적용
const instance = sumAgg() // 3단계: AggregatorInstance 생성2. sum(attrs)() 패턴의 문제점
- sum(attrs)에서 attrs는 포맷터(옵션)이지, 실제 집계할 속성 배열이 아님
- sum(attrs)()처럼 바로 실행하면 속성 정보 없이 인스턴스를 만들어버림
- 피벗테이블에서 어떤 필드를 합산할지 지정해야 하므로 반드시 [attr](예: ['value'])가 필요
- 속성 없이 인스턴스를 만들면, 집계 대상 필드가 없어 잘못된 결과가 나옴
3. 올바른 호출 방식
- 잘못된 예시:
aggregatorTemplates.sum(usFmt)() - 올바른 예시:
aggregatorTemplates.sum(usFmt)(['value'])
4. 실제 코드 근거
sum (formatter: Formatter = usFmt): AggregatorTemplate {
return ([attr]: [string]) => () => ({
sum: 0,
push (record: DataRecord) {
const val = parseFloat(String(record[attr]))
if (!isNaN(val)) {
this.sum += val
}
},
value () {
return this.sum
},
format: formatter,
numInputs: typeof attr !== 'undefined' ? 0 : 1
})
}- 첫 번째 함수: 포맷터를 받고
- 두 번째 함수: [attr]을 받고
- 세 번째 함수: AggregatorInstance를 반환
5. 결론
- sum(attrs)()는 속성 배열 없이 인스턴스를 만들어 잘못된 동작을 유발함
- 반드시 sum(attrs)([attr])처럼 속성 배열을 명시적으로 넘겨야 함
- 실제로는 aggregators 객체에 템플릿 함수만 저장하고, 사용할 때 속성 배열을 넘기는 구조가 맞음
쉬운 설명 (한줄 요약)
옵션(포맷터)은 잘 받으면서, 진짜 필수인 속성 정보([attr])는 안 받아서, 집계할 대상을 모르는 잘못된 인스턴스가 만들어진다!
✅ 작업 내역
- 프랑스어 Aggregators 등에서 sum(attrs)() 패턴을 제거하고, 템플릿 함수만 저장하도록 수정
- 필요시 실제 사용처에서 속성 배열을 넘기는 방식으로 변경
한줄 요약:
옵션(포맷터)은 잘 받으면서, 진짜 필수인 속성 정보([attr])는 안 받아서, 집계할 대상을 모르는 잘못된 인스턴스가 만들어진다!