Home > Spring > πŸƒ[Spring] `@Component` μ–΄λ…Έν…Œμ΄μ…˜.

πŸƒ[Spring] `@Component` μ–΄λ…Έν…Œμ΄μ…˜.
Spring Framework

πŸƒ[Spring] @Component μ–΄λ…Έν…Œμ΄μ…˜.

  • @Component μ–΄λ…Έν…Œμ΄μ…˜μ€ Spring Frameworkμ—μ„œ 빈(Bean) 으둜 등둝할 클래슀λ₯Ό μ§€μ •ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 클래슀 레벨 μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  • 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ Spring IoC μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ μžλ™μœΌλ‘œ κ΄€λ¦¬λ˜λŠ” 빈으둜 λ“±λ‘λ©λ‹ˆλ‹€.
  • 주둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μžλ™μœΌλ‘œ λΉˆμ„ λ“±λ‘ν•˜κ³  싢을 λ•Œ μ‚¬μš© λ©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ Spring μ»¨ν…Œμ΄λ„ˆ
πŸ™‹β€β™‚οΈ Spring μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

πŸ“ Spring IoC μ»¨ν…Œμ΄λ„ˆμ™€ Spring μ»¨ν…Œμ΄λ„ˆλŠ” λ‹€λ₯Έ κ°œλ…μΈκ°€μš”?

Spring IoC μ»¨ν…Œμ΄λ„ˆμ™€ Spring μ»¨ν…Œμ΄λ„ˆλŠ” 같은 κ°œλ…μ„ μ˜λ―Έν•˜λŠ” μš©μ–΄μž…λ‹ˆλ‹€.
이 두 μš©μ–΄λŠ” λͺ¨λ‘ Spring Frameworkμ—μ„œ 객체(Bean, 빈)의 생성, 관리, μ˜μ‘΄μ„± μ£Όμž…, 생λͺ…μ£ΌκΈ° 관리 등을 λ‹΄λ‹Ήν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

πŸ“ 같은 κ°œλ…μ— λŒ€ν•œ λ‹€μ–‘ν•œ ν‘œν˜„

  • Spring IoC μ»¨ν…Œμ΄λ„ˆλŠ” 더 ꡬ체적인 μš©μ–΄λ‘œ, Springμ—μ„œ Inversion Of Control(μ œμ–΄μ˜ 역적) 원칙을 κ΅¬ν˜„ν•˜λŠ” 빈 관리 μ‹œμŠ€ν…œμ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
    • 이 μš©μ–΄λŠ” 주둜 μ œμ–΄μ˜ μ—­μ „(Inversion of Control) μ΄λΌλŠ” ν”„λ‘œκ·Έλž˜λ° 원칙을 κ°•μ‘°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.
    • IoCλŠ” κ°œλ°œμžκ°€ 직접 객체λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜μ§€ μ•Šκ³ , μ»¨ν…Œμ΄λ„ˆκ°€ 객체의 생성과 μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.
  • Spring μ»¨ν…Œμ΄λ„ˆλŠ” 더 일반적인 μš©μ–΄λ‘œ, Spring Frameworkκ°€ μ œκ³΅ν•˜λŠ” 객체 관리 μ‹œμŠ€ν…œμ„ κ°€λ¦¬ν‚€λŠ” ν‘œν˜„μž…λ‹ˆλ‹€.
    • 이 μš©μ–΄λŠ” Spring이 μ œκ³΅ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λŠ₯을 ν¬κ΄„μ μœΌλ‘œ ν‘œν˜„ν•˜λ©°, κ·Έ 핡심 κΈ°λŠ₯은 IoC μ»¨ν…Œμ΄λ„ˆ μž…λ‹ˆλ‹€.

πŸ“ κ²°λ‘ 

  • Spring IoC μ»¨ν…Œμ΄λ„ˆμ™€ Spring μ»¨ν…Œμ΄λ„ˆλŠ” 같은 κ°œλ…μœΌλ‘œ λ³Ό 수 있으며, 두 μš©μ–΄ λͺ¨λ‘ Spring의 핡심 κΈ°λŠ₯인 객체 관리와 μ˜μ‘΄μ„± μ£Όμž…μ„ λ‹΄λ‹Ήν•˜λŠ” μ‹œμŠ€ν…œμ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
  • IoCλŠ” 이 μ»¨ν…Œμ΄λ„ˆμ˜ μž‘λ™ 원리λ₯Ό μ„€λͺ…ν•˜λŠ” μš©μ–΄μ΄κ³ , Spring μ»¨ν…Œμ΄λ„ˆλŠ” 이λ₯Ό 일반적으둜 λΆ€λ₯Ό λ•Œ μ‚¬μš©ν•˜λŠ” ν‘œν˜„νž™λ‹ˆλ‹€.

