Spring Boot

Spring Boot 중요 개념-IoC,DI

stophyeon 2023. 7. 21. 15:49
728x90

Spring의 핵심 3가지를 Spring Triangle이라고 부릅니다.

IOC,DI & PSA & AOP입니다.

그 중 IoC,DI부터 알아보겠습니다.

 

IoC(제어의 역전)

일반적으로 인스턴스를 생성하기 위해서는 Class를 정의하고 new연산자를 통해 인스턴스를 생성합니다.
이런 방식을 제어권이 프로그래머(개발자)에게 있다고 표현합니다.

위의 코드를 보시면 MovieService라는 Class에서 MovieRepository,UserRepository라는 Class를 사용한다는 것을 
알 수 있습니다. 하지만 인스턴스를 생성하지 않았습니다. 인스턴스를 생성하지 않았으니
MovieRepository,UserRepository라는 Class를 사용하지 못할 것같지만 addMovie 메서드에서는
UserRepository를 사용하고 있고, 오류 메세지도 뜨지 않았습니다. 

이 부분이 IoC(제어의 역전)이 발생한 부분입니다.
즉, Spring 프레임워크를 사용한다면 더 이상 개발자가 인스턴스를 생성(제어권)하지 않고
Spring Container가 인스턴스를 생성해서 선언된 곳에 인스턴스를 넘겨줍니다.

단, Spring Container에서 인스턴스를 생성할 수 있는 Class는 Bean으로 선언이 되어있는 Class입니다.
Bean으로 선언하는 방법은 아래 3가지 어노테이션을 사용해서 선언할 수 있습니다.
@Bean - 메서드, 필드를 Bean으로 등록
@Component - Class전체를 Bean으로 등록
@configuration - Class내에서 여러개의 Bean을 등록
하지만 위의 코드에는 3가지중 어느 어노테이션도 선언되어 있지 않습니다.
Spring의 어노테이션에는 @Component가 포함되어 있는 어노테이션들이 있습니다.
대표적으로 @Controller & @Service & @Repository가 있습니다.

 

DI(의존성 주입)

의존성이란 의존관계가 있는 객체들의 유무입니다.
의존 관계란 쉽게 말해서 A Class에 B Class가 사용된다면 A는 B와 의존관계가 있다고 합니다.
그렇다면 A의 인스턴스를 생성하기 위해서는 B의 인스턴스가 반드시 있어야합니다.

 

위의 코드에는 UserService와 UserRepository가 의존관계가 있습니다.
UserService 인스턴스를 생성하기 위해서는 UserRepository의 인스턴스를 생성자의 인수로 넘겨 줘야 합니다. 

UserService의 인스턴스를 생성하는 Class인 UserController의 코드를 보면 Spring Container에서
UserService를 생성해주는 것을 볼 수 있습니다. 그렇다면 UserService에는 UserRepository가 
필요한데 UserRepository의 인스턴스를 생성해서 UserService에 넣어주는 것은 어디에서 작업해줄까요
이 작업도 Spring Container에서 진행됩니다. 즉, UserService의 정의 부분에서 생성자를 보고 UseService의 
인스턴스를 생성할 때 UserRepository를 생성해서 해당 인스턴스에 주입시킨 상태로 UserController에게 
넘겨 줍니다. 

위 과정을 위해서는 의존관계가 있는 Class 모두 Bean으로 등록되어 있어야합니다.

 

의존성 주입 방식

의존성 주입을 하는 방법에는 3가지가 있습니다

1. 필드 주입
2. 메서드(Setter) 주입
3. 생성자 주입

 

3가지 모두 의존성을 Spring Container에서 주입을 해주지만 생성자 주입을 선호합니다.

이유는 생성자 주입을 통해 불변성을 유지, 순환참조를 방지할 수 있기 때문입니다.
불변성이란 필드에 final선언을 할 수 있는 것입니다. final선언을 한다면 런타임 중 필드의 값이 변경되지 않는 않습니다.
순환참조란 A가 B를 호출하고, B도 A를 호출하는 것입니다. 이렇게 된다면 A 생성을 위해 B가 필요하고 또 A가 필요해지는 상황이 발생합니다. 필드 주입을 사용하면 순환참조가 되어있는 Class를 생성하는데 오류가 발생하지 않지만
해당 인스턴스를 사용할 때 오류가 발생합니다.
하지만 생성자 주입을 한다면 인스턴스를 생성하는 과정에서 미리 오류가 발생해 개발자가 빠른 수정이 가능합니다.

생성자에 @Autowired를 선언하는 것으로 의존성을 자동으로 주입해 줍니다.
만약 해당 Class에 생성자가 1개라면 @Autowired를 생략가능합니다.

'Spring Boot' 카테고리의 다른 글

Controller  (0) 2024.01.07
Spring MVC 패턴  (0) 2024.01.05
Spring Boot - PSA  (0) 2023.07.28
Spring Boot - AOP  (0) 2023.07.24
Spring Boot 들어가기전에  (0) 2023.07.21