일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- jquery
- 문자열
- API
- View
- 조건문
- Thymeleaf
- html
- Uipath
- git
- 배열
- string
- Oracle
- Java
- Database
- Array
- 이클립스
- 상속
- SpringBoot
- rpa
- mysql
- React
- Board
- JDBC
- MVC
- db
- Scanner
- jsp
- spring
- Controller
- Eclipse
- Today
- Total
유정잉
@Autowired, @Qualifier("이름"), @Resource(name="이름") 본문
📌 Spring에서 "타입(Type) 기준으로 Bean을 찾는다"는 말의 의미
✅ Spring에서 @Autowired를 사용하면 "이름"이 아니라 "타입"을 기준으로 Bean을 찾아서 주입함!
✅ 즉, 변수의 자료형(클래스 타입)을 기준으로, 그에 맞는 객체(Bean)를 자동으로 넣어줌
1️⃣ 타입(Type) 기준으로 찾는다는 게 무슨 의미일까?
우선 "타입 기준" vs "이름 기준"을 비교해서 이해해보자!
🔹 ① 타입(Type) 기준 (@Autowired)
@Component // Spring이 자동으로 Bean으로 등록
class Engine {
public String getType() {
return "V8 Engine";
}
}
@Component
class Car {
private Engine engine; // Engine 타입의 Bean을 넣어야 함
@Autowired // Engine 타입의 Bean을 찾아서 자동 주입
public void setEngine(Engine engine) {
this.engine = engine;
}
public void showEngineType() {
System.out.println("Car engine: " + engine.getType());
}
}
✅ 실행 코드
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
car.showEngineType(); // 출력: Car engine: V8 Engine
🔍 Spring이 자동으로 Bean을 주입하는 과정
- @Autowired를 보면, setEngine(Engine engine)의 매개변수 타입이 Engine임!
- Spring은 Engine이라는 "타입"을 가진 Bean을 찾음!
- Engine 타입의 Bean이 등록되어 있기 때문에 자동으로 engine에 넣어줌!
✅ 즉, @Autowired는 Bean의 "이름"을 신경 쓰지 않고, "타입"만 보고 자동으로 찾아서 주입함!
🔹 ② 이름(Name) 기준 (@Resource)
반대로 **이름을 기준으로 찾는 방식(@Resource)**을 보자!
@Component("v8Engine") // Bean의 이름을 "v8Engine"으로 지정
class Engine {
public String getType() {
return "V8 Engine";
}
}
@Component
class Car {
private Engine engine;
@Resource(name = "v8Engine") // "v8Engine"이라는 이름의 Bean을 찾아서 주입
public void setEngine(Engine engine) {
this.engine = engine;
}
public void showEngineType() {
System.out.println("Car engine: " + engine.getType());
}
}
✅ 여기서는 @Resource(name="v8Engine")을 사용해서, Bean의 "이름"을 기준으로 찾아서 주입!
✅ 즉, "타입"이 아니라 "이름"을 기준으로 특정 Bean을 찾아서 넣어주는 방식!
2️⃣ 같은 타입의 Bean이 여러 개 있을 때는 어떻게 될까?
💡 만약 같은 타입의 Bean이 여러 개 있으면 @Autowired는 어떤 걸 써야 할지 모름!
@Component("v8Engine") // Bean의 이름이 "v8Engine"
class V8Engine extends Engine {
public String getType() {
return "V8 Engine";
}
}
@Component("electricEngine") // Bean의 이름이 "electricEngine"
class ElectricEngine extends Engine {
public String getType() {
return "Electric Engine";
}
}
@Component
class Car {
private Engine engine;
@Autowired // ❌ 같은 타입(Engine)이 2개 있어서 에러 발생!
public void setEngine(Engine engine) {
this.engine = engine;
}
public void showEngineType() {
System.out.println("Car engine: " + engine.getType());
}
}
💥 실행하면 오류 발생!
No qualifying bean of type 'Engine' available: expected single matching bean but found 2
🚨 Spring이 Engine 타입의 Bean을 찾으려고 했는데, 두 개(V8Engine, ElectricEngine)가 있어서 충돌 발생!
🚨 어떤 Bean을 넣어야 할지 모르기 때문에 오류가 나는 것!
3️⃣ 해결 방법 (이름을 지정하기)
✅ 방법 1: @Qualifier("이름")을 사용해서 특정 Bean 지정
@Component
class Car {
private Engine engine;
@Autowired
@Qualifier("electricEngine") // "electricEngine"을 사용하도록 지정!
public void setEngine(Engine engine) {
this.engine = engine;
}
public void showEngineType() {
System.out.println("Car engine: " + engine.getType());
}
}
✅ @Qualifier("electricEngine")을 추가하면 "electricEngine"이라는 Bean을 명확하게 선택해서 주입 가능!
✅ 방법 2: @Resource(name="이름")을 사용해서 특정 Bean 지정
@Component
class Car {
private Engine engine;
@Resource(name = "electricEngine") // "electricEngine" Bean을 찾아서 주입!
public void setEngine(Engine engine) {
this.engine = engine;
}
public void showEngineType() {
System.out.println("Car engine: " + engine.getType());
}
}
✅ @Resource(name="electricEngine")을 사용하면 이름 기준으로 Bean을 찾아서 주입 가능!
✅ @Autowired + @Qualifier를 사용하는 것과 동일한 효과!
🔥 결론
비교 항목@Autowired (기본값)@Qualifier("이름")@Resource(name="이름")
주입 기준 | 타입(Type) 기준으로 Bean을 찾음 | 특정 Bean을 선택할 때 사용 | 이름(Name) 기준으로 Bean을 찾음 |
같은 타입의 Bean이 여러 개 있을 때 | 충돌 발생 (어떤 걸 써야 할지 모름) | 특정 Bean을 선택 가능 | 특정 Bean을 선택 가능 |
Spring 전용 여부 | Spring 전용 | Spring 전용 | Java 표준 JSR-250 어노테이션 (다른 프레임워크에서도 사용 가능) |
✅ @Autowired는 기본적으로 "타입" 기준으로 자동으로 Bean을 찾음!
✅ 같은 타입의 Bean이 여러 개 있으면 "어떤 걸 써야 할지 모르기 때문에 오류 발생!"
✅ 이때, @Qualifier("이름") 또는 @Resource(name="이름")을 사용하면 특정 Bean을 선택 가능!
📌 최종 요약
1️⃣ @Autowired → "타입(Type)"을 기준으로 Bean을 찾아서 자동 주입!
2️⃣ 같은 타입의 Bean이 여러 개 있으면 "어떤 걸 써야 할지 몰라서 오류 발생"
3️⃣ @Qualifier("이름")을 사용하면 "특정 Bean을 선택" 가능!
4️⃣ @Resource(name="이름")을 사용하면 "이름(Name)"을 기준으로 Bean을 찾아서 주입
5️⃣ @Resource(name="이름")은 @Autowired + @Qualifier와 거의 같은 역할을 함!
'개발자 공부 > ♡ Spring XML' 카테고리의 다른 글
@RequestParam vs @PathVariable vs @RequestBody (0) | 2025.02.04 |
---|---|
Spring MVC와 JSP를 이용 (0) | 2025.02.04 |
@ComponentScan과 @Bean의 차이점 (0) | 2025.02.04 |
Spring의 의존성 주입(DI) 4가지 방식 [ @Autowired, 생성자, 컬렉션, Setter ] (1) | 2025.02.03 |
Spring XML 설정으로 [ Constructor DI(생성자 주입) ] (0) | 2025.02.03 |