๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring

[Spring] IoC ์ปจํ…Œ์ด๋„ˆ์™€ ์„ค์ • ๋ฐฉ๋ฒ•

by kriorsen 2024. 5. 1.

๐Ÿ“Œ  DI(Dependency Injection)

์˜์กด์„ฑ ์ฃผ์ž…์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ทธ ๊ฐ์ฒด๊ฐ€ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด ์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

interface MessageService {
    void sendMessage(String message, String receiver);
}

class EmailService implements MessageService {
    public void sendMessage(String message, String receiver) {
        // ์ด๋ฉ”์ผ ๋ณด๋‚ด๊ธฐ ๋กœ์ง
    }
}

 

์œ„ ์ฝ”๋“œ์— ์žˆ๋Š” MessageService๋ฅผ MyApplication์—์„œ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

class MyApplication {
    private MessageService email = new EmailService();

    public void processMessages(String message, String receiver) {
        // ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋กœ์ง
        email.sendEmail(message, receiver);
    }
}

 

MyApplication ๋‚ด๋ถ€์—์„œ EmailService ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” EmailService์™€ MyApplication ์‚ฌ์ด์˜ ๋†’์€ ๊ฒฐํ•ฉ๋„๋ฅผ ์•ผ๊ธฐํ•˜๋ฉฐ, EmailService๋ฅผ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ๊ต์ฒดํ•˜๋ ค๋ฉด MyApplication์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

class MyApplication {
    private MessageService service;

    // ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
    public MyApplication(MessageService svc) {
        this.service = svc;
    }

    public void processMessages(String message, String receiver) {
        // ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋กœ์ง
        service.sendMessage(message, receiver);
    }
}

 

๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ์œ ์—ฐํ•ด์ง„๋‹ค. EmailService์™€ MyApplication ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ด์ง„๋‹ค๋Š” ์ด์  ๋˜ํ•œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ  IoC(Inversion Of Control) ์ปจํ…Œ์ด๋„ˆ

IoC๋Š” ์ œ์–ด์˜ ์—ญ์ „์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ, ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ์ฑ…์ž„์„ ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ ์ถ”์ƒํ™”๋œ ํ”„๋ ˆ์ž„์›Œํฌ์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™์ด๋‹ค.

 

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” IoC๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค. IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” XML ์„ค์ • ํŒŒ์ผ ํ˜น์€ ์• ํ…Œ์ด์…˜(@Component)์„ ํ†ตํ•ด ์ œ๊ณต๋œ๋‹ค. ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋ฉฐ, ์ƒ์„ฑ๋œ Bean ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.


XML ๊ธฐ๋ฐ˜ ์„ค์ •

package learn.controller;

import learn.service.HelloService;

public class HelloController {
    private HelloService helloService;

    public HelloService getHelloService() {
        return helloService;
    }

    public void setHelloService(final HelloService helloService) {
        this.helloService = helloService;
    }
}
package learn.service;

public class HelloService {
}

 

์œ„์™€ ๊ฐ™์ด HelloService์™€ HelloController๊ฐ€ ์ •์˜๋˜์—ˆ์„ ๋•Œ, XML์„ ์ด์šฉํ•ด ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด XML ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<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
		https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloController"
          class="learn.controller.HelloController">
        <property name="helloService" ref="service" />
    </bean>
    <bean id="service" class="learn.service.HelloService">
    </bean>
</beans>

 

์œ„์™€ ๊ฐ™์ด <bean> ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— Bean์„ ์ •์˜ํ•˜๊ณ , <property> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

package learn;

import learn.service.HelloService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import learn.controller.HelloController;

public class Application {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloController helloController = context.getBean("controller", HelloController.class);
        HelloService injectedHelloService = helloController.getHelloService();
        System.out.println(helloController);

        HelloService helloService = context.getBean("service", HelloService.class);
        System.out.println(helloService.equals(injectedHelloService));
    }
}

 

 

