Spring

[Spring] @SpringBootApplication 에 λŒ€ν•˜μ—¬.

μžνλ‹ˆ 2022. 4. 12. 01:46

0.πŸšΆλ“€μ–΄κ°€λ©° 

Spring boot둜 ν”„λ‘œμ νŠΈλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•Œμ•„μ„œ λ§Œλ“€μ–΄μ§€λŠ” μœ μΌν•œ μžλ°” μ½”λ“œλ‘œ μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό μ°Ύμ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

여기에 λΆ™μ–΄μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜μΈ @SpringBootApplication이 μ–΄λ–€ 역할을 ν•˜κ³  μžˆλŠ”μ§€ κΆκΈˆν•˜μ—¬ 이에 λŒ€ν•΄ μ°Ύμ•„λ³΄μ•˜κ³ , 이λ₯Ό 톡해 Spring의 μ—¬λŸ¬ μ–΄λ…Έν…Œμ΄μ…˜μ— λŒ€ν•΄ μ•Œμ•„λ³Ό 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” κ·Έ λ‚΄μš©μ„ μ†Œκ°œν•˜κ³ μž ν•©λ‹ˆλ‹€.

 

@SpringBootApplication이 μ–΄λ–€ μ–΄λ…Έν…Œμ΄μ…˜μΈμ§€ μ•ŒκΈ° μœ„ν•΄ μ •μ˜λœ 곳을 μ°Ύμ•„κ°€ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ•„λž˜ νŒ¨ν‚€μ§€μ— μ‘΄μž¬ν•˜λ”κ΅°μš”!

package org.springframework.boot.autoconfigure;

@SpringBootApplication μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ„ μ–ΈλΆ€λ§Œ μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜ 사진과 같이 λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

주의 깊게 봐야할 곳은 μŠ€ν”„λ§ 고유 μ–΄λ…Έν…Œμ΄μ…˜μ΄κ³  μ—¬κΈ°μ—λŠ” μ„Έ 가지가 μžˆμŠ΅λ‹ˆλ‹€.

  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration
  3. @ComponentScan

μœ„ μ„Έ 가지 μ–΄λ…Έν…Œμ΄μ…˜ κΈ°λŠ₯을 @SpringBootApplication ν•˜λ‚˜λ‘œ ν™œμ„±ν™” μ‹œν‚¬ 수 μžˆλŠ” 것이죠!

 

그러면 ν•˜λ‚˜ν•˜λ‚˜ μ’€ 더 μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. 

 


1. @SpringBootConfiguration

@SpringBootConfiguration

enable registration of extra beans in the context or the import of additional configuration classes. An alternative to Spring’s standard @Configuration that aids configuration detection in your integration tests.

 

μŠ€ν”„λ§μ˜ @Configuration μ–΄λ…Έν…Œμ΄μ…˜λ₯Ό λŒ€μ²΄ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€. 거의 λΉ„μŠ·ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜μ£ !

 

두 μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ°¨μ΄μ μœΌλ‘œλŠ” @SpringBootConfiguration은 ꡬ성을 μžλ™μœΌλ‘œ 찾을 수 μžˆλ‹€λΌκ³  ν•©λ‹ˆλ‹€. 

 

차이점에 λŒ€ν•΄μ„œλŠ” 아직 μ œλŒ€λ‘œ μ΄ν•΄ν•˜μ§€ λͺ»ν•œ 것 κ°™μ•„ μΆ”ν›„ 더 곡뢀해보고 λ‚΄μš©μ„ 쑰금 더 λ³΄μ™„ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 

@Configuration μ–΄λ…Έν…Œμ΄μ…˜?

 

μ„€μ • ν΄λž˜μŠ€μ—μ„œ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•΄ λΉˆμ„ λ“±λ‘ν•˜λ €λ©΄ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

@Cofiguration μ–΄λ…Έν…Œμ΄μ…˜μ„ ν΄λž˜μŠ€μ— λΆ™μ΄λŠ” 것이고 @Bean μ–΄λ…Έν…Œμ΄μ…˜κ³Ό ν•¨κ»˜ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•΄μ£ΌλŠ” 것이죠.

@Configuration 
public class MyConfig {

    @Bean
    public MyBean mybean() {
        return new MyBean(); 
    } 
}

μœ„μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ²Œλ˜λ©΄ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ @Configuration이 λΆ™μ–΄μžˆλŠ” MyConfigλ₯Ό μžλ™μœΌλ‘œ 빈으둜 λ“±λ‘ν•˜κ³ , ν•΄λ‹Ή 클래슀λ₯Ό νŒŒμ‹±ν•΄μ„œ @Bean이 λΆ™μ–΄μžˆλŠ” λ©”μ„œλ“œλ₯Ό μ°Ύμ•„ λΉˆμ„ μƒμ„±ν•΄μ€λ‹ˆλ‹€. 이 λ•Œ Bean의 이름은 λ©”μ„œλ“œλͺ…이 λ©λ‹ˆλ‹€.

 

@Configuration을 써주어야 @Bean으둜 λ“±λ‘ν•˜λŠ” 빈이 싱글톀을 보μž₯ 받을 수 μžˆλŠ”λ° 이에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ μ•„λž˜λ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”!

 

[Spring] @Configuration μ•ˆμ— @Bean을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유, proxyBeanMethods - (2/2)

Springμ—μ„œ μˆ˜λ™μœΌλ‘œ λΉˆμ„ 등둝할 λ•Œμ—λŠ” @Configuration 클래슀 μ•ˆμ—μ„œ @Bean을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” μ™œ @Configuraiton 클래슀 μ•ˆμ—μ„œ @Bean을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. 1. @Configuration.

