리셋 되지 말자

스프링을 통한 의존성 주입 - @Autowired vs. @Resource vs. <property> 태그 본문

Java(폐지)/spring 책

스프링을 통한 의존성 주입 - @Autowired vs. @Resource vs. <property> 태그

kyeongjun-dev 2020. 8. 12. 16:45
@Autowired @Resource
출처 스프링 프레임워크 표준 자바
소속 패키지 import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.Resource;
빈 검색 방식 byType 먼저, 못 찾으면 byName byName 먼저, 못 찾으면 byType
특이사항 @Qualifier("") 협업 name 어트리뷰트
byName 강제하기 @Autowired @Qualifier("tire1") @Resource(name="tire1")

예시 코드

  • Car.java (@Resource의 byName 강제)
ppackage expert006;

import javax.annotation.Resource;

public class Car {
    @Resource(name="tire1")
    Tire tire;

    public String getTireBrand() {
        return "장착된 타이어: " + tire.getBrand();
    }
}
  • Car.java (@Autowired의 byName 강제)
package expert006;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class Car {
    @Autowired
    @Qualifier("tire1")
    Tire tire;

    public String getTireBrand() {
        return "장착된 타이어: " + tire.getBrand();
    }
}

뭐가 더 나을까

스프링이 아닌 다른 프레임워크로 교체되는 경우를 대비하자면 자바 표준인 @Resource를 쓰는게 @Autowired를 쓰는 것보다 낫다.

@Resource는 bean 태그의 자식 태그인 property로 해결될 수 있다. 여기서는 XML파일만 보아도 DI 관계를 손쉽게 확인할 수 있는 property를 사용하는게 좋다.

@Resource는 개발 생산성이 좋고 property는 유지보수성이 좋다.

하지만 유지보수가 필요 없다면 @Resource를 쓰는게 바람직하다.

의존 관계

의존 관계가 new가 아니더라도 변수에 = 으로 대입되는 순간 의존 관계가 생긴다.(객체가 대입되던 리터럴 값이 대입되던)
이때 대입되는 의존 대상이 외부에 있을수도 내부에 있을수도 있다. DI는 외부에 있는 의존 대상을 주입하는 것이다.
의존 대상을 구현하고 배치할 때 SOLID와 응집도는 높이고 결합도는 낮추라는 기본 원칙에 충실해아 한다.
그래야 프로젝트의 구현과 유지보수가 수월해진다.

Comments