[SPRING] 의존성 주입

2021. 5. 17. 22:11·SPRING
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
'SPRING' 카테고리의 다른 글
  • [SPRING] Bean
  • [SPRING] 컨테이너 (Container)
  • [SPRING] JPA 연관관계
  • [SPRING] JPA 영속성 컨텍스트
집한구석
집한구석
  • 집한구석
    tgyun615.info
  • 전체
    오늘
    어제
    • 카테고리 (183)
      • JAVA (38)
      • SPRING (15)
      • KOTLIN (23)
      • NETTY (1)
      • DEVOPS (3)
      • DOCKER (7)
      • KUBERNETES (2)
      • JAVASCRIPT (1)
      • SPLUNK (3)
      • ELK (7)
      • KAFKA (2)
      • GO (4)
      • ALGORITHM & DATA STRUCTURE (9)
      • IDE (5)
      • OS (16)
      • NETWORK (14)
      • GCP (2)
      • AWS (2)
      • DATABASE (10)
      • CLEANCODE (7)
      • OTHER (12)
  • 최근 글

  • 태그

    AWS
    Kafka
    cleancode
    docker
    SQL
    Spring
    ElasticSearch
    엘라스틱서치
    splunk
    이펙티브 코틀린
    JPA
    java
    프로그래머스
    이펙티브코틀린
    코틀린
    클린코드
    IntelliJ
    Elk
    go
    자바
  • 링크

    • github
    • linkedin
    • resume
  • hELLO· Designed By 정상우. v4.10.3
집한구석
[SPRING] 의존성 주입
상단으로

티스토리툴바