Spring boot/기본 정리

DI 그리고 IoC

코딩딩코 2022. 10. 31.

DI(Dependency Injection) : 의존성 주입
외부에서 생성된 객체를 주입해주는 것입니다.

IoC(Inversion of Control) : 제어의 역전
말 그대로 메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미합니다.

 

 

DI는 의존관계를 외부에서 주입하는 것을 의미합니다.

class A {
    private Shape shape;

    public A(Shape shape) {
        this.shape = shape;
    }
}

class B {

	public void createShape() {
            A circle = new A(new Circle());
            A triangle = new A(new Triangle());
            A square = new A(new Square());
     
    // 의존관계를 외부에서 주입하는 것을 DI라고 합니다.
    }

}

의존관계란 A가 B를 의존한다는 의미입니다.

쉽게 말씀드리면 한 클래스가 다른 클래스의 기능을 사용하는 관계라고 생각하시면 될 것 같습니다.

 

DI 방법은 생성자 삽입, 수정자 삽입, 필드 주입이 있습니다.

 

 

생성자 삽입은 생성자에 @Autowired 어노테이션을 붙이는 방법입니다.

public class A {

    private Shape shape;

    @Autowired
    public A(Shape shape) {
        this.shape = shape;
    }
}

 

수정자 삽입은 Setter를 이용해서 의존성을 주입하는 방법입니다.

public class A {

    private Shape shape;

    @Autowired
    public void setShape(Shape shape) {
        this.shape = shape;
    }
}

 

마지막으로 필드주입이란 변수 선언부에서 @Autowired 어노테이션을 붙여 의존성을 주입하는 방법입니다.

public class A {

    @Autowired
    private Shape shape;
    
}

 

@Autowired는 해당 어노테이션이 붙어있으면 @Bean이나 @Service, @Controller 등 어노테이션에 의해

IoC 컨테이너에 등록된 Bean 객체를 찾아서 의존 관계의 타입을 찾아 자동으로 의존성을 주입해주는 어노테이션입니다.

 

IoC 컨테이너란 스프링에서 IoC를 담당하는 컨테이너를 의미합니다. 스프링 컨테이너라고도 합니다.

스프링 컨테이너가 관리하는 객체를 빈(Bean)이라고 하고

클래스에 @Component, @Service, @Bean과 같은 어노테이션을 달아주면 자동으로 IoC컨테이너에 Bean 객체가 등록이 됩니다.

 

하지만 여기서 @Component와 @Bean은 사용법에서 차이가 있습니다.

 

@Component는 개발자가 작성한 클래스에 사용을 합니다.

@Component
public class Shape{

}

 

@Bean은 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용합니다.

그리고 @Configuration이 달려있는 클래스 내에서 @Bean을 사용하여 Bean 객체를 등록하여야 합니다.

@Configuration
public class CustomConfig{

    @Bean
	public BCryptPasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}
}

@Bean을 이용해서 Bean객체를 등록 할 때에는 생성자를 return 해주는 방식으로 등록하셔야 합니다.

'Spring boot > 기본 정리' 카테고리의 다른 글

Error Code  (0) 2022.10.31
@Qualifier를 이용한 DI  (0) 2022.10.31
@Controller와 @RestController  (0) 2022.10.31
클라이언트 사이드 렌더링 / 서버 사이드 렌더링  (0) 2022.10.30
Spring MVC Framework  (0) 2022.10.30

댓글