Skip to content

[서브이슈] 129-1: 템플릿 함수 호출 패턴(aggregators) 구조 개선 #130

@Seungwoo321

Description

@Seungwoo321

📋 이슈 개요

프랑스어 Aggregators 등에서 aggregatorTemplates.sum(usFmt)()와 같이 빈 괄호로 잘못 호출하는 패턴이 발견되었습니다. 이 패턴은 속성 정보([attr]) 없이 인스턴스를 생성하여, 집계 대상 필드가 없는 잘못된 집계기가 만들어지는 문제를 유발합니다.


sum(attrs)() 패턴이 잘못된 이유와 근거 (상세 설명)

1. AggregatorTemplate의 함수 구조

  • aggregatorTemplates의 각 함수(예: sum)는 다음과 같은 구조를 가집니다.
    1. 첫 번째 함수: 포맷터 등 옵션을 받음
    2. 두 번째 함수: 실제 집계할 속성 배열([attr])을 받음
    3. 세 번째 함수: 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])는 안 받아서, 집계할 대상을 모르는 잘못된 인스턴스가 만들어진다!

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions