EEALL@ONCE

🌱빈 μ„€μ • 메타 정보 λ³Έλ¬Έ

Spring🌱

🌱빈 μ„€μ • 메타 정보

μ˜¬μ—£μ›μŠ€ 2023. 8. 19. 22:09
728x90

빈의 μ„€μ • 메타 μ •λ³΄λŠ” μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—κ²Œ μ–΄λ–€ 객체λ₯Ό μƒμ„±ν•˜κ³  μ–΄λ–»κ²Œ 쑰립해야 ν•˜λŠ”μ§€μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 

μŠ€ν”„λ§μ—μ„œ λΉˆ μ„€μ • λ©”타 μ •λ³΄λ₯Ό μ œκ³΅ν•˜λŠ” λ°©λ²•μ€ ν¬κ²Œ μ„Έ κ°€μ§€μž…λ‹ˆλ‹€.

1. **XML μ„€μ •**: κ³Όκ±°μ— μ£Όλ‘œ μ‚¬μš©λ˜λ˜ λ°©μ‹μœΌλ‘œ, XML νŒŒμΌμ— λΉˆμ˜ μ •μ˜μ™€ μ˜μ‘΄μ„±μ„ λͺ…μ‹œν•©λ‹ˆλ‹€.
2. **Java Config**: Java ν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ λΉˆ μ„€μ • μ •λ³΄λ₯Ό μ œκ³΅ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μ£Όλ‘œ `@Configuration` μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λ©°, `@Bean` μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•˜μ—¬ λΉˆμ„ μ •μ˜ν•©λ‹ˆλ‹€.
3. **Annotation κΈ°λ°˜ μ„€μ •**: ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œμ— μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λΉˆμ„ μ„€μ •ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μ£Όμš” μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œλŠ” `@Component`, `@Service`, `@Repository`, `@Controller` λ“±μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄ λ°©μ‹μ€ μ£Όλ‘œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”을 ν†΅ν•΄ λΉˆμ„ μžλ™μœΌλ‘œ μ°Ύμ•„ λ“±λ‘ν•©λ‹ˆλ‹€.


Annotation 기반 μ„€μ •*

@Configuration
public class MyConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }

    @Bean
    public MyRepository myRepository() {
        return new MyRepository();
    }

    @Bean
    public MyController myController() {
        return new MyController(myService());
    }
}


XML μ„€μ •*

<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myService" class="com.example.MyService" />
    <bean id="myRepository" class="com.example.MyRepository" />
    <bean id="myController" class="com.example.MyController">
        <constructor-arg ref="myService" />
    </bean>

</beans>

 

`BeanDefinition`은 μŠ€ν”„링 ν”„λ ˆμž„μ›Œν¬μ—μ„œ λΉˆ(Bean)을 μ •μ˜ν•˜λŠ” λ©”타 μ •λ³΄λ₯Ό λ‹΄κ³  μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€. μ΄λ₯Ό ν†΅ν•΄ μ–΄λ–€ ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ–΄λ–€ μ†μ„±μ„ μ„€μ •ν•΄μ•Ό ν•˜λŠ”지에 λŒ€ν•œ μ •λ³΄λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. `BeanDefinition`은 λΉˆμ˜ λ©”타 μ •λ³΄λ₯Ό μΆ”μƒν™”ν•˜μ—¬ κ΄€λ¦¬ν•˜λ©°, XML μ„€μ •, Java Config, Annotation κΈ°λ°˜ μ„€μ • λ“±μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

`BeanDefinition`이 μ œκ³΅ν•˜λŠ” μ£Όμš” λ©”타 μ •λ³΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

