제어의 역전(IoC, Inversion Of Control) 이란
사용자의 제어권을 다른 주체에게 넘기는 것을 IOC(제어의 역전) 라고 한다.
우리가 처음 자바 프로그램을 배울 때, 각 객체들이 프로그램의 흐름을 결정하고 객체를 직접 생성하고 조작하는 작업을 했었다. 쉽게 말해 Class를 생성하고 new를 입력하여 원하는 객체를 직접 생성한 후에 사용했다는 말이다.
이렇게
객체를 직접 생성하여 메소드 호출하는 작업을 했고 이 말은 사용자가 직접 작업을 제어하는 구조였다는 뜻이다. 예를 들면, A객체에서 B객체에 있는 메서드를 사용하고 싶다면 B객체를 직접 A객체 내에서 생성하고 메서드를 호출했던 방식이다.
예시)
// A 클래스 정의
class A {
private B bInstance;
public A(B bInstance) {
this.bInstance = bInstance;
}
public String callBMethod() {
String result = bInstance.someMethod();
return result;
}
}
// B 클래스 정의
class B {
private int value;
public B(int value) {
this.value = value;
}
public String someMethod() {
return "B 객체의 메서드가 호출되었습니다. 값: " + value;
}
}
//메인 클래스
public class Main {
public static void main(String[] args) {
// B 객체 생성
B bObj = new B(42);
// A 객체 생성하고 B 객체의 메서드 호출
A aObj = new A(bObj);
String result = aObj.callBMethod();
// 결과 출력
System.out.println(result);
}
}
하지만 IoC가 특징인 Spring에서는 IoC (Inversion of Control) 컨테이너를 사용하여 객체의 생성, 관리, 및 생명주기를 제어한다. 이것은 개발자가 직접 new를 이용하여 생성한 객체를 이용하여 객체의 생성과 관리를 직접 처리하는 것이 아니라 스프링 프레임워크가 이를 담당한다는 것을 의미한다.
스프링 컨테이너는 애플리케이션의 런타임 중에 객체를 생성하고, 필요한 의존성을 주입하며, 객체의 생명주기를 관리한다. 이로써 개발자는 객체 생성과 관리에 대한 걱정을 덜어낼 수 있고, 애플리케이션의 구성을 좀 더 유연하게 변경할 수 있다.
스프링의 IoC 컨테이너는 주로 다음 두 가지 방식으로 동작한다
의존성 주입 (Dependency Injection): 스프링은 객체가 필요로 하는 의존성(다른 객체)을 자동으로 주입해준다. 이를 통해 객체 간의 결합도를 낮추고 재사용성을 높일 수 있다는 장점 있다.
빈 라이프사이클 관리: 스프링 컨테이너는 빈(Bean) 객체의 라이프사이클을 관리한다. 빈은 컨테이너가 생성하고, 초기화하며, 필요할 때마다 주입하고, 사용 후에 정리된다.
따라서 스프링에서는 객체의 생성과 관리를 스프링 컨테이너에 위임하고, 이를 통해 객체 간의 결합도를 낮추고 애플리케이션을 더 관리하기 쉽게 만든다. 이렇게 스프링은 IoC 컨테이너를 통해 "다른 주체"가 객체의 생명주기와 관리를 담당하게 된다.
'spring 스프링' 카테고리의 다른 글
@Annotation 스프링 자주 사용하는 어노테이션 정리 (0) | 2023.08.23 |
---|---|
스프링 빈(Spring Bean)이란? (0) | 2023.08.21 |
[Spring Boot] 일정 주기로 실행하는 @Scheduled 사용해보기 (0) | 2023.08.15 |
Spring Boot 초기 데이터 설정 방법 정리(data.sql, schema.sql) (0) | 2023.08.09 |
application.properties 의 값을 불러와 사용하기 (0) | 2023.08.07 |