Skip to content

Latest commit

ย 

History

History
89 lines (74 loc) ยท 6.32 KB

File metadata and controls

89 lines (74 loc) ยท 6.32 KB

spring-core-test โ€” AOT/์ฝ”์–ด ํ…Œ์ŠคํŠธ ์ง€์› ๋„๊ตฌ

Spring Framework 7.1.0-SNAPSHOT ๊ธฐ์ค€

ํ•œ ์ค„ ์ •์˜

spring-core-test๋Š” ๋ฉ”์ธ ์‚ฐ์ถœ๋ฌผ์ด ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ๋ฅผ ๋•๋Š” ๋ชจ๋“ˆ์ด๋‹ค. AOT(Ahead-Of-Time)๋กœ ์ƒ์„ฑ๋œ ์ž๋ฐ” ์†Œ์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ ์ฆ‰์„ ์ปดํŒŒ์ผยท๋กœ๋”ฉํ•˜๊ณ , ๋ฆฌํ”Œ๋ ‰์…˜/๋ฆฌ์†Œ์Šค ํ˜ธ์ถœ์„ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ˆ˜์ค€์—์„œ ๊ฐ€๋กœ์ฑ„ RuntimeHints ์„ค์ •์ด ์‹ค์ œ ๋™์ž‘์„ ๋น ์ง์—†์ด ๋ฎ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋„๊ตฌ ๋ชจ์Œ์ด๋‹ค.

์ด ๋ชจ๋“ˆ์ด ํ‘ธ๋Š” ๋ฌธ์ œ

Spring 6๋ถ€ํ„ฐ ๋„์ž…๋œ AOT ์ฒ˜๋ฆฌ๋Š” ๋นŒ๋“œ ์‹œ์ ์— ๋นˆ ์ •์˜ยทํ”„๋ก์‹œยท๋ฆฌํ”Œ๋ ‰์…˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ” ์†Œ์Šค ์ฝ”๋“œ๋กœ ์ƒ์„ฑํ•œ๋‹ค. ์ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์ •๋ง ์ปดํŒŒ์ผ๋˜๊ณ  ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ ํ™•์ธํ•˜๋ ค๋ฉด ๋‘ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  1. ์ƒ์„ฑ๋œ ์†Œ์Šค๋ฅผ ์‹ค์ œ๋กœ ์ปดํŒŒ์ผํ•ด ํด๋ž˜์Šค๋กœ ๋„์šฐ๋Š” ์ˆ˜๋‹จ โ€” ๋””์Šคํฌ์— ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š๊ณ , ํ…Œ์ŠคํŠธ ํด๋ž˜์ŠคํŒจ์Šค๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ. โ†’ org.springframework.core.test.tools (TestCompiler).
  2. GraalVM ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€์—์„œ ํ•„์š”ํ•œ RuntimeHints๊ฐ€ ๋ˆ„๋ฝ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ˆ˜๋‹จ โ€” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘ ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฆฌํ”Œ๋ ‰์…˜/๋ฆฌ์†Œ์Šค/ํ”„๋ก์‹œ๋ฅผ ์“ฐ๋Š”์ง€ ๊ธฐ๋กํ•˜๊ณ , ์„ค์ •๋œ ํžŒํŠธ์™€ ๋Œ€์กฐ. โ†’ org.springframework.aot.agent (Java Agent, 7.0์—์„œ deprecated).

์ด ๋ชจ๋“ˆ์€ ์œ„ ๋‘ ์ถ•์„ ์ค‘์‹ฌ์œผ๋กœ, AOT ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋„˜๊ธฐ๋Š” ์–ด๋Œ‘ํ„ฐ(TestGenerationContext, CompilerFiles)์™€ SpringFactoriesLoader ๋ชฉ ๊ตฌํ˜„(MockSpringFactoriesLoader)์„ ํ•จ๊ป˜ ์ œ๊ณตํ•œ๋‹ค.

