본문 바로가기
카테고리 없음

[ 스프링 프레임워크 ] IoC / DI / Bean / 컨테이너

by Hwanii_ 2023. 10. 19.
728x90

IoC (Inversion of Control), DI (Dependency Injection)


IoC나 DI는 어떤 판이 있다고 할 때,
아주 큰 판을 스프링 이라고 본다면,

우리는 그 판 위에서 본인의 어플리케이션을 만들어 나가는 개념 이라고 생각 할 수 있겠다.
(판 위에 우리가 만들어놓은 여러 기능을 조립 한다고 생각 할 수 있겠다)

 

 

 

Bean 이란 ?


IoC와 DI를 공부 할 때, 많이 나오는 용어로 Bean 을 볼 수 있다.

Bean 단어 자체는 콩을 의미 하는데, 여담으로 자바는 처음 오크 라는 이름으로 출발 했다.

하지만, 다른 회사에서 이미 오크 라는 이름을 사용 해서, 중간에 그린으로 변경 했다가 다시 자바로 변경 하게 되었다.

자바 단어의 유래는 자바 개발자들이 자주 가던 카페에서 사용 하고 있는 커피 원두의 이름을 따서 지은 설이 있다.

그래서 Bean (콩 == 원두) 라는 단어를 좋아 한다.

 

 

 

자바에서의 javaBean


1) 데이터를 저장 하기 위한 구조체. 자바 빈 규약 이라는 것을 따르는 구조체 이다. (클래스)

2) private 접근제어자가 붙은 멤버변수 (프로퍼티) 와 getter / setter 로만 데이터를 접근 한다.

3) 인수 (argument) 가 없는 기본 생성자가 디폴트로 존재 한다.

 


어떤 특정한 클래스는 보통 프로퍼티가 있고 메서드가 존재 한다.

메서드는 이 프로퍼티를 사용 해서 무언가 클래스가 행위를 할 수 있도록 하는게 일반적인데,

이 javaBean은 행위가 없고 단순히 데이터를 저장하기 위한 용도로 사용 되는 구조체 라고 생각 하면 된다.

 

public class JavaBean {

	private String id;
	private Integer count;

	public JavaBean(){}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Integer getCount() {
		return count;
	}

	public void setCount(Integer count) {
		this.count = count;
	}
    
}

 

 

 

스프링에서의 Bean


1) 스프링 IoC 컨테이너에 의해 생성 되고 관리 되는 객체.

2) 자바에서처럼 new 키워드를 사용해서 new Object(); 로 생성 하지 않는다.

3) 각각의 Bean 들 끼리는 서로 편리 하게 의존 (사용) 할 수 있다.

일반적으로 사용자가 만든 클래스를 스프링의 Bean 으로 등록 하겠다는 설정을 할 수 있다.

그러면 스프링의 IoC 컨테이너가 직접 개발자 대신에 특정 클래스를 메모리에 올려 준다.

 

 

 

 

 

컨테이너란 ?


원래는 우리가 알고 있는 화물을 싣는 거대한 네모 상자 처럼,
스프링이 여러 빈 또는 기능을 담고 있다고 해서 컨테이너 라고 한다.
'통' 이라고 생각 하면 된다.

스프링에서 가장 중요한 핵심 개념을 IoC 컨테이너 라고 할 수 있다.
스프링의 내부에 ApplicationContext 라는 Context 인터페이스 라는 것을 기반으로 동작 한다.

개발자가 Bean을 등록 하기 위해 설정만 해주면 스프링이 클래스를 Bean 으로 대신 등록 해준다.

실제로 ApplicationContext 내부 코드를 보면 Bean이 List의 형식으로 등록 된다.

그래서 이 List 내부에 개발자가 설정한 클래스가 싱글톤 패턴으로 인스턴스화 된다.

그런데 그 클래스를 그대로 인스턴스화 하는것은 아니고,
스프링의 ApplicationContext가 지니고 있는 온갖 설정 값 들을,

