๐ŸŒ†
Sunset Archive
GitHubLinkedInBlog
  • litsynp
  • Archives
    • Projects
      • Let's Parking!
      • ๋ง›์ง‘๋ชฌ์Šคํ„ฐ (JMT Monster)
      • spring-x-demo Projects
    • Articles
      • My Thoughts on GitBook
      • Wake-on-LAN & RDP Setup
    • Learning
      • Languages
        • Rust
          • Useful Links
          • Syntax
          • Pointers
          • Dependencies
          • Logging
          • Phantom Types
          • Iterable
            • Optional Skip
        • Go
          • Useful Links
          • Structures
          • Zero Values
          • Error Handling
          • Dependency Injection
          • Project Layout
        • JavaScript/TypeScript
          • Basics
            • Types
              • [JS] Falsy Values
              • [TS] Types - unknown, any, never
            • Rest Parameters (...)
            • Spread Syntax (...)
            • Destructuing Assignment
            • CJS, AMD, UMD, ESM
          • Advanced
            • Conditional Destructuring Assignment
            • Type Guards
          • Miscellaneous
            • Dependency Injection in JS?
            • ESLint, Prettier, TypeScript
          • Node
            • Useful Links
            • General
              • V8 Engine
              • Version Management: NVM
              • Environment Variables
            • Database
              • Knex
        • C
          • Dynamic Multi-dimensional Arrays
        • Spring
          • General
            • @Import v.s. @ContextConfiguration
            • MessageSource
          • Kotlin+Spring
            • Kotlin Annotations (Use-Site Targets)
            • Handling Null in Request DTO
            • Handling Null in URL
          • Reactive Stack
            • Reactive API with Spring WebFlux
          • Spring Security
            • Google OAuth Setup
          • Spring Batch
            • Bulk Insert
        • Kotlin
          • val/var in Constructor
          • Initializer Blocks
          • Inheritance Modifiers (final, open, abstract)
          • Delegate Pattern
        • Java
          • Serialization
          • Random Number Generation
            • (1) Math.random() v.s. Random
            • (2) Random v.s. ThreadLocalRandom
        • Python
          • Version Management
        • Ruby
          • Installation
          • Getters & Setters
        • Elixir
        • Erlang
        • Flutter
        • AWS
          • AWS CLI
        • Terraform
          • Installation
          • Basics
      • Code
        • OOP
          • The 4 Basic Concepts of OOP
          • The SOLID Principles
          • GRASP
          • Spring POJO
          • Others
        • Functional Programming
          • Currying
          • Higher-Order Function
          • Closure
          • Monad
        • ๊ณต๋ณ€์„ฑ, ๋ฐ˜๊ณต๋ณ€์„ฑ, ๋ฌด๊ณต๋ณ€์„ฑ
        • Others
          • UUID
          • GraphQL
          • Multimedia
            • Streaming
          • Geography
            • ์œ„๋„ (Latitude), ๊ฒฝ๋„ (Longitude)
      • Tools
        • Nix
        • Mermaid
          • Flowchart
          • Sequence Diagram
          • Class Diagram
          • Entity Relationship Diagrams
        • VSCode
          • VSCode CLI
          • VSCode Extensions
        • JetBrains
          • IntelliJ - Open Projects in Tabs
          • Delete Leftover IDE Directories
        • vim
          • Commands
      • Books
        • ๋‹ค์žฌ๋‹ค๋Šฅ ์ฝ”ํ‹€๋ฆฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Programming Kotlin)
          • Pt 01. ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์Šคํฌ๋ฆฝํŒ… ํ•˜๊ธฐ
            • Ch 01. ์ฝ”ํ‹€๋ฆฐ ์‹œ์ž‘ํ•˜๊ธฐ
            • Ch 02. Java ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ฝ”ํ‹€๋ฆฐ ํ•„์ˆ˜ ์‚ฌํ•ญ
            • Ch 03. ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž
            • Ch 05. ์ฝœ๋ ‰์…˜ ์‚ฌ์šฉํ•˜๊ธฐ
        • ์˜ค๋ธŒ์ ํŠธ (Object)
          • Ch.0 ๋“ค์–ด๊ฐ€๋ฉฐ - ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„
          • Ch.1 ๊ฐ์ฒด, ์„ค๊ณ„
          • Ch.2 ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
          • Ch.3 ์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ
          • Ch.4 ์„ค๊ณ„ ํ’ˆ์งˆ๊ณผ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
          • Ch.5 ์ฑ…์ž„ ํ• ๋‹นํ•˜๊ธฐ
          • Ch.6 ๋ฉ”์‹œ์ง€์™€ ์ธํ„ฐํŽ˜์ด์Šค
          • Ch.7 ์œ ์—ฐํ•œ ์„ค๊ณ„
          • Ch.8 ์˜์กด์„ฑ ๊ด€๋ฆฌํ•˜๊ธฐ
          • Ch.9 ์œ ์—ฐํ•œ ์„ค๊ณ„
          • Ch.10 ์ƒ์†๊ณผ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ
          • Ch.11 ํ•ฉ์„ฑ๊ณผ ์œ ์—ฐํ•œ ์„ค๊ณ„
          • Ch.12 ๋‹คํ˜•์„ฑ
          • Ch.13 ์„œ๋ธŒํด๋ž˜์‹ฑ๊ณผ ์„œ๋ธŒํƒ€์ดํ•‘
          • Ch.14 ์ผ๊ด€์„ฑ ์žˆ๋Š” ํ˜‘๋ ฅ
          • Ch.15 ๋””์ž์ธ ํŒจํ„ด๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ
          • End. ๋งˆ์น˜๋ฉฐ - ๋‚˜์•„๊ฐ€๊ธฐ
          • ํ›„๊ธฐ
        • ํ—ค๋“œ ํผ์ŠคํŠธ ๋””์ž์ธ ํŒจํ„ด (Head First Design Patterns)
          • Ch.1 ๋””์ž์ธ ํŒจํ„ด ์†Œ๊ฐœ์™€ ์ „๋žต ํŒจํ„ด
          • Ch.2 ์˜ต์ €๋ฒ„ ํŒจํ„ด
          • Ch.3 ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด
          • Ch.4 ํŒฉํ† ๋ฆฌ ํŒจํ„ด
          • Ch.5 ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด
          • Ch.6 ์ปค๋งจ๋“œ ํŒจํ„ด
          • Ch.7 ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด๊ณผ ํผ์‚ฌ๋“œ ํŒจํ„ด
          • Ch.8 ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด
          • Ch.9 ๋ฐ˜๋ณต์ž ํŒจํ„ด๊ณผ ์ปดํฌ์ง€ํŠธ ํŒจํ„ด
          • Ch.10 ์ƒํƒœ ํŒจํ„ด
          • Ch.11 ํ”„๋ก์‹œ ํŒจํ„ด
          • Ch.12 ๋ณตํ•ฉ ํŒจํ„ด
        • ์ดํŽ™ํ‹ฐ๋ธŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ (Effective TypeScript)
          • Ch.1 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์•Œ์•„๋ณด๊ธฐ
            • Item 1 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ด€๊ณ„ ์ดํ•ดํ•˜๊ธฐ
            • Item 2 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ค์ • ์ดํ•ดํ•˜๊ธฐ
            • Item 3 ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ํƒ€์ž…์ด ๊ด€๊ณ„์—†์Œ์„ ์ดํ•ดํ•˜๊ธฐ
            • Item 4 ๊ตฌ์กฐ์  ํƒ€์ดํ•‘์— ์ต์ˆ™ํ•ด์ง€๊ธฐ
            • Item 5 any ํƒ€์ž… ์ง€์–‘ํ•˜๊ธฐ
          • Ch.2 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ
            • Item 6 ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ์‹œ์Šคํ…œ ํƒ์ƒ‰ํ•˜๊ธฐ
            • Item 7 ํƒ€์ž…์ด ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ
            • Item 1-7 Study Summary
            • Item 8 ํƒ€์ž… ๊ณต๊ฐ„๊ณผ ๊ฐ’ ๊ณต๊ฐ„์˜ ์‹ฌ๋ฒŒ ๊ตฌ๋ถ„ํ•˜๊ธฐ
            • Item 9 ํƒ€์ž… ๋‹จ์–ธ๋ณด๋‹ค๋Š” ํƒ€์ž… ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 10 ๊ฐ์ฒด ๋ž˜ํผ ํƒ€์ž… ํ”ผํ•˜๊ธฐ
            • Item 11 ์ž‰์—ฌ ์†์„ฑ ์ฒดํฌ์˜ ํ•œ๊ณ„ ์ธ์ง€ํ•˜๊ธฐ
            • Item 12 ํ•จ์ˆ˜ ํ‘œํ˜„์‹์— ํƒ€์ž… ์ ์šฉํ•˜๊ธฐ
            • Item 13 ํƒ€์ž…๊ณผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์  ์•Œ๊ธฐ
            • Item 14 ํƒ€์ž… ์—ฐ์‚ฐ๊ณผ ์ œ๋„ˆ๋ฆญ ์‚ฌ์šฉ์œผ๋กœ ๋ฐ˜๋ณต ์ค„์ด๊ธฐ
            • Item 15 ๋™์  ๋ฐ์ดํ„ฐ์— ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 16 number ์ธ๋ฑ์Šค ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ณด๋‹ค๋Š” Array, ํŠœํ”Œ, ArrayLike๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 17 ๋ณ€๊ฒฝ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด readonly ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 18 ๋งคํ•‘๋œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๋™๊ธฐํ™”ํ•˜๊ธฐ
          • Ch.3 ํƒ€์ž… ์ถ”๋ก 
            • Item 19 ์ถ”๋ก  ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ์žฅํ™ฉํ•œ ์ฝ”๋“œ ๋ฐฉ์ง€ํ•˜๊ธฐ
            • Item 20 ๋‹ค๋ฅธ ํƒ€์ž…์—๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 21 ํƒ€์ž… ๋„“ํžˆ๊ธฐ
            • Item 22 ํƒ€์ž… ์ขํžˆ๊ธฐ
            • Item 23 ํ•œ๊บผ๋ฒˆ์— ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ
            • Item 24 ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ณ„์นญ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 25 ๋น„๋™๊ธฐ ์ฝ”๋“œ์—๋Š” ์ฝœ๋ฐฑ ๋Œ€์‹  async ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 26 ํƒ€์ž… ์ถ”๋ก ์— ๋ฌธ๋งฅ์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ
            • Item 27 ํ•จ์ˆ˜ํ˜• ๊ธฐ๋ฒ•๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํƒ€์ž… ํ๋ฆ„ ์œ ์ง€ํ•˜๊ธฐ
          • Ch.4 ํƒ€์ž… ์„ค๊ณ„
            • Item 28 ์œ ํšจํ•œ ์ƒํƒœ๋งŒ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…์„ ์ง€ํ–ฅํ•˜๊ธฐ
            • Item 29 ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋„ˆ๊ทธ๋Ÿฝ๊ฒŒ, ์ƒ์„ฑํ•  ๋•Œ๋Š” ์—„๊ฒฉํ•˜๊ฒŒ
            • Item 30 ๋ฌธ์„œ์— ํƒ€์ž… ์ •๋ณด๋ฅผ ์“ฐ์ง€ ์•Š๊ธฐ
            • Item 31 ํƒ€์ž… ์ฃผ๋ณ€์— null ๊ฐ’ ๋ฐฐ์น˜ํ•˜๊ธฐ
            • Item 32 ์œ ๋‹ˆ์˜จ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ ๋‹ˆ์˜จ์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 33 string ํƒ€์ž…๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ธ ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 34 ๋ถ€์ •ํ™•ํ•œ ํƒ€์ž…๋ณด๋‹ค๋Š” ๋ฏธ์™„์„ฑ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 35 ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ, API์™€ ๋ช…์„ธ๋ฅผ ๋ณด๊ณ  ํƒ€์ž… ๋งŒ๋“ค๊ธฐ
            • Item 36 ํ•ด๋‹น ๋ถ„์•ผ์˜ ์šฉ์–ด๋กœ ํƒ€์ž… ์ด๋ฆ„ ์ง“๊ธฐ
            • Item 37 ๊ณต์‹ ๋ช…์นญ์—๋Š” ์ƒํ‘œ๋ฅผ ๋ถ™์ด๊ธฐ
          • Ch.5 any ๋‹ค๋ฃจ๊ธฐ
            • Item 38 any ํƒ€์ž…์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ข์€ ๋ฒ”์œ„์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 39 any๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ณ€ํ˜•ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 40 ํ•จ์ˆ˜ ์•ˆ์œผ๋กœ ํƒ€์ž… ๋‹จ์–ธ๋ฌธ ๊ฐ์ถ”๊ธฐ
            • Item 41 any์˜ ์ง„ํ™”๋ฅผ ์ดํ•ดํ•˜๊ธฐ
            • Item 42 ๋ชจ๋ฅด๋Š” ํƒ€์ž…์˜ ๊ฐ’์—๋Š” any ๋Œ€์‹  unknown์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 43 ๋ชฝํ‚ค ํŒจ์น˜๋ณด๋‹ค๋Š” ์•ˆ์ „ํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 44 ํƒ€์ž… ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ถ”์ ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ „์„ฑ ์œ ์ง€ํ•˜๊ธฐ
          • Ch.6 ํƒ€์ž… ์„ ์–ธ๊ณผ @types
            • Item 45 devDependencies์— typescript์™€ @types ์ถ”๊ฐ€ํ•˜๊ธฐ
            • Item 46 ํƒ€์ž… ์„ ์–ธ๊ณผ ๊ด€๋ จ๋œ ์„ธ ๊ฐ€์ง€ ๋ฒ„์ „ ์ดํ•ดํ•˜๊ธฐ
            • Item 47 ๊ณต๊ฐœ API์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ์ต์ŠคํฌํŠธํ•˜๊ธฐ
            • Item 48 API ์ฃผ์„์— TSDoc ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 49 ์ฝœ๋ฐฑ์—์„œ this์— ๋Œ€ํ•œ ํƒ€์ž… ์ œ๊ณตํ•˜๊ธฐ
            • Item 50 ์˜ค๋ฒ„๋กœ๋”ฉ ํƒ€์ž…๋ณด๋‹ค๋Š” ์กฐ๊ฑด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 51 ์˜์กด์„ฑ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฏธ๋Ÿฌ ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 52 ํ…Œ์ŠคํŒ… ํƒ€์ž…์˜ ํ•จ์ •์— ์ฃผ์˜ํ•˜๊ธฐ
          • Ch.7 ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ
            • Item 53 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ๋ณด๋‹ค๋Š” ECMAScript ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 54 ๊ฐ์ฒด๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋…ธํ•˜์šฐ
            • Item 55 DOM ๊ณ„์ธต ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ
            • Item 56 ์ •๋ณด๋ฅผ ๊ฐ์ถ”๋Š” ๋ชฉ์ ์œผ๋กœ private ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ
            • Item 57 ์†Œ์Šค๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋””๋ฒ„๊น…ํ•˜๊ธฐ
          • Ch.8 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ
            • Item 58 ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•˜๊ธฐ
            • Item 59 ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๋„์ž… ์ „์— @ts-check์™€ JSDoc์œผ๋กœ ์‹œํ—˜ํ•ด ๋ณด๊ธฐ
            • Item 60 allowJS๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ
            • Item 61 ์˜์กด์„ฑ ๊ด€๊ณ„์— ๋”ฐ๋ผ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์ „ํ™˜ํ•˜๊ธฐ
            • Item 62 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ์™„์„ฑ์„ ์œ„ํ•ด noImplicitAny ์„ค์ •ํ•˜๊ธฐ
        • Dive Into Design Patterns
          • ๋””์ž์ธ ํŒจํ„ด ์†Œ๊ฐœ
          • ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ์›์น™๋“ค
          • ๋””์ž์ธ ํŒจํ„ด ๋ชฉ๋ก
          • ์œ ์šฉํ•œ ๋งํฌ
        • ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ (System Design Interview)
          • Key Points
          • Real Life Systems
          • Engineering Blogs
        • Node.js ๋””์ž์ธ ํŒจํ„ด ๋ฐ”์ด๋ธ” (Node.js Design Patterns 3rd Edition)
        • ๋ฆฌํŒฉํ„ฐ๋ง 2ํŒ (Refactoring: 2nd Ed.)
          • 1์žฅ ๋ฆฌํŒฉํ„ฐ๋ง: ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ
          • 2์žฅ ๋ฆฌํŒฉํ„ฐ๋ง ์›์น™
          • 3์žฅ ์ฝ”๋“œ์—์„œ ๋‚˜๋Š” ์•…์ทจ
          • 4์žฅ ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•ํ•˜๊ธฐ
