티스토리 뷰
Static
- 자바 프로그래밍에서 성능을 향상시키는 방법은 여러가지가 있습니다.
- 그 중에서 한가지는 static을 사용하는 것입니다.
static의 특징
- 자바에서 static으로 지정했다면, 해당 메소드나 변수는 정적입니다. (반대말은 dynamic)
- static으로 선언한 변수는 클래스 변수입니다.
- 하나의 JVM이나 WAS 인스턴스에서는 같은 주소에 존재하는 값을 참조합니다.
- GC의 대상이 되지 않습니다.
static 활용
-
자주 사용하고 절대 변하지 않는 변수는 final static으로 선언하자.
-
설장 파일 정보도 static으로 관리하자.
클래스의 객체를 생성할 때마다 설정 파일을 로딩하면 엄청난 성능 저하가 발생합니다. 이럴 때 반드시 static으로 데이터를 읽어서 관리해야 합니다.
-
코드성 데이터는 DB에서 한 번만 읽자.
쇼핑몰의 상품 코드처럼 양이 많고 자주 바뀔 확률이 높은 데이터를 제외하고,
건수가 그리 많지 않되 조회 빈도가 높은 코드성 데이터는 DB에서 한 번만 읽어서 관리하는 것이 성능 측면에서 좋습니다.static의 잘못된 활용 예제
import java.util.HashMap;
public class BadQueryManager {
private static String queryURL = null;
public BadQueryManager(String badUrl) {
queryURL = badUrl;
}
public static String getSql(String idSql) {
try {
FileReader reader = new FileReader();
HashMap<String, String> doc = reader.read(queryURL);
return doc.get(idSql);
} catch (Exception e) {
System.out.println(e);
}
return null;
}
}
- queryURL 이라는 문자열을 static으로 지정했습니다.
- 문자열이 있는 생성자로 이 클래스 객체를 생성하면 쿼리 파일이 지정됩니다.
어떤 사용자가 BadQueryManager의 생성자를 통해 queryURL을 설정하고 getSql() 메소드를 호출 하기 전, 다른 queryURL을 사용하는 사용자의 스레드에서 BadQueryManager의 생성자를 호출하면 어떻게 될까 ?
- 먼저 호출한 사용자는 생성자를 호출했을 때의 URL을 유지하고 있을 거라고 생각하고 getSql() 메소드를 호출하겠지만, 이미 그 값은 변경되고 난 이후입니다. 그러므로 시스템 오류가 발생합니다.
- getSql() 메소드와 queryURL을 static으로 선언한 것이 잘못된 부분입니다.
- 웹 환경이기 때문에 여러 사용자가 호출할 경우 queryURL은 그때 그때 변경됩니다.
- 다시 말하면, queryURL은 static으로 선언됐기 떄문에 클래스의 변수이지 객체의 변수가 아닙니다.
- 모든 스레드에서 동일한 주소를 가리키게 되어 문제가 발생한 것입니다.
'Language > Java' 카테고리의 다른 글
Synchronized (0) | 2018.06.01 |
---|---|
Thread Class & Runnable Interface (0) | 2018.06.01 |
Process & Thread (0) | 2018.06.01 |
IO (0) | 2018.06.01 |
System Class (0) | 2018.06.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- auth
- 대규모
- HTTP
- stateful
- Cross Origin
- ngrinder
- thread
- cross
- ehcache
- Spring Boot
- Token
- Groovy
- MongoDB
- SPOF
- web
- URI
- redis
- cors
- JWT
- class
- iinput
- Java
- https
- NoSQL
- stateless
- Runnable
- output
- script
- synchronized
- 404
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함