1. **빈 ν΄λž˜μŠ€λͺ… (Bean Class Name)**: μƒμ„±ν•  λΉˆμ˜ ν΄λž˜μŠ€ μ΄λ¦„을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
2. **μƒμ„±μž μΈμž (Constructor Arguments)**: μƒμ„±μžλ₯Ό ν†΅ν•΄ λΉˆμ„ μƒμ„±ν•  λ•Œ ν•„μš”ν•œ μΈμžλ“€μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
3. **ν”„λ‘œνΌν‹° (Properties)**: λΉˆμ˜ ν”„λ‘œνΌν‹°λ“€μ„ μ„€μ •ν•˜λŠ” κ°’듀을 ν¬ν•¨ν•©λ‹ˆλ‹€.
4. **Scope**: λΉˆμ˜ μƒλͺ…μ£ΌκΈ° λ²”μœ„λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. (`singleton`, `prototype` λ“±)
5. **Lazy Initialization**: 빈이 ν•„μš”ν•œ μ‹œμ κΉŒμ§€ μ΄ˆκΈ°ν™”λ₯Ό λŠ¦μΆ”λŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 즉 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό 생성할 λ•Œ λΉˆμ„ λ°”λ‘œ μƒμ„±ν•˜μ§€μ•Šκ³  μ‹€μ œ λΉˆμ„ μ‚¬μš©ν•  λ•Œ κΉŒμ§€ μ΅œλŒ€ν•œ 생성을 μ§€μ—°μ²˜λ¦¬ 
6. **μ˜μ‘΄μ„± (Dependencies)**: λ‹€λ₯Έ λΉˆλ“€κ³Όμ˜ μ˜μ‘΄μ„±μ„ λ‚˜νƒ€λ‚΄λŠ” μ •λ³΄μž…λ‹ˆλ‹€.
7. **Initializer Methods**: λΉˆ μ΄ˆκΈ°ν™” μ‹œ ν˜ΈμΆœν•  λ©”μ„œλ“œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
8. **Destroy Methods**: λΉˆ μ†Œλ©Έ μ‹œ ν˜ΈμΆœν•  λ©”μ„œλ“œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
9. **Autowiring Mode**: μ˜μ‘΄μ„± μ£Όμž…을 μœ„ν•œ μžλ™ μ—°κ²° λͺ¨λ“œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

κ°„λ‹¨ν•œ `BeanDefinition` μ˜ˆμ‹œλ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€:

GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(MyService.class);
beanDefinition.getPropertyValues().add("message", "Hello, Spring!");
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);


μœ„ μ˜ˆμ‹œμ—μ„œλŠ” `MyService` ν΄λž˜μŠ€λ₯Ό λΉˆμœΌλ‘œ λ“±λ‘ν•˜κ³ , `message` ν”„λ‘œνΌν‹°μ— κ°’을 μ„€μ •ν•˜λ©°, `singleton` μŠ€μ½”ν”„λ‘œ λΉˆμ„ κ΄€λ¦¬ν•˜λ„둝 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.


근데 메타 μ •λ³΄λž€ ?

 

메타 μ •λ³΄(Metadata)λŠ” λ°μ΄ν„°μ— λŒ€ν•œ λ°μ΄ν„°λ‘œ, μ–΄λ–€ μ •λ³΄μ— λŒ€ν•œ μ„€λͺ…μ΄λ‚˜ κ΅¬μ‘°λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ°μ΄ν„°λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μŠ€ν”„링 ν”„λ ˆμž„μ›Œν¬μ—μ„œ λ©”타 μ •λ³΄λŠ” μ£Όλ‘œ ν”„λ‘œκ·Έλž¨μ˜ κ΅¬μ„±, μ„€μ •, μ‹€ν–‰ λ“±μ„ μ„€λͺ…ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” λ° μ‚¬μš©λ©λ‹ˆλ‹€.

μ—¬λŸ¬ κ°€μ§€ μ˜ˆμ‹œλ₯Ό ν†΅ν•΄ μŠ€ν”„λ§μ—μ„œ μ‚¬μš©λ˜λŠ” λ©”타 μ •λ³΄λ₯Ό μ΄ν•΄ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€:

