Goal
- Spring Bean
- Spring IoC Container
- Dependency Injection (DI)
- Constructor Injection
- Method Injection
- Setter Injectio
Spring Bean
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
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
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 κ°μ²΄λ₯Ό μ£Όμ ν μ μλ€.
- Proxy
μμ‘΄μ± μ£Όμ λ°©μ
- 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 |