Spring 핵심 3대 요소
- 제어의 역전 (Ioc, Inversion of Control)
- 관점 지향 프로그래밍 (AOP, Aspect Oriented Programming)
- 서비스 추상화 (PSA, Portable Service Abstraction)
스프링에 대해 이해도를 높이기 위해
백기선님의 인프런 - 예제로 배우는 스프링 입문(개정판) 강의를 들으며 정리를 위해 포스팅합니다.
동영상 강의이고, 예제 코드를 통한 진행을 하므로 이해에 더욱 도움이 됩니다. 무료 강의이니 수강하시는 걸 추천드립니다!
제어의 역전 (IoC, Inversion of Control)
일반적인 경우 클래스에서 사용할 의존성을 직접 만들어서 사용합니다.
class OwnerController {
private OwnerRepository repo = new OwnerRepository();
}
위의 코드와 같이 OwnerController에서 사용할 의존성을 직접 생성( new OwnerRepository(); )해서 사용합니다.
제어의 역전(Ioc)이란?
컨트롤러가 의존성을 사용은 하지만, 직접 관리하지 않고
어디선가(IoC Container) 관리하는 일을 하고 만들어 줄 수 있도록 생성자를 통해 받아옵니다.
즉 OwnerController는 의존성 생성, 관리를 하지 않습니다.
Spring Framework는 IoC Container를 통해 인스턴스 생성을 일괄적으로 진행하고 라이프 사이클 관리까지 위임합니다.
인스턴스의 생성 및 관리의 주체가 IoC Container 이고 의존성을 주입해주기 때문에 제어의 역전이라고 불립니다.
의존성을 주입하는 것은 Dependency Injection(DI) 이라고 합니다.
Dependency Injection(DI)는 세 가지 방법이 있습니다.
- Setter injection(수정자 주입) : 의존성을 입력받는 Setter 메소드를 만들고 이를 통해 의존성을 주입받습니다.
- Constructor Injection(생성자 주입) : 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입받습니다.
- Spring Framework Reforence에서 권장하는 방법입니다.
- 아래 필드 주입에서 안내한 단점들이 대부분 보완이 되는 의존성 주입 방법입니다. - Field Injection(필드 주입) : 변수 선언부에 @Autowired Annotation을 사용하여 의존성을 주입받습니다.
- 의존성을 주입하기 간단하지만 여러 가지 문제점이 있어 생성자 주입을 통한 DI를 권장하고 있습니다.
- SOLID 원칙 중 하나인 단일 책임(SRP)의 원칙 위반, 테스트에 용이하지 않은 점, final 선언 불가로 인한 불변성 보장을 하지 않는 점, 순환 의존성에 대한 문제점 등이 있기 때문에 권장하지 않습니다.
Spring IoC Container 란?
"객체(Bean)의 생성을 책임지고, 의존성을 관리하는 컨테이너입니다. 말 그대로 제어권을 가지고 있습니다."
Spring IoC Container는 ApplicationContext 또는 BeanFactory 중 하나를 사용합니다.
주로 ApplicationContext를 사용합니다.
BeanFactory가 실질적 IoC Container이고, ApplicationContext는 BeanFactory를 상속받아 확장한 클래스입니다.
BeanFactory : Bean의 생성과 설정, 관리를 맡고 있습니다.
- Bean 등록, 생성, 조회, 반환을 관리합니다.
- getBean() 메소드가 정의되어 있습니다.
ApplicationContext : BeanFactory를 상속받고 있는 서브 인터페이스입니다. BeanFactory에 여러 기능을 추가했습니다.
- BeanFactory와 같이 Bean 등록, 생성, 조회, 반환을 관리합니다.
- Spring의 각종 부가 서비스를 추가로 제공합니다.
참고 자료