DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’» is a community of 970,177 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Create account Log in
Ukjin Yang
Ukjin Yang

Posted on

Spring @Component @Bean μ•Œκ³  μ“°κΈ°

λ‹¨λ„μ§μž…μ μœΌλ‘œ λ§ν•˜κ² λ‹€. μ•Œκ³  써라. 이 λ‘˜μ˜ 차이만 μ•Œμ•„λ„ 당신은 μŠ€ν”„λ§μ΄ μ–΄λ–»κ²Œ λŒμ•„κ°€λŠ”μ§€ λ°˜μ€ μ•Œκ³  λ“€μ–΄κ°„λ‹€κ³  봐도 μ’‹λ‹€.

μ•Œλ‹€μ‹œν”Ό μŠ€ν”„λ§μ€ ν­λ§ν•œ EJB 방식을 λŒ€μ²΄ν•œλ‹€. 그리고 μ–΄λ…Έν…Œμ΄μ…˜ κΈ°λ°˜μ€ κ°œλ°œμƒμ‚°μ„±μ— μ—„μ²­λ‚œ ν–₯상을 λΆˆλŸ¬μ™€μ€¬λ‹€.

자, 이제 μ•Œμ•„λ³΄μž. 두 μ–΄λ…Έν…Œμ΄μ…˜μ˜ 차이λ₯Ό!

@Component

싱글톀 클래슀 λΉˆμ„ μƒμ„±ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€. λ¬Όλ‘  @Scope("Prototype") μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 싱글톀이 μ•„λ‹Œ λΉˆμ„ 생성할 μˆ˜λ„ μžˆλ‹€. λ˜ν•œ @Service, @Repository μ–΄λ…Έν…Œμ΄μ…˜ λ˜ν•œ 이에 ν¬ν•¨λœλ‹€.

이 μ–΄λ…Έν…Œμ΄μ…˜μ€ 선언적(Declarative)인 μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‹€. 즉, νŒ¨ν‚€μ§€ μŠ€μΊ” μ•ˆμ— 이 μ–΄λ…Έν…Œμ΄μ…˜μ€ "이 클래슀λ₯Ό μ •μ˜ν–ˆμœΌλ‹ˆ 빈으둜 λ“±λ‘ν•΄μ€˜." λΌλŠ” 뜻이 λœλ‹€.

이 μ–΄λ…Έν…Œμ΄μ…˜μ€ μ§ˆλ¦¬λ„λ‘ μ“°κΈ° λ•Œλ¬Έμ— 이상 μ„€λͺ…을 λ§ˆμΉ˜λ„λ‘ ν•˜κ² λ‹€.

@Bean

이녀석은 주둜 @Configuration μ–΄λ…Έν…Œμ΄μ…˜μ΄ λ“€μ–΄κ°„ Spring 을 μ„€μ •ν•˜λŠ” 클래슀 내에 λ“€μ–΄κ°€λŠ” λ©”μ†Œλ“œμ—μ„œ μ„ μ–Έν•œλ‹€. λ§Œμ•½ 이λ₯Ό @Component 둜 따지면, μŠ€ν”„λ§μ€ μŠ€μΊ”ν•  νŒ¨ν‚€μ§€λ₯Ό κ²€μƒ‰ν•΄μ„œ @Component μ–΄λ…Έν…Œμ΄μ…˜μ„ λ°œκ²¬ν•˜λ©΄ μ΄λ ‡κ²Œ λ“±λ‘ν•˜λŠ” 꼴이 λœλ‹€.

@Component
public class MyBean {
    // ...
}

// μŠ€ν”„λ§ λ‚΄λΆ€ 처리λ₯Ό μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ ν‘œν˜„ν•˜λ©΄?

@Bean
public MyBean myBean() {
    return new MyBean();
}
Enter fullscreen mode Exit fullscreen mode

λ¬Όλ‘  μƒμ„±μžμ— μΈμžκ°€ μžˆλ‹€λ©΄ κ·Έ 빈이 μžˆλŠ”μ§€ 확인 ν›„ λ„£λŠ”λ‹€. λ¬Όλ‘  μ—†μœΌλ©΄ μŠ€ν”„λ§μ€ 였λ₯˜λ₯Ό λ±‰μœΌλ©° 앱을 끝내버린닀.

자, 그럼 μ΄λ…€μ„μ˜ 쑴재 μ΄μœ λŠ”?

