thread-safe하도록 servlet작성하기
만약 자바로 웹 어플리케이션을 작성한다면, 서블릿이 가장 친숙한다. JSP로 작성하거나 일반 서블릿으로 작성하든 관계 없이, 서블릿이 제공하는 장점을 받게 된다.
thread-safe라는 것은? 여러 thread가 프로그램의 단일 instance을 실행하여, 메모리를 공유할때, 동일한 위치(영역, 값)를 읽고 쓰려고 시도 할 수 있습니다.
자바 프로그램과 마찬가지로 서블릿은 JVM내에서 실행되어야 하지만, 웹 어플리케이션의 경우 서블릿 컨테이너가 HTTP요청이 들어 오는 곳에서 처리를 합니다.
서블릿의 생명주기의 상당 부분을 프로그래머가 제어 할 수 없고, 생성 및 파괴시에 메모리 사용에 대해 걱정하지 않는다.
Google이나 Amazon처럼 많은 각 요청에 대해 서블릿은 인스턴스화를 하는 것은 실용적이지 않으며, 서블릿 컨테이너가 multi thread를 처리합니다.
1. thread-safe하냐?
변수 counter는 인스턴스 변수이고, 클래스내에서 정의되어, 클래스 인스턴스에 속합니다.
이 값은 method호출간에 유지되며, 문제는 서블릿 컨테이너가 multi thread이고, 다중 요청을 위해 서블릿의 단일 인스턴스를 공유한다는 점이다.
이 서블릿을 동시에 실행할때 어떤 일이 발생하는지 살펴보자. 처리에 지연을 위해 sleep()를 사용한다. HTML프레림을 사용하여 동시 요청을 만듭니다.
쓰레드 안전하지 않은 서블릿 코드는 다음과 같은 결과를 생성한다.
2.첫번째 방어 : 회피
각 쓰레드에 대해 고유한 변수 인스턴스를 갖도록하기 위해 클래스 내에서 변수 선언한 내용을 method내로 변수 선언을 이동하기만 하면 된다. 차이점은 method에 대한 각 호출에 대해 새 변수가 만들어진다.
3.두번째 방어: 부분 동기화
쓰레드 동기화는 알아야 할 중요한 기술이지만, 필요하지 않으면 이걸 솔루션으로 채택하지 마세요. 코드 블록을 동기화 할때마다 시스템에 병목 현상이 발생합니다. 코드 블록을 동기화할때, 주어진 순간에 동기화된 코드 블록내에 하나의 스레드만 있을 수 있다고 JVM 알려줍니다. 다중 쓰레드에서 동기화된 코드 블록으로 스레드가 실행되면, 2번째 스레드는 1번쨰 스레드가 해당 블록을 종료할때까지 대기해야 합니다.
4.마지막 방어: 전체 동기화
서블릿 컨테이너에 쓰레드가 안전하지 않다는 것을 알려주기 위해서, 빈 인터페이스를 구현해야 합니다. 구현하려는 tag는 SingleThreadModel인터페이스 입니다. 인터페이스를 적용하면, 2개의 쓰레드가 동시에 실행 될 수 없음을 보장 합니다. (블록이 발생하므로, 되도록 사용하면 안되겠죠?)
원문 : Jul 12, 2004
https://www.javaworld.com/article/2072798/java-web-development/write-thread-safe-servlets.html?page=2
'Web Tech. > Spring Framework' 카테고리의 다른 글
Maven Project 생성하기 (0) | 2019.06.28 |
---|---|
LINE(라인, 그룹채팅방)으로 메시지 보내기 - 방법1 (0) | 2019.05.19 |
Tomcat Memory Leak (0) | 2018.07.18 |
Java Spring + Slack Web Hook API (0) | 2018.03.13 |
페이스북 Graph API 사용하기 (0) | 2017.09.26 |