본문 바로가기

개발중/Spring

[Spring] 스프링 생성자 주입 방법 3가지

728x90
반응형

스프링에서는 의존성 주입이라는 특징이 있는데, 의존성을 주입하기 위한 세 가지 방법을 알아보자.

1. 생성자 주입(Constructor Injection)

 

클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면

@Autowired를 생략 할 수 있다.

 

@Controller
public class binsooController {
    
    private final BinsooService binsooService;
    
    @Autowired 
    public binsooController(BinsooService binsooService) {
        this.binsooService = binsooService;
    }
}


2. 필드 주입(Field Injection)

 

필드에 @Autowired 어노테이션만 붙여주면 자동으로 의존성 주입된다.
사용법이 매우 간단하기 때문에 가장 많이 접할 수 있는 방법이다.

하지만 단점이 존재한다,

  • 코드가 간결하지만, 외부에서 변경하기 힘들다.
  • 프레임워크에 의존적이고 객체지향적으로 좋지 않다.
@Controller
public class BinsooController {
	
    @Autowired 
    private BinsooService binsooService;
}


3. 수정자 주입(Setter Injection)

 

Setter 메소드에 @Autowired 어노테이션을 붙이는 방법다.

수정자 주입을 사용하면 setBinsooService 메서드를 public으로 열어두어야 하기 때문에 언제 어디서든 변경이 가능하다.

@Controller
public class BinsooController {
    private BinsooService binsooService;
    
    @Autowired
    public void setBinsooService(BinsooService binsooService) {
    	this.binsooService = binsooService;
    }
}

 


세 가지 주입 방식 중에 제일 권장되는 방식은 '생성자 주입' 이다.

개발을 하다보면 여러 컴포넌트간에 의존성이 생기는데 그 때 문제가 발생한다.

 

필드 주입과 수정자 주입은 빈이 생성된 후에 참조를 하기 때문에

양방향으로 참조하는 상황이어도 어플리케이션이 아무런 오류없이 실행하게 된다.

 

그렇게 되면 실제 코드가 호출될 때까지 문제점이 발견되지 않는다.

그러므로 유지보수가 더 힘들게 된다 ..

 

하지만 생성로 필드 주입을 하고 어플리케이션이 구동될 때는 BeanCurrentlyInCreationException 오류가 발생한다.

그로 인해 순환 참조를 방지할 수 있다.


 

728x90
반응형