- 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 처리를 안해서 발생했습니다.
'▸Spring MVC > 기본 문법' 카테고리의 다른 글
스프링 Restful 서비스(API)_기본 개념 [1/3] (0) | 2020.03.20 |
---|---|
@Repository, @Service 어노테이션 (6) | 2020.03.18 |
스프링 MVC - 데이터 전달 객체들 (1) | 2020.03.11 |
스프링 MVC 컨트롤러 작성하기 (0) | 2020.03.11 |
스프링 AOP 구현 (관점 지향 프로그래밍) (0) | 2020.03.10 |
댓글