SPRING

[SPRING] 의존성 주입

집한구석 2021. 5. 17. 22:11
728x90

의존성 개념

  • 객체간의 관계를 뜻함, 의존관계

주입 개념

  • 외부에서 객체를 생성해서 넣어주는 것

정의

  • 필요한 객체를 setter나 constructor로 전달 받아서 넣어주는 것

일반적으로 의존성 주입은 SPRING에서 많이 사용되며, 주입방법도 여러가지가 있음


의존성 주입 방법 

  • 필드 주입
  • 수정자 주입
  • 생성자 주입

일반적으로 익숙한건 @Autorwired를 통한 필드 주입이 익숙할 듯 (필자는 생성자 주입을 선호함)


필드 주입

@Service
public class UserService {
   @Autowired
   private UserRepository userRepository
}

주입방법중 가장 간단함, 간단해서 막 추가가능(장점이라보기 어려움), 주입 필드를 Final로 정의 불가 


수정자 주입

@Service
public class UserService {
   
   private UserRepository userRepository;
   
   @Autowired
   public void setUserRepository(UserRepository userRepository) {
       this.userRepository = userRepository;
   }
}

setter 메서드를 통하여 주입 (필자는 생소함), 필드 주입과 동일하게 Final로 정의 불가함 


생성자 주입

@Service
public class UserService {
   
   private final UserRepository userRepository;
   
   public UserService(UserRepository userRepository) {
       this.userRepository = userRepository;
   }
}

스프링에서도 무조건 권장하는 의존성 주입 방법, Final로 정의를 함 (필자는 Lombok을 이용하여 해당 방식으로 주입함)


생성자 주입의 장점

  • Final을 선언해여 주입하기 때문에 불변성을 유지가 가능함 
  • 생성자 주입은 순환참조가 발생할 경우 BeanCurrentlyCreationExeption 발생시켜서 순환참조를 방지함 (필드주입이나 수정자 주입으로는 순환참조를 발견할 방법이 없음)

순환참조

  • A클래스가 B클래스를 참조하는데, B클래스가 다시 A클래스를 참조하고, B클래스가 C클래스를 참조하고 A클래스가 B클래스를 참조하는 경우 (해당 설명 예시만 들어도 끔찍함)

스프링에서 생성자 주입을 권장하는 이유가 있음, 생성자주입에 익숙해지자

'SPRING' 카테고리의 다른 글

[SPRING] DISPATCHER-SERVLET  (0) 2021.06.07
[SPRING] Bean  (0) 2021.05.23
[SPRING] 컨테이너 (Container)  (0) 2021.05.23
[SPRING] JPA 연관관계  (0) 2021.05.19
[SPRING] JPA 영속성 컨텍스트  (0) 2021.05.16