@Autowired란?

백엔드&인프라 추종자·2025년 2월 21일

스프링 공부

목록 보기
6/35

@Autowired란?

@AutowiredSpring Framework에서 의존성 주입(Dependency Injection, DI)을 위한 어노테이션입니다. Spring 컨테이너가 애플리케이션의 객체들 간에 필요한 의존 관계를 자동으로 해결해주기 위해 사용됩니다. 쉽게 말해, @Autowired자동으로 객체를 주입해주는 역할을 합니다.


1️⃣ 의존성 주입(Dependency Injection, DI)

의존성 주입(DI)은 객체가 다른 객체에 의존할 때, 해당 의존 객체를 외부에서 주입하는 방식입니다. 이를 통해 클래스 간의 결합도를 낮추고, 유연한 코드단위 테스트 용이성을 제공합니다.

예를 들어, UserService 클래스가 UserRepository 객체에 의존하고 있다고 가정할 때, Spring이 UserRepository를 자동으로 UserService에 주입해주도록 하는 것입니다.


2️⃣ @Autowired의 사용 방법

🔹 1. 필드 주입 (불편함이 존재)

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;
    
}
  • 필드에 @Autowired를 사용하면, Spring은 UserRepository 타입의 객체를 찾아 자동으로 주입합니다.
  • 단점: 테스트가 어려워지고, 필드가 final로 선언되지 않기 때문에 불변성(immutable)을 보장할 수 없습니다.

🔹 2. 생성자 주입 (권장)

@Service
public class UserService {

    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
  • 생성자에 @Autowired를 사용하면, Spring은 생성자를 호출할 때 의존성을 주입합니다.
  • 장점: final을 사용하여 의존성을 불변으로 만들 수 있으며, 단위 테스트가 용이합니다.
  • Spring 4.3 이상에서는 생성자가 하나일 경우 @Autowired 어노테이션을 생략할 수 있습니다.

🔹 3. 세터 주입

@Service
public class UserService {

    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
  • 세터 메서드에 @Autowired를 사용하면, 의존성이 선택적으로 주입될 수 있습니다.
  • 장점: 선택적 의존성 주입이 가능하지만, 불변성을 보장할 수 없습니다.

3️⃣ @Autowired의 동작 방식

  • Spring 컨테이너는 애플리케이션이 실행될 때, @Autowired가 붙은 필드, 생성자, 세터 메서드에 대해 의존 객체를 주입합니다.
  • 주입될 객체는 Spring의 빈(Bean)으로 등록된 객체여야 하며, 주입할 객체가 없으면 예외가 발생합니다. (예: No qualifying bean of type...)

4️⃣ @Autowired의 특징

특징설명
자동 주입Spring은 @Autowired가 붙은 변수, 생성자, 세터 메서드에 자동으로 의존성을 주입함
선택적 주입의존성이 여러 개일 경우, @Qualifier를 사용하여 명시적으로 주입할 빈을 선택할 수 있음
빈이 없을 경우주입할 객체가 없으면 예외가 발생 (No qualifying bean of type...)
@Autowired 생략 가능Spring 4.3 이상에서는 생성자가 하나일 경우 @Autowired 어노테이션을 생략 가능

5️⃣ 결론

@AutowiredSpring의 의존성 주입을 자동화하여, 객체 간의 의존성을 쉽게 관리하고, 코드의 결합도를 낮추며, 유연하고 테스트하기 좋은 구조를 만듭니다.

  • 생성자 주입을 기본으로 사용하고, 필드 주입과 세터 주입은 특정 상황에서만 사용하세요.

@Autowired를 통해 Spring 컨테이너가 자동으로 의존성 객체를 주입해주는 방식을 활용하면, 더 나은 애플리케이션 설계가 가능합니다. 🚀

profile
AI 답변 글을 주로 올립니다.

0개의 댓글