Skip to content

refactor: separate class analysis and rule validation logic#231

Open
yuchem2 wants to merge 8 commits into
developfrom
CARGO-424
Open

refactor: separate class analysis and rule validation logic#231
yuchem2 wants to merge 8 commits into
developfrom
CARGO-424

Conversation

@yuchem2

@yuchem2 yuchem2 commented Jun 4, 2026

Copy link
Copy Markdown
Member

#224에서 진행된 작업에서 클래스 분석과 검증 로직을 분리하고, 추후 미들웨어에서 분석된 클래스만 사용하여 데이터를 매핑하도록 수정합니다.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 풀 리퀘스트는 analyzeCargoSchema를 도입하여 라우트 등록 시점에 DTO 클래스와 중첩된 DTO들을 재귀적으로 분석하고 캐싱하는 정적 분석 단계를 추가했습니다. 이를 통해 기존의 validateCargoSchemavalidateAnalysis로 리팩토링하여 분석된 메타데이터를 기반으로 유효성 검사를 수행하도록 개선했습니다. 리뷰어는 동적 다형성(예: TypeResolver)으로 인해 정적 분석 단계에서 누락된 클래스가 있을 경우, 런타임에 analyzeCargoSchema를 호출하여 캐싱된 메타데이터를 안전하게 재사용할 수 있도록 바인딩 로직을 개선할 것을 제안했습니다.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread packages/express-cargo/src/binding.ts Outdated
@yuchem2

yuchem2 commented Jun 4, 2026

Copy link
Copy Markdown
Member Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a dedicated schema analysis phase (analyzeCargoSchema) that recursively extracts and caches metadata for DTO classes and their nested dependencies. This analysis result is then utilized during both schema validation and request binding to prevent redundant metadata reconstruction. The review feedback highlights two key areas for improvement: first, ensuring that dynamically resolved classes during runtime binding are also validated using validateAnalysis; second, checking the parameter length of type functions (typeFn.length === 0) in the analysis phase to safely distinguish between zero-argument Thunks and multi-argument Resolvers, preventing runtime errors during static analysis.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread packages/express-cargo/src/binding.ts
Comment thread packages/express-cargo/src/analysis.ts Outdated
@yuchem2 yuchem2 self-assigned this Jun 4, 2026
@yuchem2

yuchem2 commented Jun 4, 2026