Powered by GitBook
On this page
  • Spring Batch Flow
  • Spring Batch ์ •๋ฆฌ
  • SpEL (Spring Expression Language)
  • Spring Batch
  • ๋ฐฐ์น˜ ๊ด€๋ จ ๊ฐ์ฒด ๊ด€๊ณ„๋„
  • ์ง€์—ฐ ์ƒ์„ฑ (Lazy Initialization)
  • Flow ์ œ์–ด
  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Step ์‹คํ–‰ํ•˜๊ธฐ
  • REF

Was this helpful?

Edit on GitHub
  1. Archives
  2. Learning
  3. Languages
  4. Spring

Spring Batch

PreviousGoogle OAuth SetupNextBulk Insert

Last updated 9 months ago

Was this helpful?

Spring Batch Flow

  • Job > Step > Task ๊ตฌ์กฐ

    • Job์€ Step์„ ๊ฐ–๊ณ  ์žˆ๊ณ , Step์€ Tasklet ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ ์ž‘์—…์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

    • Task๋Š” ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ์ž ์ •์˜ ํ˜•์‹๊ณผ read/process/write (RPW) ํ˜•์‹์ด ์กด์žฌํ•œ๋‹ค.

Spring Batch Metadata

Spring Batch๋Š” DB๋ฅผ ํ†ตํ•ด ์™„๋ฃŒ/์‹คํŒจ ๋“ฑ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค. ํฌ๊ฒŒ 4๊ฐ€์ง€์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค.

  1. ์ด์ „ ์‹คํ–‰ job history

  2. ์‹คํŒจํ•œ batch์™€ parameter / ์„ฑ๊ณตํ•œ job

  3. ์‹คํ–‰ ์žฌ๊ฐœ ์ง€์ 

  4. Job ๊ธฐ์ค€ step ํ˜„ํ™ฉ๊ณผ ์„ฑ๊ณต / ์‹คํŒจ ์—ฌ๋ถ€

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ…Œ์ด๋ธ”์ด DB์— ์ƒ์„ฑ๋˜๋Š”๋ฐ, H2 DB ์‚ฌ์šฉ์‹œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋‚˜ ๊ทธ์™ธ DB๋Š” ์ง์ ‘ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. DDL ์ฟผ๋ฆฌ๋Š” org.springframework.batch.core์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

