본문 바로가기
개발관련/Spring

[Spring] 스프링은 어떻게 동작할까? (1)

by joa-yo 2019. 9. 24.
반응형

spring은 무엇일까? 알고싶은데, 사용법만 설명하고 끝나는 경우가 많아 spring에서 제공하는 API, 그리고 자세히 설명되어 있는 블로그를 소개하며 SpringFrameWork가 어떤 것인지 낱낱이 살펴보려 한다.

 

SpringFrameWork란?

Spring은 java application을 구현하기 위한 틀을 제공한다. spring을 검색하면 "의존성 주입"을 가장 먼저 설명해주는데, Spring이 "의존성주입"형태를 기초로 만들었기 때문에 가장 먼저 알려주는 것이다. 그렇다면 의존성 주입이란 무엇일까?

 

의존성 주입이란?

이 명칭만으로는 무엇에 어떤 의존성을 주입한다는 것인지 알 수 없다. 풀어서 설명하자면 객체에 객체가 필요로 하는 다른 객체를 생성하여 전달(주입, injection, push)한다는 의미이다. 

차를 갖는 방법을 예를 들어 설명해보자. 내가 직접 차를 산다면 다른 차로 바꾸고 싶을 경우 이 차를 팔고 새 차를 사야한다. 즉, 사용할 객체를 다른 객체로 바꾸고 싶은 경우 코드를 변경해야 한다는 의미다. 

그런데 차를 직접 사지않고 렌트하여 사용한다고 가정하면 아래의 이점이 있다.

    1. 렌트카 가게는 여러가지 종류의 차들을 구비하고 있다.
    2. 내가 원하는 차를 선택하여 고를 수 있으며 나중에 바꿀수도 있다.
    3. 만약 같은 차를 반납하고 다시 빌리더라도, 이전에 처음 빌렸을 때와 같은 상태로 보내주고, 차를 반납하면 차를 보관해둔다.
    4. 한대의 차를 여러사람과 공유하여 사용한다.

 

차를 렌트하는 과정은 스프링이 동작하는 방식과 비슷하다.

  1. 어플리케이션이 실행되면, 여러가지 종류의 bean들을 생성하여 갖고 있는다.
  2. 어떤 객체가 필요로 하는 객체를 다른 객체로 변경하고 싶다면, 쉽게 변경 가능하다.
  3. bean사용시에는 초기화해주고 사용이 끝나면 반환 해준다.
  4. 정의된 bean객체는 한번만 생성되어, 필요시마다 필요한 객체에 주입된다.

내가 차를 산다면 차를 바꾸기도 쉽지 않지만, 렌트한다면 필요할 때마다 차를 렌트해서 사용할 수 있고, 필요에 따라 다른 차로 쉽게 변경가능하다. 이러한 이점을 갖고 있는 것이 SpirngFrameWork이다.

 

SpringFrameWork 의 중심 BeanFactory와 ApplicationContext

동작방식을 설명하기에 앞서 알아야할것은 BeanFactory와 ApplicationContext이다. 이것은 스프링 프레임워크의 중심이 되는 객체로, 앞에서 설명한 렌터카 가게와 같다. BeanFactory는 객체를 생성하여 주입하고, 삭제하는 기능을 하는 가장 기초가 되는 객체이다. 여기에 추가적인 기능을 더한것이 ApplicationContext이다. 이것은 추가적인 인터페이스를 상속받아 추가적인 기능을 수행한다.

ApplicationContext가 추가적으로 상속받고 있는 것이 궁금하다면?
[ AppicationContext와 BeanFactory의 비교 ]
 http://wonwoo.ml/index.php/post/1571
[ AppicationContext가 추가적으로 상속받고 있는 인터페이스들의 목록 ] 
EnvironmentCapable, MessageSource, ApplicationEventPublisher, ResourcePatternResolver

 

SpringFrameWork 동작 방식

