지난 번에는 XML을 통한 의존성 주입을 공부했다.
이번에는 Annotation을 이용한 의존성 주입에 대해 공부하려 한다.
Annotation을 통한 의존성 주입 방식은 XML 방식과는 다르게 Annotation 만으로
Bean을 생성하거나 설정할 수 있다.
예를 들어
Annotation을 통해 Bean을 생성하는 것은 @Component로 객체를 생성할 대상 클래스에 작성해주면 된다.
이때 생성되는 bean의 이름은 클래스의 첫 글자를 소문자로 바꾼 것으로, Desktop이 클래스 이름이면
desktop으로 생성된다. 이는 @Component (value = "bean-name")으로 이름 지정이 가능하다.
위에서 언급한 @Component를 포함하여, @Repository, @Service, @Controller 와 같은 Annotation 들을
Stereotype Annotation 이라고한다.
스프링에서 기본적으로 적용되는 Annotation 이라고 생각하면 된다.
이에 대해 자세히 알아보자면, 우선 @Component다.
@Component
@Component는 클래스에 부여된다. 해당 Annotation이 붙은 클래스는 스캐너를 통해 자동으로 빈으로 등록된다.
여기서 스캔은 @ComponentScan Annotation을 통해 스캔할 @Component 클래스의 위치를 지정할 수 있다.
지정을 한다면, 지정한 패키지 아래의 모든 서브 패키지를 다 검색하게 된다.
@Repository
@Service
@Controller
위 세 Annotation 모두 @Component와 같이 bean을 생성하는 역할을 한다.
하지만 각각의 Annotation은 어떤 bean을 생성하는가에 따라 달리 사용할 수 있고, 이를 권장한다.
@Repository의 경우 JPA에서 DAO(Data Access Object, DB에 접근하는 객체)와 비슷한 역할을 하기에
DAO 관련 부가 기능을 Annotaion을 할 때는 @Repository Annotation을 사용한다.
@Service의 경우 서비스 관련 기능의 Bean을 생성할 때 사용한다.
@Controller의 경우도 MVC에서 컨트롤러 역할을 하는 빈을 생성할 때 사용한다.
각각의 목적에 맞는 구체적인 사용을 위한 @Component의 확장을 통해서,
목적에 맞게 구체화해 사용하면 스프링에서 더욱 효율적으로 사용 가능하다.
이렇게 객체를 @Component를 통해 bean으로 등록한 다음에는
필요에 따라 의존성을 주입할 곳에 @Autowired라는 Annotation을 작성하여 bean을 주입할 수 있다.
이때도 XML과 같이 생성자, 설정자, 필드 방식으로 의존성을 주입할 수 있다.
예를 들자면
@Component
public class Programmer{
private Computer computer;
public Programmer(){
}
//만약 생성자를 하나만 정의한다면 @Autowired는 생략 가능하다. 이 경우 생성자가 2개 이상이기에 생략 x
@Autowired
public Programmer(Computer computer){
this.computer = computer;
}
// @Autowired //setter 의존성 주입
// public void setComputer(@Qualifier("desktop")Computer computer){
// this.computer= computer;
// }
// @Autowired //Field 의존성 주입
// @Qualifier("lattop")
// private computer computer;
// @같은 타입이 여러 개일 경우, Qualifier 를 통해 bean을 지정하여 식별 가능하다.
}
이렇게 보면 생성자, 설정자, 필드에서 @Autowired Annotaion을 통해 의존성을 주입할 수 있고,
혹시 같은 타입이 여러 개일 경우, @Qualifier Annotation을 통해 bean을 지정하여 식별할 수 있다.
라고 이해했다.
'프레임워크 > Spring' 카테고리의 다른 글
Spring AOP Proxy (0) | 2023.04.12 |
---|---|
Spring AOP(Aspect Oriented Programming) (2) | 2023.04.12 |
의존성 주입(Dependency Injection)(의존성 주입_XML) (0) | 2023.04.11 |
의존성 주입(Dependency Injection)(강하고 느슨한 결합 관계) (0) | 2023.04.11 |
제어의 역전(Inversion of Control) (0) | 2023.04.11 |