본문 바로가기
프레임워크/Spring

의존성 주입(Dependency Injection)(의존성 주입_Annotation@)

by 프로그래밍 공부 2023. 4. 11.

 지난 번에는 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을 지정하여 식별할 수 있다. 

 

 

라고 이해했다.