
책에서는 코드로 설명하는 부분이 많아 개념적인 내용만 정리. 코드와 관련된 것은 깃허브의 코드를 통해 실습을 하고 있음.
- DI(Dependency Injection)는 프로그램 설계에서 객체를 직접 생성하지 않고 외부에서 전달받아 사용하는 방식입니다.
- DI에서 'Dependency(의존성)'는 사용될 객체를 의미하고, 'Injection(주입)'은 이 객체를 외부에서 넣어준다는 뜻입니다.
즉, 필요한 객체를 직접 만들지 않고 외부에서 생성해서 전달받아 사용하는 방식을 말합니다. 이를 통해 코드의 결합도를 낮추고, 프로그램의 유연성과 재사용성을 높일 수 있습니다.

애플리케이션이 커지면 외부에서 준비해야 할 객체의 수가 급증합니다. Service나 Repository 같은 객체 몇 개만 있을 때는 문제가 없지만, 실제 개발에서는 수백 개에 달하는 객체를 준비하고 이를 다른 객체에 주입하는 과정이 복잡해집니다. 이로 인해 객체 관리가 번거로워지고, 유지보수가 어려워질 수 있습니다.
DI 컨테이너 (공식 매뉴얼에서는 'IoC 컨테이너') : '외부'에서 하는 처리를 담당하는 스프링의 기능
- 대량의 객체 생성이나 DI을 간결한 코드로 처리해주는 기능이 있다.
- 외부에서 직접 생성하는 문제를 해결 할 수 있음.
- Bean DI 컨테이너가 관리하는 객체를 말함. JavaBeans랑 전혀 다른 것, 스프링의 고유한 용어 - Bean 정의 Bean를 정의하는 정보를 가리킴, 관리할 객체의 구상 클래스가 무엇인지, 어느 의존 객체를 인젝션할 것인지에 대한 정보를 말함 - 설정 정보(Configuration) DI 컨테이너로 불러올 정보. 설정 정보에는 Bean 정의도 포함. Bean 정의 외에도 DI 컨테이너의 특정 기능을 활성화 또는 비활성화 할 수 있는 정보가 포함. DI 컨테이너에서 불러오면 설정 정보에 따라 Bean 객체가 생성되며 의존 객체가 인젝션 - 애플리케이션 컨텍스트 (Application Context) DI 컨테이너의 다른 이름.
DI 컨테이너를 불러올 설정 정보를 JavaConfig로 불리는 클래스에 작성. @Configuration을 붙이면 스프링은 이를 JavaConfig로 인식하고, DI 컨테이너의 특정 기능을 활성하거나 Bean 정의를 설정함.
Bean 정의를 작성하는 대표적인 방법
스프링에서 객체를 관리하는 3가지 방식
- Stereotype Annotation
- Stereotype Annotation은 스프링이 자동으로 객체를 생성하고 관리할 수 있도록 하는 어노테이션입니다.
대표적인 Stereotype Annotation에는@Component,@Service,@Repository,@Controller가 있으며, 특정 클래스가 스프링에서 관리할 빈(Bean)임을 나타냅니다.
이 어노테이션을 사용하면 자동으로 DI 컨테이너에 등록되며, 의존성 주입이 필요할 때 스프링이 해당 객체를 주입해줍니다.- @Bean 메소드
@Bean어노테이션은 Java Config 클래스 내에서 특정 메서드가 반환하는 객체를 스프링 빈으로 등록하고자 할 때 사용합니다.
주로@Configuration이 적용된 클래스에서 사용되며, 이 메소드가 반환하는 객체는 스프링 컨테이너에서 관리됩니다.
@Bean을 사용하면 메서드 명으로 빈의 이름이 지정되며, 세부적인 설정을 적용해 특정 조건에 따라 객체를 설정하거나 주입할 수 있는 유연성을 제공합니다.<bean>태그
<bean>태그는 XML 기반의 설정 방식에서 스프링 빈을 정의할 때 사용됩니다.
<bean>태그를 통해 객체의 클래스를 명시하고, 생성자나 세터를 통해 필요한 의존성을 지정할 수 있습니다.
XML 설정 파일에 작성된<bean>태그는 스프링 IoC 컨테이너가 읽어들여 필요한 빈을 생성하고 관리하게 됩니다.
실제로 사용했었던 예시
@Configuration public class AppConfig { //IamPort API 사용을 위한 API 키와 Secret Key @Value("${iamport.apiKey}") String apiKey; //API 발급키 //시크릿키 @Value("${iamport.apiSecret}") String secretKey; @Bean public IamportClient iamportClient() { return new IamportClient(apiKey, secretKey); //API 키와 시크릿키 사용하여 인스턴스 생성 및 반환 } }
그림출처 : 그림으로 보는 스프링6 책 중