PSD( Private-Self-Development )

생성자 주입을 사용하는 이유 본문

Backend/JAVA

생성자 주입을 사용하는 이유

chjysm 2023. 1. 30. 11:17

소스 분석 과 인터넷 강의를 듣던 중 @Autowired 어노테이션 대신,

@RequiredArgsConstructor 를 사용을 지향하여 이유를 찾아보게 되었다.

 

의존성 주입 ?

Spring 프레임워크는 사용자가 new 키워드를 사용하여 객체를 생성 및 소멸시키는 과정을 대신 해주는데 

객체간의 의존성을 주입해주고(DI) 

Spring 컨테이너가 Bean들의 생명 주기를 관리한다.(IoC)

이러한 의존성 주입에는 3가지 방식이 있는데, 이 중 생성자 주입을 지향해야 한다.

이유를 알아보자. 

 

의존성 주입의 종류

1. 필드 주입

@Service
public class AService{
	@Autowired
    pivate ARepository aRepository;
    
    @Autowired
    pivate BService bService;
}

장점 

  • 코드가 간결하다.

단점

  • 외부에서 수정이 불가능 하다. 
    • ex) AService 에서 사용하는 repository를 변경하여 테스트 하고싶은 경우
  • Spring DI 가 필수이다.
  • 객체가 mutable 하지 못하다.

 

2. 수정자 주입

@Service
public class AService{
    pivate ARepository aRepository;
    pivate BService bService;
    
    @Autowired
    public void setARepository(ARepository aRepository){
    	this.aRepository = aRepository;
    }
    @Autowired
    public void setBService(BService bService){
    	this.bService = bService;
    }
}

장점

  • 외부에서 수정이 가능하다.

단점

  • Setter 가 public 이기 때문에 의존성 주입 객체의 변경 가능성이 열린다. 
    = 다른 곳에서 임의로 객체를 변경 할 수 있기 때문에 에러 발생 위험이 높아진다.

 

3. 생성자 주입 

@Service
public class AService{
    pivate final ARepository aRepository;
    pivate fianl BService bService;
    
    @Autowired
    public void AService( ARepository aRepository, BService bService ){
    	this.aRepository = aRepository;
        this.bService = bService;
    }
}

장점

  • 객체의 불변성 확보
    • 객체의 생성자는, 객체 생성 시 1회만 호출되기 때문
  • 테스트 코드 작성의 편리함 
    • 테스트 코드 구동 환경은 Spring DI 에 관리 받지 않기 때문에 생성자 주입을 사용할 경우, 생성자를 사용하여 테스트 가능하다.
  • 변수의 final 선언으로 의존성 주입을 필수 설정 가능 
  • 순환 참조 방지

 

Lombok의 @RequiredArgsConstructor 어노테이션

@Service
@RequiredArgsConstructor
public class AService{
    pivate final ARepository aRepository;
    pivate fianl BService bService;
}

Lombok의 @RequiredArgsConstructor 어노테이션 사용 시, [3. 생성자 주입] 과 같은 생성자를 자동으로 생성 해 준다. 

 


참조

https://programforlife.tistory.com/111

 

[Spring] 생성자 주입을 사용해야 하는 이유

인턴을 시작한 초기 단계에, Spring 프로젝트 코드 분석을 하다가 신기한 점을 발견해서 질문을 한 기억이 있습니다. Spring프로젝트에서 Controller를 작성할 때, 저는 항상 @Autowired 어노테이션을 사

programforlife.tistory.com

'Backend > JAVA' 카테고리의 다른 글

가비지 컬렉션(Garbage Collection)  (0) 2023.07.12