자바썸
자바랑 썸타는중
자바썸

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
자바썸

자바랑 썸타는중

[spring] 싱글톤 레지스트리
Spring/Spring

[spring] 싱글톤 레지스트리

2022. 4. 22. 16:08

대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 웹 애플리케이션은 여러 클라이언트들이 동시에 요청을 보낸다.

그럴 때마다 객체를 생성하고 소멸되는 과정이 반복되면 메모리 낭비가 심하게 된다.

 

그래서 스프링에서 스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다.

이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.

 

지금부터 사례로 싱글톤 레지스트리에 대해 알아보도록 하자.

현재 클래스 다이어그램을 보면 Pitcher 클래스와 Catcher 클래스는 Equipment 인터페이스에 의존하고 있다. 그리고 Glove 클래스는 Equipment 인터페이스를 구현한 클래스이다. 

 

Pitcher 클래스와 Catcher 클래스는 외부에서 Glove 클래스의 객체를 주입받도록 해주었다.

여기서 코드를 보면 catcher 빈을 만드는 코드를 보면 equipment()를 호출하고 이 메서드를 호출하면 new Glove()가 호출된다.

 

마찬가지로 pitcher 빈을 만드는 코드를 보면 equipment()를 호출하고 이 메서드를 호출하면 new Glove()가 호출된다.

 

코드만 놓고 봤을 때, 각각 다른 Glove가 생성되기 때문에 싱글톤이 깨지는 것처럼 보인다.

그래서 Test를 통해 정말 다른 객체인지 확인해보자.

콘솔 화면에 출력해서 수동으로 비교해봐도 같다는 것을 알 수 있다. 하지만 수동으로 테스트를 진행하는 것은 좋은 방법이 아니므로 자동으로 테스트를 진행할 수 있도록 추가하고 결과를 보자.

assertThat 추가.

assertThat을 추가해서 일일이 수동으로 비교할 필요 없이 테스트가 성공했다는 결과를 알 수 있다. 

 

왜 성공했을까? 

 

자바 코드만 보면 테스트를 성공하면 안 되는 코드이다. 근데 예상과 달리 테스트를 성공해버렸다. 

 

왜 그런지 알아보기 위해 먼저 테스트 코드를 하나 더 추가하자. 이 테스트 코드는 빈을 등록할 수 있도록 설정 정보가 들어있는 Config에 대해 알아보는 코드이다. 

테스트 코드를 작성하고 출력 값을 보면 위와 같은 결과가 나온다. 근데 우리가 만든 Config 클래스가 맞긴 한 거 같은데 $$부터 알 수 없는 것들이 같이 출력됐다. 바로 이것 때문에 싱글톤 레지스트리가 되는 것이다. 

노란 박스를 보면 CGLIB이라고 적혀 있는데 스프링이 CGLIB이라는 바이트 조작 라이브러리를 사용해서 Config 클래스를 상속한 다른 임의의 클래스를 만들고, 그 클래스에 빈 등록을 한 것이다. 

 

그래서 Config@CGLIB 내부 코드를 예상해보면 @Bean 어노테이션이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 존재하지 않으면 빈으로 만들어서 등록하고 반환하는 코드가 만들어진다. 

 

그래서 우리가 pitcher 빈을 만들 때 new Glove()가 호출되고 Catcher 빈을 만들 때 new Glove()가 호출돼도 서로 다른 객체가 아닌 같은 객체를 반환받은 것이다. 

 

스프링으로 @Configuration 어노테이션을 붙임으로써 싱글톤이 보장되는 것을 알게 되었다.  

'Spring > Spring' 카테고리의 다른 글

[Spring] 인터셉터(Interceptor)에 대해 알아보자!  (0) 2022.06.28
[Spring] Filter에 대해 알아보자 !  (0) 2022.06.24
[spring] Spring MVC 구조  (0) 2022.06.02
[spring] 컴포넌트 스캔  (0) 2022.04.25
[spring] 스프링에서 DI를 하는 이유  (0) 2022.04.21
    'Spring/Spring' 카테고리의 다른 글
    • [Spring] Filter에 대해 알아보자 !
    • [spring] Spring MVC 구조
    • [spring] 컴포넌트 스캔
    • [spring] 스프링에서 DI를 하는 이유
    자바썸
    자바썸

    티스토리툴바