inflearn
김영한
스프링 핵심 원리 기본편 섹션 5~10강
학습목표
회원 주문 서비스에 의존관계 주입하기, request 스코프 예제 만들기.
-개론
백엔드 인턴을 하면서 싱글톤 개념을 처음 접했다.
싱글톤을 간단하게 설명하자면 객체를 1개만 생성하고 클라이언트가 이를 공유되도록 설계하는 것이다.
인턴 업무에서 싱글톤 개념을 적용한 부분은 바로 Python 클래스를 작성하여 MySQL DB에 select, update, insert, delete 쿼리문을 날리는 부분이었다.
이때 생성자와 소멸자를 따로 지정하였고, new() 함수를 통해 싱글톤 개념을 적용했다.
-내 과오, 과거의 싱글톤..
static property로 instance를 미리 만들어 둔다.
그리고 new() 함수를 호출해서 해당 instance가 이미 만들어졌는지를 판단하고(line 2) 없으면 새 instance를, 있으면 기존 instance를 return 하도록 하는 방법이다.
이 방법은 allocator를 건드리는 방법이다.
# code
def __new__(cls, *args, **kwargs):
if not cls.__instance or not cls.__database:
cls.__instance = super(MysqlPython, cls).__new__(cls,*args,**kwargs)
return cls.
다 구현한 다음에야 이 방법은 리소스 낭비도 심하고 논리적으로 잘못된 동작임을 깨달았지만 유지보수는 다음에..... 데코레이터를 활용하면 된다고 한다.
업무를 할 때는 왜 싱글톤이 필요한지 어렴풋하게 이해했는데, 강의를 들으며 좀 더 깊게 이해할 수 있었다.
-싱글톤이 필요한 이유
싱글톤이 없다면, 코드 실행마다 객체가 새로 생성된다.
01번 포스트에서 설명했던 예시를 적용하자면 역할은 하나인데 배우는 와글와글 여러 명을 고용한 것이다.
인건비(메모리) 낭비를 생각하면 꼭 방지해야 한다.
싱글톤 패턴을 구현하는 방법도 여러가지라 상기 서술한 예시 코드 외에 다양한 방법이 존재한다. 또한 싱글톤 방식에는 장점 뿐 아니라 단점 또한 존재한다.
파이썬에서는 싱글톤 패턴의 문제점을 어떻게 해결하는지 잘 모르겠지만 스프링은 스프링 컨테이너를 통해 해결할 수 있다.
-싱글톤 방식의 주의점
싱글톤 방식은 stateless(무상태)로 설계해야 한다는 점을 주의해야 한다.
+파이썬의 경우 싱글톤과 비슷한 디자인 패턴으로 모노스테이트 패턴이란 게 존재한다. 이 패턴은 실제로 인스턴스는 별도로 여러개를 가질 수 있지만, 각각은 하나의 state를 서로 공유하도록 만드는 구현이다. 언어와 디자인 패턴에 따라 개발은 정말 여러 방법이 있음을 다시 느낀다.
다시 본론으로 들어오자면 싱글톤 방식은 여러 클라이언트가 같은 객체 인스턴스 하나를 공유하기 때문에 공유필드를 절대 사용하지 않아야 한다. 무조건 스프링 빈은 stateless(무상태)로 설계하기!!
이 외에는 강의자료에 있는 코드라 저작권을 위해 블로그에 작성하지 않겠다.