1. **빈(Bean) λ©”타 μ •λ³΄**: λΉˆ(Bean) μ •μ˜μ—μ„œ μ‚¬μš©λ˜λŠ” λ©”타 μ •λ³΄λŠ” ν•΄λ‹Ή λΉˆμ˜ ν΄λž˜μŠ€λͺ…, μƒμ„±μž μΈμž, ν”„λ‘œνΌν‹° μ„€μ • λ“±μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. μ΄ μ •λ³΄λŠ” λΉˆμ˜ μƒμ„±, κ΄€λ¦¬, μ˜μ‘΄μ„± μ£Όμž… λ“±μ„ μŠ€ν”„링 μ»¨ν…Œμ΄λ„ˆκ°€ μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

2. **μ• λ…Έν…Œμ΄μ…˜(Annotation)**: μŠ€ν”„λ§μ—μ„œ μ• λ…Έν…Œμ΄μ…˜μ€ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œμ— λΆ€κ°€μ μΈ μ •λ³΄λ₯Ό μ œκ³΅ν•˜λŠ” μ—­ν• μ„ ν•©λ‹ˆλ‹€. `@Component`, `@Service`, `@Autowired` λ“±μ˜ μ• λ…Έν…Œμ΄μ…˜μ€ ν΄λž˜μŠ€κ°€ λΉˆμœΌλ‘œ λ“±λ‘λ˜κ±°λ‚˜ μ˜μ‘΄μ„± μ£Όμž…을 λ°›μ•„μ•Ό ν•¨μ„ λ‚˜νƒ€λ‚΄λ©°, μ΄λŠ” μŠ€ν”„λ§μ˜ λ©”타 μ •λ³΄λ‘œ ν™œμš©λ©λ‹ˆλ‹€.

3. **ν”„λ‘œνΌν‹° νŒŒμΌ(Properties file)**: `application.properties`λ‚˜ `application.yml`κ³Ό κ°™μ€ ν”„λ‘œνΌν‹° νŒŒμΌμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„€μ • μ •λ³΄λ₯Ό λ©”타 λ°μ΄ν„°λ‘œ ν¬ν•¨ν•©λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° μ •λ³΄, μ„œλ²„ ν¬νŠΈ λ“±μ„ μ„€μ •ν•˜λŠ” λ° ν™œμš©λ©λ‹ˆλ‹€.

4. **AOP(Aspect-Oriented Programming) μ„€μ •**: AOPλŠ” λ©”타 λ°μ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ νš‘단 κ΄€μ‹¬ μ‚¬ν•­(cross-cutting concern)을 λΆ„λ¦¬ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” κΈ°λ²•μž…λ‹ˆλ‹€. λ©”타 μ •λ³΄λ₯Ό ν†΅ν•΄ μ–΄λŠ μ§€μ μ—μ„œ μ–΄λ–€ λ‘œμ§μ„ μ μš©ν•΄μ•Ό ν•˜λŠ”지 μ„€μ •ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

5. **λ¦¬ν”Œλ ‰μ…˜(Reflection)**: μžλ°” λ¦¬ν”Œλ ‰μ…˜μ€ μ‹€ν–‰ μ€‘인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν΄λž˜μŠ€, λ©”μ„œλ“œ, ν•„λ“œ λ“±μ˜ μ •λ³΄λ₯Ό μ‘°μ‚¬ν•˜κ³  μ‘°μž‘ν•˜λŠ” λ° μ‚¬μš©λ©λ‹ˆλ‹€. μ΄λ₯Ό ν†΅ν•΄ λ©”타 μ •λ³΄λ₯Ό λ™μ μœΌλ‘œ λΆ„μ„ν•˜κ³  ν™œμš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

메타 μ •λ³΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰κ³Ό κ΄€λ¦¬λ₯Ό λ•λŠ” μ€‘μš”ν•œ κ°œλ…μœΌλ‘œ, μŠ€ν”„링 ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” μ΄λŸ¬ν•œ λ©”타 μ •λ³΄λ₯Ό ν™œμš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„€μ •κ³Ό λ™μž‘을 μ‘°μ •ν•˜κ³  μ œμ–΄ν•©λ‹ˆλ‹€.

 


 

728x90