| 어노테이션 | 설명 |
|---|---|
@SpringBootApplication | 스프링 부트 애플리케이션의 시작점으로, 컴포넌트 스캔과 자동 구성을 포함하는 복합 어노테이션 |
@Component | 빈으로 등록할 클래스를 정의하며, 스프링 컨테이너가 자동으로 관리 |
@Service | 서비스 계층을 나타내는 @Component의 확장 |
@Repository | 데이터 접근 계층을 나타내는 @Component의 확장 |
@Controller | MVC 패턴에서 컨트롤러 계층을 나타내는 @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();
}
}
@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);
}
}
@Component는 스프링 컨테이너에 빈으로 등록할 클래스를 지정하는 기본 어노테이션이다. 주로 일반적인 빈으로 등록할 클래스에 사용된다. @Component가 붙은 클래스는 자동으로 스프링 컨테이너에 등록되며, 다른 빈에서 이를 주입받을 수 있다.@Component
public class OrderService {
// 서비스 로직
}
@Component의 특별한 형태로, 용도에 따라 세분화된 어노테이션들이 있음
@Repository는 스프링이 데이터 접근 계층에 대한 예외를 일관되게 처리하도록 도와준다.@Service
public class OrderService { }
@Repository
public class OrderRepository { }
@Controller
public class OrderController { }
@Autowired는 의존성 주입을 자동으로 수행하기 위해 사용되는 어노테이션입이, 스프링은 @Autowired가 붙은 필드, 생성자, Setter 메서드에 대해 자동으로 의존성을 주입한다.@Autowired를 직접 붙여서 의존성을 주입@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;
}
}
@Qualifier는 같은 타입의 빈이 여러 개 있을 때 특정 빈을 지정하여 주입할 때 사용한다. @Autowired와 함께 사용하며, 주입할 빈을 명확히 지정할 수 있다@Component
public class OrderService {
private final PaymentService paymentService;
@Autowired
public OrderService(@Qualifier("creditCardPaymentService") PaymentService paymentService) {
this.paymentService = paymentService;
}
}
@Primary는 같은 타입의 빈이 여러 개 있을 때 기본적으로 주입할 빈을 지정한다. @Primary가 지정된 빈은 동일 타입의 여러 빈 중에서 기본값으로 선택됨 @Qualifier가 있을 경우 @Primary보다 @Qualifier가 우선이 된다.@Component
@Primary
public class CreditCardPaymentService implements PaymentService {
// 서비스 구현
}
@Resource는 JSR-250 표준 어노테이션으로, @Autowired와 유사한 기능을 제공하지만 기본적으로 이름을 기준으로 주입한다. @Resource는 주로 Java EE 환경에서 쓰이지만, 스프링에서도 사용 가능하다고 한다.@Component
public class OrderService {
@Resource(name = "creditCardPaymentService")
private PaymentService paymentService;
}
@Configuration은 스프링 설정 클래스를 정의할 때 사용하며, 자바 기반 설정을 작성할 수 있도록 한다. 이 클래스는 하나 이상의 @Bean 메서드를 포함하여 컨테이너에 빈을 등록할 수 있다.@Configuration
public class AppConfig {
@Bean
public PaymentService paymentService() {
return new CreditCardPaymentService();
}
}
@Bean은 자바 기반 설정 파일에 메서드를 정의하고, 그 메서드의 리턴값을 빈으로 등록할 때 사용된다. @Configuration 클래스 안에서 주로 사용@Configuration
public class AppConfig {
@Bean
public OrderService orderService() {
return new OrderService(paymentService());
}
@Bean
public PaymentService paymentService() {
return new CreditCardPaymentService();
}
}