GiYeong

Spring - 1 본문

CS/Spring

Spring - 1

gy2710 2022. 6. 2. 19:54

IoC(Inversion of Control)

IoC를 그대로 해석하면 제어의 역전이다.
이는 개발자가 가지고 있던 제어권이 외부의 컨테이너에 넘어가서 객체의 생성, 라이프사이클 관리와 같은 객체에 대한 제어권이 바뀜을 의미한다.
제어권이 컨테이너로 넘어감에 따라, DI(의존성 주입), AOP(관점 지향 프로그래밍)등이 가능해진다.

IoC 컨테이너

Spring에서 객체를 생성하고 의존성을 관리해주는 컨테이너로서, 인스턴스의 생성부터 소멸까지의 Life Cycle 관리를 수행하기 때문에 개발자들이 비즈니스 로직에 집중할 수 있도록 해준다.

DI(Dependency Injection)

DI는 의존성 주입이라는 뜻으로, 객체 간의 의존성을 개발자가 아닌 외부에서 주입하는 것이다. Spring의 경우 IoC 컨테이너가 이를 수행한다.
여기서 의존(dependency)이란 객체 간의 의존을 의미한다. 예를들어 Service 클래스에서 Dao클래스의 메서드를 이용해서 DB처리를 하는 경우, 이를 Service 클래스가 Dao 클래스에 의존한다고 표현할 수 있다.
즉, 한 클래스에서 다른 클래스의 메서드를 실행하는 경우를 의존한다고 표현한다.

DI를 사용하지 않는다면 어떤 클래스에서 다른 클래스를 의존하는 경우, 다른 클래스의 객체를 직접 생성해서 사용할 것이다.

public class AService{
	private BDao bDao = new BDao();
}

DI는 의존하는 객체를 직접 생성하는 것이 IoC 컨테이너에서 Bean 객체를 생성하는 방식이다.

@Component	// Bean 객체로 등록
public class BDao{
}
public class AService{
	@Autowired	// 의존성 주입 Annotation
    private BDao bDao;
}

DI의 장점

  1. 객체 간의 의존성이 줄어든다.
  2. Unit Test가 용이해진다.
  3. 재사용성이 높은 코드가 된다.
  4. 가독성이 좋아진다.

Spring Bean

Spring에서 POJO를 Beans라고 한다.
POJO란, Plain Old Java Object로서 getter, setter와 같은 기본적인 기능만 가진 Java 객체를 말한다.
Spring은 POJO 방식을 기반으로 하는 웹 프레임워크로서 IoC, DI, AOP 등의 기술을 활용하여 POJO 기반의 구성을 이루었다.
즉, Spring에서 Bean이란 IoC 컨테이너가 관리하는 자바 객체를 의미한다. 이는 곧 IoC 컨테이너에 의해 생명주기가 관리되는 객체를 의미한다고 할 수 있다.

Spring Bean 생성 주기

Spring Bean은 객체 생성 - 의존 설정 - 초기화 - 사용 - 소멸 순의 Life Cycle을 가진다.
컨테이너가 초기화 될 때, Bean 객체를 설정 정보에 맞춰 생성하고, 의존 관계를 설정한 후, 해당 프로세스가 완료되는 Bean 객체가 지정한 메서드를 호출하여 초기화한다. Bean 객체를 사용한 뒤, 컨테이너가 종료되면 Bean 객체가 지정한 메서드를 호출하여 소멸된다.
Spring은 InitializingBean(생성 관련) 인터페이스와 DisposableBean(소멸 관련) 인터페이스를 제공하고 있으며, Bean 객체 클래스가 이를 구현하고 있으면 이를 호출하여 Bean 객체의 초기화 및 종료를 진행한다.

Bean Scope

Bean Scope란 Bean이 존재하는 범위를 의미한다.
Bean 객체는 기본적으로는 Spring 컨테이너의 시작과 종료까지 단 하나의 객체만을 사용하는 Singleton 범위를 가진다. 이는 이름을 다르게 해서 Bean 객체를 생성하더라도 식별자가 같기 때문에 같은 Bean 객체임을 의미한다.
만약 Bean 객체를 생성할 때마다 새로운 객체를 생성하도록 하고 싶다면 Prototype 범위를 사용하면 된다.

'CS > Spring' 카테고리의 다른 글

@Controller / @RestController  (0) 2022.09.04
Spring의 장점  (0) 2022.06.16
Spring - 3  (0) 2022.06.04
Spring - 2  (0) 2022.06.03
Comments