1️⃣ μ£Όμš” κΈ°λŠ₯ 및 νŠΉμ§•.

1. μžλ™ 빈 등둝.

  • @Component μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 ν΄λž˜μŠ€λŠ” Spring의 μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” κ°€λŠ₯에 μ˜ν•΄ μžλ™μœΌλ‘œ κ°μ§€λ˜κ³ , Spring IoC μ»¨ν…Œμ΄λ„ˆμ— 빈으둜 λ“±λ‘λ©λ‹ˆλ‹€.
  • κ°œλ°œμžκ°€ 직접 λΉˆμ„ λ“±λ‘ν•˜λŠ” λŒ€μ‹ , Spring이 클래슀 κ²½λ‘œμ—μ„œ 이λ₯Ό νƒμƒ‰ν•˜κ³  κ΄€λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€.

2. λ‹€λ₯Έ νŠΉν™”λœ μ–΄λ…Έν…Œμ΄μ…˜μ˜ 기반

  • @ComponentλŠ” Springμ—μ„œ 일반적인 λΉˆμ„ λ“±λ‘ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λ˜λ©°, 이λ₯Ό 기반으둜 ν•œ 더 ꡬ체적인 μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, @Service, @Repository, @Controller 등이 @Component의 νŠΉμˆ˜ν™”λœ ν˜•νƒœλ‘œ, 각각의 역할에 λ§žλŠ” λΉˆμ„ ꡬ체적으둜 μ •μ˜ν•©λ‹ˆλ‹€.
    • @Service: μ„œλΉ„μŠ€ λ ˆμ΄μ–΄λ₯Ό μ •μ˜ν•˜λŠ” ν΄λž˜μŠ€μ— μ‚¬μš©.
    • @Repository: 데이터 μ—‘μ„ΈμŠ€ λ ˆμ΄μ–΄(DAO)에 μ‚¬μš©.
    • @Controller: μ›Ή 컨트둀러(ν”„λ ˆμ  ν…Œμ΄μ…˜ λ ˆμ΄μ–΄)에 μ‚¬μš©.

3. κ°„νŽΈν•œ 빈 관리

  • @ComponentλŠ” νŠΉλ³„ν•œ μ„€μ • 없이 ν΄λž˜μŠ€μ— κ°„λ‹¨νžˆ μ–΄λ…Έν…Œμ΄μ…˜λ§Œ λΆ™μ—¬μ„œ Spring IoC μ»¨ν…Œμ΄λ„ˆμ—μ„œ κ΄€λ¦¬λ˜λŠ” 빈으둜 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • Spring이 μ œκ³΅ν•˜λŠ” 기본적인 빈 등둝 방식 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

2️⃣ μ˜ˆμ‹œ

@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("Hello from MyComponent!");
    }
}
  • μœ„ μ½”λ“œμ—μ„œ MyComponent ν΄λž˜μŠ€λŠ” @Component μ–΄λ…Έν…Œμ΄μ…˜ 덕뢄에 Spring IoC μ»¨ν…Œμ΄λ„ˆμ— μžλ™μœΌλ‘œ 빈으둜 λ“±λ‘λ©λ‹ˆλ‹€.
    • 이제 Spring이 이 λΉˆμ„ κ΄€λ¦¬ν•˜λ©°, λ‹€λ₯Έ κ³³μ—μ„œ μ˜μ‘΄μ„± μ£Όμž…μ„ 톡해 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
@Service
public class MyService {
    
    private final MyComponent myComponent;
    
    @Autowired
    public MyService(MyComponent myComponent) {
        this.myComponent = myComponent;
    }
    
    public void performAction() {
        myComponent.doSomthing();
    }
}
  • 이 μ˜ˆμ—μ„œλŠ” MyService ν΄λž˜μŠ€κ°€ MyComponent λΉˆμ„ μ£Όμž…λ°›μ•„ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • MyComponent κ°€ μžλ™μœΌλ‘œ 빈으둜 λ“±λ‘λ˜μ—ˆκΈ° λ•Œλ¬Έμ—, @Autowiredλ₯Ό 톡해 MyService에 μ£Όμž…λ  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ @Component와 μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”

  • @Component μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‚¬μš©λ˜λ €λ©΄ Spring이 μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ„ 톡해 ν•΄λ‹Ή 클래슀λ₯Ό μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€.
  • 일반적으둜 @ComponentScan μ–΄λ…Έν…Œμ΄μ…˜μ΄λ‚˜ Spring Bootμ—μ„œλŠ” @SpringBootApplication μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 μžλ™μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ΄ ν™œμ„±ν™”λ©λ‹ˆλ‹€.
