IoC Container란?
IoC Container는 객체 지향 프로그래밍에서 객체의 생명주기와 의존성을 관리하는 중요한 도구이다. IoC Container의 핵심 목적은 객체의 생성과 관리를 프로그래머로부터 가져와 프레임워크나 라이브러리가 담당하도록 하는 것이다.
IoC Container 역할
IoC Container는 어플리케이션 내에서 필요한 객체들을 생성하고 관리한다. 이는 개발자가 직접 new 연산자를 사용하여 객체를 생성하는 것이 아니라, 컨테이너가 어플리케이션의 설정에 따라 자동으로 객체를 생성한다.
컨테이너는 객체 간의 의존성을 해결한다. 이는 일반적으로 의존성 주입(DI)을 통해 이루어진다. 예를 들어, 어떤 서비스 클래스가 데이터베이스 접근 객체를 필요로 할 때, IoC Container는 해당 객체를 서비스 클래스에 주입해 준다.
객체의 생명주기(생성,사용,파괴)를 컨테이너가 관리한다. 이를 통해 객체가 필요할 때 생성되고, 더 이상 필요하지 않을 때 자동으로 처리될 수 있다.
어플리케이션의 객체와 의존성 관련 설정을 한 곳에서 관리할 수 있다. 이는 코드의 재사용성과 유지보수성을 높여준다.
Spring Framework의 IoC Container
빈(Bean)이란?
Spring IoC Container에 의해 관리되는 객체를 의미한다. 빈은 스프링 컨테이너에 의해 인스턴스화되고, 관리되며, 필요에 따라 다른 객체에 주입된다.
빈은 일반적으로 XML파일이나 어노테이션을 통해 정의되고, 스프링 컨테이너에 의해 생성되고 관리된다. 개발자는 빈의 생성과 소멸 방식, 범위(scope)등을 설정할 수 있다.
빈은 다양한 범위를 가질 수 있는데, 싱글톤(Singleton) 범위는 어플리케이션 내에서 한 인스턴스만 존재하게 하고, 프로토타입(Prototype) 범위는 빈을 요청할 때마다새로운 인스턴스를 생성한다.
빈은 다른 빈에 의존성을 가질 수 있으며, 이러한 의존성은 컨테이너에 의해 자동으로 주입된다.
@Component
이 어노테이션은 클래스가 스프링 컨테이너에 의해 관리되는 빈임을 나타낸다. @Component를 사용함으로써 해당 클래스의 인스턴스가 Spring IoC(Inversion of Control) 컨테이너에 의해 자동으로 생성되고 관리된다.
클래스에 @Component 어노테이션을 붙이면, 스프링의 클래스패스 스캐닝 기능이 이를 감지하고 자동으로 빈으로 등록한다. 이는 개발자가 수동으로 XML 파일 등에 빈을 등록하는 것보다 편리하다.
@Component가 붙은 클래스는 스프링 컨테이너에 의해 관리되므로, @Autowired와 같은 다른 어노테이션을 사용하여 의존성 주입을 받을 수 있다.
@Component는 더 특수화된 어노테이션들의 기반이 되기도 한다. 예를 들어, @Service, @Repository, @Controller등은 @Component의 특화된 형태로, 각각 서비스 계층, 데이터 접근 계층, 프레젠테이션 계층의 빈을 정의하는 데 사용된다.
모든 클래스에 @Component를 사용하는 것은 바람직하지 않다. 빈으로 관리되어야 할, 즉 컨테이너에 의한 생명주기 관리가 필요한 클래스에만 사용해야 한다.
@Component를 사용함으로써 생성되는 빈은 어플리케이션의 전체 수명 동안 메모리에 상주하게 된다. 따라서 불필요한 빈의 생성은 성능과 리소스에 영향을 줄 수 있다.