스프링 프레임워크는 BeanFactory를 통해 객체를 관리한다. 객체를 생성하고 삭제하는 일을 관리해주는데, 이 일을 생명주기 관리라고 한다. 따라서 BeanFactory는 Application이 실행되는동안 꺼지지 않으며, 객체를 주입받기 원하는 객체에 객체를 전달해준다. BeanFactory는 Xml에 설정되어있는 객체만 관리할 수 있으며, 설정되지 않은 객체는 관리대상에서 제외된다.

객체가 생성되고 삭제되는 범위를 scope라고 하는데, 스프링 프레임워크는 4가지의 scope를 갖고있다. 어플리케이션의 실행과 종료와 같은 것이 singleton, 어플리케이션의 요청과 같은 것이 protoType이다. 웹에서 하나의 request마다 생성되는 것은 request, 하나의 session마다 생성되는 것은 session이라고 한다. 객체의 생성 및 삭제되는 시점만 다를 뿐, 동작방식은 거의 동일하다. 각각의 scope를 구체적으로 살펴보자.

 

ProtoType방식은 BeanFactory가 xml형식의 파일을 읽어들인 후 요청이 들어올때까지 기다린다. 요청이 들어오면 객체를 생성 및 초기화 하여 객체에 전달해준다. 따라서 각 요청마다 새로운 객체가 생성되며, 요청이 종료되면 생성되었던 객체는 사라진다.

Singleton방식은 BeanFactory xml형식의 파일을 읽어들여 Application 시작시 bean객체를 생성 및 초기화해둔다. 어떤 객체가 BeanFactory에게 특정 객체를 요구하면 생성해두었던 객체를 전달해준다. 그리고 다른 객체가 동일한 객체 사용을 요구하면 갖고있던 객체를 생성해두었던 객체를 전달해준다. 즉, 하나의 객체를 생성하여두고 필요한 다른 객체들이 공유하여 사용하는 형태이다. 따라서 어플리케이션이 종료될 때 비로소 객체가 소멸될 수 있다.

Request와 session은 요청 또는 세션 생성시에 새로운 객체가 생성되며, 요청 또는 세션이 끝날때까지 생성된 객체를 재사용한다. (Singleton 방식과 유사)

 

 


외부 참조 글

1. SpringFrameWork를 잘설명해 놓은 글이 있어 올립니다.

 

Spring Framework 개념 및 구조

이번 포스팅은 web 개발(java)을 할 때 자주 사용하는 framework인 Spring에 대해서 전반적인 느낌을 알아보겠습니다. 저의 블로그는 입문자들에게 거리감이 느껴지는 추상적인 개념들을 구체화해보면서 이전보다..

solt.tistory.com

 

2. SPRING API DOC

Spring은 기능을 수행하기 위해 라이브러리를 가지고있는데, API문서로 잘 정리되어 있다. BeanFactory ApplicationContext라는 interface는 spring의 중심적인 객체를 나타내므로, 자세히 알고 싶다면 읽어보는 것을 권한다.

 

Spring Framework 5.1.9.RELEASE API

 

docs.spring.io

 

1. 객체 초기화 및 삭제시 필요한 작업 정의하는 방법 (사용자 임의 정의) : 출처 HowToDoInJava

객체 초기화 및 소멸은 스프링이 알아서 해주지만, 그 때마다 특별히 지정해주어야 하는 작업이 있다면, 아래의 방식을 사용하면 된다. 큰따옴표 안에 들어가는 것은 지정할 메소드의 명칭이다. 그 메소드는 객체 내부에 존재해야한다.

[ 하나의 bean객체에 CustomMethod정의하는 방법 ]

<beans>

    <bean id="demoBean" class="com.howtodoinjava.task.DemoBean"

                    init-method="customInit"

                    destroy-method="customDestroy"></bean>

</beans>

 

[ 파일 내 모든 bean객체에 CustomMethod정의하는 방법 ]

<beans default-init-method="customInit" default-destroy-method="customDestroy">  

        <bean id="demoBean" class="com.howtodoinjava.task.DemoBean"></bean>

</beans>

 

 

반응형

댓글