Java Framework/Spring

[Spring] @Autowired

annovation 2025. 2. 2. 10:05

@Autowired

@Autowired는 Spring에서 의존성 주입을 간편하게 처리하기 위해 제공하는 애노테이션입니다. Spring이 관리하는 빈(bean)을 찾아서 해당 객체를 자동으로 주입합니다.

  • 빈(bean)이란?
    • Spring IoC 컨테이너에 의해 관리되는 객체를 의미합니다.
    • Spring은 애플리케이션 실행 시 필요한 객체들을 생성하고 관리합니다.

의존성 주입 (Dependency Injection) 

의존성 주입은 객체가 직접 필요한 의존성을 생성하지 않고, 외부에서 주입받는 설계 방식입니다. 객체 간의 결합도를 낮춰 코드의 재사용성과 테스트 용이성을 높입니다.

 

1. 전통적인 방식

public class OrderService {
    private PaymentService paymentService;

    public OrderService() {
        this.paymentService = new PaymentService(); // 직접 객체를 생성
    }
}
  • OrderService가 PaymentService를 직접 생성하여 강하게 결합됨

2. 의존성 주입 방식

public class OrderService {
    private final PaymentService paymentService;

    @Autowired
    public OrderService(PaymentService paymentService) { // 외부에서 주입
        this.paymentService = paymentService;
    }
}
  • PaymentService는 외부에서 주입되어, OrderService는 이를 직접 관리하지 않음

의존성 주입 종류 

1. 생성자 주입

생성자를 통해 필요한 객체를 주입받는 방식입니다.

 

(1) 직접 생성 방식 : 객체가 필요한 다른 객체를 스스로 생성합니다.

public class Car {
    private Engine engine;

    public Car() {
        this.engine = new Engine(); // Car가 Engine을 직접 생성
    }
}

➡️ 문제점

  • Car는 Engine에 강하게 의존합니다.
  • 다른 종류의 Engine(예: 전기 엔진)으로 바꾸려면 Car의 코드를 수정해야 합니다.

(2) 객체 주입 방식 : 외부에서 준비된 객체(Engine)를 Car에 전달합니다.

public class Car {
    private Engine engine;

    public Car(Engine engine) { // 외부에서 주입받음
        this.engine = engine;
    }
}
  • Car는 Engine의 구체적인 구현에 의존하지 않습니다.
  • Engine이 변경되더라도 Car의 코드 수정이 필요 없습니다.

2. 필드 주입

필드 주입(Field Injection)은 객체의 필드(멤버 변수)에 직접 주입을 받는 방식입니다.

public class Car {
    @Autowired // 필드 주입
    private Engine engine;
}
  • 동작 원리 : Spring이 실행될 때, Engine 객체를 찾아서 engine 필드에 자동으로 주입합니다. 즉, 개발자가 직접 engine을 생성하거나 설정하지 않아도 됩니다.

3. setter 주입

세터 메서드를 통해 객체를 주입받는 방식입니다.

public class Car {
    private Engine engine;

    @Autowired
    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}

출처

OpenAI ChatGPT (https://openai.com)

'Java Framework > Spring' 카테고리의 다른 글

[Spring] Validation Library 데이터 유효성 검사  (0) 2025.02.08
[Spring] HTTP Method  (0) 2025.02.07
[Spring] @GetMapping  (0) 2025.01.31
[Spring] @Transactional  (0) 2025.01.30
[Spring] HTTP 요청 어노테이션 (Annotation)  (0) 2024.12.18