Programming/Spring

Spring Bean / IoC Container / DI

osean 2023. 1. 21. 09:55

  • Spring Bean
  • Spring IoC Container
  • Dependency Injection (DI)
    • Constructor Injection
    • Method Injection
    • Setter Injectio

Spring Bean ์œผ๋กœ ๋“ฑ๋ก๋œ ํด๋ž˜์Šค๋Š” IoC Contrainer ์— ์˜ํ•ด ์ƒ์„ฑ๋œ Singleton ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, Bean ์œผ๋กœ ๋“ฑ๋ก๋œ ํด๋ž˜์Šค๋งŒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์ด ์ฃผ์ž…(Dependency Injection)๋˜์–ด ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.

Register Bean

  • @Bean
    • @Bean ์€ @Configuration ์ด ๋ถ™์€ DI ์„ค์ •์šฉ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด Bean Object ์˜ ์ƒ์„ฑ๊ณผ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
@Configuration
class DataSourceConfig {
    @Bean
	fun dataSource(): DataSource {
        val dataSource = SimpleDriverDataSource()

        dataSource.setDriverClass(Driver::class.java)
        dataSource.url = "jdbc:mysql://localhost/springbook?characterEncoding=UTF-8"
        dataSource.username = "user"
        dataSource.password = "password"

        return dataSource
    }
}
  • @Autowired
    • Spring Framework ๋Š” @Autowired ๊ฐ€ ๋ถ™์€ ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ(Setter) ๊ฐ€ ์žˆ์œผ๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ๋ณด๊ณ  ์ฃผ์ž… ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์˜ Bean ์„ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฃผ์ž…ํ•œ๋‹ค.
    • ์ด๊ฐ™์€ @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์–ด DI ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํžˆ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, Bean ์„ค์ • ์ •๋ณด๋ฅผ ๋ณด๊ณ  ๋‹ค๋ฅธ ๋นˆ๊ณผ์˜ ์˜์กด ๊ด€๊ณ„๊ฐ€ ์–ด๋–ค์ง€ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
    • ๋‹จ, ์˜์กด ๊ฐ์ฒด์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ ๊ตฌํ˜„์ฒด ๋ณ„๋กœ ๋‹ค๋ฅธ Bean ์ด๋ฆ„์„ ์„ค์ •ํ•˜์—ฌ ์ตœ์ข… ํ›„๋ณด๋ฅผ ์„ ํƒํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
      • @Component("AComponentImpl") ์™€ ๊ฐ™์ด Bean ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.
// ProductServiceConfig
@Configuration
class ProductServiceConfig(
  	@Autowired
	private val productRepository: ProductRepository
) {
	@Bean
	fun productService(): ProductService = ProductService(productRepository)
}

// ProductRepositoryConfig
@Configuration
class ProductRepositoryConfig() {
	@Bean
	fun productRepository(): ProductRepository = ProductRepository()
}
  • @Component
    • ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์€ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ Bean Scanner ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ Bean ๊ฐ์ฒด๋กœ ๋“ฑ๋ก๋œ๋‹ค.
    • @Componenet ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด Bean ์œผ๋กœ ๋“ฑ๋กํ•˜๋ ค๋ฉด @ComponentScan ๊ณผ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ๋ฒ”์œ„๊นŒ์ง€ ์Šค์บ”ํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
      • @ComponentScan @Component ๋ฐ ํ•˜์œ„ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์–ด๋А ๋ฒ”์œ„๊นŒ์ง€ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์„์ง€ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉฐ ์„ค์ • ๊ฐ€๋Šฅํ•œ ํŒจํ‚ค์ง€๋Š” ๋‹ค์ค‘ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 
    • @Controller, @Service, @Repository ๋“ฑ
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Component
annotation class WebAdapter(
    @get:AliasFor(annotation = Component::class)
    val value: String = ""
)