μ˜ˆμ „ μŠ€ν”„λ§μ€ XML μ„€μ •λ§Œ κ°€λŠ₯ν–ˆμœΌλ©°, 3.0 λΆ€ν„° 본격적인 μ–΄λ…Έν…Œμ΄μ…˜ 지원이 μ‹œμž‘λ˜μ—ˆλ‹€.
λ¬Όλ‘  μ΅œμ‹  버전인 5.2 μ—μ„œλ„ XML 섀정은 μ§€μ›ν•œλ‹€. XML 으둜 μ„€μ •ν•  λ•Œ μž₯점이라면?
λ°”λ‘œ λ„£μ—ˆλ‹€ 뺐닀, 클래슀 λ°”κΎΈλŠ” λ“±μ˜ μœ μ—°ν•œ 섀정이 κ°€λŠ₯ν•˜λ‹€λŠ” 이점이닀. κ·Έλƒ₯ XML 파일 νŽΈμ§‘ν•˜κ³  앱을 μž¬μ‹œμž‘ν•˜λ©΄ 끝이닀. 정말 κ°„λ‹¨ν•˜λ‹€. ν•„μš”μ—†λŠ” λΉˆμ€ μ£Όμ„μ²˜λ¦¬ν•˜λ©΄ λœλ‹€. μ–΄μžν”Ό XML μ΄λ‚˜ ν΄λž˜μŠ€λ‚˜ μˆ˜μ •ν•˜λ©΄ μ•± μž¬μ‹œμž‘ ν•΄μ•Ό ν•˜λŠ”κ±΄ λ§€ν•œκ°€μ§€λ‹€.
λ˜ν•œ μŠ€μΊ”ν•  ν•„μš” 없이 빈 등둝이 λΉ λ₯΄κ²Œ 이루어진닀. XML 섀정을 κ³ μˆ˜ν•˜λŠ” μ‹œλ‹ˆμ–΄ κ°œλ°œμžλ“€μ΄ 이런 맀λ ₯ λ•Œλ¬Έμ— XML 섀정을 λΉ μ Έλ‚˜κ°€λ € ν•˜μ§€ μ•ŠλŠ” 것이닀.
μœ„ 빈 섀정을 클래슀 κΈ°λ°˜μ—μ„œλŠ” @Bean μ–΄λ…Έν…Œμ΄μ…˜ λ˜ν•œ 이런 μœ μ—°ν•œ μž‘μ—…μ„ κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€. 예λ₯Ό λ“€λ©΄,

// prop μ •μ˜ μ•ˆν•˜λ©΄ 빈 λ¬Έμžμ—΄λ‘œ. null λ°›μœΌλ©΄ switch λ¬Έμ—μ„œ NullPointerException λ°œμƒν•¨
@Value("${my.prop.animal:}")
private String animal;

@Bean
public Animal animal() {
    switch(animal) {
        case "dog": return new Dog();
        case "cat": return new Cat();
        case "cow": return new Cow();
        default: throw new InvalidStateException("동물 μ •μ˜ν•˜κ³  λ‹€μ‹œ μ‹€ν–‰ν•  것!");
    }
}
Enter fullscreen mode Exit fullscreen mode

이런 μ‹μœΌλ‘œ ν”„λ‘œνΌν‹° 값을 읽어듀여 여기에 λ§žλŠ” κ΅¬ν˜„ 클래슀λ₯Ό μΈν„°νŽ˜μ΄μŠ€ 기반 λΉˆμ— λ“±λ‘ν•΄μ£ΌλŠ” μœ μ—°ν•œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€λŠ” 것.
λ˜ν•œ, @Component μ–΄λ…Έν…Œμ΄μ…˜ λ„£κΈ° κ³€λž€ν•œ 타사 라이브러리 클래슀λ₯Ό λΉˆμ— 등둝할 λ•Œλ„ @Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ ν†΅ν•œ λ©”μ†Œλ“œλ₯Ό 톡해 등둝할 수 μžˆλ‹€.

정리

일반적인 λ‹Ήμ‹ μ˜ 빈 등둝은 κ°„νŽΈν•˜κ²Œ @Component μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, μœ μ—°ν•œ 빈 등둝이 ν•„μš”ν•˜λ‹€λ©΄ @Configuration μ–΄λ…Έν…Œμ΄μ…˜μ΄ λ“€μ–΄κ°„ 클래슀 λ‚΄ @Bean μ–΄λ…Έν…Œμ΄μ…˜ λ©”μ†Œλ“œ μ„ μ–ΈμœΌλ‘œ!
μ•„, Spring Boot의 경우 @SpringBootApplication μ–΄λ…Έν…Œμ΄μ…˜μ΄ λ“€μ–΄κ°„ μŠ€ν”„λ§ μ‹€ν–‰λΆ€μ—μ„œλ„ @Bean μ–΄λ…Έν…Œμ΄μ…˜μ΄ κΉƒλ“  λ©”μ†Œλ“œ 등둝이 κ°€λŠ₯ν•˜λ‹€λŠ” 것도 μžŠμ§€ 말자.

Top comments (0)

πŸŒ™ Dark Mode?!

Turn it on in Settings