코딩항해기

[Spring] @어노테이션 의존성 주입 (Component, Autowired, Qualifier) 본문

Spring

[Spring] @어노테이션 의존성 주입 (Component, Autowired, Qualifier)

miniBcake 2024. 10. 4. 12:57

 

 

 

[Spring] xml Bean을 통한 의존성 주입 (CI, SI)

의존성 주입 DI (Dependency Injection)Spring 컨테이너에서 객체 Bean을 먼저 생성해두고 생성한 객체를 지정한 객체에 주입하는 방식을 의존성 주입이라고 한다.기존에는 new를 사용해 개발자가 직접 관

minibcake.tistory.com

 

 

xml 방식의 단점

전통적인 Spring에서는 xml방식을 주로 사용했으나, 객체가 무수히 많아지면 전부 xml에 작성해야하므로 양이 방대해지고, 오탈자가 있을 경우 ctrl F를 통해 원하는 객체를 찾는 것도 어려워진다. 이러한 과도한 설정 문제를 개선하기 위해 어노테이션을 활용한 설정을 개발했다.

(복잡성, 유효성 검사의 어려움, 타입 안정성 부재, 추가 작업 필요 등의 단점을 가지고 있다.)

 

 

@어노테이션

Spring 3.0부터는 어노테이션, 즉 JAVA 코드를 사용한 설정을 지원하기 시작했다. 굉장히 다양한 어노테이션이 존재하고 있으며, 다양한 설정을 지원한다. 이 어노테이션은 컴파일 전에 확인하게되며, xml에서 별도의 설정을 한다. 어노테이션도 제법 오래된 기술이기 때문에 설정 방식이 많이 있는 것으로 보이는데, 이 방식은 조금 구버전이라는 것 같다.

 


 

@Component("객체명설정")

Componet는 기존 xml 파읠의 Bean 태그를 대신한다. 기존 bean 태그는 class와 id를 갖고 있는데 class는 어노테이션이 달린 위치에서 확인할 수 있으므로 id만 ()안에 문자열로 설정하면 된다. 해당 어노테이션은 파일 상단에 작성한다. (Class명 위에) 어노테이션과 xml 설정을 함께 사용하면 충돌이 발생하므로 어노테이션을 사용했다면 xml에서는 삭제한다.

@Component("galaxyWatch") //galaxyWatch로 해당 객체 호출
public class GalaxyWatch implements Watch {
    //생성자
    public GalaxyWatch(){
        System.out.println("Galaxy Watch 생성자 실행");
    }
}

 

 

@Autowired

Autowired는 의존성 주입을 자동으로 한다. 의존성 주입이 필요한 필드마다 설정해주면되고 필드의 타입을 보고 자동으로 의존성을 주입한다. 이 때 해당 타입을 가진 주입 객체가 여러 개 있다면 주입 모호성이 발생해 예외가 발생하게 된다. 이 경우 모호성을 유발하는 객체를 전부 컨테이너에서 내리거나 다른 어노테이션을 통해 어떤 객체를 사용할지 지정해줄 수 있다.

@Component("apple")
public class Iphone implements Phone {
	@Autowired //자동 의존 주입 (타입으로 주입)
	private Watch watch; //DI대상

	public Iphone() {
		System.out.println("아이폰 객체 생성");
		//멤버변수 초기화
	}
}

 

 

 

@Qualifier("객체명")

모호성 문제가 발생했을 때 특정 객체를 지정해주는 어노테이션이다. Qualifier를 추가하면 타입 조건 외에도 객체명 조건이 추가되어 어떤 객체를 주입해야하는지 명확해진다. 다만 성능 상에서 문제가 있으므로 성능에 예민한 프로젝트에서는 잘 사용되지 않으며 타입을 하나로 좁혀 모호성 발생을 해결하게 된다. 즉, 어노테이션과 xml을 혼합해 사용하게 된다.

@Component("apple")
public class Iphone implements Phone {
	@Autowired
    @Qualifier("appleWatch") //Watch타입의 객체 중 appleWatch id를 가진 객체를 주입
	private Watch watch; //DI대상

	public Iphone() {
		System.out.println("아이폰 객체 생성");
		//멤버변수 초기화
	}
}