resources ํด๋” ์— ์žˆ๋Š” XML ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€์„œ ApplicationContext๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ์ผ์— ์„ค์ •๋œ id ๊ฐ’์œผ๋กœ ํ•ด๋‹น Bean์„ ์กฐํšŒํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•œ Bean์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. 

 

์‹คํ–‰ ํ›„์—๋Š” ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Bean์„ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ApplicationContext์—์„œ ์ง์ ‘ ์กฐํšŒํ•œ HelloService ์ธ์Šคํ„ด์Šค์™€ HelloController์— ์ฃผ์ž…๋œ HelloService ๊ฐ์ฒด๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


Annotation ๊ธฐ๋ฐ˜ ์„ค์ • 

1. @Bean์„ ์ด์šฉํ•œ ์„ค์ •

package learn.config;

import learn.service.HelloService;
import learn.controller.HelloController;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public HelloService helloService() {
        return new HelloService();
    }

    @Bean
    public HelloController helloController() {
        return new HelloController(helloService());
    }
}

 

@Configuration์€ ์Šคํ”„๋ง ์„ค์ • ์ •๋ณด(Bean ์ •์˜)๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ์• ํ…Œ์ด์…˜์ด๋‹ค. @Bean์€ ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ๋กœ ์‚ฌ์šฉ๋˜์–ด, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง Bean์œผ๋กœ ๋“ฑ๋กํ•˜๋„๋ก ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. @Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์— @Bean์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ทธ ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ์ฒด๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” Bean์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค. 

package learn;

import learn.config.AppConfig;
import learn.controller.HelloController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Application {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        HelloController helloController = context.getBean(HelloController.class);
        System.out.println(helloController);
        System.out.println(helloController.getHelloService());
    }
}

 

๊ทธ๋ž˜์„œ AppConfig๋ฅผ ํ†ตํ•ด ApplicationContext๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Bean์ด ์ž˜ ๋“ฑ๋ก๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. @Autowired์™€ @Component๋ฅผ ์ด์šฉํ•œ ์„ค์ •

@Component

  • ํด๋ž˜์Šค ๋ ˆ๋ฒจ์˜ ์• ๋„ˆํ…Œ์ด์…˜์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Spring ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์•„ Spring IoC ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” Bean์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.
  • @Repository, @Service, @Controller ๋“ฑ์€ @Component์˜ ํŠนํ™”๋œ ํ˜•ํƒœ๋กœ, ๊ฐ๊ฐ์˜ ์˜์—ญ(์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต, ์„œ๋น„์Šค ๊ณ„์ธต, ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต)์— ๋งž๊ฒŒ ์ถ”๊ฐ€์ ์ธ ํŠน์ง•์„ ์ œ๊ณตํ•œ๋‹ค.

@Autowired

  • @Autowired๋Š” ํด๋ž˜์Šค์˜ ํ•„๋“œ, ์„ธํ„ฐ, ์ƒ์„ฑ์ž์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Spring IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์ด ์ฃผ์ž…๋œ๋‹ค.
  • ์ƒ์„ฑ์ž, ํ•„๋“œ, ์„ธํ„ฐ ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์˜์กด์„ฑ ์ฃผ์ž…์— ์žˆ์–ด์„œ ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์ด ๊ถŒ์žฅ๋œ๋‹ค. ์ด๋Š” ์ฃผ์ž… ๋ฐ›๋Š” ๊ฐ์ฒด๋“ค์„ ๋ถˆ๋ณ€(immutable)์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ˆœํ™˜ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋“ฑ์˜ ์ด์ ์ด ์žˆ๋‹ค.
  • ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ณ , ํ•ด๋‹น ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…๋“ค์ด Bean์œผ๋กœ ๋“ฑ๋ก ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” @Autowired ์• ๋„ˆํ…Œ์ด์…˜์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํ”„๋ง์€ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ์ž๋™์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‹œ๋„ํ•œ๋‹ค.
package learn.service;

import org.springframework.stereotype.Service;

@Service
public class HelloService {
}
package learn.controller;

import learn.service.HelloService;
import org.springframework.stereotype.Controller;