Copy link
Copy Markdown
Member Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 풀 리퀘스트는 Cargo 클래스와 중첩된 DTO들을 재귀적으로 분석하고 결과를 캐싱하는 analyzeCargoSchema 기능을 도입하고, 기존의 검증 로직을 validateAnalysis로 리팩토링하여 바인딩 및 검증 흐름을 개선합니다. 리뷰어는 두 가지 개선 사항을 제안했습니다. 첫째, binding.ts에서 targetClassObject일 때 빈 객체로 잘못 바인딩되는 버그를 방지하기 위해 targetClass !== Object 조건을 추가할 것을 권장합니다. 둘째, analysis.ts에서 currentClass.prototype이 정의되지 않았을 때 발생할 수 있는 TypeError를 방지하기 위해 안전한 폴백을 적용할 것을 제안합니다.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread packages/express-cargo/src/binding.ts Outdated
Comment thread packages/express-cargo/src/analysis.ts Outdated
@yuchem2 yuchem2 requested a review from laggu June 4, 2026 13:40
*
* This function caches its results, so subsequent calls for the same class are free.
*/
export function analyzeCargoSchema(cargoClass: ClassConstructor): AnalysisResult {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 함수에서 CargoClassMetadata 에서 관리하는 필드 캐시들을 모두 계산해서 세팅하면 좋을거 같아요

@yuchem2

yuchem2 commented Jun 9, 2026

Copy link
Copy Markdown
Member Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 풀 요청은 DTO 클래스와 중첩된 DTO들을 재귀적으로 분석하고 메타데이터 필드 목록을 사전 계산하여 캐싱하는 클래스 분석 단계(analyzeCargoSchema)를 도입합니다. 이를 통해 바인딩 시 프로토타입 체인을 반복해서 탐색하는 성능 저하를 방지하고, 런타임 동적 다형성 바인딩 및 검증을 지원합니다. 리뷰어는 analyzeCargoSchema 함수에 유효한 클래스 생성자 함수인지 확인하는 방어적 코드를 추가할 것과, 런타임에 동적으로 분석된 메타데이터를 기존 맵에 병합하여 불필요한 재분석을 방지하고 성능을 최적화할 것을 제안했습니다.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +56 to +58
export function analyzeCargoSchema(cargoClass: ClassConstructor): AnalysisResult {
const cached = ANALYSIS_CACHE.get(cargoClass)
if (cached) return cached

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

cargoClass가 올바른 클래스 생성자 함수인지 검증하는 방어적 코드(Defensive check)를 추가하는 것이 좋습니다. 만약 cargoClassnull, undefined 또는 함수가 아닌 값이 전달될 경우, WeakMap.get 호출이나 cargoClass.prototype 접근 시 직관적이지 않은 런타임 에러가 발생할 수 있습니다.

에러를 명확하게 던져 개발자가 문제를 빠르게 인지할 수 있도록 개선할 수 있습니다.

Suggested change
export function analyzeCargoSchema(cargoClass: ClassConstructor): AnalysisResult {
const cached = ANALYSIS_CACHE.get(cargoClass)
if (cached) return cached
export function analyzeCargoSchema(cargoClass: ClassConstructor): AnalysisResult {
if (!cargoClass || typeof cargoClass !== 'function') {
throw new TypeError('analyzeCargoSchema: cargoClass must be a class constructor function.')
}
const cached = ANALYSIS_CACHE.get(cargoClass)
if (cached) return cached
References
  1. 잘못된 입력이나 상태가 들어왔을 때 안전하게 처리할 수 있도록 방어적 프로그래밍(Defensive Programming)을 적용합니다.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

null, undefined가 들어온 경우 WeakMap.get은 에러를 던지지 않고, undefined를 반환하는 것을 확인하였습니다. 하지만 prototype 접근시 오류가 발생하는 경우를 확인하여 해당 사항의 경우 오류를 반환하도록 반영하겠습니다.

Comment on lines +175 to +181
const nestedMetaFromMap = analysis.metadataMap.get(targetClass)
let targetAnalysis = analysis
if (!nestedMetaFromMap) {
targetAnalysis = analyzeCargoSchema(targetClass)
validateAnalysis(targetAnalysis)
}
const nestedMeta = nestedMetaFromMap || targetAnalysis.rootMeta

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

동적 다형성(Dynamic Polymorphism) 등으로 인해 런타임에 결정된 targetClass가 정적 분석 결과(analysis.metadataMap)에 존재하지 않는 경우, 매번 analyzeCargoSchemavalidateAnalysis를 수행하게 됩니다.

비록 캐시가 적용되어 있어도 매번 함수 호출과 맵 조회가 발생하므로, 분석된 결과를 현재 analysis.metadataMap에 병합(merge)하여 캐싱해 두면 다음 바인딩 시점부터는 추가적인 분석 과정 없이 즉시 메타데이터를 조회할 수 있어 성능이 크게 향상됩니다.

        const nestedMetaFromMap = analysis.metadataMap.get(targetClass)
        let targetAnalysis = analysis
        if (!nestedMetaFromMap) {
            targetAnalysis = analyzeCargoSchema(targetClass)
            validateAnalysis(targetAnalysis)
            for (const [cls, meta] of targetAnalysis.metadataMap) {
                analysis.metadataMap.set(cls, meta)
            }
        }
        const nestedMeta = nestedMetaFromMap || targetAnalysis.rootMeta
References
  1. 런타임에 동적으로 분석된 메타데이터를 캐시에 병합하여 불필요한 재분석 및 검증 과정을 최소화합니다.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 리뷰는 root 정적 분석 결과에 동적 다형성 타입을 넣으라는 요청이지만, 실제로는 캐시 미스가 발생하고, analyzeCargoSchema함수가 호출되면 내부 전역 캐시로 등록되기 때문에 실제로는 문제가 없습니다. 오히려 동적 다형성 타입이 많은 경우 root weakMap의 비대해질 가능성이 있어 반영하지 않습니다.

@yuchem2 yuchem2 requested a review from laggu June 9, 2026 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants