Home > Spring > πŸƒ[Spring] Spring μ»¨ν…Œμ΄λ„ˆ.

πŸƒ[Spring] Spring μ»¨ν…Œμ΄λ„ˆ.
Spring Framework

πŸƒ[Spring] Spring μ»¨ν…Œμ΄λ„ˆ.

Spring μ»¨ν…Œμ΄λ„ˆλŠ” Spring Framework의 핡심 ꡬ성 μš”μ†Œλ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 빈(Bean) 을 μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” IoC(Inversion Of Control) μ»¨ν…Œμ΄λ„ˆλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

Spring μ»¨ν…Œμ΄λ„ˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ™μž‘ν•˜λŠ” λ™μ•ˆ 객체(Bean, 빈)의 생λͺ…μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•˜λ©°, μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection, DI) 을 톡해 객체 κ°„μ˜ μ˜μ‘΄μ„±μ„ μžλ™μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

1️⃣ Spring μ»¨ν…Œμ΄λ„ˆμ˜ μ£Όμš” μ—­ν• .

1. 빈 생성 및 관리

  • Spring μ»¨ν…Œμ΄λ„ˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ ν•„μš”ν•œ λΉˆμ„ μƒμ„±ν•˜κ³  κ·Έ 생λͺ…μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • 빈의 생성, μ΄ˆκΈ°ν™”, μ˜μ‘΄μ„± μ£Όμž…, μ†Œλ©Έμ˜ λͺ¨λ“  과정을 μ»¨ν…Œμ΄λ„ˆκ°€ μ œμ–΄ν•©λ‹ˆλ‹€.

2. μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection)

  • μ»¨ν…Œμ΄λ„ˆλŠ” 빈 κ°„μ˜ μ˜μ‘΄μ„±μ„ λΆ„μ„ν•˜κ³ , ν•„μš”ν•œ 경우 μ˜μ‘΄μ„±μ„ μžλ™μœΌλ‘œ μ£Όμž…ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” 객체λ₯Ό 직접 μƒμ„±ν•˜κ±°λ‚˜ μ—°κ²°ν•  ν•„μš” 없이, ν•„μš”ν•œ 객체λ₯Ό μ»¨ν…Œμ΄λ„ˆκ°€ μ£Όμž…ν•΄μ€λ‹ˆλ‹€.

3. 빈 μ„€μ • 및 ꡬ성.

  • Spring μ»¨ν…Œμ΄λ„ˆλŠ” XML 파일, μžλ°” μ„€μ • 클래슀, μ–΄λ…Έν…Œμ΄μ…˜ 등을 톡해 μ„€μ •λœ 빈의 ꡬ성을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • μ„€μ • νŒŒμΌμ΄λ‚˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 각 빈이 μ–΄λ–€ λ‹€λ₯Έ λΉˆμ„ ν•„μš”λ‘œ ν•˜λŠ”μ§€ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. 빈의 생λͺ…μ£ΌκΈ° 관리.

  • μ»¨ν…Œμ΄λ„ˆλŠ” 빈의 생λͺ…μ£ΌκΈ°(생성, μ΄ˆκΈ°ν™”, μ‚¬μš©, μ†Œλ©Έ)λ₯Ό μ œμ–΄ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ μ»¨ν…Œμ΄λ„ˆλŠ” ν•„μš”ν•œ λΉˆμ„ μƒμ„±ν•˜κ³ , μ’…λ£Œλ  λ•Œ 빈의 μžμ›μ„ ν•΄μ œν•˜λŠ” λ“±μ˜ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

5. μŠ€μ½”ν”„ 관리.

  • Spring μ»¨ν…Œμ΄λ‚˜λŠ” 빈의 μŠ€μ½”ν”„λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • μ‹±κΈ€μ½˜ μŠ€μ½”ν”„(μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ²΄μ—μ„œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ 쑴재) λ˜λŠ” ν”„λ‘œν† νƒ€μž… μŠ€μ½”ν”„(μš”μ²­λ§ˆλ‹€ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€ 생성)λ“±μ˜ λ‹€μ–‘ν•œ μŠ€μ½”ν”„λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.

2️⃣ Spring μ»¨ν…Œμ΄λ„ˆμ˜ μœ ν˜•.

Spring μ»¨ν…Œμ΄λ„ˆλŠ” λ‹€μ–‘ν•œ μœ ν˜•μ΄ 있으며, 이듀은 λͺ¨λ‘ 기본적으둜 λ™μΌν•œ IoC κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€λ§Œ, μ‚¬μš© λͺ©μ μ΄λ‚˜ ꡬ성이 λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

1. BeanFactory

  • Spring의 κ°€μž₯ 기본적인 IoC μ»¨ν…Œμ΄λ„ˆμž…λ‹ˆλ‹€
  • 지연 λ‘œλ”©(lazy loading) 을 μ‚¬μš©ν•˜μ—¬ 빈이 μ‹€μ œλ‘œ ν•„μš”ν•  λ•ŒκΉŒμ§€ μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 이 방식은 λ¦¬μ†ŒμŠ€κ°€ μ œν•œλœ ν™˜κ²½μ—μ„œ μœ μš©ν•˜μ§€λ§Œ, λ³΅μž‘ν•œ ν•΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 거의 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

