인프런 커뮤니티 질문&답변

임현강님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

싱글톤 방식의 주의점

싱글톤과 멀티스레드 질문

작성

·

322

5

안녕하세요. 질문드리겠습니다.

멀티스레딩 환경에서 싱글톤 객체를 사용해 요청들을 처리하기 위해서는 stateless한 설계를 해야한다는 내용 잘 이해됐습니다.

이 stateless와 직접 연관되는 부분은 아닌 것으로 보이지만.. 싱글톤 멀티스레딩 관련 궁금증이 생겨 질문을 남깁니다.

 

싱글톤으로 생성된 Controller, Service등의 객체에서도 객체를 생성하는 경우가 있을 것입니다.

ex) PointAccmlParam (포인트 적립에 필요한 속성들을 전달할 객체)

이 또한 객체이기 때문에 heap 영역에 저장될 것이고 멀티스레딩 환경에서 heap은 공유 영역입니다.

물론 각 인스턴스의 참조값이 다르니 엉뚱한 객체의 값을 사용하게 될 경우는 없겠습니다만..

이러한 경우에는 싱글톤의 객체 생성 제한이란 장점이 사라져버리게 되지 않을까? 하는 생각이 듭니다.

기껏 Controller, Service를 싱글톤으로 잘 설계해봤자.. 그녀석들이 저렇게 request별로 각각의 param객체를 생성해버린다면.. 앞서 Controller, Service를 굳이 싱글톤으로 설계한 의미가 없어지는 것 아닌가 싶습니다.

 

이 부분에 대한 해결책이 있을까요? Param 객체도 싱글톤을 적용시키면서 엉뚱한 참조가 일어나지 않게 하는 마법같은 방법이라던가 하는 것이요.

 

아니면.. 그냥 Param 객체는 어쩔 수 없는 부분이고, 객체 생성을 줄일 수 있는 곳에서라도 줄이기 위해서 Controller, Service만이라도 싱글톤으로 가져간다. 라고 생각하고 넘어가야 할까요??

 

답변 부탁드립니다. 감사합니다!

 

답변 1

2

안녕하세요, 임현강 님. 공식 서포터즈 codesweaver 입니다.
.
싱글톤은 보통 애플리케이션에서 단 한개만 존재해도 되는 객체에 한해서 적용합니다. 그래서 컴포넌트들은 기본적으로 싱글톤이 적용되어 있습니다.
이 싱글톤 객체들이 파라미터를 전달받고 이를 DTO로 변환하며 발생하는 Heap 메모리 할당과 삭제등은 어쩔 수 없는 부분이긴 합니다.

.

기본적으로 Heap을 이용하기 위해선 OS로부터 메모리를 빌리는 과정이 필요하며 이는 속도 저하의 원인이 됩니다. 그래서 보통 OS로 부터 충분한 양의 메모리를 미리 받아놓고 이를 쪼개어 사용하는 방법을 사용합니다(자바에서는 이런 부분을 사용자가 제어하지 않고 JVM에게 일임합니다). 그리고 다 사용한 메모리를 해제하지 않고 사용 가능한 메모리로 들고 있다가 필요할 때 이 에모리를 다시 할당하는 등의 여러가지 최적화 기법을 적용하고 있습니다.

 

그리고 다행인 것은 웹 애플리케이션의 속도 문제를 검증할 때 (고객이 브라우저로 어떤 사이트를 요청하고 응답 화면을 받기까지) 가장 오랜 시간이 걸리는 부분은 프론트엔드 쪽의 렌더링이 가장 오랜 시간이 소요되며 백 엔드에서는 DB에서 데이터를 가져오는 과정이 가장 오랜 시간이 걸립니다. 정작 자바의 메모리 효율때문에 속도 저하가 발생하는 정도는 미미한 편입니다.

.
감사합니다.

임현강님의 프로필 이미지
임현강
질문자

명쾌한 답변 감사드립니다~