본문 바로가기

웹 프로그래밍/Spring

[Spring] bean, container 개념 및 예제 & 싱글턴 패턴 사용 방법

[스크립트 정리]

 

bean이란

==> Bean()이란 Spring이 관리하는 인스턴스이다.

 

Spring Container?

==> 스프링 프레임워크에서 Container 기능을 제공해주는 클래스

==> Container Bean 클래스를 관리(생성, 삭제)하는 주체다.

 

Container-XML이란?

==> Spring XML 파일

==> 스프링은 XML 설정 정보를 참조하여 여러가지 Container Service를 제공한다

==> 유지보수 작업 시 XML 파일을 조정한다. 클래스 개수 등에 따라 코드가 엄청 길어질 수 있음.

 

Container-XML 템플릿 생성 방법

==> src/main/resources 내에 xml 파일 생성

 

Spring Container 생성 방법

==> ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, GenericXmlApplicationContext)

 

Container-XML 내에서 bean 태그 생성 방법

==> <bean class="패키지명.클래스명">

==> main 프로그램을 돌리면 컨테이너가 생성되면서 인스턴스가 자동 생성 됨.

 

특정 인스턴스를 가져오는 방법

==> 컨테이너객체.getBean("xml내에있는클래스의id");

==> 명시적 형변환 또는, 컨테이너객체.getBean("xml내에있는클래스의id", 클래스타입.class);

 

컨테이너를 생성하는 동시에 모든 인스턴스를 만들고싶지 않을 수도 있다.

==> 그럴 때 사용하는 bean태그 내의 속성이 'lazy-init'이다.

==> 속성값을 true로 바꾸면 해당 클래스에 대해서는 사용자가 getBean으로 직접 호출할 때만 인스턴스를 만든다.

 

이제는 Singleton 패턴으로 인스턴스를 하나만 생성해보자.

==> HelloSingle이라는 클래스를 하나 만들고 실습해보자.

==> 싱글톤패턴을 사용하려면 HelloSingle()이라는 생성자 말고, getInstance()라는 메소드를 호출해야 한다.

==> 컨테이너를 생성할 때는 자동으로 각 클래스의 생성자를 통해 인스턴스를 만들었는데, 어떻게 getInstance() 메소드를 호출하게 만들까?

==> 이때는, <bean>태그 내에 factory-method 라는 속성을 사용하면 된다.

==> 속성값으로 해당 클래스 내에 있는 메소드명을 써주면 된다.

 

 

one.zip
7.91MB


Bean에 대한 검색 결과

 

 

Bean 이란

자주 사용하는 객체를 Singleton 객체로 생성해놓고 어디서든 불러서 쓸 수 있는 것을

Spring 에서 Bean 이라는 이름을 붙인 것.

클래스를 한번 만들어놓고 재사용하기 편하게 하기 위함.

 

Bean(빈)이란 Spring이 관리하는 인스턴스이다. 

즉, 개발자가 직접 인스턴스를 생성하고 호출, 삭제하는 것이 아니라 항상 Spring이 제공하는 Container를 통해서 관리되는 인스턴스를 우린 Bean이라고 부른다.


 

bean 생성 시에는 기본적으로 컨테이너를 활용하게 된다. 

이를 배운 뒤, 서버가 실행되는 동안 단 한번만 객체를 생성하기 위해서 싱글턴 패던을 사용하는 방법도 알아보자.

 

ApplicationContext context = new ClassPathXmlApplicationContext("beanContainer.xml");	
		
ApplicationContext context = new FileSystemXmlApplicationContext("src/main/resources/beanContainer.xml");	
		
// ClassPathXmlApplicationContext, FileSystemXmlApplicationContext 두 기능을 통합한 컨테이너가 생겼다.
// 그것이 바로 GenericXmlApplicationContext 이다.
ApplicationContext context = new GenericXmlApplicationContext("beanContainer.xml");

아래 내용은 수업 중에 왜 했는지는 모르겠다.

스프링에 대한 정보를 담고있는(?) pom.xml에 