์˜์กด ๊ด€๊ณ„

        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚                spring-core-test                โ”‚
        โ”‚  (Premain-Class: RuntimeHintsAgent)            โ”‚
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                        โ”‚ api
                        โ–ผ
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚spring-coreโ”‚   โ† aot.hint / aot.generate / io.support / asm
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

  optional / ์ปดํŒŒ์ผ ์ „์šฉ:
    assertj-core         (AssertJ ๋‹จ์–ธ โ€” *Assert ํด๋ž˜์Šค)
    junit-jupiter-api    (@CompileWithForkedClassLoader, @EnabledIfRuntimeHintsAgent)
    junit-platform-launcher (ํฌํฌ๋œ ํด๋ž˜์Šค๋กœ๋”๋กœ ํ…Œ์ŠคํŠธ ์žฌ์‹คํ–‰)
    qdox                 (์†Œ์Šค์—์„œ ํด๋ž˜์Šค๋ช… ํŒŒ์‹ฑ)
  • ์˜์กดํ•˜๋Š” ๋ชจ๋“ˆ: spring-core ํ•˜๋‚˜๋ฟ(api). ๋‚ด๋ถ€์ ์œผ๋กœ spring-core์˜ org.springframework.asm(ASM ์žฌํŒจํ‚ค์ง•), aot.hint, aot.generate ํŒจํ‚ค์ง€๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์˜์กด๋ฐ›๋Š” ๋ชจ๋“ˆ: ํ”„๋ ˆ์ž„์›Œํฌ ์ „๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ. ํŠนํžˆ spring-context/spring-beans์˜ AOT ํ…Œ์ŠคํŠธ, spring-core์˜ RuntimeHints ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ.

ํ•˜์œ„ ์ฑ•ํ„ฐ ๋ชฉ์ฐจ

  1. 01-๋ชจ๋“ˆ-์ง€ํ˜•๋„.md โ€” ๋„ค ๊ฐœ ํŒจํ‚ค์ง€๊ฐ€ ๊ฐ๊ฐ ๋ฌด์—‡์„ ์ฑ…์ž„์ง€๋Š”๊ฐ€, ๋‘ ๊ฐœ์˜ ํฐ ์ถ•
  2. 02-TestCompiler-๋™์ -์ปดํŒŒ์ผ.md โ€” ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ ์ž๋ฐ” ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผยท๋กœ๋”ฉํ•˜๋Š” ์—”์ง„
  3. 03-ํฌํฌ๋œ-ํด๋ž˜์Šค๋กœ๋”-๊ฒฉ๋ฆฌ.md โ€” @CompileWithForkedClassLoader๋กœ ํด๋ž˜์ŠคํŒจ์Šค๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜
  4. 04-AOT-์ƒ์„ฑ-ํ…Œ์ŠคํŠธ-๋ธŒ๋ฆฌ์ง€.md โ€” TestGenerationContextยทCompilerFilesยทMockSpringFactoriesLoader
  5. 05-RuntimeHints-Agent.md โ€” ๋ฐ”์ดํŠธ์ฝ”๋“œ ๊ณ„์ธก์œผ๋กœ ๋ฆฌํ”Œ๋ ‰์…˜ ํ˜ธ์ถœ์„ ๊ธฐ๋กยท๊ฒ€์ฆํ•˜๋Š” Java Agent

์ „์ฒด ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ASCII ๋งต

