▸Spring MVC/기본 문법

@Resource, @Inject, @Autowired 사용 (자동 의존성 주입)

코데방 2020. 3. 18.
728x90
- Develop OS : Windows10 Ent, 64bit
- WEB/WAS Server : Tomcat v9.0
- DBMS : MySQL 5.7.29 for Linux (Docker)
- Language : JAVA 1.8 (JDK 1.8)
- Framwork : Spring 3.1.1 Release
- Build Tool : Maven 3.6.3
- ORM : Mybatis 3.2.8

 

세 개의 어노테이션은 컨테이너에 생성된 빈(Bean) 객체를 자동으로 주입받을 수 있도록 해주는 어노테이션입니다. Bean 객체를 이용할 때 코드를 아주 간결하게 해주기 때문에 필수로 사용되는 어노테이션입니다. 

 

주의할 점으로는 Bean 객체가 생성될 때 어노테이션을 스캔해서 자동 주입해줍니다. 그냥 일반적인 방법으로 해당 클래스의 인스턴스를 new로 생성하면 어노테이션은 작동하지 않습니다. 그냥 빈(Bean) 설정 파일에서 일일이 ref="다른 Bean" 이렇게 작성해주는 부분을 생략할 수 있도록 해준다고 생각하면 됩니다. 물론 설정파일에서 Bean을 등록하지 않고 어노테이션을 통해 등록할 수도 있는데 이 때도 마찬가지입니다.

 

 

 

그리고 컨테이너를 생성하는 시점에 xml을 파싱할 때 어노테이션을 사용한 클래스도 같이 검색해서 하나의 완전한 xml 파일을 생성할 수 있도록 아래와 같이 스캔할 패키지 범위를 정해줘야 합니다. 뒤에다가 .* 형식으로 작성하면 하위 패키지까지 모두 범위에 넣게 됩니다. 

 <context:component-scan base-package="패키지 full path"/>

 

  @Resource @Inject @Autowired
의존 Java Javax Spring
사용 가능 위치

- 필드

- 파라미터가 한 개인 setter

- 필드

- 생성자

- setter

- 필드

- 생성자

- setter

Bean 검색

우선순위

이름 -> 타입 타입 -> 이름 타입 -> 이름
Bean 강제 지정 @Resource(name="ID")

@Inject

@Named("ID")

@Autowired

@Qualifier("ID")

Bean 없을 경 예외 발생

예외 발생

@Autowired(required=false) 처리하면 예외 발생 방지

 

 


 

 

@Resource

 

필드명 또는 생성자 파라미터 변수의 이름과 Bean 객체의 ID를 매핑시켜서 먼저 찾는 방식입니다. 만약 매핑되는 ID가 없으면 타입을 검색해서 찾아줍니다. 그런데 같은 타입도 없다면 예외를 발생시킵니다. (name="ID")로 ID를 강제 지정할 수도 있습니다.

 

타입 또는 이름이 항상 맞으면 좋겠지만 오버라이딩을 사용하는 경우 둘 다 달라질 수 있기 때문에 항상 이름을 명시해서 사용해주는 것이 나중에 보기도 좋고 안정적입니다.

 

	@Resource
	private SqlSessionFactory sqlFactory;
	@Resource(name="sqlSessionFactory")
	private SqlSessionFactory sqlFactory;

 

 


 

 

 

@Inject

 

타입이 같은 Bean을 먼저 찾습니다. 하지만 같은 타입의 Bean 객체가 여러 개 있다면 다음은 이름으로 찾는데, 그래도 없다면 예외가 발생합니다. 부모 클래스 타입에다가 여러 자식 클래스의 Bean 객체 중 하나를 오버라이딩 시키는 경우 발생할 수 있는 문제입니다. 따라서 @Named 어노테이션을 사용해 정확한 Bean ID를 지정해주는 것이 좋습니다.

 

하나의 필드에 적용할 때는 아래와 같이 사용해주면 됩니다.

	@Inject	
	@Named("sqlSessionFactory")
	private SqlSessionFactory sqlFactory;

 

 

만약 setter나 생성자의 파라미터에서 여러 개의 Bean 객체를 주입해준다면 아래와 같이 파라미터 앞에 위치시켜 지정해줄 수 있습니다.

 

	@Inject	
	private @Named("sqlSessionFactory") SqlSessionFactory sqlFactory;

 

 


 

 

@Autowired

 

스프링에서 제공해주는 어노테이션입니다. 스프링 의존적이라 나중에 프레임워크를 바꿀 계획이 있다면 위의 두 어노테이션을 사용하는 것이 좋습니다.

 

사용법과 동작은 @Inject와 거의 유사합니다. 특정 Bean 객체를 강제로 지정해주는 어노테이션만 @Qualifier를 사용해주면 됩니다.

 

	@Autowired
	@Qualifier("sqlSessionFactory")
	private SqlSessionFactory sqlFactory;

 

 

만약 찾는 Bean 객체가 없을 경우 발생하는 예외를 피하고 싶다면 required 속성값을 false로 줍니다. 못 찾을 경우 null 값으로 존재할테니 나중에 이 객체를 사용하는 곳에서는 null일 경우에 대한 처리를 별도로 해주면 됩니다.

 

	@Autowired(required=false)
	@Qualifier("^__^")
	private SqlSessionFactory sqlFactory;

 

 

required 속성 지정을 별도로 안했을 때와 했을 때 발생하는 예외가 서로 다른 것을 알 수 있습니다. nullPointer 예외는 뒷쪽에서 해당 객체에 대한 null 처리를 안해서 발생했습니다.

 

required 속성을 적용하지 않았을 경우

 

required=false 적용 시

728x90

댓글

💲 추천 글