웹/Spring

[Spring] @Aurowired 의존성 주입(Dependency Injection)

개발하는소유밍 2024. 1. 29. 22:04

스프링 어노테이션 중에는 @Autowired 가 있는데,

이 어노테이션을 특정 필드에 부여하면 IoC 컨테이너 안에 존재하는 특정 필드와 같은 타입의 Bean 자동으로 찾아 주입해주게 된다.

 

 

※ 스프링 프레임워크에서 의존성을 주입하는 방법(생성자 주입 권장)

1. 필드 주입

 - 필드 주입방식은 Class에 속한 Field 위에 @Autowired 어노테이션을 붙여주면 된다.

 

@Service
public class TestService {

	@Autowired
	private TestRepository testRepository;
}

 

 

2. 수정자 주입

 - Setter  method를 만들어 준 후 에 @Autowired 어노테이션을 붙여준다.

 

@Service
public class TestService {

    private TestRepository testRepository;
    
    @Autowired
    private void setTestRepository(TestRepository testRepository){
    	this.testRepository = testRepository;
    };
}

 

 

3. 생성자 주입(Constructor Injection)

 - 단일 생성자의 경우 @Autowired 어노테이션을 붙이지 않아도 되지만,

 생성자가 2개 이상인 경우에는 생성자에  @Autowired 어노테이션 붙여줘야한다.

 

@Service
public class TestService {

    private TestRepository testRepository;
    
    //@Autowired
    private TestRepository(TestRepository testRepository){
    	this.testRepository = testRepository;
    };
}
/*
	클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면
	@Autowired를 생략해도 주입이 가능하도록 스프링 프레임워크에서 편의성을 제공
*/

 

 

 

✔   생성자 주입의 장점

 1. 순환 참조 방지

 2. final 선언이 가능 - 런타임에 객체 불변성을 보장(필드, 수정자 주입은 필드를 final로 선언할 수 없음)

 3. 테스트 코드 작성 용이

 4. 단일책임의 원칙(SRP)위반 확률을 낮춰줌

   *생성자 주입이 아닌 필드주입으로 클래스 내부의 선언된 필드에 @Autowired만 붙여 쉽게 의존성을 주입한다는것은

   하나의 클래스가 여러가지 기능을 담당하게 만들기도 쉽다는 의미와 더불어,

   생성자 주입은 생성자 파라미터에 사용하고자 하는 필드를 모두 넣어주어야 하기 때문에 코드가 길어지고 경각심을 가질 수 있음

 

 

✔  생성자 주입과 필드/수정자 주입의 차이

 

생성자 주입 먼저 생성자의 인자에 사용되는 빈을 찾거나 빈 팩토리에서 만든 다음,
찾은 인자 빈으로 주입하려는 빈의 생성자를 호출
(즉, 주입하려는 빈을 먼저 찾고 빈을 생성)
필드/수정자 주입 먼저 빈을 생성한 후, 주입하려는 빈을 찾아 주입
(순환참조가 실행될 수 있음)

 

 


 

[Java] 생성자(Constructor)의 특징

✔ 생성자(Constructor) 란 ? ⁂ 객체가 생성될 때, 자동으로 호출되는 특수목적의 멤버함수(메서드)로, 객체 초기화(객체의 필드값을 설정하는것)를 위해 사용 ⁂ 인스턴스 생성 시에 실행되어야 할

younimini.tistory.com

 

300x250