• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

static관련 질문드립니다.

23.11.26 06:25 작성 23.11.26 06:41 수정 조회수 556

4

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
"static method에 @Bean을 사용하게 되면 싱글톤 보장을 위한 지원을 받지 못한다" 그 이유에 대해서 자세히 알 수 있을까요? 비슷한 질문글들을 봐도 이유에 대한 정확한 설명은 없는 것 같아서요. 제가 찾아본 바로는 bean의 라이프사이클관리, 의존성 주입, 프록시 등등 있는데 무엇이 정확한 이유인지 잘 모르겠어서 질문남깁니다!!

답변 2

·

답변을 작성해보세요.

5

David님의 프로필

David

2023.11.29

안녕하세요. 980513k님, 공식 서포터즈 David입니다.

간단히 설명드리자면, static 메서드는 프록시가 적용되지 않기 때문입니다.

싱글톤을 보장 받으려면, 프록시로 인해 @Bean이 붙은 메서드를 호출하면 컨테이너에 동일한 빈이 존재하는지 확인하게 됩니다. 그러나 프록시가 적용되지 않는 static 메서드는 컨테이너에 동일한 빈이 존재하는지에 대한 로직이 수행되지 않기 떄문에 싱글톤을 보장하지 않습니다.

감사합니다.

2

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.11.28

안녕하세요, 인프런 AI 인턴입니다.

980513k님, static 메소드에 @Bean을 사용하는 경우 싱글톤 보장을 받지 못하는 이유에 대해 설명드리겠습니다.

스프링 프레임워크에서 @Bean 어노테이션이 붙은 메소드는 해당 빈의 생성 로직을 담고 있습니다. 스프링 컨테이너는 이러한 메소드를 호출하여 빈 인스턴스를 생성하고 관리합니다.

일반적인 경우에는 스프링 컨테이너가 @Bean 어노테이션이 붙은 메소드를 자동으로 싱글톤 범위로 관리하여, 해당 빈의 요청이 있을 때마다 이미 생성된 인스턴스를 반환해줍니다. 즉, 메소드 호출을 통한 빈의 생성과 관리가 스프링 컨테이너 내부의 라이프사이클에 따라 이루어지게 됩니다.

반면, static 메소드는 클래스의 인스턴스가 생성되지 않아도 호출할 수 있는 메소드이며, 클래스 로더가 해당 클래스를 메모리에 로드할 때 메모리에 함께 배치됩니다. static 메소드는 특정 인스턴스에 속하지 않기 때문에 스프링 컨테이너가 빈을 관리하는 방식, 즉 인스턴스 레벨에서 처리하는 라이프사이클 관리, 의존성 주입 및 프록시 적용 등과 같은 과정을 거치기 어렵습니다.

그 결과, @Bean 어노테이션을 사용한 static 메소드는 스프링 컨테이너가 반환하는 빈 인스턴스에 대한 싱글톤 보장이 어려워지고, 스프링 컨테이너가 제공하는 기능들을 온전히 사용하지 못하게 됩니다. 따라서, 일반적으로 @Bean 메소드는 non-static 메소드로 선언하여 스프링 컨테이너가 제어할 수 있게 하는 것이 좋습니다.

강의 내용 중 비슷한 문제가 발생할 경우 자주하는 질문을 확인하거나, 질문 잘하기 메뉴얼을 참고해보시기 바랍니다. 추가적인 정보가 필요하다면, 강의 지식공유자님께 직접 질문해보시는 것도 좋은 방법일 것입니다.

강의 관련하여 다른 궁금한 부분이 있다면 언제든 질문해주세요. 공부하는데 도움이 되시길 바랍니다!