Spring Batch ์ •๋ฆฌ

  • spring-starter-batch dependency ์ถ”๊ฐ€

  • task scheduling ๋Œ€์ฒด๊ฐ€ ์•„๋‹Œ, scheduler์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง

  • ์œ ์ฆˆ ์ผ€์ด์Šค

    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ, ํ๋กœ๋ถ€ํ„ฐ ์ปค๋‹ค๋ž€ ์ˆ˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋“ค์ž„

    • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

    • ์กฐ์ž‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑ

  • ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐฐ์น˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋ฉ”์‹œ์ง€ ์ฃผ๋„์ ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋“ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์‹œ๋‚˜๋ฆฌ์˜ค๋„ ์กด์žฌํ•œ๋‹ค.

  • ์Šคํ”„๋ง ๋ฐฐ์น˜ ๊ณ„์ธต ๊ตฌ์กฐ (Spring Batch Layered Architecture)

  • Application์€ ๋ชจ๋“  ๋ฐฐ์น˜ ์ž‘์—…๊ณผ ์Šคํ”„๋ง ๋ฐฐ์น˜๋กœ ์ž‘์„ฑํ•œ ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

  • Batch Core๋Š” ๋ฐฐ์น˜ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ๋Ÿฐํƒ€์ž„ ํด๋ž˜์Šค๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. JobLauncher, Job, Step์˜ ๊ตฌํ˜„์ฒด๋ฅผ ํฌํ•จํ•œ๋‹ค.

  • Application๊ณผ Core ๋‘˜ ๋‹ค ๋™์ผํ•œ infrastructure ์œ„์—์„œ ์ž‘๋™ํ•œ๋‹ค. Infrastructure์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต reader (์˜ˆ๋ฅผ ๋“ค๋ฉด ItemReader)์™€ writer (์˜ˆ๋ฅผ ๋“ค๋ฉด ItemWriter), service (์˜ˆ๋ฅผ ๋“ค์–ด RetryTemplate)๋ฅผ ํฌํ•จํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”์–ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํฌํ•จํ•œ๋‹ค. (์ฝ”์–ด ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.)

  • ๊ฐ€์ด๋“œ๋ผ์ธ

    • ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์น˜์™€ ๊ฐ€๊นŒ์ด ๋‘์ž. ์ฆ‰, ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊นŒ์ด ๋‘์ž” ๋œป.

    • I/O๋ฅผ ์ค„์ด๊ณ  ๋‚ด์žฅ ๋ฉ”๋ชจ๋ฆฌ ์œ„์—์„œ ์ž‘์—…์„ ๋งŽ์ด ํ•˜์ž.

    • ๋ชจ๋“  ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด์„œ ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ๋ง๊ณ  ํ•œ๋ฒˆ์— ์ฝ๊ณ  ์บ์‹œ๋ฅผ ํ•ด๋‘๋˜์ง€ ์ž‘์—… ์ค‘์ธ ์ €์žฅ์†Œ์— ๋ณด๊ด€ํ•ด๋‘์ž.

    • ๊ฐ™์€ ๋ฐฐ์น˜ ์ž‘์—…์„ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•˜์ง€ ๋ง์ž.

    • ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์žฌํ• ๋‹น์— ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ์• ์ดˆ์— ๋ฐฐ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๋‹นํžˆ ํ• ๋‹นํ•ด๋‘์ž.

