Spring의 IoC

초코칩·2024년 4월 17일
0

spring

목록 보기
5/16
post-thumbnail

Spring IoC

Spring IoC(제어의 역전, Inversion of Control)는 Spring Framework의 핵심 개념 중 하나로, 객체의 생성, 구성, 생명 주기 관리를 개발자가 아닌 컨테이너(Spring IoC 컨테이너)가 담당하는 것을 의미한다. 이를 통해 객체 간의 결합도를 낮추고 애플리케이션의 유연성과 테스트 용이성을 높인다.

대표적인 개념으로는 관리 대상인 Spring Bean, Bean의 생명 주기를 관리하는 IoC 컨테이너인 Application Context, 객체가 필요한 의존성을 주입하는 DI가 있다.

Spring Bean

Spring에서 Spring이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트를 Bean이라고 한다. 동시에 스프링 Bean은 스프링 컨테이너가 생성과 관계설정, 사용 등을 제어해주는 제어의 역전(IoC)이 적용된 오브젝트를 가라키는 말이다.

Application Context

Spring에서 Bean의 생성과 관계설정과 같은 제어를 담당하는 IoC 오브젝트를 Bean Factory라고 부른다. 보통 Bean Factory보다는 이를 더 확장하는 Application Context를 주로 사용한다. 즉 Application Context는 IoC 방식에 따라 만들어진 일종의 Bean Factory이다.

Application Context는 별도의 설정 정보를 참고해서 Bean의 생성, 관계설정 등의 제어 작업을 총괄하는 IoC 엔진이다.

의존성 주입(Dependency Injection)

의존성이란 객체가 다른 객체의 기능을 필요로 할 때 이를 의존성이라고 한다. 예를 들어, 서비스 객체가 리포지토리 객체를 필요로 한다면 리포지토리 객체가 서비스 객체의 의존성이다.

대표적인 방법으로 생성자 주입, 수정자 주입, 필드 주입이 있다.

생성자 주입은 생성자를 통해 의존성을 주입하는 방식입니다. 객체가 생성될 때 의존성을 함께 전달받는다.

수정자 주입은 세터 메서드를 통해 의존성을 주입하는 방식이다. 객체가 생성된 후 필요한 의존성을 세터 메서드를 통해 주입받는다.

필드 주입은 필드를 통해 의존성을 주입하는 방식이다. 직접 필드에 주입하는 방식으로, 가장 간단하지만 테스트가 어려울 수 있다.

Application Context 동작 방식

기존 오브젝트 팩터리를 이용했던 방식과 스프링의 Application Context를 사용한 방식을 비교해보자.

현재 DaoFactory는 UserDao를 비록한 DAO 객체를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적인 역할을 하는데 반해, Application Context는 애플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계설정을 담당한다.

대신 ApplicationContext에는 DaoFactory와 달이 직접 오브젝트를 생성하는 코드는 없고, 그런 생성정보와 연관관계 정보를 별도의 설정정보를 통해 얻는다. 때로는 외부의 오브젝트 팩토리에 그 작업을 위임하고 그 결과가 가져다가 사용하기도 한다.

@Configuration이 붙은 DaoFactory는 이 Application Context가 활용하는 IoC 설정정보다. 내부적으로는 Application Context가 DaoFactory의 userDao() 메서드를 호출해서 생성한다. 생성한 오브젝트를 가져와 getBean()으로 요청할 때 전달해준다.

Application Context는 DaoFactory 클래스를 설정정보로 등록해두고 @Bean이 붙은 메서드의 이름을 가져와 Bean 목록을 만들어둔다.

장점

DaoFactory와 같은 오브젝트 팩터리에서 사용했던 IoC 원리를 그대로 적용하는 데 Application Context를 사용하는 이유는 범용적이고 유연한 방법으로 IoC 기능을 확장하기 위해서다. 명확한 장점은 다음과 같다.

클라이언트는 구체적인 클래스를 알 필요 없다.

DaoFactory처럼 IoC를 적용한 오브젝트도 계속 추가될 것이다. 클라이언트가 필요한 오브젝트를 가져오려면 어떤 팩터리 클래스를 사용해 할지 알아야하고, 필요할 때마다 팩토리 오브젝트를 생성해야 하는 번거로움이 있다. Application Context를 사용하면 오브젝트 팩터리가 아무리 많아져도 이를 알아야하거나 직접 사용할 필요가 없다.

