Spring

  • ์Šคํ”„๋ง์€ IoC์™€ AOP๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์ปจํ…Œ์ด๋„ˆ ํ”„๋ ˆ์ž„์›Œํฌ.
  • ๊ฐœ์ธ์ ์œผ๋กœ ์Šคํ”„๋ง์„ ์•ˆ ์ข‹์•„ํ•˜์ง€๋งŒ ์Šคํ”„๋ง์˜ ์ฃผ์š” ๊ฐœ๋…๋“ค์ด ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งŽ์€ ์˜ํ–ฅ์„ ์ค€ ๊ฒƒ ๊ฐ™๋‹ค.
  • ์ง€๊ธˆ ์—…๋ฌด์—์„œ๋„ ์“ฐ๊ณ  ์žˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ์•Œ๊ฒ ๋Š”๋ฐ, ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

Spring vs Spring Boot

  • ์Šคํ”„๋ง์€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ.
  • ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์Šคํ”„๋ง์˜ ๊ฐ์ข… ์„ค์ •์„ ์ž๋™ํ™”ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ:
    • ์ž„๋ฒ ๋””๋“œ ํ†ฐ์บฃ - ํ†ฐ์บฃ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ๋ณ„๋„์˜ ์›น ์„œ๋ฒ„ ๊ตฌ์ถ•์ด ๋ถˆํ•„์š”ํ•˜๋‹ค.
    • ๋””ํŽœ๋˜์‹œ ์ž๋™ํ™” - ๋””ํŽœ๋˜์‹œ์˜ ๋ฒ„์ „ ์ถฉ๋Œ์„ ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • jar - war ํŒŒ์ผ๋กœ ๋นŒ๋“œ๋˜๋Š” ์Šคํ”„๋ง๊ณผ ๋‹ฌ๋ฆฌ jar ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌ๊ฐ€ ์‰ฝ๋‹ค.

IoC(Invertion of Control) Container

  • ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ค์ •์— ๋”ฐ๋ผ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค.
  • IoC๋Š” ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์˜ ๋””ํŽœ๋˜์‹œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณผ์ •:
    • ์ด๋•Œ ๋””ํŽœ๋˜์‹œ๋ฅผ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ด๋‹นํ•˜๋ฉฐ ์—ญ์ „์ด ์ผ์–ด๋‚œ๋‹ค.
    • ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ๋Š” IoC๋ฅผ DI๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ๋‹ค.
  • org.springframework.context.ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ๋Š” XML, ์ž๋ฐ” ์–ด๋…ธํ…Œ์ด์…˜, ๋˜๋Š” ์ž๋ฐ” ์ฝ”๋“œ๋กœ ํ‘œํ˜„๋œ ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค:
    • ์ „ํ†ต์ ์œผ๋กœ๋Š” XML์„ ์‚ฌ์šฉํ•œ๋‹ค - <beans ...> ... </beans>
    • ์ง€๊ธˆ์€ ๋Œ€๋ถ€๋ถ„ ์ž๋ฐ” ๊ธฐ๋ฐ˜์„ ์‚ฌ์šฉํ•œ๋‹ค - @Configuration, @Bean, @Import, @DependsOn
  • high-level์—์„œ ๋ณด๋ฉด ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ POJO๋ฅผ ์ฝ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค:

Bean

  • ์ž๋ฐ” ๋นˆ๊ณผ ์Šคํ”„๋ง ๋นˆ์ด ์žˆ๋‹ค:
    • ์ž๋ฐ” ๋นˆ์€ getter์™€ setter๋ฅผ ๊ฐ€์ง„ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ๋งํ•œ๋‹ค.
    • ์Šคํ”„๋ง ๋นˆ์€ ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งํ•œ๋‹ค. ์ฆ‰, ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋‹ค.
  • ๋นˆ์€ ์ปจํ…Œ์ด๋„ˆ์— ์ œ๊ณตํ•œ ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.
  • XML๋กœ ๋นˆ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค:
    <beans>
        <bean id="myService" class="com.acme.services.MyServiceImpl"/>
    </beans>
    
  • ๋‹น์—ฐํžˆ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ๋„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค:
    @Configuration
    class AppConfig {
    
        @Bean
        fun myService(): MyService {
            return MyServiceImpl()
        }
    }
    
    • ์Šคํ”„๋ง์€ @Component, @Service, @Controller ๋“ฑ ์Šคํ…Œ๋ ˆ์˜คํƒ€์ž… ์–ด๋…ธํ…Œ์ด์…˜๋„ ์ œ๊ณตํ•œ๋‹ค.
    • ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์€ ํด๋ž˜์Šค๋Š” ๋นˆ ์Šค์บ๋„ˆ๋ฅผ ํ†ตํ•ด ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.

Dependency Injection

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์งˆ์ˆ˜๋ก ๊ฐ์ฒด๊ฐ„์˜ ์˜์กด์„ฑ์ด ๋ณต์žกํ•ด์ง„๋‹ค:
    • ์˜์กด์„ฑ์ด ๋Š˜์–ด๋‚˜๋ฉด ์œ ๋‹› ํ…Œ์ŠคํŠธ๋„ ์–ด๋ ต๊ณ , ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ๋„ ์–ด๋ ค์›Œ์ง„๋‹ค.
  • ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ๊ฐ์ฒด ์˜์กด์„ฑ์ด ์ฃผ์ž…๋œ๋‹ค:
    • ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์˜์กด์„ฑ์ด ์ฃผ์ž…๋˜๋ฏ€๋กœ ๊ฐ์ฒด๊ฐ„์˜ ๊ฒฐํ•ฉ์ด ์ค„์–ด๋“ ๋‹ค.

Without DI

// An example without dependency injection
public class Client {
    // Internal reference to the service used by this client
    private ExampleService service;

    // Constructor
    Client() {
        // Specify a specific implementation in the constructor instead of using dependency injection
        service = new ExampleService();
    }

    // Method within this client that uses the services
    public String greet() {
        return "Hello " + service.getName();
    }
}

With DI

Constructor-based Injection

// Constructor
Client(Service service) {
    // Save the reference to the passed-in service inside this client
    this.service = service;
}
class Client(private val service: Service) {
    // business logic that actually uses the injected Service is omitted...
}
  • ์Šคํ”„๋ง 4.3 ๋ฒ„์ „๋ถ€ํ„ฐ ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ผ๋•Œ๋Š” @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋œ๋‹ค:
    • ์ฝ”ํ‹€๋ฆฐ์€ ํ•œ ํด๋ž˜์Šค์— ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ญ์ƒ ๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋„ ๋œ๋‹ค.

Setter-based Injection

// Setter method
@Autowired
public void setService(Service service) {
    // Save the reference to the passed-in service inside this client.
    this.service = service;
}
class Client {
    // a late-initialized property so that the Spring container can inject a Service
    @Autowired
    lateinit var service: Service

    // business logic that actually uses the injected Service is omitted...
}
  • @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค:
    • ์ด๋•Œ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.
    • ์–ด๋…ธํ…Œ์ด์…˜์ด ์•„๋‹ˆ๋ผ XML๋กœ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์€ ์•„๋‹ˆ๋‹ค.

AOP (Aspect-Oriented Programming)

  • ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ.
  • ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌ์™€ ๋ถ€๊ฐ€ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•ด ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก .
  • ์Šคํ”„๋ง์˜ ๊ธฐ๋ฐ˜ ์ฒ ํ•™์€ AOP. ๋งŽ์€ low-level API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

์ด ๋ฌธ์„œ๋ฅผ ์ธ์šฉํ•œ ๋ฌธ์„œ