SpEL (Spring Expression Language)

SpEL (Spring Expression Language) ์€ ๋Ÿฐํƒ€์ž„์—์„œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ(query)์™€ ์กฐ์ž‘(manipulation)์„ ์ง€์›ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ํ‘œํ˜„ ์–ธ์–ด์ด๋‹ค.

SpEL ํ‘œํ˜„์‹์€ # ๊ธฐํ˜ธ๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•œ๋‹ค. #{ํ‘œํ˜„์‹}

์†์„ฑ ๊ฐ’์„ ์ฐธ์กฐํ•  ๋•Œ๋Š” $ ๊ธฐํ˜ธ์™€ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•œ๋‹ค. ${property.name}

Spring Batch

๋ฐฐ์น˜์˜ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ฝ๊ธฐ - ์ฒ˜๋ฆฌ - ์“ฐ๊ธฐ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

๋ฐฐ์น˜ ๊ด€๋ จ ๊ฐ์ฒด ๊ด€๊ณ„๋„

Job๊ณผ Step์€ 1:M, Step๊ณผ ItemReader, ItemProcessor, ItemWriter๋Š” 1:1 ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š”๋‹ค.

Job์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ํฐ ์ผ๊ฐ(Job)์— ์—ฌ๋Ÿฌ ๋‹จ๊ณ„(Step)๋ฅผ ๋‘๊ณ , ๊ฐ ๋‹จ๊ณ„๋ฅผ ๋ฐฐ์น˜์˜ ๊ธฐ๋ณธ ํ๋ฆ„๋Œ€๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

