Spring Framework는 DI를 구현하기 위해 IoC(Inversion of Control) 컨테이너를 사용한다. IoC 컨테이너는 애플리케이션의 객체 생명주기를 관리하고, 객체 간의 의존성을 주입하는 역할을 한다.
이를 통해 개발자는 객체를 생성하거나 관리할 필요 없이, 필요한 객체를 Spring 컨테이너가 자동으로 주입해 주기 때문에 코드의 결합도가 낮아지고 유지보수가 쉬워진다.
@Configuration과 @Bean 애너테이션을 사용하여 Java 클래스로 의존성을 설정한다.@Component, @Autowired, @Service, @Repository 등의 애너테이션을 상요하여 컴포넌트 스캔과 자동 주입을 설정한다.@Autowired 애너테이션을 사용하여 주입.public interface MessageService {
void sendMessage(String message);
}
@Service
public class EmailMessageService implements MessageService {
@Override
public void sendMessage(String message) {
System.out.println("EmailMessageService: " + message);
}
}
@Component
public class MessageController {
private final MessageService messageService;
public MessageController(MessageService messageService) {
this.messageService = messageService;
}
public void processMessage(String message) {
messageService.sendMessage(message);
}
}
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
MessageController controller = context.getBean(MessageController.class);
controller.processMessage("Hello, Dependency Injection in Spring!");
}
}
@SpringBootApplication: Spring Boot 애플리케이션의 시작점을 설정하며, 컴포넌트 스캔이 이루어져 자동으로 @Component, @Service, @Repository 등의 Bean을 탐색하고 IoC 컨테이너에 등록한다.@Autowired: Spring에서 의존성 자동 주입을 위해 사용된다. 생성자 주입 방식 외에도 필드 주입(@Autowired를 필드 위에 선언)과 세터 주입(@Autowired를 세터 메서드에 선언) 방식이 있다.@Component 및 @Service: Spring 컨테이너가 해당 클래스를 Bean으로 인식하도록 한다. @Service는 주로 서비스 계층에 사용되며, @Component는 일반적인 클래스에 사용할 수 있다. (각 애노테이션마다 상징하는 기능에 맞게 선언하여 사용)