예전부터 이해가 잘되지 않았던 AutoWired는 무엇이며 왜 쓰고 지금은 왜 사용하지 않는지에 대해 알아보자.
📌 @Autuwired 한 줄 요약
➡️ @Autowired는 "Spring에게 대신 객체를 만들어서 넣어달라고 하는 표시"이다
@Autuwired가 없을 경우
OrderService orderService = new OrderService();
@Autowired가 있는 경우
@Autowired
OrderService orderService;
SpringBoot에서는 객체를 미리 만들어서 보관하는데 이것을 Bean이라고 한다.
@Autowired가 붙어있으면 "여기에 Bean(객체)을 넣어줘야 하는구나"라고 SpringBoot가 이해한다.
📝 예제
@Service
public class OrderService {
public String order() {
return "주문 완료!"
}
}
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("/order")
public String order() {
return orderService.order();
}
예제를 보면 OrderService객체를 구현하는데 @Autowired를 이용하기 때문에 "new OrderService()"를 선언하지 않는것을 확인 할 수 있다.
그렇다면 위 예제에서 @Autowired가 없다면 어떻게되는가?
➡️ order에서 orderService.order를 리턴값으로 반환할 때 NullPointerException을 반환하게 된다
권장되는 방식(생성자 주입) 예제
@RestController
public class OrderController {
private final OrderService orderService;
public OrderController(Orderservice orderService) {
this.orderService = orderService;
}
@GetMapping("/order")
public String order() {
return orderService.order();
}
}
왜 @Autowired를 사용하지 않는게 권장되는가?
➡️ 컴파일 시점에는 에러가 발생하지 않기 때문
실제로 실행하여 에러가 발생하기 전까지는 모르기 때문이다.
➡️ final을 사용하지 못한다.
final을 사용하지 못한다는 말인 즉 불안정한 객체로서 나중에 바뀔 수 있는 가능성이 존재하는 것이다.
'Java' 카테고리의 다른 글
| [Java] Garbage Collector에 대해 알아보자 (0) | 2026.01.04 |
|---|---|
| [Java] 단위 테스트와 통합 테스트의 차이점과 장단점 (0) | 2026.01.02 |
| [Java] StringBuffer (2) | 2023.03.07 |
| [JSP] 절대경로 구하는법 (0) | 2020.12.19 |
| 자바 환경변수 설정이 필요한 이유? (0) | 2020.08.06 |