스프링 개념 정리 IOC(제어의 역전)

0

스프링 IOC 개념 정리

스프링의 가장 큰 특징은 흔히 IOC , AOP , DI 가 있는데 여기서는 IOC를 개념을 정리해보려고 한다.

IOC(Inversion of Control)

해석하면 제어의 반전 or 제어의 역전이다. 즉 제어가 바뀌었다는 것을 의미한다.

-스프링을 쓰기전

스프링이라는 것을 사용하기 전에는 프로그램의 주체는 개발자였다.
어떻게 보면 당연하다. 개발자가 직접 코드를 작성하고 그것을 통해 프로그램을 실행시키니까
즉 프로그램을 제어하는 것은 개발자라는 말이다.
객체의 생성과 메소드 호출 등 모든 것이 개발자가 결정한다

-스프링에서는?

간단하게 말하면 프레임워크의 한 종류인 스프링이 맡아서 관리를 해준다.
프레임워크가 중심이 되어 코드를 실행하는 것이다.
당연히 객체 생성, 관리 등도 프레임워크가 맡아서 한다. 여기까지만 들으면 AI가 뚝딱뚝딱 해주는 거 같지만 그렇지는 않다

왜 해주는가? 왜 바뀌었는가?

개발자가 클래스를 만들고 잘 실행하고 프로그램을 관리하다가 왜 이렇게 바뀌었는가? 라고 의문을 가질 수 있다.
자바는 객체 지향 프로그래밍 언어이다. 즉 여러 객체가 서로 상호 작용하면서 실행이 된다. 이때 이 중에서 하나를 수정한다고 가정해보자 하나의 객체가 다른 객체에 최대한 영향을 안줘야지 편하게 수정 할 수 있을 것이다. 객체를 생성하려면 클래스를 만들어줘야 하고 그 안에 객체를 만들어야 할 것이고 이러한 과정이 반복되면 하나의 클래스가 다른 클래스에 영향을 줄 것이다. 이것은 유지 보수가 힘들어지는 것을 의미한다. 각 클래스들끼리 결합도가 너무 높기 때문이다. 반대로 말하면 각 클래스들끼리 서로 의존도가 낮아지고 결합도가 낮다면 유지보수가 편하진다는 뜻이기도 하다. IOC는 이러한 부분에서 강점을 가지고 있다.

DI(의존성 주입)

객체를 내부에서가 아닌 외부에서 만드는 것을 말한다.
일반적으로 우리가 객체를 만들면 클래스를 생성하고 그 내부에서 만들것이다. 근데 DI는 그렇지 않다 간단하게 요약하면

  1. 객체를 내부에서 생성할 것이냐 외부에서 생성해서 전달받을 것이냐의 차이다.
  2. 객체를 내부에서 생성하면 생성한 객체가 바뀌었을때 같이 수정해야할 가능성이 매우 높다. 이것을 강결합이라고 부른다.
  3. 객체를 외부에서 주입받게 되면 그 객체와의 의존도가 낮아진다. 객체가 수정되었을때도 영향을 덜 받는다. 약결합이라 부른다.
  4. 스프링에서는 다양한 객체들을 스프링 컨테이너에 미리 담아두기 때문에 원하는 객체를 주입받아 사용하기 편하다.

하여 DI를 통해 하나의 객체를 사용하여 여러 곳의 클래스가 이 공유 하는 개념으로서 사용하게 된다. 한번 객체를 선언 함으로 여러 곳에서 사용이 가능한 개념이다.

IoC container :

객체의 생성과 관계설정, 사용, 제거 등의 작업을 대신 해주는데 이때 이 안에서 저장 되는 객체들을 bean라고 한다.

Spring에서의 Bean 정의

Spring 애플리케이션의 백본을 형성하고 Spring IoC 컨테이너에 의해 관리되는 객체를 빈이라고 한다.
빈은 Spring IoC 컨테이너에 의해 인스턴스화 되고 조립, 관리되는 객체다.

Bean

: 스프링의 IoC 컨테이너가 관리하는 객체들.
즉 Spring에서의 빈(bean)은 ApplicationContext가 만들어서 그 안에 담고 있는 객체를 말한다.
IOC컨테이너에서는 싱글톤 패턴을 가지게 된다.

싱글톤 패턴

애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.

싱글톤은 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.

또한 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.

Bean을 사용하는 이유

Stdent student = new Stdent("kim");
School School = new School(student); 

생성자라는 것을 통해서 객체를 생성한다.

이러한 방법은 문제 없지만 클래스를 변경해야 하는 상황일떄 직접 다른 연관 클래스를 수정해야 한다는 번거로움이 생길 수 있다.

하지만 스프링에서 IOC 컨테이너에 넣어서 관리 한다면 싱글톤 레지스트리로 싱글톤 객체생성 관리를 하기때문에

객체에서는 싱글톤 생성과 관리를 할 필요가 없어져 평범한 객체로써 사용이 가능하다.(스프링의 POJO 기반)

평범한 객체로써 사용이 가능해지면서 아래와 같은 장점을 같게된다.

1.생성자를 public으로 지정 가능하여 객체를 객체지향적으로 프로그래밍 가능.
2.static으로 지정할 필요없기 때문에 전역상태로 관리 되지않아도 된다.
3.테스트를 위해 해당객체를 그대로 사용가능하여 테스트에도 용이하다.

스프링 요약

프로그램의 주체 및 관리가 개발자가 아닌 프레임워크가 주체가 모두 관리한다는 개념이다.

0개의 댓글