본문 바로가기
IT/Spring

토비 스프링 - @Autowired

by 봉즙 2019. 10. 19.

@Autowired : 스프링의 DI에 사용되는 어노테이션

@Autowired가 붙은 인스턴스 변수가 있으면, 테스트 컨텍스트 프레임워크는 변수타입과 일치하는 컨텍스트 내의 빈을 찾으며, 타입이 일치하는 빈이 있으면 인스턴스 변수에 주입해준다. 일반적으로는 주입을 위해서는 생성자나 setter 메소드 같은 메소드가 필요하지만, 이경우에는 메소드가 없어도 주입이 가능하며, 별도의 DI 설정 없이 필드의 타입 정보를 이용해 빈을 자동으로 가져올 수 있는데, 이러한 방법을 타입에 의한 자동와이어링이라 한다.

 

ApplicationContext는 xml에 정의된 빈이 아닌데도 @Autowired를 통하여 어플리케이션 컨텍스트가 DI가 된다.

스프리 어클리케이션 컨텍스트는 초기화 시에 자기 자신도 빈으로 등록하기에 어플리켕션 컨텍스트에는 ApplicationContext 타입의 빈이 존재하게 되며, DI가  가능하게 된다.

 

Autowired는 변수에 할당 가능한 타입을 가진 빈으로 자동으로 찾기에, 같은 타입의 빈이 두개 이상 있는 경우에는 타입 만으로는 어떤 빈을 가져 올지 결정 할 수 없다.

 

일반적으로는 테스트에서도 가능한 한 인터페이스를 사용해서 어플리케이션 코드와 느슨하게 연결해두는 편이 좋다.

 

@DirtiesContext : 스프링의 테스트 컨텍스프 프레임워크에게 해당 클래스의 테스트에서 어플리케이션 컨텍스트의 상태를 변경한다는 것을 알려준다. 클래스뿐만 아니라 메소드 레벨에서도 적용 가능하며, 하나의 메소드에만 컨텍스트 상태를 변경한다면 메소드에만 적용시켜주는 것이 좋다. 

 

침투적 기술 : 기술을 적용했을 때 어플리케이션 코드에 기술 관련 API가 등장하거나 특정 인터페이스나 클래스를 사용하도록 강제하는 기술, 침투적 기술을 상요하면 어플리켕션 코드가 해당 기술에 종속되는 결과를 가져온다.

 

비침투적 : 기술이 어플리케이션 로직을 담은 코드에 아무런 영향을 주지않고 적용이 가능하다. 따라서 기수에 종속적이지 않은 순수한 코드를 유지할 수 있게 해준다. 스프링은 비침투적 기술의 대표전익 예이기에 스프링 컨테이너 없는 DI테스트 역시 가능한 것이다.

 

DI를 이용한 테스트 방법 선택 : 항상 스프링 컨테이너 없이 테스트 할 수 있는 방법을 가장 우선적으로 고려하는 것이 좋다. 테스트 수행속도가 가장 빠르고 테스트 자체가 간결하다.  여러 오브젝트와 복잡한 의존관계를 갖고 있는 오브젝트를 테스트해야 하는 경우 스프링 설정을 이용한 DI 방식의 테스트를 이용하면 편리하다. 테스트에서 어플리케이션 컨텍스트를 사용하는 경우 테스트 전용 설정파일을 따로 만들어 사용한는것이 좋다. 테스트 설정 파일을 따로 만들었다 하더라도 떄는 예외적인 의존관계를 강제로 구성해서 테스트 코드로 수동 DI해서 테스트하는 방법을 사용하면된다. 테스트 메소드나 클래스에 @DirtiesContext 어노테이션을 붙여야 한다.

'IT > Spring' 카테고리의 다른 글

토비 스프링 - 템플릿  (0) 2019.10.20
토비 스프링 - 학습 테스트, 버그 테스트  (0) 2019.10.20
토비 스프링 - 테스트  (0) 2019.10.19
REST API  (0) 2019.10.15
토비 스프링 - XML 이용한 설정  (0) 2019.10.14

댓글