Spring 5. 싱글톤 그리고 프록시 패턴
5. 싱글톤 그리고 프록시 패턴

멀티 쓰레드 환경에서 매요청마다 객체가 생성이 되는걸까?

생각만해도 최악이다. 결론 부터 말하면 스프링은 프록시 패턴을 통해 객체를 항상 싱글톤으로 만들어준다.

싱글톤은 뭔데?

  • 객체를 딱 1개만 생성하여 사용하는 패턴
    • 메모리를 효율적으로 사용하고, 생성 시간이 최초 실행시에만 있다.
  • 구현방법은 생성자가 private 하여 new로 생성이 불가능하고, static 클래스로 미리 만들어진 인스턴스를 할당한다.
  • static으로 코드에 내제 되어있어 테스트 어려움과 코드 수정에 어려움이 있다.
    • DIP, OCP 위반
  • 필드에 값을 저장하고, 사용하게되면 여러 쓰레드에서 같은 객체이므로 값이 조작이 가능해서 주의해야한다.

스프링은 그러면 어떻게 단점들을 해결하고 싱글톤을 사용할 수 있을까?

Configuration 코드를 읽으면서 Bean이 들어가야할 영역을 바이트코드를 수정하여 기존 만들어진 객체로 주입한다.

  • 프록시 패턴으로 객체 생성 전에 코드를 분석하여 내용을 수정한다.
    • CGLIB(Code Generator Library)와 JDK Dynamic Proxy를 이용하여 바이트 코드를 수정한다.
  • AOP도 위와 같은 원리로 코드가 실행되기전에 특정 코드가 수행될 수 있게 설계 되어있다.

© 2025 seokh1213

LinkedIn LinkedIn GitHub