본문 바로가기
IT/Java

Spring prototype Bean

by 성준하이 2023. 7. 29.
반응형

Java Spring을 사용할 경우 Bean 을 Spring 위에 Singleton 으로 올리는것에 대해서는 이전 포스팅에서 다룬적이 있다.

Singleton 에 대해서는 아래 참고 포스팅을 참고 바란다.

 

이번 포스팅에서 다룰 내용인 prototype이란.

singleton은 여러번 호출이 되어도 하나의 주소를 반환한다고 한다면

이 prototype이란 요청시마다 객체가 생성이 되는 개념이라고 보면 된다.

 

그렇기에 당연히 무분별하게 사용하면 안되고 그럴경우엔 OutofMemory 등의 에러가 발생할수 있다.

 

허나 실제로 실무를 경험하다보면 거의 없지만 간혹 이 prototype을 사용해줘야하는 경우가 있을때도 있다.

그럴 경우에 대비하여 샘플 코드를 아래 작성 해둔다.

 

 

bean을 생성할때 annotation으로 

@Scope("prototype")

이라고 설정을 하게 되면 bean 설정은 끝이 난다.

 

저번 포스팅에서 singleton 테스트를 그대로 가져와서 이어서 테스트 해볼것이다.

 

=====포스팅에서 가져옴=====

Service안에 

private int cnt=0;

public int getCnt() {
     return this.cnt;
}
public int addCnt() {
     cnt= this.cnt+1;
     return cnt;
}

이라는 코드를 추가 후

다시 TestController 에서 

System.out.println(service.getCnt());
service.addCnt();
System.out.println(service2.getCnt());

를 할 경우 출력은

0, 1 이 순서대로 나온다.

=====포스팅에서 가져옴=====

 

여기서 Service 에 @Component 등 Bean 등록 annotation과 함께

@Scope("prototype") 을 사용해주면 어떻게 될까?

 

결론은 0,0 이 나온다.

각각 호출할때 별개로 가져오게 된다.

 

이렇게 prototype을 사용하면 singleton에서는 한개로만 관리가 되었지만 각각 관리가 되고,

주체는 호출한 클라이언트가 객체를 관리하게 된다.

 

빈번하게 사용이 된다면 부하가 가니 방어 코딩을 추천한다.


참고 포스팅

https://thenicesj.tistory.com/146

 

객체지향 디자인 패턴 심화 정리 part.1

포스팅을 읽기 전에 아래 참고 포스팅에서 간단한 디자인패턴에 대한 정의와 종류에 대해서 읽고 오면 도움이 될것이다. 그리고 이번 포스팅에서는 좀더 심화된 내용을 다뤄볼 것이다. 저번 포

thenicesj.tistory.com

https://thenicesj.tistory.com/640

 

Spring 에서 Singleton

singleton 패턴에 대해서는 아래 참고 포스팅을 참고 바란다. spring 에서의 기능중 하나는 의존성 주입인 DI 가 있다. 자세한 내용은 아래 참고 포스팅 참고바란다. 스프링에서는 컨테이너 위에 Bean

thenicesj.tistory.com

 

반응형

댓글