:imagesdir: images

== 실습
=== 개요
스레드세이프하지 않은 프로그램의 동작을 확인한 후 스레드세이프하게 수정합니다.

=== 절차
. CalculateController 클래스의 내용을 살펴봅시다. 어떤 처리를 하고 있는지 알 수 있나요? 또, 뭔가 문제가 느껴지나요?

. calculatePrice 메서드에서 total을 계산한 후 중단점을 설정하고 CalculateApplication 클래스를 디버그 모드로 실행해 봅시다.
+
NOTE: Intellij IDEA를 사용하는 경우, 다음과 같이 중단점 설정을 Thread에 합니다. 
+
image::thread.png[]

. 브라우저로 http://localhost:8080/calculate-price?a=100&b=200&c=300 에 접속합니다. 하나의 스레드로 처리가 멈출 것입니다. total 변수의 내용은 600으로 되어 있습니다.

. 브라우저를 새로 시작하고 http://localhost:8080/calculate-price?a=200&b=300&c=400 에 접속합니다. 다른 스레드에서 처리가 멈출 것입니다. 이때 total 변수의 내용은 900으로 되어 있습니다. 

. 처음 스레드의 처리를 재개합시다. 화면에 990이 표시됩니다. 원래 660이었는데, 나중에 실행한 처리에 의해 total 변수의 내용이 변경되었기 때문입니다. 다시 말해, 스레드세이프한 구조가 아닙니다. 

. 스레드세이프하게 만들려면 어떻게 하면 좋을까요? 프로그램을 다시 수정해봅시다.