middlemoon
Spring - 웹 에플리케이션과 싱글톤 본문
싱글톤을 알아보기 전에, 싱글톤의 의미란 무엇인가?
-> 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.
물론 객체의 인스턴스를 1개만 생성하는게 아닌 필요할 때마다 처리해주는 경우가 있다.
Transaction Per Second(TPS)는 초당 트랜잭션의 개수 또한 늘어나는것을 줄일수 없다는 단점이 있다.
효율적이지 못한 코드때문에 싱글톤이라는 개념을 사용하는 것이다.
이번 시간은 웹 어플리케이션과 싱글톤의 관계는 어떤것이 있을까? 라는 것을 확인해보려한다.
이 블로그는 김영한님 강의를 토대로 작성하였으니 참고용으로 봐주시면 좋을 것 같고, 기록용으로 남기기 위해 올렸다는 점 참고해주시면 감사하겠습니다.
AppConfig안에 있는 MemberService에 나오는 memberService, memberServiceImpl 까지 쓰지않는 것들을 사용하기 때문에
불필요한 메모리 낭비가 있다는 점이 핵심이라 말할수 있다.
단순한 코드로 예제를 보고있지만, instance라는 싱글톤 객체를 만들어 오직 getInstance에서만 인스턴스를 사용할 수 있게
만들어놓는다. private를 한 이유는 이 글을 보고 있는 독자들도 잘 알겠지만 public과 달리 private은 다른 위치에서 불필요한 중복코드를 작성을 방지하기 위해 쓰이는 형태이다.
memberService1과 2로 각각 불러와서 결과가 다른것과 달리
singletonService1과 2로 사용했을 때의 차이점을 확인할 수 있을것이다. @2fd1433e이 동일하게 나오게 되는것을 확인할 수 있다.
스프링 컨테이너의 싱글톤을 사용하기 위해 ApplicationContext라는 클래스를 사용한다.
AppConfig안에 있는 클래스들은 중에서는 싱글톤을 사용하기 위한 코드는 단 한줄도 없지만
내장되어 있는 ApplicationContext을 사용하여 기존의 memberService1,2 의 저장되어있는 내용이 달라도
싱글톤으로 사용할 수 있다는 점을 알수가 있다.
자, 여기까지 보았다면 문제점을 하나 제시할수 있다. 만약 가격을 책정하는 Service를 만든다고 가정한 뒤, 위의 과정처럼 A가 10000원 일때 그리고 B가 20000원 일때 결과가 나오는 현상이 있다.
쉽게 말해 10000원이라는 A물건을 구입하려고 결제를 했는데 싱글톤으로 인해 20000원이 강제로 구매가 된다면?
분명 큰 문제가 일어날 것이다.
여기에 대한 해결방법은?
-> 무상태(stateless)로 설계하는 것이 방법이다.
기존의 StatefulService에 해당하는 부분에 들어간 뒤,
1.먼저 void형태였던 price 반환값을 int로 리턴해줄수 있도록 타입을 변환해준뒤
2.Order에 있는 클래스를 불러와 각각 A,B의 변수를 선언한 뒤
userAPrice1에 해당하는 결과값만 가져오게 되면 콘솔에는 10000원이라는 결과가 반환되는것을 볼수 있다.
만약에 @Configuration을 제거해주면 스프링빈은 어떻게 결과가 나올까?
@Configuration을 분리 시
SpringBean을 읽어내는 것이 아니라 순수 자바의 코드를 읽어내 싱글톤이 아닌 여러 인스턴스의 결과를 그대로 리턴
@Configuration을 병합 시
SpringBean을 읽어내며, AppConfig@CGLIB라는 인스턴스가 싱글톤으로 인식하여 사용가능
이정도 차이점을 배울수 있을것이다. 그래서 @Autowired라는 자동의존관계주입을 이용해서 쓰이는 것의 원리이다 !
'Develop > Spring' 카테고리의 다른 글
Spring - 컴포넌트 스캔 (0) | 2023.03.14 |
---|---|
Spring - 스프링 컨테이너와 스프링 빈 (0) | 2023.02.18 |
Spring - 스프링 핵심 원리 이해2 (객체 지향 원리 적용) (0) | 2023.02.06 |
Spring - 스프링 핵심 원리 이해1 (0) | 2023.01.29 |
Spring - 객체지향 프로그래밍의 이해 (0) | 2023.01.20 |