@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}
  • 이 μ½”λ“œμ—μ„œ @SpringBootApplication은 @ComponentScan을 ν¬ν•¨ν•˜κ³  μžˆμ–΄, @Componentκ°€ 뢙은 λͺ¨λ“  클래슀λ₯Ό μžλ™μœΌλ‘œ κ²€μƒ‰ν•˜κ³  빈으둜 λ“±λ‘ν•©λ‹ˆλ‹€.

4️⃣ @Component와 λ‹€λ₯Έ 빈 등둝 방식 비ꡐ.

  • @Component vs @Bean
    • @ComponentλŠ” 클래슀 λ ˆλ²¨μ—μ„œ μžλ™μœΌλ‘œ λΉˆμ„ λ“±λ‘ν•˜λ©°, μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ„ 톡해 Spring이 클래슀λ₯Ό κ°μ§€ν•©λ‹ˆλ‹€.
    • @Bean은 λ©”μ„œλ“œ λ ˆλ²¨μ—μ„œ μˆ˜λ™μœΌλ‘œ λΉˆμ„ λ“±λ‘ν•˜λŠ” λ°©μ‹μœΌλ‘œ, μžλ°” μ„€μ • 클래슀(@Configuration)λ‚΄μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
      • κ°œλ°œμžκ°€ 직접 λ©”μ„œλ“œλ₯Ό 톡해 λΉˆμ„ μƒμ„±ν•˜κ³  μ΄ˆκΈ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • @Component vs @Service, @Repository, @Controller
    • 이듀 μ–΄λ…Έν…Œμ΄μ…˜μ€ λͺ¨λ‘ @Componentλ₯Ό 기반으둜 ν•˜λ©°, νŠΉμ • λ ˆμ΄μ–΄μ˜ 역할을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄, @ServiceλŠ” μ„œλΉ„μŠ€ 계측을 λ‚˜νƒ€λ‚΄κ³ , @RepositoryλŠ” 데이터 μ—‘μ„ΈμŠ€ 계측을 @ControllerλŠ” ν”„λ ˆμ  ν…Œμ΄μ…˜ 계측을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • κΈ°λŠ₯μ μœΌλ‘œλŠ” λ™μΌν•˜μ§€λ§Œ, 역할에 따라 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ½”λ“œμ˜ 가독성과 의미λ₯Ό 더 λͺ…ν™•ν•˜κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ μ–Έμ œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?

  • 일반적인 빈 등둝이 ν•„μš”ν•  λ•Œ
    • λΉ„μ¦ˆλ‹ˆμŠ€ 둜직, μœ ν‹Έλ¦¬ν‹° 클래슀, 도메인 객체 λ“± Spring IoC μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜μ–΄μ•Ό ν•˜λŠ” 일반적인 클래슀λ₯Ό 빈으둜 등둝할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • νŠΉμ • 역할이 μ—†λŠ” 클래슀
    • @Service, @Repository, @Contoroller와 같은 λͺ…μ‹œμ μΈ 역할이 μ—†λŠ” 경우, @Componentλ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀λ₯Ό 빈으둜 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€.

6️⃣ κ²°λ‘ .

  • @ComponentλŠ” Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μžλ™μœΌλ‘œ λΉˆμ„ λ“±λ‘ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 기본적인 μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
    • 이λ₯Ό μ‚¬μš©ν•˜λ©΄ Spring IoC μ»¨ν…Œμ΄λ„ˆκ°€ 클래슀 κ²½λ‘œμ—μ„œ μžλ™μœΌλ‘œ ν•΄λ‹Ή 클래슀λ₯Ό μ°Ύμ•„ 빈으둜 κ΄€λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€.
  • 일반적인 빈 등둝을 μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λ˜λ©°, 더 ꡬ체적인 역할을 λ‚˜νƒœλ‚΄κΈ° μœ„ν•΄ @Service, @Repository, @Controller와 같은 νŠΉν™”λœ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.
  • @ComponentλŠ” κ°„λ‹¨ν•˜κ²Œ λΉˆμ„ κ΄€λ¦¬ν•˜κ³ μž ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.