2. ApplicationContext

  • Spring μ»¨ν…Œμ΄λ„ˆμ˜ 보닀 ν™•μž₯된 ν˜•νƒœλ‘œ, μ¦‰μ‹œ λ‘œλ”©(eager loading) 방식을 μ‚¬μš©ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘μ‹œ λΉˆμ„ 미리 μƒμ„±ν•©λ‹ˆλ‹€.
  • ApplicationContextλŠ” BeanFactory의 λͺ¨λ“  κΈ°λŠ₯을 ν¬ν•¨ν•˜μ—¬, 좔가적인 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 이 μ»¨ν…Œμ΄λ„ˆλŠ” λŒ€λΆ€λΆ„μ˜ Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

μ£Όμš” κ΅¬ν˜„μ²΄.

  • ClassPathXmlApplicationContext : XML μ„€μ • νŒŒμΌμ„ μ‚¬μš©ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.
  • AnnotationConfigApplicationContext : μžλ°” 기반 섀정을 μ‚¬μš©ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.
  • WebApplicationContext : Spring MVC μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©λ˜λŠ” μ»¨ν…Œμ΄λ„ˆλ‘œ, μ›Ή ν™˜κ²½μ— λ§žλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

3️⃣ Spring μ»¨ν…Œμ΄λ„ˆμ˜ λ™μž‘ κ³Όμ •.

1. 빈 μ •μ˜ 및 등둝

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•  λΉˆμ„ μ„€μ • 파일(XML, μžλ°” 클래슀) λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 μ •μ˜ν•©λ‹ˆλ‹€.
  • 이 빈 μ •μ˜λŠ” Spring μ»¨ν…Œμ΄λ„ˆκ°€ 관리할 객체의 청사진 역할을 ν•©λ‹ˆλ‹€.

2. μ»¨ν…Œμ΄λ„ˆ μ΄ˆκΈ°ν™”

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ Spring μ»¨ν…Œμ΄λ„ˆκ°€ μ΄ˆκΈ°ν™”λ˜λ©°, λΉˆμ„ μƒμ„±ν•˜κ³  μ˜μ‘΄μ„±μ„ μ£Όμž…ν•©λ‹ˆλ‹€.
  • μ΄λ•Œ μ»¨ν…Œμ΄λ„ˆλŠ” 섀정에 따라 λΉˆμ„ μƒμ„±ν•˜κ³  빈 μ‚¬μ΄μ˜ 의쑴 관계λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

3. 빈 μš”μ²­ 및 μ‚¬μš©

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 빈이 ν•„μš”ν•  λ•Œ, μ»¨ν…Œμ΄λ„ˆμ—μ„œ λΉˆμ„ μš”μ²­ν•©λ‹ˆλ‹€.
  • μ»¨ν…Œμ΄λ„ˆλŠ” μš”μ²­λœ λΉˆμ„ λ°˜ν™˜ν•˜λ©°, 이 λΉˆμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

4. 빈 μ†Œλ©Έ

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œλ˜κ±°λ‚˜ 빈이 더 이상 ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©΄, μ»¨ν…Œμ΄λ„ˆλŠ” 빈의 μ†Œλ©Έ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ λΉˆμ„ 적절히 μ •λ¦¬ν•©λ‹ˆλ‹€.

4️⃣ Spring μ»¨ν…Œμ΄λ„ˆμ˜ μ˜ˆμ‹œ

1. 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="userService" class="com.example.UserService">
        <property name="userRepository" ref="userRepository"/>
    </bean>

    <bean id="userRepository" class="com.example.UserRepository"/>
</beans>
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = context.getBean(UserService.class);

2. μžλ°” μ„€μ • 기반 μ»¨ν…Œμ΄λ„ˆ

@Configuration
public class AppConfig {
    
    @Bean
    public UserService userService() {
        return new UserService(userRepository());
    }
    
    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }
}
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);

3. μ–΄λ…Έν…Œμ΄μ…˜ 기반 μ„€μ •

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
}
@ComponentScan(basePackages = "com.example")
@Configuration
public class AppConfig {}
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);

5️⃣ κ²°λ‘ 

Spring μ»¨ν…Œμ΄λ„ˆλŠ” Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 객체(빈)의 생성, 관리, μ˜μ‘΄μ„± μ£Όμž… 등을 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 핡심 μΈν”„λΌμž…λ‹ˆλ‹€.
이λ₯Ό 톡해 κ°œλ°œμžλŠ” 객체 생성 및 κ΄€λ¦¬μ˜ λ³΅μž‘μ„±μ„ 쀄이고, μ½”λ“œμ˜ λͺ¨λ“ˆν™”와 μœ μ—°μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
λ‹€μ–‘ν•œ μ„€μ • 방식(XML, μžλ°” μ„€μ •, μ–΄λ…Έν…Œμ΄μ…˜ λ“±)을 톡해 κ°œλ°œμžλŠ” μ»¨ν…Œμ΄λ„ˆμ™€ λΉˆμ„ μ‰½κ²Œ κ΅¬μ„±ν•˜κ³  관리할 수 μžˆμŠ΅λ‹ˆλ‹€.