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

김은재님의 프로필 이미지

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

상품 도메인 개발

질문드립니다.

작성

·

765

6

강의중에 궁금한게 생겨서 질문남깁니다.

현재 3년동안 개발을 하면서 ConcurrentHashMap을 사용하지 않고 모든코드를 HashMap으로 처리하였습니다.

물론 실제 고객들이 사용하는 서비스개발 회사가 아니라 주로 금융권 SI프로젝트들 중에서도 고객내부직원들이 쓰는 업무를 주로 개발해서 트래픽이 많이 몰리진 않았거든요.

제가 경험했던 프로젝트들이 여러개의 쓰레드가 접근하지 않아서 HashMap으로도 무리없이 프로젝트가 진행되었던 걸로 생각하면 될까요?? 반대로 트래픽이 몰리는 서비스개발회사에서는 ConcurrentHashMap을 사용하면 되는건가요??

답변 2

5

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 은재님

동시성이 문제가 되는 상황에서만 ConcurrentHashMap을 사용하시면 됩니다.

예를 들어서 스프링의 빈이 싱글톤인데, 여기에서 멤버 변수를 사용하면 여러 쓰레드에서 해당 멤버 변수를 공유해서 사용하게 됩니다. 이때 문제가 될 수 있습니다.

지역 변수는 쓰레드간에 공유되지 않기 때문에 HashMap을 사용하는 것이 맞습니다.

감사합니다.

김은재님의 프로필 이미지
김은재
질문자

예전에 빈객체로 등록될때는 스프링에서 자동으로 싱글톤으로 빈객체를 등록한다고 해주셨었는데요. 

예를들어서 Controller에서 @Service어노테이션이 붙은 ItemService를 호출하게되면

이때는 Map<Long, ItemService> map = new ConcurrentHashMap<>()이라고 코드를 구성하고 만약에 싱글톤으로 만들어진 경우가 아니면 Map<Long, String> map = new HashMap<>() 이런식으로 코드를 작성해도 된다는 의미인가요??

단일쓰레드환경과 멀티쓰레드환경이 개념적으로는 알고있지만, 실제 실무에서 어떻게 환경이 구축되어있는게 감이안잡혀서 질문드립니다. 그리고 혹시 이번강의에서는 단일쓰레드환경인지 멀티쓰레드환경인지 알 수 있을까요??

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 은재님

웹 애플리케이션은 기본적으로 모두 멀티쓰레드 환경입니다.

여러 고객이 동시에 같은 싱글톤 컨트롤러, 서비스 등을 호출하게 됩니다.

여기서 핵심은 멤버 변수 vs 지역 변수의 차이를 이해하셔야 합니다.

이렇게 싱글톤 객체에 멤버 변수는 여러 쓰레드에서 공유되기 때문에 조심해서 사용해야 합니다. 그래서 이 경우 ConcurrentHashMap을 사용해야 합니다.

그런데 지역 변수는 쓰레드마다 각각 따로 전용 공간이 할당 되기 때문에 HashMap을 사용하셔도 됩니다.

1

멤버 변수(member variable)는
메소드 밖에서 선언된 변수를 말한다.
메소드 안에 선언된 변수는
지역(local) 변수라고 한다.