Spring을 사용하는데 XML파일은 매우 중요하다. 따라서 XML관리가 매우 중요한데 XML에 모든 설정을 다 적으면 Xml 지옥이 펼쳐진다. 따라서 적당히 어노테이션을 이용하는것이 매우 중요하다.
따라서 이번엔 Spring Annotation의 종류를 알아보자. 천천히 공부하면서 보이는 어노테이션 마다 추가하면서 정리 할 예정이다.
앞으로 할 어노테이션은 객체 생성과 연관이 있으므로
<context:component-scan base-package=”polymorphism”/>
를 applicationContext.xml에 추가한다.
1.@Component : 해당 클래스의 객체를 생성한다. @Component(“id”) id값값을 작성하여 해당 객체를 요청할 수 있게 한다. 작성하지 않는다면 해당 클래스 명의 맨 앞자리가 소문자로 변환되어 아이디가 자동으로 지정된다.
package polymorphism;
import org.springframework.stereotype.Component;
@Component("tv") // 이 tv아이디는
public class LgTV implements TV {
@Override
public void powerOn() {
System.out.println("LgTV 전원 켜짐");
}
@Override
public void powerOff() {
System.out.println("LgTV 전원 꺼짐");
}
@Override
public void volumeUp() {
System.out.println("LgTV 소리 커짐");
}
@Override
public void volumeDown() {
System.out.println("LgTV 소리 작아짐");
}
}
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] args) {
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
TV tv = (TV)factory.getBean("tv"); // @Component 어노테이션의 id와 getBean()의 아규먼트가 일치한다.
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
}
}
2. @Autowired : Autowired 어노테이션은 변수나 메서드 위에 작성되고 Autowired가 붙은 변수는 자료형을 확인하고 현재 메모리에 있는 (생성된 객체) 자료형과 일치하는 객체에 주입한다. 반드시 객체가 먼저 생성되어있어야 한다. 또한 여러개의 자료형이 동시에 존재할 수 있는데 그 문제는 아래 어노테이션을 사용해서 해결할 수 있다.
package polymorphism;
public class SamsungTV implements TV {
@Autowired
private Speaker speaker;
private int price;
public SamsungTV(Speaker speaker, int price) {
System.out.println("==> SamsungTV 다중 생성자 인젝션");
this.speaker = speaker;
this.price = price;
}
public Speaker getSpeaker() {
return speaker;
}
public void setSpeaker(Speaker speaker) {
System.out.println("setSpeaker()호출");
this.speaker = speaker;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
System.out.println("setPrice()호출");
this.price = price;
}
public SamsungTV() {
System.out.println("SamsungTV 객체 생성");
}
public SamsungTV(Speaker speaker) {
System.out.println("==> SamsungTV 생성자 인젝션");
this.speaker = speaker;
}
@Override
public void powerOn() {
System.out.println("SamsungTV 전원 켜짐"+", 가격 : "+price);
}
@Override
public void powerOff() {
System.out.println("SamsungTV 전원 꺼짐");
}
@Override
public void volumeUp() {
speaker.volumeUp();
}
@Override
public void volumeDown() {
speaker.volumeDown();
}
}
package polymorphism;
import org.springframework.stereotype.Component;
@Component("sony")
public class SonySpeaker implements Speaker{
public SonySpeaker() {
System.out.println("SonySpeaker 객체 생성");
}
public void volumeUp() {
System.out.println("SonySpeaker 소리 올린다.");
}
public void volumeDown() {
System.out.println("SonySpeaker 소리 내린다.");
}
}
우리는 분명 저 스피커가 sony스피커라고 한 적이 없다 심지어 speaker는 인터페이스다. 하지만 자동으로 Autowired 어노테이션으로 자동으로 변수에 객체가 주입된것을 볼 수 있다.
3. @Qualifier : @Autowired 어노테이션으로 객체를 주입하면 해당자료형을 가지는 객체는 유일해야한다. 하지만 그럴일이 없다. 따라서 우리가 정확히 객체를 지정해야하는데 이때 사용하는것이 Qualifier어노테이션이다. 우리는 Component어노테이션으로 객체 생성시에 id값을 지정했다. 이것을 여기에 사용하게 된다.
package polymorphism;
import org.springframework.stereotype.Component;
@Component("apple")
public class AppleSpeaker implements Speaker {
public AppleSpeaker() {
System.out.println("AppleSpeaker 객체 생성");
}
@Override
public void volumeUp() {
System.out.println("===> AppleSpeaker 소리 올린다.");
}
@Override
public void volumeDown() {
System.out.println("===> AppleSpeaker 소리 내린다.");
}
}
위와 같이 클래스를 추가해보자. 그러면 컴파일과 동시에 Speaker의 자료형을 가진 객체가 두개가 메모리에 존재한다. 따라서 오류가 난다 이럴 때 Qulifier 어노테이션으로 아래와 같이 추가해 보자
@Autowired
@Qualifier("apple")
private Speaker speaker;
그렇다면 두 어노테이션을 해석해보자면 Autowired로 Speaker객체 가져와서 Qualifier로 Component id가 “apple”인 객체를 주입해 라고 해석할 수 있다.
4. @Primary : 위에서 처럼 Qualifier 어노테이션으로 객체를 직접 지정할 수 있지만 Primary어노테이션을 통해서 객체를 주입할 수 있다. 이 어노테이션의 의미는 같은 자료형을 가진 객체가 많이 만들어졌는데 객체에 주입하려고하면 해당 객체를 우선적으로 주입해라 라는 의미를 가지고 있다.
@Autowired
//@Qualifier("apple")
private Speaker speaker;
@Primary
@Component("apple")
public class AppleSpeaker implements Speaker {
Qualifier 어노테이션에 주석처리를 하고 AppleSpeaker에 @Primary 어노테이션을 붙여보자 결과가 잘 나오는것을 볼 수 있을 것이다.
5. @Resource : @Qualifier + @Autowired 이 두 가지의 어노테이션을 섞은 형태로 @Resource(name=”@Component id”) 형태이다.
위 예제에서는 @Resource(name=”apple”) 이런식으로 작성할 수 있을것이다.
6. @Service, @Controller, @Repository : MVC 모델에서 사용하는 어노테이션으로 모두 Component 어노테이션의 상속을 받아 객체 생성의 목적을 두고 사용하는 어노테이션으로 각자 클래스가 어떤 역할을 하는지 명시해주는 의미도 가지고 있다.
@Service ===> ServiceImpl : 비즈니스 로직을 처리하는 Service 클래스
@Repository ===> DAO : 데이터베이스 연동을 처리하는 DAO 클래스
@Controller ===> Controller : 사용자 요청을 제어하는 Controller 클래스
'BACK > Spring' 카테고리의 다른 글
[Back] Spring JdbcTemplate (0) | 2020.07.09 |
---|---|
[Back] Spring AOP( 관점 지향 프로그램 ) (0) | 2020.07.01 |
[Back] Spring 기초 (0) | 2020.06.25 |