[spring boot 개념] 스프링은 IoC 컨테이너를 가진다.

이경민·2022년 7월 19일
0

spring

목록 보기
3/20

IoC (Inversion of Control): 역전의 제어

주도권을 spring이 갖고 있다. (메모리를 개발자가 아는 spring이 관리한다)

실체화 개념

  • class: 설계도
  • object: 실체화가 가능한 것
  • instance: 실체화가 된 것
📝 가구 (추상적인 개념) VS 의자/침대 (실체화 가능)
  • 코드로 object를 실체와 시키는 방법: object를 직접 new를 해서 Heap이라는 공간에 띄운다.
의자 s =  new 의자( );  // 의자를 실체화 시켜 메모리에 띄움

spring IoC의 역할

spring이 수 많은 object들을 class로 만들어 놨는데 spring이 읽어서 이 객체들을 직접 띄운다. 즉, spring이 알아서 이것들을 메모리에 올려준다.

컨테이너는 보통 객체의 Life Cycle을 관리하고 제어하는 것을 말한다. 제어권이 spring framework으로 넘어오면서 DI(의존성 주입), AOP (관점 지향 프로그래밍)을 가능하게 한다.

  • 메모리 동작 방식
    • 개발자가 new를 해서 heap 공간에 올리면 의자의 주소는 reference 변수 s가 들고 있고 s가 의자를 가리킴.
    • s는 new를 만든 stack, method 내부에서 관리.
    • s는 메서드 실행 시간에만 메모리에 떠있다.

다른 메서드에서 의자를 사용하고 싶으면 (새로 new를 하면) 아래 공간에 새로운 의자가 생성되면 기존 의자랑은 다른 것이다. 이러면 나중에 공유하는 것이 힘들다.

📝 spring에서는 개발자가 직접 new하는 방식 보다 IoC를 사용한다.
@Component
class A S ... // IoC   

spring이 해당 class를 읽어서(스캔) 자신이 들고 있는 메모리 공간(heap 안에)에 A라는 class를 로딩한다.


DI (dependency injection, 의존성 주입)를 지원

각 클래스 간에 의존관계를 빈 설정 정보를 바탕으로 외부 컨테이너에 주입하는 개념
spring이 scan을 하여 메모리에 띄움

scan을 하면 동일한 object를 원하는 모든 class의 method에서 의자(object)를 사용 가능하다. (즉, 동일 object를 다른 장소에서 여러 번 사용 가능) 필요한 곳에서 갖고와서 사용하는 것을 DI라고 한다. IoC와 DI를 하면 프로그램 작성이 편해진다.

singleton: 객체의 인스턴스가 오직 1개만 생성되는 패턴.

  • 장점1: 메모리
    최초 1번의 new 연산자르 통해 생성된 메모리 영역을 사용해 객체 접근할 때 메모리 낭비 방지. 이미 생성된 instance를 사용하기 때문에 메모리 낭비 방지.
  • 장점2: class간 데이터 공유 쉬움
    singleton instance는 전역으로 사용되기 때문에 다른 class의 instance들이 접근해 사용 가능하다. 하지만 동시 접근시 동시성 문제가 발생하므로 유의하기!!
  • 단점1: 구현 코드가 많이 필요
    동시성 문제 보완 위해 syncronized 키워드 사용 필요
  • 단점2: 테스트가 어렵다.
    자원을 공유하기 때문에 테스트가 결정적으로 격리된 환경헤서 수행되기 위해서는 매번 instance 상태 초기화가 필요하다. 아닌 경우 application 전역에서 상태가 공유되기 때문에 온전한 test 수행이 불가능하다.
  • 단점3: 유연성이 떨어진다.

0개의 댓글