← 질문 목록
#35깊이 0
스프링 빈이 싱글톤인 것이 언제 문제가 되는가?
빈이 상태를 들고 있을 때다. 인스턴스가 하나뿐이라 모든 요청이 같은 필드를 공유한다. 한 요청이 써 넣은 값을 다른 요청이 읽는다.
| 두는 자리 | 공유 범위 | 안전한가 |
|---|---|---|
| 빈의 필드 | 애플리케이션 전체 | 아니다. 요청끼리 섞인다 |
| 메서드 지역 변수 | 호출 하나 | 안전하다 |
| ThreadLocal | 스레드 하나 | 반납을 빠뜨리면 샌다 |
주의
가장 흔한 사고는 빈에 사용자 정보를 담아두는 것이다. 테스트에서는 요청이 하나씩 들어와 안 드러나고, 동시 접속이 생기는 순간 남의 데이터가 보인다.
해법은 상태를 빈 밖으로 빼는 것이다. 필요한 값은 인자로 넘기고, 빈은 동작만 들고 있게 한다. 스코프를 요청 단위로 바꾸는 방법도 있지만 대개 마지막 수단이다.
상태 없는 빈은 매 요청마다 새로 만들 필요가 없어 싱글톤이 기본이다. 대부분의 빈이 상태 없는 서비스라 하나면 충분하다. 요청마다 만들면 생성 비용과 GC 부담이 그대로 늘어난다.