오모씨
462
2020-06-24 22:14:36
2
271

서블릿을 통하여 Tomcat에 연결된 사용자 끼리 특정 변수를 공유할 수 있나요?


안녕하세요.


JSP 서블릿을 사용하여 앱에 접속한 사용자들끼리 변수(?)를 공유하는 방법이 있는지 알고 싶습니다.


예를 들어 A라는 사용자가 앱에 접속해서 PARSER라는 모듈을 사용하고 있다는 것을 톰캣이 알고 있고, B라는 사용자가 해당 PARSER라는 모듈을 사용하려고 접근 할 시에는 이미 사용 중이라는 것을 B에게 알리려고 합니다.


한가지 생각한 것이 A가 PARSER를 사용할 때 서버에 빈 파일을 하나 생성하고 사용이 완료되면 이 파일을 지우는 것 입니다. 따라서 B가 PARSER에 접근하려 할때 이미 빈 파일이 생성되어 있으면 현재 A가 사용중임을 알릴 수 있을 것 같기는 합니다.


그런데 이 방법이 좀 무식해 보이기도 해서, 혹시 특정 사용자가 PARSER에 접근 할때 톰캣 내부에 모든 접속자가 공유할 수 있는 flag를 만들고 이 flag가 존재하면 다른 사용자들이 접근을 못하게 하는 것이 어떨까 해서 찾아봤는데 방법을 모르겠어서요.


session을 사용해 볼까 했는데 session은 특정 접속자가 앱을 사용하는 동안에 유지되는 변수인 것 같아서요.


혹시 해당 방법을 아시는 고수님들 답변 부탁드립니다. 감사합니다.

0
  • 답변 2

  • allinux
    1k
    2020-06-24 22:44:36

    서블릿 컨테이너는 thread per connection 입니다.

    멀티스레드 기반이라는 이야깁니다.

    그리고 자바에서 객체를 생성하려면 new 를 사용해야만 합니다.그런데...서블릿 객체 생성시 new 하고 사용하던가요? 꼭 스프링과 비슷하게 컨테이너가 생성합니다.

    즉 서블릿 인스턴스는 1개입니다.(물론...이견이 있을 수 있습니다만....일반적으로 그렇습니다.)

    사용자가 여러명 접속한다해서 서블릿 인스턴스가 여러개 되지 않습니다.

    그럼 static 으로 서블릿 변수를 만들면  그 변수는 상태를 계속 유지하게 됩니다.

    즉 변경을 하면 변경이 된 상태로 유지된다는 겁니다.

    그리고 세마포어와 뮤텍스를 이용해서도 처리가 가능합니다. <- 사실 이것이 정석적인 방법입니다.

    다만...단점은 클러스터링 환경이면 안되겠죠...이런 경우는 DB나 파일등을 이용해볼 수 있습니다.

  • 초무쿤
    6k
    2020-06-25 02:15:51

    static 요.

    근데 scaleout 환경에서는 않됩니다.(서버가 여러개라)

    DB나 REDIS 같은거 사용하셔야될듯한데요. 

    아무래도 그냥 db가 심플하게..

  • 로그인을 하시면 답변을 등록할 수 있습니다.