-
Spring에서 @Autowired를 사용하는 것보다 생성자 주입 방식이 나은 이유?Spring 2024. 7. 24. 10:33728x90반응형
Spring에서 @Autowired를 사용하는 것보다 생성자를 통해 구성하는 방식이 더 나은 이유는 다음과 같습니다:
- 불변성(Immutable) 보장: 생성자 주입은 필드를 final로 선언할 수 있게 하여 객체의 불변성을 보장합니다. 불변 객체는 상태 변화를 방지하여 안전성을 높입니다.
- 명시적 의존성(Explicit Dependency): 생성자 주입은 클래스의 의존성을 명확하게 보여줍니다. 어떤 의존성이 필요한지 명확하게 드러나기 때문에 코드의 가독성이 향상됩니다.
- 테스트 용이성(Testability): 생성자 주입을 사용하면 테스트 코드에서 setter나 리플렉션을 사용하지 않고도 의존성을 쉽게 주입할 수 있습니다. 따라서 단위 테스트 작성이 더 용이합니다.
- 순환 의존성 방지: 생성자 주입은 순환 의존성을 방지할 수 있습니다. Spring은 순환 의존성이 있는 경우 애플리케이션 시작 시점에서 이를 감지하여 오류를 발생시키므로 문제를 조기에 발견할 수 있습니다.
- 프레임워크 독립성: 생성자 주입을 사용하면 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반응형'Spring' 카테고리의 다른 글
AOP vs OOP 차이점 (0) 2024.09.12 Spring boot에서 AWS S3에서 받은 파일들을 Zip파일로 압축후 response하기 (in memory) (0) 2023.05.23 [Spring] @Component 클래스 생성자에서 @value값이 null일 경우 해결법 (0) 2022.12.18 @RequestParam ,@RequestBody 차이점 완전정복 (0) 2022.11.03 SPRING BOOT을 이용한 쇼핑몰 만들기(Chapter1) - 스프링 환경셋팅 *with intellij,jsp,mybatis,tomcat,postgreSql (0) 2022.05.16