티스토리 뷰
배포 후 문제가 발생했습니다.
문제 : 검색을 했는데 내가 보낸 키워드가 아닌 이상한 키워드로 검색이 된다.
원인 : Controller에서 자주 쓰이는 변수들을 클래스 변수(attribute)로 선언했는데 그게 critcal section이 되어서 여러 개의 쓰레드들이 그 변수들의 값을 변경하고 검색 작업의 무결성(동기화)이 깨졌다
.
해결책 : 검색 정보를 담은 value object를 새로 만들고 매소드 안에 지역변수로 선언하여 사용한다.
이번에 저는 검색 Controller의 500라인이나 되는 방대한 검색 메소드를 리펙토링 했습니다. 메소드를 추출해내고 자주 쓰이는 변수들은 클래스 변수로 만들었습니다. 그리고 메소드가 호출될 때마다 클래스 변수 초기화 메소드를 호출할 수 있도록 했습니다.
그런데 문제는 WAS에서 생성한 싱글톤 인스턴스에서 여러 쓰레드로 동시에 메소드를 호출하는 것이었습니다. 그러다 보니 클래스 변수들은 이리저리 변경되고 그 변경된 상태로 (내가 원하는 검색 정보가 아닌) 검색이 실행되는 것이었죠.
싱글톤 패턴인 객체는 무상태(stateless) 방식으로 만들어야 한다고 합니다. 당연한 말이죠. 상태를 가지고 있으면 여러 쓰레드들이 수시로 상태를 변경할 테고 하나의 작업(쓰레드)이 원하는 결과를 얻을 수 없겠죠.
이번 실수를 통해서 많이 배웠습니다.
감사합니다!
키워드 : Thread, Critacal Section, Thread Safe, Singleton, Mutex, Semaphore
쓰레드, 임계 영역, 싱글톤, 뮤텍스, 세마포어
<관련 정보>
http://okjsp.net/seq/163582#1414841581607()
http://peacekirf.tistory.com/28()
http://topnanis.tistory.com/195 (무결성, 쓰레드, 뮤텍스, 세마포어에 관한 간단한 정리)
'JAVA' 카테고리의 다른 글
[JAVA:reflection] 자바 프록시로 문제 해결하기! (0) | 2015.10.26 |
---|---|
[JAVA:reflection] typesafe하게 특정 메서드 객체 가져오기 (0) | 2015.10.04 |
[JAVA] 현재 실행중인 메서드 가져오는 방법 (0) | 2015.10.04 |
JSP 버퍼 플러시 후에 < jsp : foword > 한다면? (0) | 2015.03.05 |
jsp application 기본 객체 범위 테스트 (0) | 2015.03.03 |
- Total
- Today
- Yesterday
- container
- html
- 객체지향
- spring
- S68
- ChatGPT
- javascript
- springboot
- 한달살기
- Clean code
- sanur
- 회고
- Docker
- rest
- ecma6
- 발리
- Bali
- 개발자
- AWSKRUG
- 도커
- 실수노트
- spring boot
- 웹
- ES6
- hands-on
- 사누르
- 웹을 지탱하는 기술
- 독후감
- AWS
- 컨테이너
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |