필드(Field) 방식 
- @Autowired 를 이용한 의존 자동 주입

   - 장점 : 설정 코드에서 직접 주입하지 않고 스프링이 자동으로 빈 객체를 주입. 간편한 코드를 짤 수 있다.

   ** 자동 주입할 빈이 없거나, 주입 대상에 일치하는 빈이 2개 이상이면 UnsatisfiedDependencyException
   ** @Qaulifier 어노테이션을 사용해 자동 주입할 빈을 지정할 수 있다.

   - 단점 : 프로그램의 복잡도가 증가하는 것을 알아차리기 힘들다.

생성자(Constructor) 방식
- 빈 객체를 생성하는 시점에 모든 의존 객체가 주입된다.

   - 장점: 빈 객체를 생성하는 시점에 필요한 모든 의존 객체를 주입받기 때문에 객체를 사용할 때 완전한 상태로 사용할 수 있다. (반면 세터 메서드 방식은 Setter에 인자로 넣어주지 않으면 오류가 발생할 수 있다.)

   - 장점: 순환 참조 코드를 짜면 BeanCurrentlyInCreationException 을 발생시켜 순환 참조를 사전에 방지할 수 있다.
          이는 생성자의 인자에 사용되는 빈을 찾거나 팩토리에서 만든 후에 생성자를 호출하기 때문이다.

   - 장점: 생성자 주입을 사용하게 되는 경우 생성자의 인자가 많아짐에 따라 복잡한 코드가 됨을 쉽게 알 수 있다.  
          -> 리팩토링하여 역할을 분리하는 등과 같은 코드의 품질을 톺이는 활동의 필요성을 더 쉽게 알 수 있다.   

   - 장점: 주입되는 객체를 final로 선언하여 초기화 후에 빈 객체가 변경되지 않도록(Immutable) 할 수 있다.   

   - 장점: 테스트 코드 작성이 편리하다. 단순 POJO를 이용한 테스트 코드를 만들 수 있다.

   - 단점: 생성자의 파라미터가 많을 경우 각 인자가 어떤 의존 객체를 설정하는지 알아내려면 생성자의 코드를 확인해야 한다.

세터 메서드(Setter Metohd) 방식
- 세터 메서드 이름을 통해 어떤 의존 객체가 주입되는지 알 수 있다.

   - 장점: 메서드 이름으로 어떤 의존 객체를 설정하는지 알 수 있다. 

   - 단점: 필요한 의존 객체를 전달하지 않아도 빈 객체가 생성되므로 NullPointerExeption이 발생할 수 있다.

 

+ Recent posts