📕🐘 도로락 - 코끼리를 냉장고에 넣는 방법
Spring Framework | 2018. 10. 30. 22:34

[Spring] XML 설정과 @Autowired 설정이 겹쳤을때 의존주입 우선순위

XML 설정과 @Autowired 설정이 겹쳤을때 의존주입 우선순위

스프링 어플리케이션에서 객체의 의존관계를 설정할때 XML이나 자바 코드 설정을 통해 빈을 정의하고 의존 관계를 정의할수도 있지만 @Autowired를 통한 자동 의존주입을 이용할수도 있습니다. 그렇다면 만약 XML설정에서 의존관계를 설정함과 동시에 @Autowired를 통해 자동 의존주입을 받는 경우 어떤 설정이 우선순위를 갖게 될까요?

이번글에서는 XML을 통한 명시적인 의존주입 설정과 @Autowired를 통한 자동의존주입 설정 두 가지를 적용하여 어떤 설정이 우선순위를 갖는지 테스트해보았습니다. 테스트 버전은 스프링 4.1.0 버전을 사용하였으니 참고해 주세요.

MemberDao 클래스

MemberDao 클래스입니다. 나중에 우선순위를 테스트하기 위해 name 속성을 하나 두었습니다.

MemberWebService 클래스

MemberWebService이며 MemberDao를 @Autowired를 통해 자동의존주입 받습니다. 특별한점이 있다면 @Qualifier 어노테이션을 통해 명시적으로 id가 "memberDao"인 MemberDao 빈을 의존주입 받는다는 점입니다.

XML 설정

다음은 스프링 컨테이너 생성시 사용할 XML 설정입니다. <context:annotation-config /> 은 스프링이 관리하는 빈 사이에서 필요한 의존 객체들이 자동으로 의존주입 할수 있게 해주는 설정입니다. 즉 @Autowired@Qualifier등을 사용할 수 있게 해주는 설정입니다.

여기서는 세 개의 빈을 생성합니다. 두 개의 MemberDao 빈을 생성하는데, 각각 id가 memberDao와 memberDao2입니다. 각각을 구분하기 위해 name 속성으로 자신의 id값을 설정해 주었습니다.

다음으로 MemberWebService 빈인데, @Autowired를 설정함과 동시에 <constructor-arg>를 통해 생성자를 이용해 명시적으로 memberDao2 빈을 주입시켰습니다. 이부분이 핵심인데, 이후에 memberDao가 주입될지 memberDao2가 주입될지가 포인트입니다.

테스트 클래스

테스트는 단순하게 컨테이너 생성 후 MemberWebService 빈을 얻은 후 어떤 MemberDao가 의존주입 되어있는지 확인하는 것입니다.

XML은 생성자방식으로 주입, 클래스에서 필드에서 @Autowired 사용시

현재 XML에서는 생성자방식으로 주입했고 클래스상으로는 필드에 자동의존주입 설정을 해두었습니다. 이런 경우에는 필드에 설정된 자동의존주입이 우선순위를 갖습니다. memberDao 출력

XML은 생성자방식으로 주입, 클래스에서 생성자에 @Autowired 사용시

XML에서는 생성자방식으로 의존주입을 명시하고 클래스상으로는 생성자에 자동의존주입 설정을 하는 경우에는 XML의 생성자를 통한 의존주입이 우선순위를 갖습니다. memberDao2 출력

XML은 생성자방식으로 주입, 클래스에서 setter 메서드에 @Autowired 사용시

XML에서는 생성자방식으로 의존주입을 명시하고 클래스상으로는 setter 메서드에 자동의존주입 설정을 하는 경우에는 setter 메서드에 설정된 자동의존주입이 우선순위를 갖습니다. memberDao 출력

XML 의존주입 설정을 <property>로 변경

XML에서 생성자를 통해 의존객체를 명시했던것을 <property>를 통한 방식으로 변경했습니다.

XML은 property방식으로 주입, 클래스에서 필드에서 @Autowired 사용시

현재 XML에서는 property방식으로 주입했고 클래스상으로는 필드에 자동의존주입 설정을 해두었습니다. 이런 경우에는 XML 설정이 우선순위를 갖습니다. memberDao2 출력

XML은 property 방식으로 주입, 클래스에서 생성자에 @Autowired 사용시

XML에서는 property방식으로 의존주입을 명시하고 클래스상으로는 생성자에 자동의존주입 설정을 하는 경우에도 XML의 설정이 우선순위를 갖습니다. memberDao2 출력

XML은 property방식으로 주입, 클래스에서 setter 메서드에 @Autowired 사용시

XML에서는 property방식으로 의존주입을 명시하고 클래스상으로는 setter 메서드에 자동의존주입 설정을 하는 경우에도 XML의 설정이 우선순위를 갖습니다. memberDao2 출력

정리

즉 XML의 명시적인 의존주입 설정과 Class상에 @Autowired 등을 통한 자동의존주입시 우선순위는 다음과 같습니다. 두 가지 설정이 겹치는 경우가 분명 좋은 경우는 아닐것입니다. 다만 어쩔 수 없이 두 가지 의존주입 명시가 겹치게 되는 경우 다음의 우선순위대로 설정이 따라간다는 점을 참고정도만 해주면 될 것 같습니다.

XML 설정 빈 정의 Class 설정 결과
<constructor-arg> 필드에 @Autowired 설정 필드의 설정이 우선순위를 가짐
<constructor-arg> 생성자에 @Autowired 설정 XML설정이 우선순위를 가짐
<constructor-arg> setter 메서드에 @Autowired 설정 setter의 설정이 우선순위를 가짐
<property> 필드에 @Autowired 설정 XML설정이 우선순위를 가짐
<property> 생성자에 @Autowired 설정 XML설정이 우선순위를 가짐
<property> setter 메서드에 @Autowired 설정 XML설정이 우선순위를 가짐
도로락

도로락

Writer

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그