spring-core-test/src/main/java
โ”‚
โ”œโ”€โ”€ org/springframework/core/test/tools/        โ† [์ถ• 1] ๋™์  ์ปดํŒŒ์ผ ์—”์ง„
โ”‚   โ”œโ”€โ”€ TestCompiler                  ์ปดํŒŒ์ผ ์ง„์ž…์ (๋ถˆ๋ณ€, with* ๋นŒ๋”)
โ”‚   โ”œโ”€โ”€ Compiled                      ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ + ํด๋ž˜์Šค ๋กœ๋”ฉ/์ธ์Šคํ„ด์Šคํ™”
โ”‚   โ”œโ”€โ”€ DynamicFile (sealed)          โ”œโ”€ SourceFile   (.java + ํด๋ž˜์Šค๋ช… ํŒŒ์‹ฑ)
โ”‚   โ”‚                                 โ””โ”€ ResourceFile (์ž„์˜ ๋ฆฌ์†Œ์Šค)
โ”‚   โ”œโ”€โ”€ SourceFiles / ResourceFiles / ClassFiles   ๋ถˆ๋ณ€ ์ปฌ๋ ‰์…˜ ๋ž˜ํผ
โ”‚   โ”œโ”€โ”€ ClassFile                     in-memory ๋ฐ”์ดํŠธ์ฝ”๋“œ
โ”‚   โ”œโ”€โ”€ DynamicJavaFileManager        ์ปดํŒŒ์ผ ์‚ฐ์ถœ๋ฌผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€
โ”‚   โ”œโ”€โ”€ DynamicClassLoader            ์ƒ์„ฑ๋œ ํด๋ž˜์Šค/๋ฆฌ์†Œ์Šค๋ฅผ ๋…ธ์ถœ
โ”‚   โ”œโ”€โ”€ DynamicJavaFileObject / DynamicClassFileObject / DynamicResourceFileObject
โ”‚   โ”œโ”€โ”€ *Assert (Source/Resource/DynamicFile)      AssertJ ์ง€์›
โ”‚   โ”œโ”€โ”€ CompileWithForkedClassLoader  โ† [์ถ• 1-b] ํด๋ž˜์ŠคํŒจ์Šค ๊ฒฉ๋ฆฌ ์• ๋„ˆํ…Œ์ด์…˜
โ”‚   โ”‚   + ...Extension + ...ClassLoader            JUnit ํ™•์žฅ + ํฌํฌ ํด๋ž˜์Šค๋กœ๋”
โ”‚   โ””โ”€โ”€ CompilationException / WritableContent
โ”‚
โ”œโ”€โ”€ org/springframework/aot/test/generate/      โ† [์ถ• 1-c] AOTโ†’์ปดํŒŒ์ผ๋Ÿฌ ์–ด๋Œ‘ํ„ฐ
โ”‚   โ”œโ”€โ”€ TestGenerationContext         InMemoryGeneratedFiles ๊ธฐ๋ฐ˜ GenerationContext
โ”‚   โ””โ”€โ”€ CompilerFiles                 GeneratedFiles โ†’ TestCompiler ๋ณ€ํ™˜
โ”‚
โ”œโ”€โ”€ org/springframework/core/test/io/support/   โ† ๊ธฐํƒ€ ์ฝ”์–ด ํ…Œ์ŠคํŠธ ๋ณด์กฐ
โ”‚   โ””โ”€โ”€ MockSpringFactoriesLoader     spring.factories ๋ชฉ ๊ตฌํ˜„
โ”‚
โ”œโ”€โ”€ org/springframework/aot/agent/               โ† [์ถ• 2] Java Agent (deprecated 7.0)
โ”‚   โ”œโ”€โ”€ RuntimeHintsAgent             premain ์ง„์ž…์ 
โ”‚   โ”œโ”€โ”€ InvocationsRecorderClassTransformer / ...Visitor   ASM ๋ฐ”์ดํŠธ์ฝ”๋“œ ์žฌ์ž‘์„ฑ
โ”‚   โ”œโ”€โ”€ InstrumentedBridgeMethods     ๊ณ„์ธก๋œ JDK ๋ฉ”์„œ๋“œ ๋Œ€์ฒด ๊ตฌํ˜„
โ”‚   โ”œโ”€โ”€ InstrumentedMethod (enum)     ๊ณ„์ธก ๋Œ€์ƒ + ํžŒํŠธ ๋งค์ฒ˜
โ”‚   โ”œโ”€โ”€ RecordedInvocation            ๊ธฐ๋ก๋œ 1ํšŒ ํ˜ธ์ถœ
โ”‚   โ”œโ”€โ”€ RecordedInvocationsPublisher / ...Listener   ๋ฆฌ์Šค๋„ˆ ๋ฐœํ–‰
โ”‚   โ””โ”€โ”€ HintType / MethodReference
โ”‚
โ””โ”€โ”€ org/springframework/aot/test/agent/          โ† [์ถ• 2-b] Agent ํ…Œ์ŠคํŠธ API
    โ”œโ”€โ”€ RuntimeHintsRecorder          record(Runnable) โ†’ ํ˜ธ์ถœ ์ˆ˜์ง‘
    โ”œโ”€โ”€ RuntimeHintsInvocations + ...Assert   AssertJ๋กœ ํžŒํŠธ ๋Œ€์กฐ
    โ””โ”€โ”€ EnabledIfRuntimeHintsAgent    Agent ๋ฏธ์ ์žฌ ์‹œ ํ…Œ์ŠคํŠธ ๋น„ํ™œ์„ฑํ™”