@Controller
public class HelloController {
    private HelloService helloService;

    // @Autowired ์ƒ๋žต
    public HelloController(HelloService helloService) {
        this.helloService = helloService;
    }

    public HelloService getHelloService() {
        return helloService;
    }
}
package learn.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "learn")
public class AppConfig {
}
package learn;

import learn.config.AppConfig;
import learn.controller.HelloController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Application {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        HelloController helloController = context.getBean(HelloController.class);
        System.out.println(helloController);
        System.out.println(helloController.getHelloService());
    }
}

 

์œ„์™€ ๊ฐ™์ด HelloController์™€ HelloService๋ฅผ ๊ฐ๊ฐ @Controller์™€ @Service ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด Bean์œผ๋กœ ๋“ฑ๋กํ•œ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋“ฑ๋ก๋œ ๋นˆ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ“Œ Annotaion Based์™€ XML๊ณผ์˜ ๊ด€๊ณ„

Annotaion Based ์„ค์ •

์• ๋„ˆํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์„ค์ •์€ Spring์—์„œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํŒŒ์ผ ๋Œ€์‹  ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ๋˜๋Š” ํ•„๋“œ ์„ ์–ธ์— ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

Annotaion Based์˜ ์žฅ์ 

1. ์ฝ”๋“œ ๋‚ด ๊ด€๋ จ์„ฑ

์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ์˜์กด์„ฑ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ์„ค์ • ์ •๋ณด๊ฐ€ ์ฝ”๋“œ ๋‚ด์— ์œ„์น˜ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์€ ํด๋ž˜์Šค์˜ ์—ญํ• ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

2. ๊ฐ„ํŽธํ•œ ์„ค์ •

XML ๊ธฐ๋ฐ˜ ์„ค์ •์— ๋น„ํ•ด ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ๋ณต์žกํ•œ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹  ํด๋ž˜์Šค์— ์ง์ ‘ ์• ๋„ˆํ…Œ์ด์…˜์„ ์ ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. 

 

3. ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

์• ๋„ˆํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ ์„ค์ •์€ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค. @ComponentScan์„ ํ™œ์šฉํ•˜๋ฉด ์ง€์ •๋œ ํŒจํ‚ค์ง€์—์„œ @Component, @Service ๋“ฑ์˜ ์• ๋„ˆํ…Œ์ด์…˜์„ ๊ฐ–๋Š” ํด๋ž˜์Šค๋“ค์„ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•˜์—ฌ ๋นˆ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋”๋ผ๋„ ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค.

 

XML๊ณผ์˜ ๊ด€๊ณ„

์• ๋„ˆํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์„ค์ •๊ณผ XML ์„ค์ •์€ ์ƒํ˜ธ ๋ณด์™„์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์• ๋„ˆํ…Œ์ด์…˜์ด ํด๋ž˜์Šค์— ์ง์ ‘ ์ ์šฉ๋˜์–ด ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€์ง€๋งŒ, XML์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ์‹ค์ œ๋กœ Spring์€ ์• ๋„ˆํ…Œ์ด์…˜๊ณผ XML ์„ค์ •์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค. ๋‹จ, ์• ๋„ˆํ…Œ์ด์…˜์„ ์ด์šฉํ•œ ์ฃผ์ž…์ด XML์„ ํ†ตํ•œ ์ฃผ์ž…๋ณด๋‹ค ์šฐ์„ ์‹œ๋œ๋‹ค. ์ ˆ๋Œ€์ ์œผ๋กœ ์–ด๋Š ๋ฐฉ์‹์ด ๋” ๋‚ซ๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๊ธฐ ์–ด๋ ต๊ธฐ์— ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

https://docs.spring.io/spring-framework/reference/core/beans/annotation-config.html#page-title

https://docs.spring.io/spring-framework/reference/core/beans/java/configuration-annotation.html

https://docs.spring.io/spring-framework/reference/core/beans/introduction.html

https://docs.spring.io/spring-framework/reference/core/beans/basics.html