허용되지 않은 태그명을 사용할 수는 없다.

 

아래에 <aaa> 태그를 썼지만 빨간 줄이 뜬다.

 xsi:schemaLocation에 있는 링크에 들어가보자.

여기에 있는 태그만 pom.xml에서 인식한다.


지금부터 bean(클래스 객체)를 생성해보자.

우선 생성할 객체 정보를 담고있는 xml을 생성하자.

(스프링은 XML 설정 정보들을 참조하여 여러가지 Container service를 제공한다)

이름은 beanContainer.xml


아래 두 장의 스크린샷은 그냥 내가 해본것임.

저 위에 <aaa> 태그에 대한 내용을 다시한번 적용해보려고 한 것임.

그런데 개념을 잘못 알고있는 것 같다. 아무 의미없는 짓을 한 것 같음.


bean들을 관리 할 컨테이너를 생성하자.

ClassPathXmlApplicationContext, FileSystemXmlApplicationContext 두 방법으로 생성할 수 있다.

두 방식을 통합한 게 바로 GenericXmlApplicationContext이다. (맞나?)

아래의 코드로 인해서

beanContainer.xml 내에 있는 클래스에 대한 인스턴스를 자동으로 생성한다.

그런데, 아직 beanContainer.xml에 <bean> 태그를 생성하지 않았기 때문에 어떠한 인스턴스도 만들어지지 않았다.

<bean> 태그 하나 당 하나의 객체 정보를 담고있다.

<bean class="패키지명.클래스명"> 을 적으면 된다.

이제 다시 main 프로그램을 돌리면 컨테이너가 생성되면서 Hello 클래스의 인스턴스가 자동으로 생성된다.

그리고 특정 인스턴스를 가져올 수도 있다.

이때는, 컨테이너객체.getBean("xml내에있는클래스의id"); 를 통해 가져올 수 있다.

 

getBean()의 리턴타입은 Object이므로, 각 인스턴스에 해당하는 타입으로 명시적 형변환을 해줘야 한다.

컨테이너를 생성하면서 xml에 등록되어있는 두 개의 클래스에 대한 인스턴스가 자동으로 만들어짐.

콘솔에 보이는 'Hello 객체 로딩'은 Hello 생성자를 만들면서 호출된 것이다.

그리고 각 객체로 prnMsg() 메소드를 실행하여 msg:Hello 라는 스트링이 호출됨(?)

ClassPathXmlApplicationContext 말고도 FileSystemXmlApplicationContext으로도 컨테이너를 만들 수 있다.

 

 

그런데 컨테이너를 생성하는 동시에 모든 인스턴스를 만들고싶지 않을 수도 있다.

그럴 때 사용하는 bean태그 내의 속성이 'lazy-init'이다.

속성값을 true로 바꾸면 해당 클래스에 대해서는 사용자가 getBean으로 직접 호출할 때만 인스턴스를 만든다.

아래 콘솔을 보자.

getBean, prnMsg() 순서대로 결과가 나왔다. 

즉, getBean으로 불러올 때 객체가 생성되었다.


이제는 Singleton 패턴으로 인스턴스를 하나만 생성해보자.

HelloSingle이라는 클래스를 하나 만들고 실습해보자.

 

싱글톤패턴을 사용하려면 HelloSingle()이라는 생성자 말고, getInstance()라는 메소드를 호출해야 한다.

컨테이너를 생성할 때는 자동으로 각 클래스의 생성자를 통해 인스턴스를 만들었는데, 어떻게 getInstance() 메소드를 호출하게 만들까?

 

이때는, <bean>태그 내에 factory-method 라는 속성을 사용하면 된다.

속성값으로 해당 클래스 내에 있는 메소드명을 써주면 된다.

 

 

 

객체의 주소를 찍어보자.

지금은 각각 다른 객체이다.

factory-method 속성을 추가해보고 다시 주소를 찍어보자.

객체의 주소를 찍어보자.

같은 주소가 나온다. 즉, 싱글턴 패턴이 제대로 작동한다.