얄팍한 토비 스프링 공부 - Configuration / Bean, IOC, DI

IOC - 제어의 역행

1줄 요약:
"어플리케이션에서 사용하는 객체를 개발자가 정하는 것이 아니고 외부의 사용자가 정하게 하는 것"

'제어의 역행'이라니!! 한국어로 번역하면 너무나 어려운 용어가 된다.
쉽게 말하자면 각 객체들이 자신들의 로직을 수행할 때 필요한 것들을 직접 호출하거나 상속해서 쓰는게 아니고 중간자적인 존재 하나가 필요한 것들을 계속해서 공급해주는 것이다.
보통은 자신들이 능동적으로 필요한 오브젝트, 메소드, 파라미터를 호출하는데 반해 IOC가 되는 경우엔 필요로 하는 것들이 "지급"된다.
그리고 바로 이 "지급"이라는 것이 무엇이냐? DI가 되겠다.

DI - 의존관계설정
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
  • 런타임 시점의 의존관계가 클래스모델이나 코드에는 드러나지 않는다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로써 만들어진다. (From 토비 스프링)

의존성 주입이라고 많이 번역이 되는데.. 엄밀히 말하면 객체에 다른 객체가 포함되는 것이 아니라 참조값만 불러오는 것이기 때문에 의존관계설정이 더 정확한 표현이라 한다.
위의 IOC에서 이야기한 중간자적인 존재가 "지급"하는 대상이 DI 오브젝트들이다.
IOC가 필요한 것들을 지급해주는 것이라면, DI는 바로 쥐어지는 객체(Bean)이라고 생각하자.

이 쯤되면 대충 감이 올텐데 여기서 말한 '중간자적인 존재'란? 바로 Spring이 되겠다.

예시)
내가 적군을 물리치러 전쟁에 나갔다. 옆에는 간달프가 있다.
간달프는 전쟁에 직접 참여하지 않지만 날 도와준다.
내가 수상전을 치를 때는 수상전에 유리한 석궁을,
내가 지상전을 치를 때는 지상전에 유리한 창을 쥐어준다.
나는 무기를 고르거나 준비할 필요가 없다. 필요한건 상황에 맞게 간달프가 나에게 주고 있다.

- 여기서 '나'는 메인 메소드(혹은 어플리케이션) / '간달프'는 스프링 / 각 종 무기들은 Bean들이 되겠다.
- 그리고 Bean 안에는 또 다른 Bean이 들어갈 수 있다. 뭔가 콩깍지 안에 완두콩이 여러개 있는 것이 연상이 된다.


@Configuration

- 스프링의 컨텍스트가 사용할 환경이라는 뜻, 즉 스프링 돌아갈 때
"얘도 하나의 환경 설정을 하는 녀석이니까 스캐닝하고 필요한 거 참조하세요" 를 알리는 것이다.

@Bean

- 빈의 정의는 스프링이 IOC 방식으로 관리하는 오브젝트라는 뜻.
- 오브젝트 생성을 담당하는 IoC 메소드란 뜻. 메소드 위에 붙으며 메소드 이름이 빈의 이름이 된다!
"이 녀석 자바 빈이니까 필요하면 얘를 끌어다가 쓰세요"
지금으로선 일단 xml에 property 설정하는 애랑 똑같다고 보면 되겠다.
(DB연결할 때 sessionFactory등등 하는 것처럼)

- Bean등록방법 :
1) Context XML 파일에 Bean ID와 Property를 정의하는 방법
2) Config Class를 만들고 각각의 메소드 위에 @Bean 어노테이션을 설정하는 방법

<생명주기, Singleton>
Spring의 Bean의 생명주기를 알아보자.
Bean은 스프링 컨테이너가 생성될 때 생성이 되고 스프링 컨테이너가 종료될 때 소멸된다.
Servlet이 그러하듯, Bean또한 생성될 때 / 소멸될 때 각각 어떤 행동을 할 지 개발자가 정의할 수 있다.
방법은 Bean 클래스에서 implements InitializingBean 혹은 DisposableBean을 구현하면 된다.
InitializingBean 구현시 : Bean이 초기화 되기 전에 호출할 함수를 Override해야한다.
DisposableBean 구현시 : Bean이 소멸 되기 전에 호출할 함수를 Override해야한다.

혹신 Bean Class내부에 간단히 어노테이션을 붙인 메소드를 추가함으로서 해결할 수 있다.
@PostConstruct
메소드
@PreDestroy
메소드

이와 같이 어노테이션이 붙은 메소드를 정의하면 자동으로 각각의 호출시점에 메소드가 실행된다.



댓글

이 블로그의 인기 게시물

로컬 Tomcat 서버 실행속도 개선

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

2020.02.17 Python의 multiprocessing 중 Pool.map(), chunksize에 관한 내용