Spring IoC Container() ๋Š” DI(Dependency Injection) ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ Spring Container ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์นœ๋‹ค.

ApplicationContext ๋Š” Spring IoC Container ์˜ Bean ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šคํ™”, ๊ตฌ์„ฑ ๋ฐ ์กฐ๋ฆฝ ๋“ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ์—ญํ• ์ด๋‹ค. ์ด๋กœ ์ธํ•ด ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฅผ ํ†ตํ•ด Bean ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์„ค์ •์„ ์ฝ์–ด ๋“ค์ธ๋‹ค. ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” XML ์ด๋‚˜ Java Annotation, Java Code ๋“ฑ์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

Spring Framework ๋Š” ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ClassPathxmlApplicationContext, FileSystemXmlApplicationContext ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ๊ธฐ์กด์—๋Š” XML ์„ ํ†ตํ•ด ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ ํ–ˆ์œผ๋‚˜ ์ด๋Ÿฌํ•œ ํ˜•์‹์„ Java Annotation ์ด๋‚˜ Code ๋ฅผ ์ด์šฉํ•ด ์„ ์–ธ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปจํ…Œ์ด๋„ˆ์—์„œ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•˜๋‹ค.

Config Metadata Annotation

  • @Import
    • @Configuration์œผ๋กœ ์„ค์ •ํ•œ ํŒŒ์ผ์„ ๋‘ ๊ฐœ ์ด์ƒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
@Import(QueryFactoryConfig::class)
@Configuration
class JpaQueryFactoryConfig {

    @PersistenceContext
    private lateinit var entityManager: EntityManager

    @Bean
    fun queryFactory() = JPAQueryFactory(this.entityManager)
}
  •  @DependsOn
    • ๋นˆ์ด ๋“ฑ๋ก๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
@Component("calculator-2")
@DependsOn(value = ["calculator-1"])
class Calculator(
        var number: Int
)

Dependency Injection(DI)๋Š” Bean ๊ฐ์ฒด์—์„œ ํ•„์š”ํ•œ ์™ธ๋ถ€์˜ Bean ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ด๋‹ค. ์ด๋Ÿฌํ•œ DI ์›์น™์— ์˜ํ•ด ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด๋ฉฐ, ๊ฐ์ฒด ๊ฐ„ ์ข…์†์„ฑ์— ๋Œ€ํ•œ Decoupling ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์˜์กด์ด ํ•„์š”ํ•œ Bean ๊ฐ์ฒด๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋Š” Bean ๊ฐ์ฒด์˜ ์œ„์น˜๋‚˜ ๊ตฌํ˜„์ฒด๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ฃผ์ž… ๋ฐ›์Œ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ ์ง„ํ–‰์ด ์šฉ์ดํ•ด์ง€๋„๋ก ํ•˜๋ฉฐ ์œ ์—ฐํ•œ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ DI ๋Š” ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™์˜ ๊ด€์ ์—์„œ ํ์‡„์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์€ ์ฒ ์ €ํžˆ ํ•ด๋‹น ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

