Java 에서 'Class Variable' 또는 'Class Method' 라 불리는, 해당 Class 내에서 공용적으로 쓸 수 있는 변수나 메소드들을 Static Variable 또는 Static Method 라 불린다.
Static Initializer 는 이러한 값들을 미리 셋팅하기 위해 사용하며 다음과 같은 문법을 이용한다.
static {
// 해당 Code.. x = 10; y=30; ....
}
StaticInitialzer 에서 값만 치환하는 것으로 (상속클래스에서 해당 Class Variable 의 값을 바꿔주는식으로) 해결되는 문제라면 크게 어렵진 않다. 하지만, 만일 저 부분에 DB 나 File 등(또는 File 을 사용하는 Logger 등) 외부 자원을 이용하는 클래스를 초기화하게 된다면 사태는 더욱더 심각해진다. 처음부터 해당 Class 가 DB, File 등 큰 자원에 대해 의존성을 가지게 되는 것이다. 게다가 이는 상속을 하여 해당 부분을 Mock 으로 치환하려고 해도
StaticInitializer 가 먼저 실행되어버리므로 '치환'이 불가능해져버린다.
이를 방지하려면,
StaticInitializer 를 일반 Method 로 추출한뒤, 생성자에서 이를 호출한다. (단, 인스턴스를 2개 이상 만드는 클래스인경우 문제가 있겠다.)
그 외에 Static 의 경우, 그 사용 가능 Focus가 Global 해지기 때문에 이 또한 Bad Smell 이 될 가능성이 농후하다. 개인적으로는 가급적이면 Static Variable 을 쓰지 않는 습관을 들이려고 한다. --
1002
이 문제가, final static 으로 값이 세팅될때의 문제가 아닌가요? Mock의 생성자에서 교체 가능하지 않나요? --
NeoCoin
실무에서 저러한
StaticInitializer 를 가장 많이 볼 수 있는 곳은 Logging 관련 코드이다. 보통 Logging 관련 코드들은 개발 마무리 즈음에 붙이게 되는데, 일정에 쫓기다 보니 사람들이 Logging 관련 코드에 대해서는
CopyAndPaste 의 유혹에 빠지게 된다. 순식간에 Logging 과 Property(해당 클래스에 대한 환경설정부분) 에 대한 Dependency 가 발생하게 된다. 팀 차원에서 조심할 필요가 있다. --
1002