mangkyu.tistory.com

 


2. @EnableAutoConfiguration

@EnableAutoConfiguration

enable Spring Boot’s auto-configuration mechanism

 

ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ€ μŠ€ν”„λ§ λΆ€νŠΈμ˜ μžλ™ μ„€μ • λ©”μ»€λ‹ˆμ¦˜μ„ ν™œμ„±ν™”μ‹œμΌœμ€λ‹ˆλ‹€.

 

이게 무슨 말이지..?

 

Spring Boot의 빈 등둝 방식은 두 단계에 κ±Έμ³μ„œ μ§„ν–‰λœλ‹€κ³  ν•©λ‹ˆλ‹€.

  1. ComponentScan으둜 bean을 등둝
  2. EnableAutoConfiguration으둜 bean을 등둝

이 λ•Œ 2번 과정에 λŒ€ν•΄ μ•Œμ•„λ³΄λ©΄, @EnableAutoConfiguration μ–΄λ…Έν…Œμ΄μ…˜μ€ μŠ€ν”„λ§ λΆ€νŠΈκ°€ 미리 μ •μ˜ν•΄λ†“μ€ 빈 μ„€μ •λ“€(meta νŒŒμΌμ— 쑴재)을 빈으둜 λ“±λ‘ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

 

# Spring Boot의 meta 파일? -> spring-boot-autoconfigure ν”„λ‘œμ νŠΈμ˜ META-INF νŒ¨ν‚€μ§€ μ•ˆ spring.factories에 λ“€μ–΄μžˆμŒ!


3. @ComponentScan

@ComponentScan

enable @Component scan on the package where the application is located

 

자주 λ³΄μ΄λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄ λ‚˜μ™”λ„€μš”,, μ•žμ„œ ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ 빈 등둝을 ν•œλ‹€κ³  ν•˜μ˜€λŠ”λ° μ’€ 더 μ•Œμ•„λ΄…μ‹œλ‹€.

 

μŠ€ν”„λ§μ„ μ‚¬μš©ν•˜λ©΄μ„œ ν•„μš”μ— 따라 @Component, @Service, @Repository, @Controller, @Configuration λ“±κ³Ό 같은 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ 빈으둜 λ“±λ‘ν•˜κ³ μž ν•©λ‹ˆλ‹€. 

 

근데 κ·Έλƒ₯ λ‚΄κ°€ λ§Œλ“  ν΄λž˜μŠ€μ— μœ„μ™€ 같은 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ“°λ©΄ μ„€μ • νŒŒμΌμ— λ“±λ‘ν•œ 것도 μ•„λ‹Œλ° μ–΄λ–»κ²Œ 빈으둜 λ“±λ‘ν•΄μ€„κΉŒ?λΌλŠ” 의문이 μƒκΉλ‹ˆλ‹€. λ°”λ‘œ @ComponentScan이 μ„€μ •λœ μ‹œμž‘ 지점뢀터 빈으둜 λ“±λ‘ν•˜κ³ μžν•˜λŠ” λ†ˆλ“€(μ»΄ν¬λ„ŒνŠΈ ν΄λž˜μŠ€λ“€)을 λ‹€ μ°Ύμ•„μ„œ λ“±λ‘ν•΄μ€λ‹ˆλ‹€. 

 

μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ 것과 같이 @Configurationμ—μ„œ μˆ˜λ™μœΌλ‘œ λΉˆμ„ 등둝할 μˆ˜λ„ μžˆμ§€λ§Œ(@Bean μ‚¬μš©ν•΄μ„œ) μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€λ©΄ μžλ™μœΌλ‘œ Component듀을 Scan ν•˜μ—¬ 빈으둜 λ“±λ‘ν•΄μ€λ‹ˆλ‹€.

@Configuration 
@ComponentScan
public class MyConfig {
	// Bean듀이 μžλ™μœΌλ‘œ 등둝
}

4.πŸ“šμ •λ¦¬

μ •λ¦¬ν•˜μžλ©΄ @SpringBootApplication을 톡해

  1. @SpringBootConfiguration 
  2. @EnableAutoConfiguration
  3. @ComponentScan 

μœ„ μ„Έ 가지 κΈ°λŠ₯을 ν•œκΊΌλ²ˆμ— μ œκ³΅ν•΄μ€€λ‹€κ³  λ³Ό 수 μžˆλŠ”λ° ν•„μš”ν•œ λΉˆλ“€μ„ λ“±λ‘ν•˜λŠ” 것이 주된 κΈ°λŠ₯인 것 κ°™μŠ΅λ‹ˆλ‹€. 

 


κ΄€λ ¨ λ‚΄μš©μ„ μ°Ύλ‹€λ³΄λ‹ˆ μŠ€ν”„λ§ κΈ°λ³Έ κ°œλ…μ— λŒ€ν•΄ 잘 μ•Œμ§€ λͺ»ν•˜λŠ” κ΅¬λ‚˜λΌκ³  느끼게 λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μΆ”ν›„ μŠ€ν”„λ§ 곡뢀λ₯Ό 더 μ§„ν–‰ν•΄λ³΄λ©΄μ„œ κΈ°νšŒκ°€ 되면 κ΄€λ ¨ λ‚΄μš©μ„ 쑰금 더 μžμ„Έν•˜κ²Œ 닀뀄보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. 

 

 

 

λ°˜μ‘ν˜•