특정한 클래스들에 입혀주면서 싱글톤 패턴으로 인스턴스화 한다고 보면 된다.

 

 

 

스프링의 Bean 등록 방법 ?


1) 과거에는 xml 설정 파일을 따로 관리 하여 등록 했다. => 불편
(설정 자체도 번거롭고 귀찮을 뿐더러, 오타가 나더라도 구동 하기 전까지는 에러를 알 수 없음)

2) 현재는 @ 어노테이션 기반으로 Bean 을 등록 한다. => 편리 => @Bean, @Controller, @Service, ..

 

 

 

Bean의 Scope ?


Scope : Bean을 생성하는 규칙

1) singleton : 컨테이너에 단일로 생성 (서버가 내려 가기 전까지 계속 반복 재활용)

2) prototype : 작업 시마다 Bean을 새로 생성하고 싶을 경우

3) request : http 요청마다 새롭게 Bean을 생성하고 싶은 경우

Bean도 자바의 클래스와 동일 하게 프로퍼티를 지니고 있는 클래스 이다.
대부분 Web MVC 프로젝트 하위에 있는 Bean 들은, 프로퍼티를 처음 한번 설정해 놓으면 거의 변경 하지 않는다.
그래서 대부분은 싱글톤 패턴으로 Bean을 생성 하게 된다.

하지만, 목적에 따라서 프로퍼티를 변경해 줘야 하는 경우가 있다.
이런 경우에는 해당 Bean을 계속 해서 사용 할 수 없게 된다.

 

예를 들어보자.

100명의 사용자가 있다고 해보자.

만약에 A라는 사용자가 첫 결제 요청을 할 때, 할인율이 프로퍼티에 들어가 있다고 해보자.

이때, A 사용자는 VIP 회원이라서 결제 할 때 할인율 10%가 적용 되서 결제 되어야 하는 상황 이다.

다음으로 B 사용자는 VIP 회원이 아니다.
그런데 이 회원도 결제 요청을 보냈는데, 이전에 할인율 10%가 프로퍼티로 존재하는 Bean을 재사용 하게 되면,
엉뚱하게 B 사용자도 10% 할인율이 적용 되서 결제가 되게 된다.

그래서 이런 경우에는,

해당 Bean을 싱글톤 패턴으로 생성 하지 않고, Bean을 매번 생성 하고 소멸시키고, 생성 하고 소멸시키고 하는 방식을

prototype 또는 request 라고 한다.

대부분의 Bean은 싱글톤 패턴으로 생성 되기 때문에,

서버가 시작 할 때 같이 생성 되고, 서버가 내려 갈 때 같이 소멸 된다.

 

 

 

그런데 빈이 생성 될 때, 어떤 작업을 수행 시키고 싶거나,

빈이 소멸 될 때, 어떤 작업을 수행 시키고 싶을 때 사용 하는 개념이 있다.


Bean LifeCycle callback (빈 생명주기 콜백함수)


callback : 어떤 이벤트가 발생하는 경우 호출되는 메서드

lifecycle callback
Bean을 생성하고 초기화하고 파괴하는 등 특정 시점에 호출되도록 정의된 함수

주로 많이 사용되는 콜백

1) @PostConstruct : 빈 생성 시점에 필요한 작업을 수행
2) @PreDestroy : 빈 파괴 (주로 어플리케이션 종료) 시점에 필요한 작업을 수행

 

 

 

 

 

 

 

 

References

 

The IoC Container :: Spring Framework

 

The IoC Container :: Spring Framework

This chapter covers Spring’s Inversion of Control (IoC) container.

docs.spring.io

 

자바빈즈 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

자바빈즈 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 자바빈즈(JavaBeans)는 자바로 작성된 소프트웨어 컴포넌트이다. 자바빈즈의 사양은 썬 마이크로시스템즈에서 다음과 같이 정의되었다. "빌더 형식의 개발도구에

ko.wikipedia.org

반응형