JAVA

[JAVA/SpringBoot] 스프링 IoC 컨테이너 사용하기 (1-16)

wonderson 2022. 5. 28. 22:52
반응형

[여기에 적은 거는 강의 내용을 다 적은게 아니라서 강의자료 보면서 이 게시글 참고하자.]

[스프링 심화 강의 1주차 16강 스프링 IoC 컨테이너 사용하기]

 

- springCore 프로젝트에서 실습

 

 

스프링 IoC 컨테이너

👉 1주차 15강에서 DI 를 사용했을 때의 장점을 살펴 보았습니다.

  • 그런데 DI 를 사용하기 위해서는 객체 생성이 우선 되어야 했습니다. 과연 어디서 객체 생성을 해야 할까요? 바로 스프링 프레임워크가 필요한 객체를 생성하여 관리하는 역할을 대신해 줍니다.
  • 빈 (Bean): 스프링이 관리하는 객체
  • 스프링 IoC 컨테이너: '빈'을 모아둔 통

그럼 스프링 IoC 컨테이너에 어떻게 빈을 등록하고 사용하는지 확인해 보겠습니다.

 

스프링 '빈' 등록 방법

  1. @Component
    • 클래스 선언 위에 설정
@Component
public class ProductService { ... }
  • 스프링 서버가 뜰 때 스프링 IoC 에 '빈' 저장
    • @Component 클래스에 대해서 스프링이 해 주는 일
// 1. ProductService 객체 생성
ProductService productService = new ProductService();

// 2. 스프링 IoC 컨테이너에 빈 (productService) 저장
// productService -> 스프링 IoC 컨테이너
  • 스프링 '빈' 이름: 클래스의 앞글자만 소문자로 변경
    • public class ProductServcieproductServcie
  • '빈' 아이콘 확인 → 스프링 IoC 에서 관리할 '빈' 클래스라는 표시

 

스프링 '빈' 사용 방법

  1. @Autowired
    • 멤버변수 선언 위에 @Autowired → 스프링에 의해 DI (의존성 주입) 됨
@Component
public class ProductService {
		
    @Autowired
    private ProductRepository productRepository;
		
		// ...
}

 

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

  • @Autowired는 생성자 위에 써서 빈에 있는 클래스를 가져오겠다.
@Component
public class ProductService {

    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }
		
		// ...
}

 

  • @Autowired 적용 조건
    • 스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 가능

 

 

Lombok 의 @RequiredArgsConstructor 를 사용하면 다음과 같이 코딩 가능

- @RequiredArgsConstructor는 final로 선언된 멤버변수의 생성자를 자동으로 생성

- @RequiredArgsConstructor 좋지만 아직 배우는 단계이니깐 @Autowired 쓰자.

@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductController {

    private final ProductService productService;
    
    // 생략 가능
		// @Autowired
		// public ProductController(ProductService productService) {
		//     this.productService = productService;
		// }
}
반응형