Application Context를 이용하면 일관된 방식으로 원하는 오브젝트를 가져올 수 있다. 또한 DaoFactory처럼 자바 코드를 작성하는 대신 XML처럼 단순한 방법을 사용해 Application Context가 사용할 IoC 설정정보를 만들 수도 있다.

Application Context는 종합 IoC 서비스를 제공해준다.

Application Context의 역할은 단지 오브젝트 생성과 다른 오브젝트의 관계설정만이 전부가 아니다. 오브젝트가 만들어지는 방식, 시점과 전략을 다르게 가져갈 수도 있고, 이에 부가적으로 자동생성, 오브젝트에 대한 후처리, 정보의 조합, 설정 방식의 다변화, 인터셉팅 등 오브젝트를 효과적으로 활용할 수 있는 다양한 기능을 제공한다. 또, Bean이 사용할 수 있는 기반기술 서비스나 외부 시스템과의 연동 등을 컨테이너 차원에서 제공해주기도 한다.

Application Context는 Bean을 검색하는 다양한 방법을 제공한다.

Application Context의 getBean() 메서드는 Bean의 이름을 이용해 Bean을 찾아준다. 타입만으로 Bean을 검색하거나 특별한 어노테이션 설정이 되어 있는 Bean을 찾을 수도 있다.

Spring IoC 용어 정리

Spring IoC에서 나온 용어들을 정리하자.

Bean

스프링 IoC 컨테이너에서 관리하는 자바 객체이다. 관리되는 오브젝트(Managed Object)라고도 불린다. 주의할 점은 스프링을 사용하는 애플리케이션에서 만들어지는 모든 오브젝트가 다 Bean은 아니다. 그중에서 Spring이 직접 생성과 제어를 담당하는 오브젝트만이 Bean이다.

Bean Factory

스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다. Bean을 등록하고, 생성하고, 조회하고 돌려주고, 그 외에 부가적인 Bean을 관리하는 기능을 담당한다. 보통은 이 Bean Factory를 바로 사용하지 않고 이를 확장한 Application Context를 이용한다. BeanFactory라고 붙여쓰면 Bean Factory가 구현하고 있는 가장 기본적인 인터페이스의 이름이 된다.

Application Context

Bean Factory를 확장한 IoC 컨테이너다. Bean을 관리하는 기본적인 기능 뿐만 아니라, Spring이 제공하는 각종 부가 서비스인 트랜잭션 서비스, AOP 서비스, 국제화(il8n)를 위한 메시지 소스, 애플리케이션 이벤트 처리와 같은 여러 서비스를 제공한다.

스프링 기반 애플리케이션을 개발할 때는 Application Context 인터페이스를 이용해 스프링을 사용하는 것을 권장한다. 스프링은 Application Context를 직접 코드로 부트스트랩하거나(직접 인스턴스를 생성하고 적절한 애플리케이션 구성을 불러오는 방식) 웹 컨테이너 환경에서 ContextLoaderListener를 이용해 부트스트랩한다.

설정정보/설정 메타정보

스프링의 설정정보란 Application Context 또는 Bean Factory가 IoC를 적용하기 위해 사용하는 메타정보를 말한다. 실제로 스프링의 설정정보는 컨테이너의 어떤 기능을 세팅하거나 조정하는 경우에도 사용하지만, 그보다는 IoC 컨테이너에 의해 관리되는 애플리케이션 객체를 생성하고 구성할 때 사용된다. 따라서 애플리케이션의 형상 정보라고 불린다.

컨테이너 또는 IoC 컨테이너

IoC 방식으로 Bean을 관리한다는 의미에서 Application Context나 Bean Factory를 컨테이너 또는 IoC 컨테이너라고 한다. 컨테이너라는 말 자체가 IoC의 개념을 담고 있기 때문에 Application Context 대신에 스프링 컨테이너라고 부르는 사람이 많다. Application Context는 ApplicationContext 인터페이스를 구현한 오브젝트를 가리키기도 하는데, Application Context 객체는 하나의 애플리케이션에서 보통 여러 개가 만들어져 사용된다. 이를 통틀어 스프링 컨테이너라고 부를 수 있다.

따라서 스프링 컨테이너 또한 스프링 프레임워크의 핵심이며 스프링 빈의 생명 주기를 관리하여 Spring 프레임워크의 특징인 IoC(제어역전)와 DI(의존성주입)을 제공해주는 역할을 한다.

스프링 프레임워크

스프링 프레임워크는 IoC 컨테이너, 애플리케이션 컨텍스트를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용한다.

profile
초코칩처럼 달콤한 코드를 짜자

0개의 댓글

관련 채용 정보