Job

Job ์€ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋งŒ๋“ค์–ด ํ‘œํ˜„ํ•œ ๊ฐ์ฒด์ด๋‹ค. ์ „์ฒด ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ์žˆ์–ด ํ•ญ์ƒ ์ตœ์ƒ๋‹จ ๊ณ„์ธต์— ์žˆ๋‹ค. Job ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ Step ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋‹ค.

Job ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋นŒ๋”๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ๋‹ค. JobBuilderFactory๋กœ ์›ํ•˜๋Š” Job์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. JobBuilderFactory์˜ get() ๋ฉ”์„œ๋“œ๋กœ JobBuilder๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์‘์šฉํ•˜๋ฉด ๋œ๋‹ค. org.springframework.batch.core.Configuration.annotation.JobBuilderFactory์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ์ด๋‹ค. (๊ธธ๋‹ค ๊ธธ์–ด!)

// org.springframework.batch.core.Configuration.annotation.JobBuilderFactory
public class JobBuilderFactory {
	private JobRepository jobRepository;

	public JobBuilderFactory(JobRepository jobRepository) {
			this.jobRepository = jobRepository;
	}

	public JobBuilder get(String name) {
			JobBuilder builder = new JobBuilder(name).repository(jobRepository);
			return builder;
	}
}

get() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด JobBuilder ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค๋ฒˆ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค JobBuilderFactory ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ฃผ์ž…๋ฐ›์€ JobRepository ๋ฅผ ์‚ฌ์šฉํ•  repository๋กœ ์„ค์ •ํ•œ๋‹ค. ์ฆ‰, ํ•ด๋‹น JobBuilderFactory ์—์„œ ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  JobBuilder ๊ฐ€ ๋™์ผํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜๋Š” JobBuilder ์ฝ”๋“œ ์ผ๋ถ€์ด๋‹ค.

// org.springframework.batch.core.job.builder.JobBuilder

// ...

public SimpleJobBuilder start(Step step) {
	return new SimpleJobBuilder(this).start(step);
}

public JobFlowBuilder start(Flow flow) {
	return new JobFlowBuilder(this).start(flow);
}

public JobFlowBuilder flow(Step step) {
	return new JobFlowBuilder(this).start(step);
}

// ...

๊ณตํ†ต์ ์€ ๋ชจ๋‘ ๋นŒ๋”๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. JobBuilder์€ Job์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ณ„๋„์˜ ๊ตฌ์ฒด์ ์ธ ๋นŒ๋”๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋นŒ๋”๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ๋” ํ•˜๋Š” ์ด์œ ๋Š”, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ Job ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋นŒ๋”๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด Job ์ƒ์„ฑ์ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ํ•˜๋Š” ์˜๋„๋กœ ํŒŒ์•…๋œ๋‹ค.

๋นŒ๋”๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถˆํŽธํ•ด๋ณด์ด์ง€๋งŒ, ๋ฉ”์„œ๋“œ ์ฒด์ธ ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด ๊ตฌ์ฒด์ ์ธ ๋นŒ๋”์˜ ์กด์žฌ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š์•„๋„ ๋  ๋งŒํผ ์†์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด Job์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ Step ๋˜๋Š” Flow๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ๊ตฌ์ฒด์ ์ธ ๋นŒ๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค. Job์€ Step ๋˜๋Š” Flow ์ธ์Šคํ„ด์Šค์˜ ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

๋‹ค์Œ์€ Job ์ƒ์„ฑ ์˜ˆ์ œ ์ฝ”๋“œ์ด๋‹ค.

@Autowired
private JobBuilderFactory jobBuilderFactory;

@Bean
public Job simpleJob() {
    return jobBuilderFactory.get("simpleJob")  // 'simpleJob' ์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ Job์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” `JobBuilder` ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜
                .start(simpleStep())  // `simpleStep()`์€ ๊ฐ„๋‹จํ•œ `Step` ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ผ ๊ฐ€์ •ํ•œ๋‹ค. `start()` ๋ฉ”์„œ๋“œ๋กœ ์ธํ•ด ์ƒ์„ฑ๋˜๋Š” ๋นŒ๋”๋Š” `SimpleJobBuilder`
                .build();  // 'simpleJob'์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ `Job`์ด ์ƒ์„ฑ๋˜์–ด ๋ฐ˜ํ™˜
}

JobInstance

JobInstance ๋Š” ๋ฐฐ์น˜์—์„œ Job ์ด ์‹คํ–‰๋  ๋•Œ ํ•˜๋‚˜์˜ Job ์‹คํ–‰ ๋‹จ์œ„์ด๋‹ค. ๋งŒ์•ฝ ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ์”ฉ ๋ฐฐ์น˜์˜ Job ์ด ์‹คํ–‰๋œ๋‹ค๋ฉด, ์–ด์ œ์™€ ์˜ค๋Š˜ ์‹คํ–‰ํ•œ ๊ฐ๊ฐ์˜ Job์„ JobInstance ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ๊ฐ์˜ JobInstance ๋Š” ํ•˜๋‚˜์˜ JobExecution (JobInstance์— ๋Œ€ํ•œ ํ•œ ๋ฒˆ์˜ ์‹คํ–‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด)์„ ๊ฐ–๊ณ  ์žˆ์„๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

์˜ค๋Š˜ Job์„ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์‹คํŒจํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ๋‚  ๋™์ผํ•œ JobInstance ๋ฅผ ๊ฐ€์ง€๊ณ  ๋˜ ์‹คํ–‰ํ•œ๋‹ค. Job ์‹คํ–‰์ด ์‹คํŒจํ•˜๋ฉด JobInstance ๊ฐ€ ๋๋‚œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด JobInstance ๋Š” ์–ด์ œ์˜ ์‹คํŒจํ•œ JobExecution ๊ณผ ์˜ค๋Š˜ ์„ฑ๊ณตํ•œ JobExecution ๋‘ ๊ฐœ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์ฆ‰, JobExecution์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

