DI — 실습 / 약 20분
전 차시 IoC 코드를 Spring 으로 다시 짭니다. @Service, @Autowired 한 줄씩이 main 메서드의 수동 주입을 어떻게 대체하는지 직접 봅니다.
Eclipse 메뉴: File → New → Spring Legacy Project. Spring MVC Project 템플릿 선택. (강사의 안내가 있다면 그대로 따르기.)
pom.xml, web.xml, servlet-context.xml, root-context.xml 이 보이나요?// MessageSender.java
package com.example.demo;
public interface MessageSender {
void send(String msg);
}
// GmailSender.java
@Service
public class GmailSender implements MessageSender {
public void send(String msg) {
System.out.println("📧 " + msg);
}
}
@Service
public class OrderService {
@Autowired
private MessageSender sender;
public void order() {
sender.send("주문 완료");
}
}
@Autowired 한 줄로 컨테이너가 GmailSender 를 자동 주입합니다.
가장 간단한 방법은 컨트롤러에서 호출:
@Controller
public class HomeController {
@Autowired
private OrderService orderService;
@RequestMapping("/test")
public String test() {
orderService.order();
return "home";
}
}
Tomcat 실행 후 http://localhost:8080/.../test 접속. 콘솔에 "📧 주문 완료" 출력.
main 에서 부품을 직접 만들어 넘기는 코드가 있나요? 없습니다 — Spring 컨테이너가 자동으로 했음.new GmailSender() 가 있나요? 없습니다 — @Autowired 가 했음.KakaoSender 를 추가하고 GmailSender 의 @Service 를 잠시 주석 처리:
// @Service ← 주석
public class GmailSender implements MessageSender { ... }
@Service
public class KakaoSender implements MessageSender {
public void send(String msg) {
System.out.println("💬 " + msg);
}
}
OrderService 코드는 한 줄도 수정하지 않았는데 Kakao 가 호출됩니다.
@Service 로 Bean 등록@Autowired 로 자동 주입