1. IoC (Inversion of Control)
IoC 는 제어의 역전을 의미한다. 일반적으로 프로그램의 제어 흐름은 개발자가 코드를 작성하면서 관리한다. 그러나 IoC 에서는 제어의 주도권이 프레임워크나 컨테이너에게 넘어간다. 스프링에서는 IoC 가 객체의 생명주기와 관련된 제어를 담당한다. 즉 객체의 생성, 관리, 소멸 등을 프레임워크가 담당하고, 개발자는 이를 설정하거나 사용할 빈(Bean)을 정의한다.
Ioc는 싱글톤 패턴으로, 객체가 하나만 필요한 것들을 메모리에 띄워서 Ioc 컨테이너에 담고, 필요할 때 의존성 주입으로 사용한다.
@Component
원하는 클래스에 어노테이션을 사용하면 해당 클래스가 IoC 컨테이너에 담긴다.2. 빈(Bean)
빈은 스프링에서 IoC 컨테이너에 의해 생성, 관리되는 객체를 의미한다. 개발자는 빈을 정의하고 필요한 의존성을 주입받아 사용한다.
loC은 빈의 생명주기를 관리하며, 의존성 주입을 한다.
3. 의존성 주입 (Dependency Injection, DI)
의존성 주입은 객체 지향 프로그래밍에서 한 객체가 다른 객체에 대한 의존성을 직접 생성하는 것이 아니라, 외부에서 주입받는 것을 의미한다. 즉 필요한 다른 객체를 스스로 생성하지 않고, 외부에서 주입받아 사용하는 디자인 패턴이다.
의존성 주입을 사용하면 코드의 결합도를 낮출 수 있으며, 테스트 용이성을 높일 수 있다.
public class PizzaRecipe { public void makePizza() { } } public class CheesePizzaRecipe implements PizzaRecipe { public void makePizza() { } }
public class Chef { private PizzaRecipe pizzaRecipe; public Chef(PizzaRecipe pizzaRecipe) { this.pizzaRecipe = pizzaRecipe; } Chef chef = new Chef(new CheesePizzaRecipe()); } Chef chef = new Chef(new PepperoniPizzaRecipe()); }
Chef 클래스는 피자레시피를 만들지 않고, 외부의 클래스를 호출해서 사용한다. 만약 다른 레시피가 필요하다면 새로운 클래스를 만들면 된다.
4. 컨포넌트 스캔(Component Scanning)
컨포넌트 스캔은 클래스들 중 특정 어노테이션이 붙은 클래스들을 자동으로 찾아내서 빈(Bean) 등록을 하는 기능이다.
개발자가 모든 빈을 수동으로 등록하는 대신, 스프링이 클래스 경로나 패키지를 스캔하여 자동으로 빈을 찾아 등록하는 방식이다.
패키지 스캔
스프링은 지정된 패키지나 패키지들을 스캔하여 그 안에 존재하는 클래스들을 찾는다.
애너테이션 분석
찾은 클래스들 중에서 스프링 빈으로 등록할 것인지 결정하기 위해 애너테이션을 분석한다. 예를 들어,
@Component
, @Service
, @Repository
, @Controller
등의 스프링 애너테이션이 사용된 클래스들을 스캔 대상으로 선택할 수 있다.빈 등록
선택된 클래스들을 스프링 컨테이너에 빈으로 등록한다. 이때 빈의 이름은 보통 클래스의 이름을 사용한다.
Share article