다중사용자 지원문제
- 작성자 :
- 박*화
- 작성일 :
- 2013-11-21 10:36:43
- 조회수 :
- 563
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
안녕하세요? 항상 성실한 답변에 감사드립니다.
전자정부프레임워크의 문제인지 아니면 스프링프레임워크의 문제인지는알 수 없으나 다중 사용자의 동일한 자원에
접근에 대한 문제입니다.
특정 Controller에서 member 변수로 정의된 리스트를 비동기적으로 처리합니다.
즉, 동일한 Controller 내에서 데이터를 수집하는 메서드와 브라우즈의 요청에 의해 데이터를 읽어들여서
브라우저에 전송하는 메서드가 존재합니다.(Ajax 이용)
이같은 상황에서 1명의 사용자만 사용시는 정상 작동합니다.
하지만 다른 컴퓨터에서 다른 사용자가 또다른 ID로 로그인시, 즉 A 와 B 사용자가 동시에 접속하여 해당 리스트 데이터를
접근하면 동일한 데이터가 전송됩니다.
사용자가 다르면 당연히 수집되는 데이터가 다름에도 불구하고 마치 static 변수처럼 공유가 됩니다. (물론 해당 변수는 static
이 아닙니다)
프레임워크가 1개의 Thread로 처리하는것 같은데 맞는지요? 만약 싱글쓰레드 방식이라면 멀티로 처리할수 있는 방법이
있는지 알고 싶습니다.
감사합니다.
전자정부프레임워크의 문제인지 아니면 스프링프레임워크의 문제인지는알 수 없으나 다중 사용자의 동일한 자원에
접근에 대한 문제입니다.
특정 Controller에서 member 변수로 정의된 리스트를 비동기적으로 처리합니다.
즉, 동일한 Controller 내에서 데이터를 수집하는 메서드와 브라우즈의 요청에 의해 데이터를 읽어들여서
브라우저에 전송하는 메서드가 존재합니다.(Ajax 이용)
이같은 상황에서 1명의 사용자만 사용시는 정상 작동합니다.
하지만 다른 컴퓨터에서 다른 사용자가 또다른 ID로 로그인시, 즉 A 와 B 사용자가 동시에 접속하여 해당 리스트 데이터를
접근하면 동일한 데이터가 전송됩니다.
사용자가 다르면 당연히 수집되는 데이터가 다름에도 불구하고 마치 static 변수처럼 공유가 됩니다. (물론 해당 변수는 static
이 아닙니다)
프레임워크가 1개의 Thread로 처리하는것 같은데 맞는지요? 만약 싱글쓰레드 방식이라면 멀티로 처리할수 있는 방법이
있는지 알고 싶습니다.
감사합니다.
A
안녕하세요. 박동화님.
Spring의 bean은 @Controller를 포함하여 기본적으로 singleton 방식으로 운영됩니다. (Servlet 처럼 하나의 인스턴스가 여러 사용자의 request를 multi thread 방식으로 처리)
이 경우 멤버 변수는 모든 사용자의 request에서 공유가 되기 때문에 형식적으로 static은 아니지만, static 처럼 동작을 합니다.
비동기적으로 처리, 즉 synchorized 처리하셨더라도 thread-safe 하게 해당 멤버 변수를 접근할 수 있게 해주지만, 여러 request마도 공유하는 것은 막을 수 없습니다.
이런 경우는 2개의 request를 하나의 request로 처리하시거나 처음 요청에 대한 결과를 DB에 보관(사용자별 구분 정보 포함)하여 두번째 요청에서 제공하시는 방법 등으로 변경하셔야 합니다.
(원칙적으로 멤버 변수에 데이터를 저장하는 것은 문제 발생)
그럼, 즐거운 하루되십시오.
감사합니다.
Spring의 bean은 @Controller를 포함하여 기본적으로 singleton 방식으로 운영됩니다. (Servlet 처럼 하나의 인스턴스가 여러 사용자의 request를 multi thread 방식으로 처리)
이 경우 멤버 변수는 모든 사용자의 request에서 공유가 되기 때문에 형식적으로 static은 아니지만, static 처럼 동작을 합니다.
비동기적으로 처리, 즉 synchorized 처리하셨더라도 thread-safe 하게 해당 멤버 변수를 접근할 수 있게 해주지만, 여러 request마도 공유하는 것은 막을 수 없습니다.
이런 경우는 2개의 request를 하나의 request로 처리하시거나 처음 요청에 대한 결과를 DB에 보관(사용자별 구분 정보 포함)하여 두번째 요청에서 제공하시는 방법 등으로 변경하셔야 합니다.
(원칙적으로 멤버 변수에 데이터를 저장하는 것은 문제 발생)
그럼, 즐거운 하루되십시오.
감사합니다.