본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2024-2 SpringBoot 스터디] 탁태현 #2주차

반응형

 

DI의 3가지 방법

 

강의에서는 DI를 하는 방법이 필드 주입, 생성자 주입, setter주입 이렇게 3가지가 존재 한다고 한다. 이것들에 대해서 자세히 알아보았다.

 

필드 주입

필드 주입은 spring에서 제공하는 @Autowried 라는 어노테이션을 이용한다.

 


@Service
class ThemeService {

    @Autowired private ThemeRepo themeRepo;
    
    public void 유저아이디로_주제_전체_가져오기() throws Exception {
     ...
    }
}

interface ThemeRepo{
...
{

@Repository
class ThemeRepoImpl implements ThemeRepo {
...
}

다음과 같이 의존성을 주입을 하고자 하는 객체 앞에 @Autowired를 붙혀주면 스프링 IOC컨테이너가 이것을 자동으로 주입시켜 준다.

 

필드 주입에는 큰 단점이 1가지 존재하는데

Unit Test를 못한다는 단점이다. IOC 컨테이너를 통해서 직접 주입을 받는 경우밖에 존재 하지 않아 Spring이 실행되지 않는 상황에서는 themeRepo에 값을 주입시켜줄 방법이 없다.

 

생성자 주입(권장)

생성자 주입은 생서자를 통해서 의존성을 주입하는 방식이다.

@Service
class ThemeService {

    private final ThemeRepo themeRepo;
	
    @Autowired
    public ThemeService(ThemeRepo themeRepo){
    	this.themeRepo = themeRepo;
    }
    
    public void 유저아이디로_주제_전체_가져오기() throws Exception {
     ...
    }
}

interface ThemeRepo{
...
{

@Repository
class ThemeRepoImpl implements ThemeRepo {
...
}

 

생성자 주입에는 큰 특징이 2가지 있다.

 

  • 필드값을 final로 설정할 수 있다.
  • spring이 없어도 객체를 수동으로 주입시켜 줄 수 있다.

이 특징들이 가지는 의미는

필드값이 final이 됨으로써 여러 사람들이 협업하여 작업해도 객체가 바뀔일이 없어 버그 발생 가능성을 차단시켜 준다.

객체를 수동으로 주입시켜 줄 수 있어 Unit Test상황에서도 객체를 mocking해서 넣어 테스트가 가능하다.

 

이러한 특징들 덕분에 특별한 경우가 아니라면 생성자 주입을 사용하는 것이 권장 된다.

 

 

setter 주입

setter를 이용한 주입은 일반적으로 많이 사용하는 setter를 DI에 적용시킨 사례이다.

@Service
class ThemeService {

    private ThemeRepo themeRepo;
	
    public ThemeService(){}
    
    @Autowired
    public void setThemeRepo(ThemeRepo themeRepo){
     this.themeRepo = themeRepo;
    }
}

interface ThemeRepo{
...
{

@Repository
class ThemeRepoImpl implements ThemeRepo {
...
}

 

위 코드 처럼 의존성을 주입시켜주는 코드를 Setter로 구현하고 외부에서 setter를 이용해 필요할 때 의존성을 주입 시켜 줄 수 있다.

이 방식에는 큰 2가지 위험성이 존재한다.

 

  • 인스턴스가 null일 가능성이 있다.
  • 싱글톤으로 유지되는 인스턴스(ThemeService)에서 의존하는 인스턴스가 변할 수 있다.

혹시나 코드 사용중에 setter를 이용해 의존성을 주입하지 않은상태에서 인스턴스에 접근하려 하면 NPE(Null Pointer Expection)이 발생할 수 있다.

 

두번째로는 여러 사람이 Setter를 보고 자신이 인스턴스를 변경해도 된다고 생각해 인스턴스를 막 변경하면 알 수 없는 장애로 이어질 가능 성이 크다. 반대로 말하면 이것은 인스턴스가 IOC컨테이너에 떠있는 상태에서도 인스턴스를 교체할 수있다는 장점으로 작용할 수도 있다.

반응형