JobExecution

JobExecution ์€ JobInstance์— ๋Œ€ํ•œ ํ•œ ๋ฒˆ์˜ ์‹คํ–‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์„ค๋ช…ํ•˜์ž๋ฉด, ๋งŒ์•ฝ ์˜ค๋Š˜์˜ Job์ด ์‹คํŒจํ•ด ๋‚ด์ผ ๋‹ค์‹œ ๋™์ผํ•œ Job ์„ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋Š˜, ๋‚ด์ผ์˜ ์‹คํ–‰ ๋ชจ๋‘ ๊ฐ™์€ JobInstance ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๋‹จ, ์˜ค๋Š˜, ๋‚ด์ผ์˜ ์‹คํ–‰์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ JobExecution ์„ ์ƒ์„ฑํ•œ๋‹ค.

JobExecution ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๋ฉด Job ์‹คํ–‰์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. JobExecution ์€ JobInstance, ๋ฐฐ์น˜ ์‹คํ–‰ ์ƒํƒœ, ์‹œ์ž‘ ์‹œ๊ฐ„, ๋๋‚œ ์‹œ๊ฐ„, ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ ๋ฉ”์‹œ์ง€ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

๋‹ค์Œ์€ JobExecution ๋‚ด๋ถ€์˜ ์ฝ”๋“œ์ด๋‹ค.

// org.springframework.batch.core.JobExecution
public class JobExecution extends Entity {

	private final JobParameters jobParameters;
	private JobInstance jobInstance;
	private volatile Collection<StepExecution> stepExecutions = Collections.synchronizedSet(new LinkedHashSet<>());
	private volatile BatchStatus status = BatchStatus.STARTING;
	private volatile Date startTime = null;
	private volatile Date createTime = new Date(System.currentTimeMillis());
	private volatile Date endTime = null;
	private volatile Date lastUpdated = null;
	private volatile ExitStatus exitStatus = ExitStatus.UNKNOWN;
	private volatile ExecutionContext executionContext = new ExecutionContext();
	private transient volatile List<Throwable> failureExceptions = new CopyOnWriteArrayList<>();
	private final String jobConfigurationName;

		// ...
}
  • jobParameters : Job ์‹คํ–‰์— ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ.

  • jobInstance : Job ์‹คํ–‰์˜ ๋‹จ์œ„๊ฐ€ ๋˜๋Š” ๊ฐ์ฒด.

  • stepExecutions : StepExecution์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” Collection ํƒ€์ž….

  • status : Job์˜ ์‹คํ–‰ ์ƒํƒœ. (COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED, UNKNOWN ๋“ฑ์ด ์žˆ๋‹ค. default๋Š” STARTING)

  • startTime : Job ์ด ์‹คํ–‰๋œ ์‹œ๊ฐ„. null ์ด๋ฉด ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป.

  • createTime : JobExecution ์ด ์ƒ์„ฑ๋œ ์‹œ๊ฐ„.

  • endTime : JobExecution์ด ๋๋‚œ ์‹œ๊ฐ„.

  • lastUpdated : ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •๋œ ์‹œ๊ฐ„.

  • exitStatus : Job ์‹คํ–‰ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ƒํƒœ. (UNKNOWN, EXECUTING, COMPLETED, NOOP, FAILED, STOPPED ๋“ฑ์ด ์žˆ๋‹ค. default๋Š” UNKNOWN)

  • executionContext : Job ์‹คํ–‰ ์‚ฌ์ด์— ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

  • failureExceptions : Job ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ List ์— ๋„ฃ์–ด๋‘”๋‹ค.

  • jobConfigurationName : Job ์„ค์ • ์ด๋ฆ„.

JobParameters

JobParameters ๋Š” Job ์ด ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ Map ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

JobParameters ๋Š” JobInstance ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ธฐ์ค€์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Job ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์‹œ์ž‘ ์‹œ๊ฐ„ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•ด์„œ ํ•˜๋‚˜์˜ JobInstance ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ฆ‰, JobInstance์™€ JobParameters ๋Š” 1:1 ๊ด€๊ณ„์ด๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์œผ๋กœ๋Š” String , Long , Date , Double ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Step

Step์€ ์‹ค์งˆ์ ์ธ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์ด๋‹ค. Job ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ค์งˆ์ ์ธ ๋‹จ์œ„๋กœ ์“ฐ์ธ๋‹ค.

๋ชจ๋“  Job ์—๋Š” 1๊ฐœ ์ด์ƒ์˜ Step์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

StepExecution

Job ์— JobExecution ์ด๋ผ๋Š” Job ์‹คํ–‰ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด, Step์—๋Š” StepExecution ์ด๋ผ๋Š” Step ์‹คํ–‰ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ Step ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค StepExecution ์ด ์ƒ์„ฑ๋œ๋‹ค.

๋‹ค์Œ์€ StepExecution ํด๋ž˜์Šค์ด๋‹ค.

public class StepExecution extends Entity {

	private final JobExecution jobExecution;
	private final String stepName;
	private volatile BatchStatus status = BatchStatus.STARTING;
	private volatile long readCount = 0;
	private volatile long writeCount = 0;
	private volatile long commitCount = 0;
	private volatile long rollbackCount = 0;
	private volatile long readSkipCount = 0;
	private volatile long processSkipCount = 0;
	private volatile long writeSkipCount = 0;
	private volatile Date startTime = null;
	private volatile Date createTime = new Date(System.currentTimeMillis());
	private volatile Date endTime = null;
	private volatile Date lastUpdated = null;
	private volatile ExecutionContext executionContext = new ExecutionContext();
	private volatile ExitStatus exitStatus = ExitStatus.EXECUTING;
	private volatile boolean terminateOnly;
	private volatile long filterCount;
	private transient volatile List<Throwable> failureExceptions = new CopyOnWriteArrayList<>();

