유정잉

@Autowired, @Qualifier("이름"), @Resource(name="이름") 본문

개발자 공부/♡ Spring XML

@Autowired, @Qualifier("이름"), @Resource(name="이름")

유정♡ 2025. 2. 4. 09:38

📌 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을 주입하는 과정

  1. @Autowired를 보면, setEngine(Engine engine)의 매개변수 타입이 Engine임!
  2. Spring은 Engine이라는 "타입"을 가진 Bean을 찾음!
  3. 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와 거의 같은 역할을 함! 

 

728x90