스프링부트의 DI 관련 애노테이션들

Dong·2024년 11월 20일

Spring

목록 보기
4/8
post-thumbnail
어노테이션설명
@SpringBootApplication스프링 부트 애플리케이션의 시작점으로, 컴포넌트 스캔과 자동 구성을 포함하는 복합 어노테이션
@Component빈으로 등록할 클래스를 정의하며, 스프링 컨테이너가 자동으로 관리
@Service서비스 계층을 나타내는 @Component의 확장
@Repository데이터 접근 계층을 나타내는 @Component의 확장
@ControllerMVC 패턴에서 컨트롤러 계층을 나타내는 @Component의 확장
@Autowired의존성 자동 주입을 지정하며, 타입을 기준으로 빈을 주입
@Qualifier같은 타입의 여러 빈 중 특정 빈을 주입할 때 사용
@Primary같은 타입의 여러 빈 중 기본값으로 지정할 빈을 설정
@Resource이름을 기준으로 빈을 주입하며, JSR-250 표준 어노테이션
@Configuration자바 기반 설정 클래스 지정
@Bean자바 기반 설정 클래스에서 빈을 등록할 때 사용

예시코드

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.context.annotation.Primary;

// 스프링 부트 애플리케이션 시작점
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

// Service 인터페이스 정의
public interface PaymentService {
    void pay();
}

// 기본으로 사용할 결제 서비스 구현
@Component
@Primary  // 기본 빈으로 지정
public class CreditCardPaymentService implements PaymentService {
    @Override
    public void pay() {
        System.out.println("Credit card payment processed");
    }
}

// 또 다른 결제 서비스 구현
@Component("paypalPaymentService")
public class PaypalPaymentService implements PaymentService {
    @Override
    public void pay() {
        System.out.println("PayPal payment processed");
    }
}

// OrderService에서 PaymentService를 의존성 주입으로 사용
@Component
public class OrderService {

    private final PaymentService paymentService;

    // `@Autowired`와 `@Qualifier`를 함께 사용해 특정 빈 주입
    @Autowired
    public OrderService(@Qualifier("paypalPaymentService") PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    public void processOrder() {
        paymentService.pay();
    }
}

1. @SpringBootApplication

  • @SpringBootApplication은 스프링 부트 애플리케이션의 시작점에 붙는 어노테이션이다. 이 어노테이션은 여러 기능을 포함하고 있다.
  • 구성: @SpringBootApplication은 사실 @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan을 포함하는 복합 어노테이션이다.
    • @SpringBootConfiguration: 스프링 부트 애플리케이션의 구성 클래스로 지정
    • @EnableAutoConfiguration: 스프링 부트가 애플리케이션의 설정을 자동으로 구성하도록 한다.
    • @ComponentScan: 해당 패키지와 하위 패키지에서 스프링 컴포넌트(@Component, @Service, @Repository, @Controller)를 찾아 등록한다.
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

2. @Component

  • @Component는 스프링 컨테이너에 빈으로 등록할 클래스를 지정하는 기본 어노테이션이다. 주로 일반적인 빈으로 등록할 클래스에 사용된다. @Component가 붙은 클래스는 자동으로 스프링 컨테이너에 등록되며, 다른 빈에서 이를 주입받을 수 있다.
@Component
public class OrderService {
    // 서비스 로직
}

@Service, @Repository, @Controller

@Component의 특별한 형태로, 용도에 따라 세분화된 어노테이션들이 있음

  • @Service: 서비스 계층의 클래스를 나타내며, 비즈니스 로직을 처리하는 클래스에 사용
  • @Repository: DAO 계층에서 주로 사용하며, 데이터베이스와 상호 작용하는 클래스에 적용 @Repository는 스프링이 데이터 접근 계층에 대한 예외를 일관되게 처리하도록 도와준다.
  • @Controller: MVC 패턴에서 컨트롤러 계층을 담당하는 클래스에 사용한다. 주로 HTTP 요청을 처리하고, View 또는 JSON 응답을 반환하는 역할
@Service
public class OrderService { }

@Repository
public class OrderRepository { }

@Controller
public class OrderController { }

3. @Autowired

  • @Autowired의존성 주입을 자동으로 수행하기 위해 사용되는 어노테이션입이, 스프링은 @Autowired가 붙은 필드, 생성자, Setter 메서드에 대해 자동으로 의존성을 주입한다.

사용 위치

  • 필드 주입: 필드에 @Autowired를 직접 붙여서 의존성을 주입
  • Setter 메서드 주입: Setter 메서드에 @Autowired를 붙여서 의존성을 주입
  • 생성자 주입: 생성자에 @Autowired를 붙여서 의존성을 주입합니다. 생성자가 하나일 경우 @Autowired를 생략할 수 있다.
@Component
public class OrderService {
    @Autowired
    private PaymentService paymentService;

    @Autowired
    public void setPaymentService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

4. @Qualifier

  • @Qualifier같은 타입의 빈이 여러 개 있을 때 특정 빈을 지정하여 주입할 때 사용한다. @Autowired와 함께 사용하며, 주입할 빈을 명확히 지정할 수 있다
@Component
public class OrderService {
    private final PaymentService paymentService;

    @Autowired
    public OrderService(@Qualifier("creditCardPaymentService") PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

5. @Primary

  • @Primary같은 타입의 빈이 여러 개 있을 때 기본적으로 주입할 빈을 지정한다. @Primary가 지정된 빈은 동일 타입의 여러 빈 중에서 기본값으로 선택됨 @Qualifier가 있을 경우 @Primary보다 @Qualifier가 우선이 된다.
@Component
@Primary
public class CreditCardPaymentService implements PaymentService {
    // 서비스 구현
}

6. @Resource

  • @ResourceJSR-250 표준 어노테이션으로, @Autowired와 유사한 기능을 제공하지만 기본적으로 이름을 기준으로 주입한다. @Resource는 주로 Java EE 환경에서 쓰이지만, 스프링에서도 사용 가능하다고 한다.
@Component
public class OrderService {
    @Resource(name = "creditCardPaymentService")
    private PaymentService paymentService;
}

7. @Configuration

  • @Configuration스프링 설정 클래스를 정의할 때 사용하며, 자바 기반 설정을 작성할 수 있도록 한다. 이 클래스는 하나 이상의 @Bean 메서드를 포함하여 컨테이너에 빈을 등록할 수 있다.
@Configuration
public class AppConfig {
    @Bean
    public PaymentService paymentService() {
        return new CreditCardPaymentService();
    }
}

8. @Bean

  • @Bean자바 기반 설정 파일에 메서드를 정의하고, 그 메서드의 리턴값을 빈으로 등록할 때 사용된다. @Configuration 클래스 안에서 주로 사용
@Configuration
public class AppConfig {
    @Bean
    public OrderService orderService() {
        return new OrderService(paymentService());
    }

    @Bean
    public PaymentService paymentService() {
        return new CreditCardPaymentService();
    }
}
profile
소통을 잘하는 백엔드 개발자가 되기 위해, 꾸준히 성장하고 기록중입니다.

0개의 댓글