	// ...
}
  • jobExecution : ํ˜„์žฌ์˜ JobExecution ์ •๋ณด.

  • stepName : Step์˜ ์ด๋ฆ„.

  • status : Step ์˜ ์‹คํ–‰ ์ƒํƒœ. (COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED, UNKNOWN ๋“ฑ์ด ์žˆ๋‹ค. default๋Š” STARTING.)

  • readCount : ์„ฑ๊ณต์ ์œผ๋กœ ์ฝ์€ ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • writeCount : ์„ฑ๊ณต์ ์œผ๋กœ ์“ด ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • commitCount : Step์˜ ์‹คํ–‰์— ๋Œ€ํ•ด ์ปค๋ฐ‹๋œ ํŠธ๋žœ์žญ์…˜ ์ˆ˜.

  • rollbackCount : Step์˜ ์‹คํ–‰์— ๋Œ€ํ•ด ๋กค๋ฐฑ๋œ ํŠธ๋žœ์žญ์…˜ ์ˆ˜.

  • readSkipCount : ์ฝ๊ธฐ์— ์‹คํŒจํ•ด ๊ฑด๋„ˆ๋›ด ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • processSkipCount : ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํŒจํ•ด ๊ฑด๋„ˆ๋›ด ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • writeSkipCount : ์“ฐ๊ธฐ์— ์‹คํŒจํ•ด ๊ฑด๋„ˆ๋›ด ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • startTime : Step์ด ์‹คํ–‰๋œ ์‹œ๊ฐ„. null์ด๋ฉด ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป.

  • endTime : Step์˜ ์‹คํ–‰ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ๊ด€๋ จ ์—†์ด Step์ด ๋๋‚œ ์‹œ๊ฐ„.

  • lastUpdated : ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •๋œ ์‹œ๊ฐ„.

  • executionContext : Step ์‹คํ–‰ ์‚ฌ์ด์— ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

  • exitStatus : Step ์‹คํ–‰ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ƒํƒœ. (UNKNOWN, EXECUTING, COMPLETED, NOOP, FAILED, STOPPED ๋“ฑ์ด ์žˆ๋‹ค. default๋Š” UNKNOWN.)

  • terminateOnly : Job ์‹คํ–‰ ์ค‘์ง€ ์—ฌ๋ถ€.

  • filterCount : ์‹คํ–‰์—์„œ ํ•„ํ„ฐ๋ง๋œ ๋ ˆ์ฝ”๋“œ ์ˆ˜.

  • failureExceptions : Step ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ List ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

JobRepository

JobRepository ๋Š” ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์–ด๋–ค Job์ด ์‹คํ–‰๋˜์—ˆ์œผ๋ฉฐ, ๋ช‡ ๋ฒˆ ์‹คํ–‰๋˜์—ˆ๊ณ , ์–ธ์ œ ๋๋‚ฌ๋Š”์ง€ ๋“ฑ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Job ํ•˜๋‚˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด JobRepository ์—์„œ๋Š” ๋ฐฐ์น˜ ์‹คํ–‰์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋„๋ฉ”์ธ์ธ JobExecution ์„ ์ƒ์„ฑํ•œ๋‹ค.

JobRepository ๋Š” Step ์˜ ์‹คํ–‰ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” StepExecution ๋„ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋ฉฐ, ์ „์ฒด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

JobLauncher

JobLauncher ๋Š” Job , JobParameters ์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” run() ํ•˜๋‚˜์ด๋‹ค.

// org.springframework.batch.core.launch.JobLauncher
public interface JobLauncher {
	public JobExecution run(Job job, JobParameters jobParameters) throws ...
}

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Job๊ณผ JobParameters๋ฅผ ๋ฐ›์•„ JobExecution์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ด์ „๊ณผ ๋™์ผํ•˜๋ฉด์„œ ์ด์ „์— JobExecution์ด ์ค‘๋‹จ๋œ ์  ์žˆ๋‹ค๋ฉด ๋™์ผํ•œ JobExecution์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ItemReader

ItemReader๋Š” Step์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ํŒŒ์ผ, XML, CSV, DB ๋“ฑ ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

// org.springframework.batch.item.ItemReader
public interface ItemReader<T> {
	T read() throws Exception, UnexpectedException, ParseException, NonTransientResourceException;
}

ItemReader ์—์„œ read() ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ œ๋„ค๋ฆญ <T> ์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ์—์„œ ์ฝ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค!

ItemProcessor

ItemProcessor ๋Š” ItemReader ๋กœ ์ฝ์–ด์˜จ ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๊ตณ์ด ItemWriter๊ฐ€ ์•„๋‹ˆ๋ผ ItemProcessor๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€๋‹ค.

  1. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๊ฐ๊ฐ ์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ํ•ด ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค.

  2. Input์˜ ํƒ€์ž…๊ณผ Output์˜ ํƒ€์ž…์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. Input๊ณผ Output์˜ ํƒ€์ž…์ด ItemProcesor์˜ ์ œ๋„ค๋ฆญ <I, O>์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋‹ˆ ๋” ์ง๊ด€์ ์ด๋‹ค.

// org.springframework.batch.item.ItemProcesor
public interface ItemProcessor<I, O> {
	O process(I item) throws Exception;
}

ItemWriter

ItemWriter ๋Š” ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ DB ๋˜๋Š” ํŒŒ์ผ์— ์ €์žฅํ•œ๋‹ค.

์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ์—์„œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ ์“ฐ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

// org.springframework.batch.item.ItemWriter
public interface ItemWriter<T> {
	void write(List<? extends T> items) throws Exception;
}

ItemWriter์€ ItemReader์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

write() ๋ฉ”์„œ๋“œ๋Š” List ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด ์ง€์ •ํ•œ ํƒ€์ž…์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ ์ˆ˜๋Š” ์„ค์ •ํ•œ ์ฒญํฌ (chunk) ๋‹จ์œ„๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

