Spring annotation
- 어노테이션은 자바 1.5부터 지원
- 스프링은 어노테이션을 이용하여 빈과 관련된 정보를 설정할 수 있다.
- 일반적으로 @로 시작하는 것이 어노테이션이다.
Spring Framework에서 annotation을 사용하려면 다음과 같은 설정들을 필요로 한다.
1. CommonAnnotationBeanPostProcessor 클래스를 설정파일에 bean 객체로 등록한다.
<bean class="org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor" />
2. <context:annotation-config> 태그를 이용한다.
@Autowired, @Required, @Resource, @PostConstructor, @PreDestroy 등의 annotation을 자동 처리해주는 bean post processor
3. <context:commponent-scan base-package="" /> 태그를 이용한다.
@Component, @Controller, @Service, @Repository 등의 annotation을 자동 처리
4. <mvc:annotation-driven />
@RequestMapping, @Valid 등 spring mcv component들을 자동 처리.
HandlerMapping, HandlerAdapter를 등록하여 @Controller에 요청 연결.
해당 설정이 없어도 component-scan이 있으면 mvc application동작.
- 4개의 stereotype annotation (component-scan에 의해 자동으로 등록)
@Component : stereotype annotation의 조상
@Controller : Spring MVC에서 Controller로 인식
@Service : 역할 부여 없이 스캔 대상. 비즈니스 클래스(biz) 에 사용
@Repository : 일반적으로 dao에 사용. Exception을 DataAccessException으로 변환
1. @Component
패키지 : org.springframework.stereotype
버전 : spring 2.5
클래스에 선언하여 해당 클래스를 자동으로 bean 등록.
bean의 이름은 해당 클래스의 이름(첫글자 소문자)
범위는 디폴트로 singleton. @Scope로 지정 가능
2. @Autowired
패키지 : org.springframework.beans.factory.annotation
버전 : spring 2.5
Autowired annotation은 spring에서 의존관계를 자동으로 설정할 때 사용한다.
이 어노테이션은 생성자, 필드, 메서드 세곳에 적용이 가능하며 타입을 이용한 프로퍼티 자동 설정기능을 제공한다.
즉, 해당 타입의 빈 객체가 없거나 2개 이상일 경우 예외를 발생시킨다.
프로퍼티 설정 메서드(setter) 형식이 아닌 일반 메서드에도 적용이 가능하다.
프로퍼티 설정이 필수가 아닐 경우 @Autowired(required=false)로 선언한다. (default : true)
byType으로 의존관계를 자동으로 설정할 경우 같은 타입의 빈이 2개 이상 존재하게 되면 예외가 발생하는데, @Autowired에서도 같은 문제가 발생한다.
이 때, @Qualifier를 사용하면 동일한 타입의 빈 중 특정 빈을 사용하도록 하여 문제를 해결할 수 있다.
//ex)
@Autowired
@Qualifier("test")
private Test test;
3. @Qualifier
패키지 : org.springframework.beans.factory.annotation
버전 : spring 2.5
@Autowired annotation이 타입 기반이기 떄문에 2개 이상의 동일타입 빈 객체가 존재할 시 특정 빈을 사용하도록 선언한다.
@Qualifier("beanName")의 형태로 @AutoWired와 같이 사용하며 메서드에서 두 개 이상의 파라미터를 사용할 경우에는 파라미터 앞에 선언해야 한다.
4. @Require
패키지 : org.springframework.beans.factory.annotation
버전 : spring 2.5
필수 프로퍼티임을 명시하는 것으로, 프로퍼티 설정 메서드(setter)에 붙이면 된다.
필수 프로퍼티를 설정하지 않을 경우 빈 생성시 예외를 발생시킨다.
5. @Repository
패키지 : org.springframework.stereotype
버전 : spring 2.0
dao에 사용되며 Exception을 DataAccessException으로 변환한다.
6. @service
패키지 : org.springframework.stereotype
버전 : spring 2.0
@Service를 적용한 class는 비즈니스 로직(biz)로 간주한다.
7. @Resource
패키지 : javax.annotation.Resource
버전 : java6 & jee5
어플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용한다.
name 속성에 자동으로 연결될 빈 객체의 이름을 입력한다.
@Resource(name="testDao") // byName -> byType
1. 어노테이션이 없을때
패키지 구조
NickName.java
package com.test01;
public class NickName {
@Override
public String toString() {
return "씨네";
}
}
NickNamePrn.java
package com.test01;
public class MyNickNamePrn {
private NickName nickName;
private NickName getNickName() {
return nickName;
}
public void setNickName(NickName nickName) {
this.nickName = nickName;
}
@Override
public String toString() {
return "제 별명은 " + nickName + "입니다.";
}
}
applicationContext.com
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="nickName" class="com.test01.NickName" />
<bean id="myNickName" class="com.test01.MyNickNamePrn">
<property name="nickName" ref="nickName" />
</bean>
</beans>
MTest.java
package com.test01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test01/applicationContext.xml");
MyNickNamePrn my = factory.getBean("myNickName", MyNickNamePrn.class);
System.out.println(my);
}
}
실행결과
MTest에서는 myNickname 객체만 호출하였지만 applicationContext에서는 nickName객체를 참조하는 myNickName객체가 있습니다.
NickName에는 별명 값을 리턴하고 MyNickName에서는 제 별명은 nickName 입니다. 라는 문장을 리턴합니다.
따라서 MTest에서는 "제 별명은 씨네입니다."가 출력이 됩니다.
2. 어노테이션이 있을때
패키지 구조
NickName.java
package com.test01.anno;
import org.springframework.stereotype.Component;
@Component
public class NickName {
@Override
public String toString() {
return "씨네";
}
}
MyNickName.java
package com.test01.anno;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("myNickName")
public class MyNickNamePrn {
@Autowired
private NickName nickName;
private NickName getNickName() {
return nickName;
}
public void setNickName(NickName nickName) {
this.nickName = nickName;
}
@Override
public String toString() {
return "제 별명은 " + nickName + "입니다.";
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.test01.anno" />
</beans>
MTest.java
package com.test01.anno;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MTest {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("com/test01/anno/applicationContext.xml");
MyNickNamePrn my = factory.getBean("myNickName", MyNickNamePrn.class);
System.out.println(my);
}
}
실행결과
해당 코드도 마찬가지로 "제 별명은 씨네입니다."가 출력되었습니다.
applicationContext.xml에 <context:component-scan base-package="com.test01.anno" />만 쓰고 (Namespaces에서 체크 해주셔야됩나다!) NickName클래스와 MyNickName클래스에 어노테이션을 걸어주었습니다!
NickName의 경우
@Component
public class NickName {
@Component 어노테이션을 작성했는데(임포트 해야됩니다)
NickName nickName = new NickName();
// 혹은
<bean id="nickName" class="com.test01.anno.NickName">
해당 코드를 대신해줍니다.
MyNickName의 경우
@Component("myNickName")
public class MyNickNamePrn {
@Autowired
private NickName nickName;
메서드에는 @Component가 필드에는 @Autowired가 달려있습니다.
@Component("myNickName")는
<bean id="myNickName" class="com.test01.anno.MyNickNamePrn" />
를 대신 해줍니다. ("myNickName")이 없으면 myNickNamePrn으로 인식하기 때문에 설정할 이름을 작성해줍니다!
또한 Autowired는 생성자, 필드, 메서드 세곳에 적용이 가능하며 타입을 이용한 프로퍼티 자동 설정기능을 제공합니다.
NickName클래스에 Component가 있기때문에 자동으로 할당됩니다.
'Java 관련 > Spring Legecy' 카테고리의 다른 글
[Spring] Annotation(@Component) (0) | 2022.03.23 |
---|---|
[Spring] Annotation(@Autowired, @Qualifier) (0) | 2022.03.22 |
[Spring] DI / IoC (Bean 객체_10) - MessageSourceAware (0) | 2022.03.20 |
[Spring] DI / IoC (Bean 객체_10) - autowire (0) | 2022.03.19 |
[Spring] DI / IoC (Bean 객체_09) - 호출 (0) | 2022.03.18 |