본문 바로가기
개발/Web

[Spring] 빈(bean)을 등록하는 방법

by zuzuu 2022. 7. 1.
반응형

 

1. 컴포넌트 스캔과 자동 의존관계 설정

컴포넌트 스캔의 원리
@Component 어노테이션이 선언되어 있으면 스프링 빈으로 자동 등록
  • @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문! (@Controller 어노테이션을 살펴보면 @Component가 선언된 것을 볼 수 있음)
  • @Service, @Repository도 마찬가지로 @Component가 선언되어 있어 스프링 빈으로 자동 등록 된다.

 

 예시 

  • OrderController.java
@Controller 
public class OrderController {

    private final OrderService orderService;
    
    @Autowired
    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }
}
  • OrderService.java
@Service
public class OrderService {

    private final OrderRepository orderRepository;

    @Autowired
    public OrderService(OrderRepository orderRepository) {
        orderRepository = orderRepository;
    }
    
}

생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 객체 생성 시점에 해당 빈을 찾아서 주입한다. 생성자가 하나만 있으면 생략 가능!  -> 이렇게 객체의 의존 관계를 외부에서 넣어주는 것을 DI라고 한다!

참고 : @Autowired 를 통한 DI @Controller , @Service 등과 같이 스프링이 관리하는 객체에서만 동작한다. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

  • OrderRepository.java
@Repository
public class OrderRepository {}

이렇게 설정하면 OrderController - > OrderService -> OrderRepository구조로 스프링 컨테이너에 스프링 빈으로 등록된다.   

 


 

2. 자바 코드로 직접 스프링 빈 등록하기

OrderService.java와 OrderRepository.java의 @Service, @Repository, @Autowired 어노테이션을 제거한다. (OrderController.java는 유지)

 예시 

  • OrderConfig.java
@Configuration
public class OrderConfig {
 
    @Bean
    public OrderService orderService() {
        return new OrderService(orderRepository());
    }

    @Bean
    public OrderRepository orderRepository() {
      return new OrderRepository();
    }
}

@Configuration 어노테이션이 선언된 클래스를 생성하고, 스프링 빈으로 등록하고자 하는 메소드에 @Bean 어노테이션을 추가하면, 스프링 빈으로 등록된다.

 

3. XML로 설정

application.xml에 bean을 직접 등록할 수 있으나 최근에는 거의 사용하지 않는다.

하지만 아직 많은 레거시 프로젝트가 XML로 되어 있기도 하고, 컴파일 없이 빈 설정 정보를 변경할 수 있다는 장점이 있다.

<beans ...>

    <bean id="orderService" class="com.test.order.OrderService">
    	<constructor-arg name="orderRepository" ref="orderRepository"/>
    </bean>

    <bean id="orderRepository" class="com.test.order.OrderRepository">
    </bean>

</beans>

 

 

728x90
반응형

댓글