의존성 주입(DI) 방법 비교

Spring 에서는 객체 간 의존성을 직접 생성하지 않고 컨테이너가 대신 주입(DI)해준다.

 

DI의 방식들에 대해 비교해보았다.

 

1. 생성자 직접 생성 

public class UserService {
    private UserRepository userRepository = new UserRepository();
}

 

개발자가 직접 의존성을 주입하며 Spring DI의 장점을 모두 포기한 방식으로 Spring 환경에서는 사용하면 안된다.

(의존성 직접 생성)

 

2. 세터 주입

@Service
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

 

의존성을 선택적으로 주입할 수 있지만,

객체 생성 이후에 의존성이 주입되므로 실제 사용하기 전까지 시스템이 정상적으로 동작하는 것으로 보이지만,

실제 호출 시점에 NullPointException 발생 위험 있어 코드를 신뢰할 수 없음.

 

3. 생성자 주입 + final 

 

3-1. 기존 생성자 주입 방식

private final UserRepository userRepository;
public UserService(UserRepository userRepository) { // Spring이 밖에서 넣어줌
    this.userRepository = userRepository;
}

3-2 @RequiredArgsConstructor을 사용한 생성자 주입

@RequiredArgsConstructor
public class UserService {
    private final UserRepository userRepository;
}

객체가 생성되는 시점에 의존성이 주입되며 생성자 파라미터가 존재하지 않으면 컴파일 단계에서 오류 발생,

생성자가 생성되지 않으면 컴파일조차 되지 않으므로 NPE 발생 위험 낮고 안정적이다.

final 키워드가 붙은 필드만 생성자를 만들어주므로 final 필수

 

Spring에서는 3.생성자 주입을 통해 불변 객체를 만드는 것이 가장 안전하고 권장되는 방식이다.

 

+ Recent posts