본문 바로가기
Java

의존성 주입의 3가지 방법과 주의점

by 19810721 2020. 3. 29.

스프링 개발을 오래 했으면서도 의존성 주입에는 @Autowired 이외에 여러 방법이 있으며, 주의 할 점이 있다는 점을 오늘 알게 되어 정리해보고자 한다.

 

1> @Required 어노테이션 : Setter 메소드

2> @Autowired 어노테이션 : 생성자, 메소드, 필드에 적용 가능

 

- 생성자 기반의 주입

- 세터기반/ 메소드 기반의 주입

- 필드 기반의 주입

 

    AttachFileRepository repository;


    // 생성자 1
    @Autowired
    public TipsFileService(AttachFileRepository attachFileRepository) {
        this.repository = attachFileRepository;
    }

    // 세터 or 메소드 기반의 주입 2
    @Required
    public void setRepository(AttachFileRepository attachFileRepository) {
        this.repository = attachFileRepository;
    }
    // or
    @Autowired
    public void prepare(AttachFileRepository attachFileRepository) {
        this.repository = attachFileRepository;
    }
    
    // field 필드 주입 3
    @Autowired
    private AttachFileRepository attachFileRepository;
    

1> 생성자 기반의 주입은 생성자 자체이기 때문에 어노테이션을 생략 가능하다.

2> 세터 혹은 메소드로 주입하는 방법은 (일반적으로 세터), set블라블라(주입객체) 혹은 임의의 메소드 명으로 하면 되고, @Required 혹은 @Autowired 어노테이션이 활용된다.

3> 필드 주입 방식은 사실상 1,2 번의 번거로움으로 인해 생겨난 것인 줄로만 지금까지 알고 있었는데,  이는 생성자나 세터 메소드를 굳이 타이핑 할 필요가 없기 때문이었다. 그러나 이러한 쉬운 의존성 주입으로 인해 다량의 의존성이 주입이 되버리면, 단일책임원칙(SRP) 를 위반할 수 있다고 한다.

 

SRP = The Single Responsibility Principle - 단일 책임 원칙

변경의 축은 변경이 실제로 일어날 때만 변경의 축이다.

클래스를 변경할 때 변경하기 위한 다른 이유를 생각할 수 있다면  해당 클래스는 SRP 를 위반하는 것.

 

아울러 field 주입 방식은 자바의 리플렉션으로 필드를 주입하게 되는데, 이는 의존성을 초기화 하는 방법과 이들의 의존 관계가 노출된다는 단점이 있다고 하며, 이를 숨기기 힘들며 필드를 리플렉션으로 주입하고 사용하는 것을 위험한 것으로 간주할 수 있기 때문에 주의해야 한다고 하는 내용이 있다.

 

어떤 보조 기능이든 요약된 기능이든 단순하고 편리하다는 이유로 내용을 정확히 파악하지 않고 사용하는 것은 주의해야 겠다는 생각을 문득 해본다. 아울러, 이번 기회에 알게된 JSR 250 자바 플랙폼의 공통 어노테이션에 대한 내용을 추가 학습하여 다음 포스트를 진행해 보고자 한다.

 

알면 알 수록 어려워지는 콤퓨타 세상..