DI ํ™œ์šฉ ๋ฐฉ๋ฒ•

  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ
    • ์˜์กด ๋Œ€์ƒ์˜ ๊ตฌํ˜„์„ ๋ฐ”๊ฟ” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง•์€ ๊ธฐ์กด JDBC ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ JPA ๋‚˜ MyBatis ๋“ฑ์œผ๋กœ ๊ตฌํ˜„์ฒด๋ฅผ ํ†ต์งธ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ๋™์ ์ธ ๋ณ€๊ฒฝ
    • DI ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Ÿฐํƒ€์ž„ ์‹œ ๋™์ ์œผ๋กœ ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์ง€๋งŒ, ํ•œ ๋ฒˆ ์˜์กด์„ฑ์ด ์ฃผ์ž…๋˜๊ณ  ๋‚˜๋ฉด ๊ทธ ํ›„๋กœ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์ •์ ์ธ ๊ด€๊ณ„๋กœ ์˜๊ณค๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ DI ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•˜๋Š” ์ค‘๊ฐ„์— ์˜์กดํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” Dynamic Routing Proxy / Proxy Object ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ์‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํšŒ์›์˜ ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋” ํ•œ๋‹ค.
  • ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    • ๊ธฐ์กด ๊ตฌํ˜„๋œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ๊ทธ๋Œ€๋กœ ๋‘”์ฑ„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์˜ˆ์‹œ๋กœ Decorator ํŒจํ„ด์ด ์žˆ๋‹ค. ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋„๋ก ํ•˜๊ณ , ์‹ค์ œ ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ๋Š” DI ๋ฅผ ์ ์šฉํ•˜๋„๋ก ํ•˜๋ฉด Decorator ํŒจํ„ด์„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ
    • Proxy
      • ํ•„์š”ํ•œ ์‹œ์ ์—์„œ ์‹ค์ œ ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ์ค€๋น„ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” Lazy Loading ์ ์šฉ ์‹œ Proxy ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋„๋ก ํ•œ๋‹ค.
    • Template / Callback
      • ๋ฐ˜๋ณต์ ์œผ๋กœ ๋“ฑ์žฅํ•˜์ง€๋งŒ ํ•ญ์ƒ ๊ณ ์ •์ ์ธ ์ž‘์—… ํ๋ฆ„๊ณผ ๊ทธ ์‚ฌ์ด์—์„œ ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•ด์„œ Template ๊ณผ Callbak ์œผ๋กœ ๋งŒ๋“ค์–ด DI ์›๋ฆฌ๋ฅผ ์‘์š”ํ•ด ์ ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž‘์„ฑ๋œ ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • Singleton / Object Scope
      • Spring DI ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Singleton ์œผ๋กœ Bean ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. ์ด ๋•๋ถ„์— IoC Container ๋Š” Bean ์œผ๋กœ ๋“ฑ๋ก๋œ Singleton ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•˜๊ฒŒ ๋˜์–ด ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ํ™œ์šฉํ•ด ์ž์œ ๋กญ๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค.
      • ๋•Œ๋กœ๋Š” Singleton ์ƒ๋ช…์ฃผ๊ธฐ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž„์˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋„ ์žˆ๋‹ค. HTTP ์š”์ฒญ ๋‹น ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฑฐ๋‚˜, HTTP Session ํ•˜๋‚˜ ๋‹น ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒŒ๋” ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Test
      • ์˜์กด ๊ฐ์ฒด๋ฅผ ๋Œ€์‹ ํ•ด์„œ ๋™์ž‘ํ•  Stub / Mock ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. DI ๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์•ˆ์—์„œ ์ˆ˜๋™์œผ๋กœ Mock ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ์‹

  • Constructor Inject
    • ์ƒ์„ฑ์ž ๊ธฐ๋ฐ˜ DI ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ธ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์™€ ๋™๋“ฑํ•˜๋ฉฐ, ์˜์กด ์ธ์ž๋ฅผ ์œ ์‚ฌํ•˜๊ฒŒ ๋‹ค๋ฃฌ๋‹ค.
@RestController
class ProductController(
	private val getProductsUseCase: GetProductsUseCase
)
  • Setter Inject
@RestController
class ProductController(
	lateinit var getProductsUseCase: GetProductUseCase
)
  • Field Inject
@RestController
class ProductController(
    @Autowired
    private val getProductUseCase: GetProductUseCase
)

'Programming > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[QueryDSL] NoSuchMethodError Trouble Shooting  (0) 2023.02.22
Criteria API  (0) 2023.01.28
JPA / Persistence Context / Transactional  (2) 2023.01.14
Spring | Spring Framework ?  (0) 2020.08.02
IntelliJ | Spring MVC + Maven ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ (Oracle)  (0) 2020.07.26