본문 바로가기

TIL

33_Step : loC 컨테이너 제대로 사용하기(@bean, @component)

IoC 컨테이너란??

- 객체 생성 및 관리를 해주며 의존성을 관리하는 역할을 한다.

- 스프링 IoC 컨테이너는 DI(의존성 주입)를 하기 위해 쓴다. DI를 하기 위해서는 주입해주는 객체를 먼저 생성해야 하는데 객체를 어느 위치에서 생성해주냐를 고민할 것이다. BUT!!! 스프링 IoC 컨테이너를 쓰는 순간 그런 고민은 하지 않아도 된다. 그럼 그 매커니즘에 대해 알아보자.

 

DI를 하는 이유??

- DI를 강조하는 이유는 우리가 하나의 프로그램을 만드는데 이때 프로그램의 코드들이 강한 결합에 의해 묶여 있다고 가정해 보자. 프로그램 작동시 변경사항도 있을 거고, 수정해야 할 부분들도 생길 것이다. 강한 결합은 큰 약점이 여기서 나온다. 객체나 클래스가 서로 연관성이 짙게 묶여있기 때문에 작은 부분이라도 수정을 시작하게 되면 고구마 줄기처럼 다른 부분들도 수정해줘야 하는 상황이 발생한다. 그래서 약한 결합으로 연결되게 하는 것을 선호하고 추구한다.

 

 

IoC로 데이터를 넣는 방법은 @bean을 활용하는 것이다.

 

@Bean

Bean은 스프링이 직접 관리해주는 객체라고 보면 된다. 때문에 우리는 Bean으로 만들어만 주면 스프링이 알아서 관리해주기 때문에 매우 편리하게 작업할 수 있다.

bean이라는 이름처럼 앞에 콩모양의 아이콘이 생성됐다면 스프링 IoC 에서 관리할 '빈' 클래스라고 설정된 것이다.

이때 @Component라는 어노테이션을 볼 수 있는데 이는 같은 위치의 패키지에서 bean을 찾고, 찾은 bean을 IoC 컨테이너에 넣어주는 역할을 한다. 그렇게 bean이 IoC 컨테이너에 들어가면 스프링이 그 bean을 관리해주며 우리가 편리해진다.

 

bean을 사용하는 방법

1. 직접 객체를 생성하여 bean으로 등록하는 법

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfiguration {
    @Bean
    public baseRepository baseRepository() {
    String dbUrl = "jdbc:h2:mem:basecampdb";
    String dbId = "alpha";
    String dbPassword = "bravo";
    return new ProductRepository(dbUrl, dbId, dbPassword);
    }
   }

 

위와 같이 직접 bean을 타이핑해서 넣는 방법이 있다.

실행시켰을때 이렇게 콩에 화살표 모양이 있으면 빈이 등록된 것이다.

 

2. @Autowired

- 멤버변수 선언 위에 @Autowired → 스프링에 의해 DI (의존성 주입) 됨

@Component
public class ProductService {
    @Autowired
    private ProductRepository productRepository;
}

- '빈' 을 사용할 함수 위에 @Autowired → 스프링에 의해 DI 됨

@Component
public class ProductService {
	
    private final ProductRepository productRepository;
    
    @Autowired
    public ProductService(ProductRepository productRepository) {
    	this.productRepository = productRepository;
  	}
}

 

 

@Autowired는 스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 가능하다

@Autowired는 Spring 4.3 버젼 부터, 생성자 선언이 1개 일 때만 생략 가능한데 되도록이면 써주는 편이 좋다.

 

DI는 스프링 공부의 꽃이라고 할 수 있으니 잘 모르겠으면 차근차근 열심히 이해하도록 노력하는 것이 나중을 위해서도 필요하다. 꼭 DI와 IoC를 쓰는 이유와 어떻게 쓰이는지에 대해 명확히 알고 지나가자!

 

화이팅~!!!