ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring에서 @Autowired를 사용하는 것보다 생성자 주입 방식이 나은 이유?
    Spring 2024. 7. 24. 10:33
    728x90
    반응형

     

    Spring에서 @Autowired를 사용하는 것보다 생성자를 통해 구성하는 방식이 더 나은 이유는 다음과 같습니다:

    1. 불변성(Immutable) 보장: 생성자 주입은 필드를 final로 선언할 수 있게 하여 객체의 불변성을 보장합니다. 불변 객체는 상태 변화를 방지하여 안전성을 높입니다.
    2. 명시적 의존성(Explicit Dependency): 생성자 주입은 클래스의 의존성을 명확하게 보여줍니다. 어떤 의존성이 필요한지 명확하게 드러나기 때문에 코드의 가독성이 향상됩니다.
    3. 테스트 용이성(Testability): 생성자 주입을 사용하면 테스트 코드에서 setter나 리플렉션을 사용하지 않고도 의존성을 쉽게 주입할 수 있습니다. 따라서 단위 테스트 작성이 더 용이합니다.
    4. 순환 의존성 방지: 생성자 주입은 순환 의존성을 방지할 수 있습니다. Spring은 순환 의존성이 있는 경우 애플리케이션 시작 시점에서 이를 감지하여 오류를 발생시키므로 문제를 조기에 발견할 수 있습니다.
    5. 프레임워크 독립성: 생성자 주입을 사용하면 Spring 프레임워크에 덜 의존적이게 됩니다. 이는 코드가 프레임워크에 덜 종속적이기 때문에 유지보수성과 재사용성을 높입니다.

    예제

    1. @Autowired를 사용하는 경우:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class UserService {
    
        private UserRepository userRepository;
    
        @Autowired
        public void setUserRepository(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    
        // 서비스 메서드
    }

     

    2. 생성자 주입을 사용하는 경우:

     

    import org.springframework.stereotype.Component;
    
    @Component
    public class UserService {
    
        private final UserRepository userRepository;
    
        public UserService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    
        // 서비스 메서드
    }

     

    주요 차이점 설명:

    • 필드의 불변성: 생성자 주입 방식에서는 userRepository 필드를 final로 선언하여 객체 생성 후에는 변경될 수 없음을 보장합니다.
    • 의존성 명시: 생성자 주입은 의존성을 명시적으로 선언하므로 UserService 객체가 UserRepository를 필요로 한다는 것이 명확히 드러납니다.
    • 순환 의존성 감지: 만약 UserService와 UserRepository가 서로를 의존하고 있다면, 생성자 주입 방식에서는 Spring이 애플리케이션 시작 시점에 이를 감지하고 오류를 발생시켜 문제를 조기에 발견할 수 있게 합니다.
    728x90
    반응형
Designed by Tistory.