5. 싱글톤 그리고 프록시 패턴
멀티 쓰레드 환경에서 매요청마다 객체가 생성이 되는걸까?
생각만해도 최악이다. 결론 부터 말하면 스프링은 프록시 패턴을 통해 객체를 항상 싱글톤으로 만들어준다.
싱글톤은 뭔데?
- 객체를 딱 1개만 생성하여 사용하는 패턴
- 메모리를 효율적으로 사용하고, 생성 시간이 최초 실행시에만 있다.
- 구현방법은 생성자가 private 하여 new로 생성이 불가능하고, static 클래스로 미리 만들어진 인스턴스를 할당한다.
- static으로 코드에 내제 되어있어 테스트 어려움과 코드 수정에 어려움이 있다.
- DIP, OCP 위반
- 필드에 값을 저장하고, 사용하게되면 여러 쓰레드에서 같은 객체이므로 값이 조작이 가능해서 주의해야한다.
스프링은 그러면 어떻게 단점들을 해결하고 싱글톤을 사용할 수 있을까?
Configuration 코드를 읽으면서 Bean이 들어가야할 영역을 바이트코드를 수정하여 기존 만들어진 객체로 주입한다.
- 프록시 패턴으로 객체 생성 전에 코드를 분석하여 내용을 수정한다.
- CGLIB(Code Generator Library)와 JDK Dynamic Proxy를 이용하여 바이트 코드를 수정한다.
- AOP도 위와 같은 원리로 코드가 실행되기전에 특정 코드가 수행될 수 있게 설계 되어있다.