write() ๋ฉ”์„œ๋“œ๋Š” void ํ•จ์ˆ˜๋ผ์„œ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋”ฐ๋กœ ์—†๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋กœ์ง๋งŒ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

์ง€์—ฐ ์ƒ์„ฑ (Lazy Initialization)

  • ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ ๋ฐฉ๋ฒ•.

  • ์ง€์—ฐ ์ดˆ๊ธฐํ™”: ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋กœ๋”ฉ์„ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋‚ญ๋น„๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฆ‰, ๊ฐœ์ฒด๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ๊นŒ์ง€ ์ƒ์„ฑ์„ ์ง€์—ฐ์‹œํ‚จ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. Lazy Loading โ†” Eager Loading

  • ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์‹œ์ ์— ํ•˜์ง€ ์•Š๊ณ  ์ฒ˜์Œ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์ ์— ํ•˜๋Š”๊ฒƒ

  • e.g., ์Šคํ”„๋ง์—์„œ ๊ธฐ๋ณธ ๋นˆ ์ƒ์„ฑ์€ ์‹ฑ๊ธ€ํ„ด์ธ๋ฐ, Spring Batch๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ @StepScope๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” Step์˜ ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ๋นˆ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ฆ‰, Step์˜ ์‹คํ–‰๋งˆ๋‹ค ์ƒˆ๋กœ ๋นˆ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ฐ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. โ€” ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ 2, p261

์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ (chunk oriented processing)

**์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ (chunk oriented processing)**์ด๋ž€ ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„ ๋‚ด์—์„œ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.

**์ฒญํฌ(chunk)**๋ž€ ์•„์ดํ…œ์ด ํŠธ๋žœ์žญ์…˜์—์„œ ์ปค๋ฐ‹๋˜๋Š” ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค.

readํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ์ง€์ •ํ•œ ์ฒญํฌ ๋‹จ์œ„(CHUNK_SIZE)์™€ ์ผ์น˜ํ•˜๋ฉด, write๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค.

์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ์˜ ์ด์ ์€?

์ฒญํฌ๋กœ ๋‚˜๋ˆ„์ง€ ์•Š์•˜์„ ๋•Œ๋Š” 1000๊ฐœ ์ค‘ ํ•˜๋‚˜๋งŒ ์‹คํŒจํ•ด๋„ ๋‚˜๋จธ์ง€ 999๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กค๋ฐฑ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ฒญํฌ ๋‹จ์œ„๋ฅผ 10์œผ๋กœ ํ•ด์„œ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ๋„์ค‘์— ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ฒญํฌ๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์Šคํ”„๋ง ๋ฐฐ์น˜์—์„œ๋Š” ์ฒญํฌ ๋‹จ์œ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•œ๋‹ค.

์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ์ด ์•„๋‹Œ ๋ฐฉ์‹ โ€” Tasklet

์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ์ด ์•„๋‹Œ ๋ฐฉ์‹์€ Tasklet์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Tasklet์€ ์ž„์˜์˜ Step์„ ์‹คํ–‰ํ•  ๋•Œ ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ฝ๊ธฐ, ์ฒ˜๋ฆฌ, ์“ฐ๊ธฐ๋กœ ๋‚˜๋‰œ ๋ฐฉ์‹์ด ์ฒญํฌ ์ง€ํ–ฅ ํ”„๋กœ์„ธ์‹ฑ์ด๋ผ๋ฉด, ์ด๋ฅผ ๋‹จ์ผ ๊ฐœ๋…์œผ๋กœ ๋งŒ๋“  ๊ฒƒ์ด Tasklet์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

Tasklet ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด๋ถ€์— execute() ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋งŒ ์ง€์›ํ•œ๋‹ค. ๋‚ด๋ถ€์— ์›ํ•˜๋Š” ๋‹จ์ผ ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ž‘์—…์ด ๋๋‚˜๋ฉด RepeatStatus.FINISHED๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ž‘์—…์ด ๊ณ„์†๋œ๋‹ค๋ฉด RepeatStatus.CONTINUABLE์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Flow ์ œ์–ด

์ฝ๊ธฐ-์ฒ˜๋ฆฌ-์“ฐ๊ธฐ ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์„ธ๋ถ€์ ์ธ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜, ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ Step์˜ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์Šคํ”„๋ง ๋ฐฐ์น˜์—์„œ ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” Flow์ด๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Step ์‹คํ–‰ํ•˜๊ธฐ

๋ณดํ†ต ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋‹น ์Šค๋ ˆ๋“œ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด์ง€๋งŒ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ Step์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฐฐ์น˜๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ Step์„ ์‹คํ–‰ํ•˜๋Š” ์—ฌ๋Ÿฌ ์ „๋žต์„ ์ œ๊ณตํ•œ๋‹ค.

  1. TaskExecutor ๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ Step ๋™์ž‘์‹œํ‚ค๊ธฐ

  2. ์—ฌ๋Ÿฌ ๊ฐœ์˜ Flow ์‹คํ–‰์‹œํ‚ค๊ธฐ

  3. ํŒŒํ‹ฐ์…”๋‹์„ ์ด์šฉํ•œ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

REF

๊ทธ ์™ธ ์ฝ์–ด๋ณด๋ฉด ์ข‹์€ ๊ธ€์„ ๋ชจ์•„๋ณธ๋‹ค.

[Spring] 1. Spring Batch์˜ ๊ธฐ๋ณธ ๊ฐœ๋…
[Spring] 1. Spring Batch์˜ ๊ธฐ๋ณธ ๊ฐœ๋…
Spring Expression Language(SpEL) ์— ๋Œ€ํ•ด
Spring Batch์™€ Querydsl | ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
์Šคํ”„๋ง ๋ฐฐ์น˜ ๊ณ„์ธต ๊ตฌ์กฐ (Spring Batch Layered Architecture)
๋ฐฐ์น˜ ๊ด€๋ จ ๊ฐ์ฒด ๊ด€๊ณ„๋„